@vulcanjs/react-ui 0.4.0 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. package/dist/components/VulcanCurrentUser/Consumer.d.ts +4 -0
  2. package/dist/components/VulcanCurrentUser/Consumer.d.ts.map +1 -0
  3. package/dist/components/VulcanCurrentUser/Context.d.ts +11 -0
  4. package/dist/components/VulcanCurrentUser/Context.d.ts.map +1 -0
  5. package/dist/components/VulcanCurrentUser/Provider.d.ts +7 -0
  6. package/dist/components/VulcanCurrentUser/Provider.d.ts.map +1 -0
  7. package/dist/components/VulcanCurrentUser/index.d.ts +3 -0
  8. package/dist/components/VulcanCurrentUser/index.d.ts.map +1 -0
  9. package/dist/{react-ui/components → components}/form/FieldErrors.d.ts +0 -0
  10. package/dist/components/form/FieldErrors.d.ts.map +1 -0
  11. package/dist/{react-ui/components → components}/form/Form/Form.d.ts +0 -0
  12. package/dist/components/form/Form/Form.d.ts.map +1 -0
  13. package/dist/{react-ui/components → components}/form/Form/fields.d.ts +0 -0
  14. package/dist/components/form/Form/fields.d.ts.map +1 -0
  15. package/dist/{react-ui/components → components}/form/Form/index.d.ts +0 -0
  16. package/dist/components/form/Form/index.d.ts.map +1 -0
  17. package/dist/{react-ui/components → components}/form/Form/typings.d.ts +2 -2
  18. package/dist/components/form/Form/typings.d.ts.map +1 -0
  19. package/dist/{react-ui/components → components}/form/Form/utils.d.ts +0 -0
  20. package/dist/components/form/Form/utils.d.ts.map +1 -0
  21. package/dist/{react-ui/components → components}/form/FormComponent.d.ts +0 -0
  22. package/dist/components/form/FormComponent.d.ts.map +1 -0
  23. package/dist/{react-ui/components → components}/form/FormComponentInner.d.ts +0 -0
  24. package/dist/components/form/FormComponentInner.d.ts.map +1 -0
  25. package/dist/{react-ui/components → components}/form/FormComponentLoader.d.ts +0 -0
  26. package/dist/components/form/FormComponentLoader.d.ts.map +1 -0
  27. package/dist/{react-ui/components → components}/form/FormContainer.d.ts +3 -0
  28. package/dist/components/form/FormContainer.d.ts.map +1 -0
  29. package/dist/{react-ui/components → components}/form/FormContext.d.ts +0 -0
  30. package/dist/components/form/FormContext.d.ts.map +1 -0
  31. package/dist/{react-ui/components → components}/form/FormElement.d.ts +0 -0
  32. package/dist/components/form/FormElement.d.ts.map +1 -0
  33. package/dist/{react-ui/components → components}/form/FormError.d.ts +0 -0
  34. package/dist/components/form/FormError.d.ts.map +1 -0
  35. package/dist/{react-ui/components → components}/form/FormErrors.d.ts +0 -0
  36. package/dist/components/form/FormErrors.d.ts.map +1 -0
  37. package/dist/{react-ui/components → components}/form/FormGroup.d.ts +2 -2
  38. package/dist/components/form/FormGroup.d.ts.map +1 -0
  39. package/dist/{react-ui/components → components}/form/FormIntl.d.ts +0 -0
  40. package/dist/components/form/FormIntl.d.ts.map +1 -0
  41. package/dist/{react-ui/components → components}/form/FormLayout.d.ts +0 -0
  42. package/dist/components/form/FormLayout.d.ts.map +1 -0
  43. package/dist/{react-ui/components → components}/form/FormNestedArray.d.ts +0 -0
  44. package/dist/components/form/FormNestedArray.d.ts.map +1 -0
  45. package/dist/{react-ui/components → components}/form/FormNestedArrayLayout.d.ts +0 -0
  46. package/dist/components/form/FormNestedArrayLayout.d.ts.map +1 -0
  47. package/dist/{react-ui/components → components}/form/FormNestedDivider.d.ts +0 -0
  48. package/dist/components/form/FormNestedDivider.d.ts.map +1 -0
  49. package/dist/{react-ui/components → components}/form/FormNestedItem.d.ts +0 -0
  50. package/dist/components/form/FormNestedItem.d.ts.map +1 -0
  51. package/dist/{react-ui/components → components}/form/FormNestedObject.d.ts +0 -0
  52. package/dist/components/form/FormNestedObject.d.ts.map +1 -0
  53. package/dist/{react-ui/components → components}/form/FormOptionLabel.d.ts +0 -0
  54. package/dist/components/form/FormOptionLabel.d.ts.map +1 -0
  55. package/dist/{react-ui/components → components}/form/FormSubmit.d.ts +0 -0
  56. package/dist/components/form/FormSubmit.d.ts.map +1 -0
  57. package/dist/{react-ui/components → components}/form/VulcanComponents/Consumer.d.ts +0 -0
  58. package/dist/components/form/VulcanComponents/Consumer.d.ts.map +1 -0
  59. package/dist/{react-ui/components → components}/form/VulcanComponents/Context.d.ts +0 -0
  60. package/dist/components/form/VulcanComponents/Context.d.ts.map +1 -0
  61. package/dist/{react-ui/components → components}/form/VulcanComponents/Dummy.d.ts +0 -0
  62. package/dist/components/form/VulcanComponents/Dummy.d.ts.map +1 -0
  63. package/dist/{react-ui/components → components}/form/VulcanComponents/Provider.d.ts +0 -0
  64. package/dist/components/form/VulcanComponents/Provider.d.ts.map +1 -0
  65. package/dist/{react-ui/components → components}/form/VulcanComponents/defaultVulcanComponents.d.ts +0 -0
  66. package/dist/components/form/VulcanComponents/defaultVulcanComponents.d.ts.map +1 -0
  67. package/dist/{react-ui/components → components}/form/VulcanComponents/typings.d.ts +0 -0
  68. package/dist/components/form/VulcanComponents/typings.d.ts.map +1 -0
  69. package/dist/{react-ui/components → components}/form/core/Button.d.ts +0 -0
  70. package/dist/components/form/core/Button.d.ts.map +1 -0
  71. package/dist/{react-ui/components → components}/form/core/Loading.d.ts +0 -0
  72. package/dist/components/form/core/Loading.d.ts.map +1 -0
  73. package/dist/{react-ui/components → components}/form/index.d.ts +2 -0
  74. package/dist/components/form/index.d.ts.map +1 -0
  75. package/dist/{react-ui/components → components}/form/inputs/BasicInputs.d.ts +0 -0
  76. package/dist/components/form/inputs/BasicInputs.d.ts.map +1 -0
  77. package/dist/{react-ui/components → components}/form/inputs/consts.d.ts +0 -0
  78. package/dist/components/form/inputs/consts.d.ts.map +1 -0
  79. package/dist/{react-ui/components → components}/form/modules/formFragments.d.ts +0 -0
  80. package/dist/components/form/modules/formFragments.d.ts.map +1 -0
  81. package/dist/{react-ui/components → components}/form/modules/path_utils.d.ts +0 -0
  82. package/dist/components/form/modules/path_utils.d.ts.map +1 -0
  83. package/dist/{react-ui/components → components}/form/modules/schema_utils.d.ts +1 -1
  84. package/dist/components/form/modules/schema_utils.d.ts.map +1 -0
  85. package/dist/{react-ui/components → components}/form/modules/utils.d.ts +0 -0
  86. package/dist/components/form/modules/utils.d.ts.map +1 -0
  87. package/dist/{react-ui/components → components}/form/typings.d.ts +0 -0
  88. package/dist/components/form/typings.d.ts.map +1 -0
  89. package/dist/{react-ui/components → components}/form/ui_utils.d.ts +0 -0
  90. package/dist/components/form/ui_utils.d.ts.map +1 -0
  91. package/dist/{react-ui/components → components}/form/useBlockTransition/block.d.ts +0 -0
  92. package/dist/components/form/useBlockTransition/block.d.ts.map +1 -0
  93. package/dist/{react-ui/components → components}/form/useBlockTransition/useBlockTransition.d.ts +0 -0
  94. package/dist/components/form/useBlockTransition/useBlockTransition.d.ts.map +1 -0
  95. package/dist/{react-ui/components → components}/form/useWarnOnUnsaved/index.d.ts +0 -0
  96. package/dist/components/form/useWarnOnUnsaved/index.d.ts.map +1 -0
  97. package/dist/{react-ui/components → components}/form/useWarnOnUnsaved/useWarnOnUnsaved.d.ts +0 -0
  98. package/dist/components/form/useWarnOnUnsaved/useWarnOnUnsaved.d.ts.map +1 -0
  99. package/dist/componentsHelpers.d.ts +10 -0
  100. package/dist/componentsHelpers.d.ts.map +1 -0
  101. package/dist/index.d.ts +4 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +4 -4
  104. package/package.json +10 -10
  105. package/dist/graphql/server/resolvers/connector.d.ts +0 -19
  106. package/dist/graphql/server/resolvers/connector.d.ts.map +0 -1
  107. package/dist/graphql/server/resolvers/context.d.ts +0 -6
  108. package/dist/graphql/server/resolvers/context.d.ts.map +0 -1
  109. package/dist/graphql/server/resolvers/defaultMutationResolvers.d.ts +0 -14
  110. package/dist/graphql/server/resolvers/defaultMutationResolvers.d.ts.map +0 -1
  111. package/dist/graphql/server/resolvers/defaultQueryResolvers.d.ts +0 -9
  112. package/dist/graphql/server/resolvers/defaultQueryResolvers.d.ts.map +0 -1
  113. package/dist/graphql/server/resolvers/errors.d.ts +0 -2
  114. package/dist/graphql/server/resolvers/errors.d.ts.map +0 -1
  115. package/dist/graphql/server/resolvers/index.d.ts +0 -8
  116. package/dist/graphql/server/resolvers/index.d.ts.map +0 -1
  117. package/dist/graphql/server/resolvers/mutators.d.ts +0 -80
  118. package/dist/graphql/server/resolvers/mutators.d.ts.map +0 -1
  119. package/dist/graphql/server/resolvers/typings.d.ts +0 -5
  120. package/dist/graphql/server/resolvers/typings.d.ts.map +0 -1
  121. package/dist/graphql/server/resolvers/utilityResolvers.d.ts +0 -2
  122. package/dist/graphql/server/resolvers/utilityResolvers.d.ts.map +0 -1
  123. package/dist/graphql/server/resolvers/validation.d.ts +0 -21
  124. package/dist/graphql/server/resolvers/validation.d.ts.map +0 -1
  125. package/dist/graphql/server/typings.d.ts +0 -52
  126. package/dist/graphql/server/typings.d.ts.map +0 -1
  127. package/dist/graphql/typings.d.ts +0 -162
  128. package/dist/graphql/typings.d.ts.map +0 -1
  129. package/dist/mongo/client/index.d.ts +0 -2
  130. package/dist/mongo/client/index.d.ts.map +0 -1
  131. package/dist/mongo/mongoParams.d.ts +0 -11
  132. package/dist/mongo/mongoParams.d.ts.map +0 -1
  133. package/dist/react-hooks/cacheUpdate.d.ts +0 -22
  134. package/dist/react-hooks/cacheUpdate.d.ts.map +0 -1
  135. package/dist/react-hooks/create.d.ts +0 -26
  136. package/dist/react-hooks/create.d.ts.map +0 -1
  137. package/dist/react-hooks/delete.d.ts +0 -22
  138. package/dist/react-hooks/delete.d.ts.map +0 -1
  139. package/dist/react-hooks/index.d.ts +0 -8
  140. package/dist/react-hooks/index.d.ts.map +0 -1
  141. package/dist/react-hooks/multi.d.ts +0 -38
  142. package/dist/react-hooks/multi.d.ts.map +0 -1
  143. package/dist/react-hooks/multiQueryUpdater.d.ts +0 -21
  144. package/dist/react-hooks/multiQueryUpdater.d.ts.map +0 -1
  145. package/dist/react-hooks/single.d.ts +0 -24
  146. package/dist/react-hooks/single.d.ts.map +0 -1
  147. package/dist/react-hooks/typings.d.ts +0 -9
  148. package/dist/react-hooks/typings.d.ts.map +0 -1
  149. package/dist/react-hooks/update.d.ts +0 -19
  150. package/dist/react-hooks/update.d.ts.map +0 -1
  151. package/dist/react-hooks/upsert.d.ts +0 -27
  152. package/dist/react-hooks/upsert.d.ts.map +0 -1
  153. package/dist/react-hooks/variables.d.ts +0 -7
  154. package/dist/react-hooks/variables.d.ts.map +0 -1
  155. package/dist/react-ui/components/form/FieldErrors.d.ts.map +0 -1
  156. package/dist/react-ui/components/form/Form/Form.d.ts.map +0 -1
  157. package/dist/react-ui/components/form/Form/fields.d.ts.map +0 -1
  158. package/dist/react-ui/components/form/Form/index.d.ts.map +0 -1
  159. package/dist/react-ui/components/form/Form/typings.d.ts.map +0 -1
  160. package/dist/react-ui/components/form/Form/utils.d.ts.map +0 -1
  161. package/dist/react-ui/components/form/FormComponent.d.ts.map +0 -1
  162. package/dist/react-ui/components/form/FormComponentInner.d.ts.map +0 -1
  163. package/dist/react-ui/components/form/FormComponentLoader.d.ts.map +0 -1
  164. package/dist/react-ui/components/form/FormContainer.d.ts.map +0 -1
  165. package/dist/react-ui/components/form/FormContext.d.ts.map +0 -1
  166. package/dist/react-ui/components/form/FormElement.d.ts.map +0 -1
  167. package/dist/react-ui/components/form/FormError.d.ts.map +0 -1
  168. package/dist/react-ui/components/form/FormErrors.d.ts.map +0 -1
  169. package/dist/react-ui/components/form/FormGroup.d.ts.map +0 -1
  170. package/dist/react-ui/components/form/FormIntl.d.ts.map +0 -1
  171. package/dist/react-ui/components/form/FormLayout.d.ts.map +0 -1
  172. package/dist/react-ui/components/form/FormNestedArray.d.ts.map +0 -1
  173. package/dist/react-ui/components/form/FormNestedArrayLayout.d.ts.map +0 -1
  174. package/dist/react-ui/components/form/FormNestedDivider.d.ts.map +0 -1
  175. package/dist/react-ui/components/form/FormNestedItem.d.ts.map +0 -1
  176. package/dist/react-ui/components/form/FormNestedObject.d.ts.map +0 -1
  177. package/dist/react-ui/components/form/FormOptionLabel.d.ts.map +0 -1
  178. package/dist/react-ui/components/form/FormSubmit.d.ts.map +0 -1
  179. package/dist/react-ui/components/form/VulcanComponents/Consumer.d.ts.map +0 -1
  180. package/dist/react-ui/components/form/VulcanComponents/Context.d.ts.map +0 -1
  181. package/dist/react-ui/components/form/VulcanComponents/Dummy.d.ts.map +0 -1
  182. package/dist/react-ui/components/form/VulcanComponents/Provider.d.ts.map +0 -1
  183. package/dist/react-ui/components/form/VulcanComponents/defaultVulcanComponents.d.ts.map +0 -1
  184. package/dist/react-ui/components/form/VulcanComponents/typings.d.ts.map +0 -1
  185. package/dist/react-ui/components/form/core/Button.d.ts.map +0 -1
  186. package/dist/react-ui/components/form/core/Loading.d.ts.map +0 -1
  187. package/dist/react-ui/components/form/index.d.ts.map +0 -1
  188. package/dist/react-ui/components/form/inputs/BasicInputs.d.ts.map +0 -1
  189. package/dist/react-ui/components/form/inputs/consts.d.ts.map +0 -1
  190. package/dist/react-ui/components/form/modules/formFragments.d.ts.map +0 -1
  191. package/dist/react-ui/components/form/modules/path_utils.d.ts.map +0 -1
  192. package/dist/react-ui/components/form/modules/schema_utils.d.ts.map +0 -1
  193. package/dist/react-ui/components/form/modules/utils.d.ts.map +0 -1
  194. package/dist/react-ui/components/form/typings.d.ts.map +0 -1
  195. package/dist/react-ui/components/form/ui_utils.d.ts.map +0 -1
  196. package/dist/react-ui/components/form/useBlockTransition/block.d.ts.map +0 -1
  197. package/dist/react-ui/components/form/useBlockTransition/useBlockTransition.d.ts.map +0 -1
  198. package/dist/react-ui/components/form/useWarnOnUnsaved/index.d.ts.map +0 -1
  199. package/dist/react-ui/components/form/useWarnOnUnsaved/useWarnOnUnsaved.d.ts.map +0 -1
  200. package/dist/react-ui/index.d.ts +0 -2
  201. package/dist/react-ui/index.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- module.exports=function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=26)}([function(e,t){e.exports=require("react")},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.withVulcanComponents=t.useVulcanComponents=t.VulcanComponentsConsumer=void 0;const l=r(4),u=a(r(0)),s=r(10);t.VulcanComponentsConsumer=s.VulcanComponentsContext.Consumer;t.useVulcanComponents=()=>u.useContext(s.VulcanComponentsContext);t.withVulcanComponents=e=>r=>{const o=t.useVulcanComponents();return l.deprecate("0.0.0","Using withVulcanComponents HOC => prefer useVulcanComponents with hooks"),u.default.createElement(e,Object.assign({vulcanComponents:o},r))}},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.useFormContext=t.FormContext=void 0;const l=a(r(0));t.FormContext=l.default.createContext(void 0);t.useFormContext=()=>{const e=l.useContext(t.FormContext);if(!e)throw new Error("A component is trying to access form context but it is undefined. Please wrap your component with a <Form>.");return e}},function(e,t){e.exports=require("@vulcanjs/i18n")},function(e,t){e.exports=require("@vulcanjs/utils")},function(e,t){e.exports=require("lodash/get")},function(e,t){e.exports=require("prop-types")},function(e,t){e.exports=require("lodash/omit")},function(e,t){e.exports=require("@apollo/client")},function(e,t){e.exports=require("lodash/compact")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanComponentsContext=void 0;const n=o(r(0)),a=r(33);t.VulcanComponentsContext=n.default.createContext({Alert:a.Dummy,Button:a.Dummy,FieldErrors:a.Dummy,Form:a.Dummy,FormComponent:a.Dummy,FormComponentAutocomplete:a.Dummy,FormComponentCheckbox:a.Dummy,FormComponentCheckboxGroup:a.Dummy,FormComponentDate:a.Dummy,FormComponentDateTime:a.Dummy,FormComponentDefault:a.Dummy,FormComponentEmail:a.Dummy,FormComponentInner:a.Dummy,FormComponentLikert:a.Dummy,FormComponentLoader:a.Dummy,FormComponentMultiAutocomplete:a.Dummy,FormComponentNumber:a.Dummy,FormComponentPassword:a.Dummy,FormComponentRadioGroup:a.Dummy,FormComponentSelect:a.Dummy,FormComponentSelectMultiple:a.Dummy,FormComponentStaticText:a.Dummy,FormComponentTextarea:a.Dummy,FormComponentTime:a.Dummy,FormComponentUrl:a.Dummy,FormElement:a.Dummy,FormError:a.Dummy,FormErrors:a.Dummy,FormGroup:a.Dummy,FormGroupHeader:a.Dummy,FormGroupLayout:a.Dummy,FormIntl:a.Dummy,FormIntlItemLayout:a.Dummy,FormIntlLayout:a.Dummy,FormLayout:a.Dummy,FormNestedArray:a.Dummy,FormNestedArrayInnerLayout:a.Dummy,FormNestedArrayLayout:a.Dummy,FormNestedDivider:a.Dummy,FormNestedItem:a.Dummy,FormNestedItemLayout:a.Dummy,FormNestedObject:a.Dummy,FormNestedObjectLayout:a.Dummy,FormOptionLabel:a.Dummy,FormSubmit:a.Dummy,FormattedMessage:a.Dummy,Icon:a.Dummy,IconAdd:a.Dummy,IconRemove:a.Dummy,Loading:a.Dummy})},function(e,t){e.exports=require("lodash/pick")},function(e,t){e.exports=require("@vulcanjs/permissions")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getNullValue=t.getFieldType=t.getNestedDeletedValues=t.getDeletedValues=t.mergeValue=t.isEmptyValue=t.flatten=t.deepValue=void 0;const n=o(r(18)),a=o(r(22)),l=o(r(44)),u=o(r(19)),s=o(r(45)),i=r(23);t.deepValue=function(e,t){const r=t.split(".");for(var o=0;o<r.length;o++)e=e[r[o]];return e};t.flatten=function(e){var t={};return function e(r,o){if("[object Object]"!==Object.prototype.toString.call(r))t[o]=r;else if(Array.isArray(r)){for(var n=0,a=r.length;n<a;n++)e(r[n],o+"["+n+"]");0==a&&(t[o]=[])}else{var l=!0;for(var u in r)l=!1,e(r[u],o?o+"."+u:u);l&&o&&(t[o]={})}}(e,""),t};t.isEmptyValue=e=>null==e||""===e||Array.isArray(e)&&0===e.length;t.mergeValue=({currentValue:e,documentValue:r,deletedValues:o,path:u,locale:i,datatype:m})=>{if(i)return e||r||"";const c=t.getNestedDeletedValues(u,o),d=!!s.default(c);return(Array.isArray(e)||d)&&a.default(m,["type",Array])?n.default([],r,e,c):(l.default(e)||d)&&a.default(m,["type",Object])?n.default({},r,e,c):void 0};t.getDeletedValues=(e,t={})=>e.reduce((e,t)=>u.default(e,t,null),t);t.getNestedDeletedValues=(e,r,o={})=>t.getDeletedValues(i.removePrefix(e,i.filterPathsByPrefix(e,r)),o);t.getFieldType=e=>e.type;t.getNullValue=e=>{const r=t.getFieldType(e);return r===Array?[]:r!==Boolean&&(r===String||r===Number?"":null)}},function(e,t){e.exports=require("debug")},function(e,t){e.exports=require("lodash/uniq")},function(e,t){e.exports=require("lodash/intersection")},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||o(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(34),t),n(r(63),t)},function(e,t){e.exports=require("lodash/merge")},function(e,t){e.exports=require("lodash/set")},function(e,t){e.exports=require("lodash/isEmpty")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.formProperties=t.schemaProperties=t.getNestedFieldSchemaOrType=t.getSchemaType=t.getFieldSchema=t.convertSchema=t.getEditableFields=t.getInsertableFields=t.getReadableFields=t.getValidFields=void 0;const o=r(12),n=r(13);t.getValidFields=e=>Object.keys(e).filter(e=>!e.includes("$")&&!e.includes("."));t.getReadableFields=e=>t.getValidFields(e).filter(t=>e[t].canRead||e[t].viewableBy);t.getInsertableFields=function(e,t){return Object.keys(e).filter((function(r){var n=e[r];return o.canCreateField(t,n)}))};t.getEditableFields=function(e,t,r){return Object.keys(e).filter((function(n){var a=e[n];return o.canUpdateField(t,a,r)}))};t.convertSchema=(e,r={})=>{const{flatten:o=!1,removeArrays:n=!0}=r;let a={};return Object.keys(e).forEach(l=>{if(n&&l.includes("$"))return;a[l]=t.getFieldSchema(l,e);const u=t.getNestedFieldSchemaOrType(l,e);if(u){a[l].arrayFieldSchema=t.getFieldSchema(l+".$",e);const n=t.convertSchema(u,r);n?o?a=Object.assign(Object.assign({},a),n):a[l].schema=n:a[l].isSimpleArrayField=!0}}),a};t.getFieldSchema=(e,r)=>{let o={};return t.schemaProperties.forEach(t=>{var n;const a=null===(n=r[e])||void 0===n?void 0:n[t];a&&(o[t]=a)}),o};t.getSchemaType=e=>n.getFieldType(e);const a=(e,r)=>{const o=r[e];if(!(e=>{const r=t.getSchemaType(e);return r&&"object"==typeof r})(o))return null;return o&&t.getSchemaType(o)};t.getNestedFieldSchemaOrType=(e,r)=>{const o=((e,r)=>{const o=r[e+".$"];return o&&t.getSchemaType(o)})(e,r);if(!o){const t=a(e,r);return t||null}return o},t.schemaProperties=["type","label","optional","required","min","max","exclusiveMin","exclusiveMax","minCount","maxCount","allowedValues","regEx","blackbox","trim","custom","defaultValue","autoValue","hidden","mustComplete","form","inputProperties","itemProperties","control","input","autoform","order","group","onCreate","onUpdate","onDelete","onInsert","onEdit","onRemove","canRead","canCreate","canUpdate","viewableBy","insertableBy","editableBy","resolveAs","searchable","description","beforeComponent","afterComponent","placeholder","options","query","queryWaitsForValue","autocompleteQuery","fieldProperties","intl","intlId"],t.formProperties=["optional","required","min","max","exclusiveMin","exclusiveMax","minCount","maxCount","allowedValues","regEx","blackbox","trim","custom","defaultValue","autoValue","mustComplete","form","inputProperties","itemProperties","control","input","order","group","description","beforeComponent","afterComponent","placeholder","options","query","queryWaitsForValue","autocompleteQuery","fieldProperties"]},function(e,t){e.exports=require("lodash/find")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.filterPathsByPrefix=t.removePrefix=t.getParentPath=t.joinPath=t.splitPath=void 0;const n=o(r(46)),a=o(r(47)),l=o(r(48)),u=o(r(49));t.splitPath=e=>n.default(e);t.joinPath=e=>e.reduce((e,t)=>e+(Number.isNaN(Number(t))?`${""===e?"":"."}${t}`:`[${t}]`),""),t.getParentPath=l.default(t.splitPath,a.default,t.joinPath);t.removePrefix=(e,r)=>{const o=t.splitPath(e);return r.map(r=>{if(r===e)return r;const n=t.splitPath(r),a=u.default(n,n.length-o.length);return t.joinPath(a)})};t.filterPathsByPrefix=(e,t)=>t.filter(t=>t===e||t.startsWith(e+".")||t.startsWith(e+"["))},function(e,t){e.exports=require("simpl-schema")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getAutoInputFromType=t.allVulcanInputs=t.derivedInputs=t.advancedInputs=t.clearableInputs=t.standardInputs=void 0;const n=o(r(24));t.standardInputs=["number","url","email","textarea","checkbox","checkboxgroup","radiogroup","select","selectmultiple","datetime","date","time","text","password"],t.clearableInputs=["date","datetime","time","select","radiogroup"],t.advancedInputs=["likert","autocomplete","multiautocomplete"],t.derivedInputs=["nested"],t.allVulcanInputs=[...t.standardInputs,...t.advancedInputs,...t.derivedInputs];t.getAutoInputFromType=e=>e===Number||e===n.default.Integer?"number":e===Boolean?"checkbox":e===Date?"date":"text"},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||o(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(27),t)},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||o(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(28),t),n(r(17),t),n(r(64),t),n(r(10),t)},function(e,t,r){"use strict";var o=this&&this.__awaiter||function(e,t,r,o){return new(r||(r=Promise))((function(n,a){function l(e){try{s(o.next(e))}catch(e){a(e)}}function u(e){try{s(o.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(l,u)}s((o=o.apply(e,t||[])).next())}))},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.SmartForm=t.FormContainer=void 0;const a=n(r(0)),l=r(8),u=n(r(29)),s=r(4),i=r(32),m=r(1),c=r(4).debugVulcan("form");t.FormContainer=e=>{const{model:t,documentId:r,slug:n,fields:d,addFields:f}=e,{schema:p}=t,b=r||n,h=b?"edit":"new",y=m.useVulcanComponents();let F,g,v=e.queryFragmentName,C=e.mutationFragmentName;if(e.queryFragment&&(F="string"==typeof e.queryFragment?l.gql`
1
+ module.exports=function(e){var t={};function o(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(r,n,function(t){return e[t]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=28)}([function(e,t){e.exports=require("react")},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.withVulcanComponents=t.useVulcanComponents=t.VulcanComponentsConsumer=void 0;const l=o(4),u=a(o(0)),s=o(10);t.VulcanComponentsConsumer=s.VulcanComponentsContext.Consumer;t.useVulcanComponents=()=>u.useContext(s.VulcanComponentsContext);t.withVulcanComponents=e=>o=>{const r=t.useVulcanComponents();return l.deprecate("0.0.0","Using withVulcanComponents HOC => prefer useVulcanComponents with hooks"),u.default.createElement(e,Object.assign({vulcanComponents:r},o))}},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.useFormContext=t.FormContext=void 0;const l=a(o(0));t.FormContext=l.default.createContext(void 0);t.useFormContext=()=>{const e=l.useContext(t.FormContext);if(!e)throw new Error("A component is trying to access form context but it is undefined. Please wrap your component with a <Form>.");return e}},function(e,t){e.exports=require("@vulcanjs/i18n")},function(e,t){e.exports=require("@vulcanjs/utils")},function(e,t){e.exports=require("lodash/get")},function(e,t){e.exports=require("prop-types")},function(e,t){e.exports=require("lodash/omit")},function(e,t){e.exports=require("@apollo/client")},function(e,t){e.exports=require("lodash/compact")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanComponentsContext=void 0;const n=r(o(0)),a=o(35);t.VulcanComponentsContext=n.default.createContext({Alert:a.Dummy,Button:a.Dummy,FieldErrors:a.Dummy,Form:a.Dummy,FormComponent:a.Dummy,FormComponentAutocomplete:a.Dummy,FormComponentCheckbox:a.Dummy,FormComponentCheckboxGroup:a.Dummy,FormComponentDate:a.Dummy,FormComponentDateTime:a.Dummy,FormComponentDefault:a.Dummy,FormComponentEmail:a.Dummy,FormComponentInner:a.Dummy,FormComponentLikert:a.Dummy,FormComponentLoader:a.Dummy,FormComponentMultiAutocomplete:a.Dummy,FormComponentNumber:a.Dummy,FormComponentPassword:a.Dummy,FormComponentRadioGroup:a.Dummy,FormComponentSelect:a.Dummy,FormComponentSelectMultiple:a.Dummy,FormComponentStaticText:a.Dummy,FormComponentTextarea:a.Dummy,FormComponentTime:a.Dummy,FormComponentUrl:a.Dummy,FormElement:a.Dummy,FormError:a.Dummy,FormErrors:a.Dummy,FormGroup:a.Dummy,FormGroupHeader:a.Dummy,FormGroupLayout:a.Dummy,FormIntl:a.Dummy,FormIntlItemLayout:a.Dummy,FormIntlLayout:a.Dummy,FormLayout:a.Dummy,FormNestedArray:a.Dummy,FormNestedArrayInnerLayout:a.Dummy,FormNestedArrayLayout:a.Dummy,FormNestedDivider:a.Dummy,FormNestedItem:a.Dummy,FormNestedItemLayout:a.Dummy,FormNestedObject:a.Dummy,FormNestedObjectLayout:a.Dummy,FormOptionLabel:a.Dummy,FormSubmit:a.Dummy,FormattedMessage:a.Dummy,Icon:a.Dummy,IconAdd:a.Dummy,IconRemove:a.Dummy,Loading:a.Dummy})},function(e,t){e.exports=require("lodash/pick")},function(e,t){e.exports=require("@vulcanjs/permissions")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getNullValue=t.getFieldType=t.getNestedDeletedValues=t.getDeletedValues=t.mergeValue=t.isEmptyValue=t.flatten=t.deepValue=void 0;const n=r(o(20)),a=r(o(24)),l=r(o(46)),u=r(o(21)),s=r(o(47)),i=o(25);t.deepValue=function(e,t){const o=t.split(".");for(var r=0;r<o.length;r++)e=e[o[r]];return e};t.flatten=function(e){var t={};return function e(o,r){if("[object Object]"!==Object.prototype.toString.call(o))t[r]=o;else if(Array.isArray(o)){for(var n=0,a=o.length;n<a;n++)e(o[n],r+"["+n+"]");0==a&&(t[r]=[])}else{var l=!0;for(var u in o)l=!1,e(o[u],r?r+"."+u:u);l&&r&&(t[r]={})}}(e,""),t};t.isEmptyValue=e=>null==e||""===e||Array.isArray(e)&&0===e.length;t.mergeValue=({currentValue:e,documentValue:o,deletedValues:r,path:u,locale:i,datatype:m})=>{if(i)return e||o||"";const c=t.getNestedDeletedValues(u,r),d=!!s.default(c);return(Array.isArray(e)||d)&&a.default(m,["type",Array])?n.default([],o,e,c):(l.default(e)||d)&&a.default(m,["type",Object])?n.default({},o,e,c):void 0};t.getDeletedValues=(e,t={})=>e.reduce((e,t)=>u.default(e,t,null),t);t.getNestedDeletedValues=(e,o,r={})=>t.getDeletedValues(i.removePrefix(e,i.filterPathsByPrefix(e,o)),r);t.getFieldType=e=>e.type;t.getNullValue=e=>{const o=t.getFieldType(e);return o===Array?[]:o!==Boolean&&(o===String||o===Number?"":null)}},function(e,t){e.exports=require("debug")},function(e,t){e.exports=require("lodash/uniq")},function(e,t){e.exports=require("lodash/intersection")},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useVulcanCurrentUser=t.VulcanCurrentUserConsumer=void 0;const r=o(0),n=o(18);t.VulcanCurrentUserConsumer=n.VulcanCurrentUserContext.Consumer;t.useVulcanCurrentUser=()=>r.useContext(n.VulcanCurrentUserContext)},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanCurrentUserContext=void 0;const n=r(o(0));t.VulcanCurrentUserContext=n.default.createContext({currentUser:null,loading:!1})},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__exportStar||function(e,t){for(var o in e)"default"===o||Object.prototype.hasOwnProperty.call(t,o)||r(t,e,o)};Object.defineProperty(t,"__esModule",{value:!0}),n(o(36),t),n(o(65),t)},function(e,t){e.exports=require("lodash/merge")},function(e,t){e.exports=require("lodash/set")},function(e,t){e.exports=require("lodash/isEmpty")},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.formProperties=t.schemaProperties=t.getNestedFieldSchemaOrType=t.getSchemaType=t.getFieldSchema=t.convertSchema=t.getEditableFields=t.getInsertableFields=t.getReadableFields=t.getValidFields=void 0;const r=o(12),n=o(13);t.getValidFields=e=>Object.keys(e).filter(e=>!e.includes("$")&&!e.includes("."));t.getReadableFields=e=>t.getValidFields(e).filter(t=>e[t].canRead||e[t].viewableBy);t.getInsertableFields=function(e,t){return Object.keys(e).filter((function(o){var n=e[o];return r.canCreateField(t,n)}))};t.getEditableFields=function(e,t,o){return Object.keys(e).filter((function(n){var a=e[n];return r.canUpdateField(t,a,o)}))};t.convertSchema=(e,o={})=>{const{flatten:r=!1,removeArrays:n=!0}=o;let a={};return Object.keys(e).forEach(l=>{if(n&&l.includes("$"))return;a[l]=t.getFieldSchema(l,e);const u=t.getNestedFieldSchemaOrType(l,e);if(u)if(a[l].arrayFieldSchema=t.getFieldSchema(l+".$",e),(e=>"object"==typeof e)(u)){const e=t.convertSchema(u,o);r?a=Object.assign(Object.assign({},a),e):a[l].schema=e}else a[l].isSimpleArrayField=!0}),a};t.getFieldSchema=(e,o)=>{let r={};return t.schemaProperties.forEach(t=>{var n;const a=null===(n=o[e])||void 0===n?void 0:n[t];a&&(r[t]=a)}),r};t.getSchemaType=e=>n.getFieldType(e);const a=(e,o)=>{const r=o[e];if(!(e=>{const o=t.getSchemaType(e);return o&&"object"==typeof o})(r))return null;return r&&t.getSchemaType(r)};t.getNestedFieldSchemaOrType=(e,o)=>{const r=((e,o)=>{const r=o[e+".$"];return r&&t.getSchemaType(r)})(e,o);if(!r){const t=a(e,o);return t||null}return r},t.schemaProperties=["type","label","optional","required","min","max","exclusiveMin","exclusiveMax","minCount","maxCount","allowedValues","regEx","blackbox","trim","custom","defaultValue","autoValue","hidden","mustComplete","form","inputProperties","itemProperties","control","input","autoform","order","group","onCreate","onUpdate","onDelete","onInsert","onEdit","onRemove","canRead","canCreate","canUpdate","viewableBy","insertableBy","editableBy","resolveAs","searchable","description","beforeComponent","afterComponent","placeholder","options","query","queryWaitsForValue","autocompleteQuery","fieldProperties","intl","intlId"],t.formProperties=["optional","required","min","max","exclusiveMin","exclusiveMax","minCount","maxCount","allowedValues","regEx","blackbox","trim","custom","defaultValue","autoValue","mustComplete","form","inputProperties","itemProperties","control","input","order","group","description","beforeComponent","afterComponent","placeholder","options","query","queryWaitsForValue","autocompleteQuery","fieldProperties"]},function(e,t){e.exports=require("lodash/find")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.filterPathsByPrefix=t.removePrefix=t.getParentPath=t.joinPath=t.splitPath=void 0;const n=r(o(48)),a=r(o(49)),l=r(o(50)),u=r(o(51));t.splitPath=e=>n.default(e);t.joinPath=e=>e.reduce((e,t)=>e+(Number.isNaN(Number(t))?`${""===e?"":"."}${t}`:`[${t}]`),""),t.getParentPath=l.default(t.splitPath,a.default,t.joinPath);t.removePrefix=(e,o)=>{const r=t.splitPath(e);return o.map(o=>{if(o===e)return o;const n=t.splitPath(o),a=u.default(n,n.length-r.length);return t.joinPath(a)})};t.filterPathsByPrefix=(e,t)=>t.filter(t=>t===e||t.startsWith(e+".")||t.startsWith(e+"["))},function(e,t){e.exports=require("simpl-schema")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getAutoInputFromType=t.allVulcanInputs=t.derivedInputs=t.advancedInputs=t.clearableInputs=t.standardInputs=void 0;const n=r(o(26));t.standardInputs=["number","url","email","textarea","checkbox","checkboxgroup","radiogroup","select","selectmultiple","datetime","date","time","text","password"],t.clearableInputs=["date","datetime","time","select","radiogroup"],t.advancedInputs=["likert","autocomplete","multiautocomplete"],t.derivedInputs=["nested"],t.allVulcanInputs=[...t.standardInputs,...t.advancedInputs,...t.derivedInputs];t.getAutoInputFromType=e=>e===Number||e===n.default.Integer?"number":e===Boolean?"checkbox":e===Date?"date":"text"},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__exportStar||function(e,t){for(var o in e)"default"===o||Object.prototype.hasOwnProperty.call(t,o)||r(t,e,o)};Object.defineProperty(t,"__esModule",{value:!0}),n(o(29),t),n(o(92),t),n(o(94),t)},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__exportStar||function(e,t){for(var o in e)"default"===o||Object.prototype.hasOwnProperty.call(t,o)||r(t,e,o)};Object.defineProperty(t,"__esModule",{value:!0}),n(o(30),t),n(o(19),t),n(o(66),t),n(o(10),t),n(o(1),t),n(o(91),t)},function(e,t,o){"use strict";var r=this&&this.__awaiter||function(e,t,o,r){return new(o||(o=Promise))((function(n,a){function l(e){try{s(r.next(e))}catch(e){a(e)}}function u(e){try{s(r.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(l,u)}s((r=r.apply(e,t||[])).next())}))},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.SmartForm=t.FormContainer=void 0;const a=n(o(0)),l=o(8),u=n(o(31)),s=o(4),i=o(34),m=o(1),c=o(4),d=o(17),f=c.debugVulcan("form");t.FormContainer=e=>{const{model:t,documentId:o,slug:n,fields:c,addFields:p,currentUser:b,loadingCurrentUser:h}=e,{schema:y}=t,F=o||n,v=F?"edit":"new",g=m.useVulcanComponents();let C,_,O=e.queryFragmentName,j=e.mutationFragmentName;if(e.queryFragment&&(C="string"==typeof e.queryFragment?l.gql`
2
2
  ${e.queryFragment}
3
- `:e.queryFragment),e.mutationFragment&&(g="string"==typeof e.mutationFragment?l.gql`
3
+ `:e.queryFragment),e.mutationFragment&&(_="string"==typeof e.mutationFragment?l.gql`
4
4
  ${e.mutationFragment}
5
- `:e.mutationFragment),!F||!g){const e=u.default({formType:h,model:t,fields:d,addFields:f});F=F||e.queryFragment,v=e.queryFragmentName,g=g||e.mutationFragment,C=e.mutationFragmentName}t.name,s.capitalize(h);const _={formType:h,schema:p},O={model:t,fragment:g,fragmentName:C},j={model:t,fragment:F,fragmentName:v,input:{id:r,enableCache:!1},queryOptions:{fetchPolicy:"network-only",pollInterval:0,skip:"new"===h}},{data:E,document:P,loading:x,refetch:D}=i.useSingle(j);"new"!==h&&c("useSingle result","data",E,"document",P,"loading",x);const[N]=i.useCreate(O),[I]=i.useUpdate(O),[M]=i.useDelete(O);return b&&x?a.default.createElement(y.Loading,null):a.default.createElement(y.Form,Object.assign({document:P,loading:x,createDocument:e=>o(void 0,void 0,void 0,(function*(){const t=yield N(e),{errors:r,document:o}=t;return{document:o,errors:r}})),updateDocument:e=>o(void 0,void 0,void 0,(function*(){const t=yield I(e),{errors:r,document:o}=t;return{document:o,errors:r}})),deleteDocument:e=>o(void 0,void 0,void 0,(function*(){yield M(e)})),refetch:D},_,e))},t.SmartForm=t.FormContainer,t.default=t.FormContainer},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=o(r(15)),a=o(r(16)),l=r(8),u=r(30),s=r(31),i=r(4),m=o(r(9)),c=(e,t,r)=>[t,e,"form",r,"fragment"].map(i.capitalize).join(""),d=({schema:e,options:t})=>"new"===t.formType?u.getCreateableFields(e):u.getUpdateableFields(e),f=({readableFieldNames:e,queryFieldNames:t})=>n.default(t.concat(e)),p=({schema:e,fragmentName:t,options:r,fieldNames:o})=>{const n=o||(r.isMutation?f({queryFieldNames:d({schema:e,options:r}),readableFieldNames:u.getFragmentFieldNames({schema:e,options:{onlyViewable:!0}})}):d({schema:e,options:r})),a=n.length&&n.map(t=>s.getFieldFragment({schema:e,fieldName:t,options:r,getObjectFragment:p})).filter(e=>!!e);return a.length?`${t} { ${a.join("\n")} }`:null};t.default=({formType:e="new",model:t,fields:r,addFields:o})=>{const{schema:s,name:i,graphql:b}=t,{typeName:h,multiTypeName:y}=b;let F=d({schema:s,options:{formType:e}}),g=f({queryFieldNames:F,readableFieldNames:u.getFragmentFieldNames({schema:s,options:{onlyViewable:!0}})});if(r&&(null==r?void 0:r.length)>0){const e=r.map(e=>e+"_intl"),t=[...r,...e];F=a.default(F,t),g=a.default(g,t)}if((null==o?void 0:o.length)&&(F=F.concat(o),g=g.concat(o)),s.userId&&(F.unshift("userId"),g.unshift("userId")),s._id&&(F.unshift("_id"),g.unshift("_id")),F=n.default(F),g=n.default(g),0===F.length)throw new Error(`Model "${t.name}" has no queryable fields, cannot create a form for it. Please add readable/createable/updateable fields to the model schema.`);if(0===g.length)throw new Error(`Model "${t.name}" has no mutable fields, cannot create a form for it. Please add createable/updateable fields to model schema.`);const v=c(e,y,"query"),C=p({schema:s,fragmentName:`fragment ${v} on ${h}`,options:{formType:e,isMutation:!1},fieldNames:F});if(!C)throw new Error(`Model ${t.name} with fields ${F} yield an empty query fragment.`);const _=l.gql(C),O=c(e,y,"mutation"),j=p({schema:s,fragmentName:`fragment ${O} on ${h}`,options:{formType:e,isMutation:!0},fieldNames:g});if(!j)throw new Error(`Model ${t.name} with fields ${g} yield an empty mutation fragment.`);return{queryFragment:_,mutationFragment:l.gql(j),queryFragmentName:v,mutationFragmentName:O,extraQueries:m.default(d({schema:s,options:{formType:e}}).map(e=>s[e].query))}}},function(e,t){e.exports=require("@vulcanjs/schema")},function(e,t){e.exports=require("@vulcanjs/graphql")},function(e,t){e.exports=require("@vulcanjs/react-hooks")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Dummy=void 0;const n=o(r(0));t.Dummy=()=>n.default.createElement("span",null,"You have not setup VulcanComponentsProvider. Please add following code in your app:"," ",n.default.createElement("code",null,'import { VulcanComponentsProvider } from "@vulcanjs/react-ui"; const YourApp = <VulcanComponentsProvider>{/* your app */}</VulcanComponentsProvider>;}'))},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t},l=this&&this.__awaiter||function(e,t,r,o){return new(r||(r=Promise))((function(n,a){function l(e){try{s(o.next(e))}catch(e){a(e)}}function u(e){try{s(o.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(l,u)}s((o=o.apply(e,t||[])).next())}))},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Form=void 0;const s=a(r(0)),i=r(35),m=r(3),c=r(4),d=u(r(36)),f=u(r(9)),p=u(r(5)),b=u(r(37)),h=u(r(38)),y=u(r(18)),F=u(r(7)),g=u(r(39)),v=u(r(11)),C=u(r(40)),_=u(r(19)),O=u(r(41)),j=u(r(42)),E=u(r(43)),P=u(r(20)),x=r(21),D=r(13),N=r(23),I=r(2),M=r(50),w=r(57),k=r(59),S=r(1),L=e=>{const t=e.schema||e.model.schema,r=x.convertSchema(t),o="new"===(e.document?"edit":"new")?(e=>C.default(h.default(e,e=>e.defaultValue),e=>e))(r):{},n=y.default({},o,e.prefilledProps,(a=e.document,g.default(a,e=>null==e)));var a;return Object.keys(r).forEach(e=>{let t=r[e].minCount;if(t)for(n[e]=n[e]||[];n[e].length<t;)n[e].push({})}),c.removeProperty(n,"__typename"),{disabled:e.disabled,errors:[],deletedValues:[],currentValues:{},originalSchema:x.convertSchema(t,{removeArrays:!1}),schema:r,flatSchema:x.convertSchema(t,{flatten:!0}),initialDocument:n,currentDocument:n}},V=({isChanged:e,warnUnsavedChanges:t,children:r})=>(k.useWarnOnUnsaved({isChanged:e,warnUnsavedChanges:t}),s.default.createElement(s.default.Fragment,null,r)),T=(e,t,r,{submitFormCallbacks:o,form:n})=>{const{currentDocument:a}=r,{model:l,prefilledProps:u}=t;let s=u||{};s=g.default(s,(e,t)=>t.endsWith(".$"));const m=Object.assign({schema:l.schema,excludeRemovedFields:!1,excludeHiddenFields:!1,replaceIntlFields:!0,addExtraFields:!1},e),c=M.getFieldNames(t,a,m);return s=Object.assign(Object.assign({},s),v.default(a,...c)),r.deletedValues.forEach(e=>{e.includes(".")&&((e,t)=>{const r=N.getParentPath(t);j.default(e,r,e=>Array.isArray(e)?f.default(e):e)})(s,e)}),s=i.runCallbacks({callbacks:o,iterator:s,args:[{}]}),s};t.Form=e=>{const{initCallback:t,createDocument:r,updateDocument:o,deleteDocument:n}=e,a=L(e),{schema:u,originalSchema:c,flatSchema:f,initialDocument:h}=a,g=s.useRef(!0);s.useEffect(()=>{g.current?g.current=!1:t&&t(a.currentDocument)},[t]);Object.assign(Object.assign({},{layout:"horizontal",prefilledProps:{},repeatErrors:!1,showRemove:!0,showDelete:!0}),e);const v=[],C=[],j=[],N=m.useIntlContext(),[k,A]=s.useState([]),q=e=>{let t=i.getErrors(e);console.log(t),A(e=>[...e,...t])},[B,$]=s.useState([]),[R,G]=s.useState({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]}),[U,H]=s.useState({}),[z,K]=s.useState(h),W=()=>{e.refetch&&e.refetch()},[Y,Q]=s.useState(!1),[J,X]=s.useState(!1),Z=(t={})=>{const{document:r}=t,o=r?y.default({},e.prefilledProps,r):null;A([]),H({}),$([]),K(o||h),Q(!1)},ee=s.useRef(null),te=function(t,r){Q(!1),X(!0),"new"===r&&W();let{document:o}=t;ee.current&&Z({document:"edit"===r?o:void 0}),o=i.runCallbacks({callbacks:C,iterator:o,args:[{form:ee.current}]}),e.successCallback&&e.successCallback(o,{form:this})},re=(t,r)=>{Q(!1),console.error("// graphQL Error"),console.error(r),i.runCallbacks({callbacks:j,iterator:r,args:[{error:r,form:ee.current}]}),P.default(r)||q(r),e.errorCallback&&e.errorCallback(t,r,{form:this})},oe=t=>n=>l(void 0,void 0,void 0,(function*(){var a,l;n&&n.preventDefault(),n&&n.stopPropagation();const{contextName:u}=e;if(Y)return;A([]),Q(!0);let s=T({replaceIntlFields:!0,addExtraFields:!1,mutableFields:ce},e,{currentDocument:z,deletedValues:B},{form:ee.current,submitFormCallbacks:v});if(e.submitCallback&&(s=e.submitCallback(s)||s),"new"===t)try{const e=yield r({input:{data:s,contextName:u}});(null===(a=e.errors)||void 0===a?void 0:a.length)?re(ae,e.errors[0]):function(e){te(e,"new")}(e)}catch(e){re(ae,e)}else try{const e=z._id,t=yield o({input:{id:e,data:s,contextName:u}});(null===(l=t.errors)||void 0===l?void 0:l.length)?re(ae,t.errors[0]):function(e){te(e,"edit")}(t)}catch(e){re(ae,e)}})),{successComponent:ne,document:ae,currentUser:le,model:ue,warnUnsavedChanges:se}=e,ie=S.useVulcanComponents(),me=ae?"edit":"new",ce="edit"===me?x.getEditableFields(u,le,h):x.getInsertableFields(u,le),{formLayoutProps:de,formGroupProps:fe}=((e,t,r,o)=>{const{currentUser:n,repeatErrors:a,submitLabel:l,cancelLabel:u,revertLabel:s,cancelCallback:i,revertCallback:m,id:c,model:d,prefilledProps:f,itemProperties:p,contextName:b,showRemove:h,showDelete:y}=e,{disabled:g,currentDocument:v}=t,{formType:C}=r,{deleteDocument:_}=o,O={document:v,formType:C,currentUser:n,disabled:g,prefilledProps:f,itemProperties:p,contextName:b},j="document-"+C,E=d.name.toLowerCase(),P={model:d,currentUser:n,submitLabel:l,cancelLabel:u,revertLabel:s,cancelCallback:i,revertCallback:m,document:v,deleteDocument:"edit"===C&&h&&y&&_||null};return{commonProps:O,formSubmitProps:P,formGroupProps:e=>Object.assign(Object.assign(Object.assign({key:e.name},e),{group:F.default(e,["fields"])}),O),formLayoutProps:{formProps:{className:`${j} ${j}-${E}`,id:c},repeatErrors:a,submitProps:P,commonProps:O}}})(e,{disabled:Y,currentDocument:z},{formType:me},{deleteDocument:()=>{const t=z,r=e.document._id,o=t.title||t.name||"",a=N.formatMessage({id:"forms.delete_confirm"},{title:o});"42".confirm(a)&&n({input:{id:r}}).then(t=>{e.removeSuccessCallback&&e.removeSuccessCallback({documentId:r,documentTitle:o}),W()}).catch(e=>{console.log(e)})}}),pe=w.isNotSameDocument(h,z);return J&&ne?ne:s.default.createElement(V,{isChanged:pe,warnUnsavedChanges:se},s.default.createElement(I.FormContext.Provider,{value:{throwError:q,clearForm:Z,refetchForm:W,isChanged:pe,submitForm:(e=>t=>{oe(e)(t)})(me),addToDeletedValues:e=>{$(t=>[...t,e])},updateCurrentValues:(t,r={})=>{const{mode:o="overwrite"}=r,{changeCallback:n}=e,a={currentValues:d.default(U),currentDocument:d.default(z),deletedValues:d.default(B)};Object.keys(t).forEach(e=>{const r=e;let n=t[e];if(D.isEmptyValue(n))O.default(a.currentValues,r),_.default(a.currentDocument,r,null),a.deletedValues=[...a.deletedValues,r];else{if(_.default(a.currentValues,r,n),"merge"===o&&(Array.isArray(n)||b.default(n))){const e=p.default(a.currentDocument,r);_.default(a.currentDocument,r,y.default(e,n))}else _.default(a.currentDocument,r,n);a.deletedValues=E.default(a.deletedValues,r)}}),n&&n(a.currentDocument),H(a.currentValues),K(a.currentDocument),$(a.deletedValues)},getDocument:()=>z,getLabel:(e,t)=>M.getLabel(ue,f,N,e,t),initialDocument:h,addToSubmitForm:e=>{G(t=>Object.assign(Object.assign({},t),{submitFormCallbacks:[...t.submitFormCallbacks,e]}))},addToSuccessForm:e=>{G(t=>Object.assign(Object.assign({},t),{successFormCallbacks:[...t.successFormCallbacks,e]}))},addToFailureForm:e=>{G(t=>Object.assign(Object.assign({},t),{failureFormCallbacks:[...t.failureFormCallbacks,e]}))},clearFormCallbacks:()=>{G({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]})},errors:k,currentValues:U,deletedValues:B,clearFieldErrors:e=>{A(t=>t.filter(t=>t.path!==e))}}},s.default.createElement(ie.FormLayout,Object.assign({},de),M.getFieldGroups(e,{currentDocument:z,schema:u,flatSchema:f,originalSchema:c},N,ce,N.formatMessage).map((e,t)=>s.default.createElement(ie.FormGroup,Object.assign({key:t},fe(e)))))))};t.default=t.Form},function(e,t){e.exports=require("@vulcanjs/core")},function(e,t){e.exports=require("lodash/cloneDeep")},function(e,t){e.exports=require("lodash/isObject")},function(e,t){e.exports=require("lodash/mapValues")},function(e,t){e.exports=require("lodash/omitBy")},function(e,t){e.exports=require("lodash/pickBy")},function(e,t){e.exports=require("lodash/unset")},function(e,t){e.exports=require("lodash/update")},function(e,t){e.exports=require("lodash/without")},function(e,t){e.exports=require("lodash/isPlainObject")},function(e,t){e.exports=require("lodash/size")},function(e,t){e.exports=require("lodash/toPath")},function(e,t){e.exports=require("lodash/initial")},function(e,t){e.exports=require("lodash/fp/flow")},function(e,t){e.exports=require("lodash/takeRight")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getFieldGroups=t.getFieldNames=t.getLabel=void 0;const n=r(21),a=o(r(15)),l=o(r(9)),u=o(r(5)),s=o(r(11)),i=r(3),m=o(r(51)),c=o(r(52)),d=o(r(53)),f=o(r(54)),p=o(r(55)),b=o(r(16)),h=o(r(56)),y=r(4);t.getLabel=(e,t,r,o,n)=>{const a=e.name.toLowerCase(),l=i.formatLabel({intl:r,fieldName:o,collectionName:a,schema:t});if(n){return`${l} (${r.formatMessage({id:"locales."+n,defaultMessage:n})})`}return l};const F=(e,t,r,o)=>{const n=e.name.toLowerCase(),a=o.intlId||`${n}.${r}.${o.value}`;return t.formatMessage({id:a,defaultMessage:o.label})};t.getFieldNames=(e,t,r)=>{const{fields:o,addFields:n,removeFields:l}=e,u=Object.assign(Object.assign({},{excludeHiddenFields:!0,excludeRemovedFields:!0,replaceIntlFields:!1,addExtraFields:!1}),r),{schema:s,mutableFields:m,excludeRemovedFields:c,excludeHiddenFields:d,addExtraFields:h,replaceIntlFields:y}=u;let F=m;if(void 0!==o&&o.length>0&&(F=b.default(F,o)),c&&void 0!==l&&l.length>0&&(F=f.default(F,l)),h&&void 0!==n&&n.length>0&&(F=null==F?void 0:F.concat(n)),d){const r=t;F=p.default(F,t=>{const o=null==s?void 0:s[t].hidden;return"function"==typeof o?o({props:e,document:r}):o})}return y&&(F=null==F?void 0:F.map(e=>i.isIntlField(null==s?void 0:s[e])?e+"_intl":e)),F=a.default(F),F};const g=(e,r,o,a,l)=>{const{model:m}=e,{currentDocument:c,flatSchema:d}=r,f=u.default(l,"type.0.type")===Array;let p=Object.assign(Object.assign({},s.default(l,n.formProperties)),{name:a,datatype:l.type,layout:e.layout,input:l.input||l.control});if(f){const e=r.originalSchema[a+".$"];p.itemDatatype=u.default(e,"type.0.type")}p.label=t.getLabel(m,d,o,a),p.intlKeys=i.getIntlKeys(a);const b=c;p.document=b,p.options&&Array.isArray(p.options)&&(p.options=p.options.map(e=>Object.assign(Object.assign({},e),{label:F(m,o,a,e)}))),i.isIntlField(l)&&(p.intlInput=!0);const h=l.form||l.inputProperties||{};for(const t in h){const r=h[t];p[t]="function"==typeof r?r.call(l,Object.assign(Object.assign({},e),{fieldName:a,document:b,intl:o})):r}const y=((e,t,r,o)=>{const n=e.name.toLowerCase();return i.getIntlLabel({intl:r,fieldName:o,collectionName:n,schema:t,isDescription:!0})||null})(m,d,o,a);return y&&(p.help=y),p},v=(e,t,r)=>{const o=r?`${r}.${t}`:t;return e.path=o,e},C=(e,t,r)=>(r.includes(t)||(e.disabled=!0),e),_=(e,r,o,n,a,l,u,s)=>{const i=a[n];let m=g(e,r,o,n,i);return m=v(m,n,s),m=((e,t)=>(t&&(e.parentFieldName=t),e))(m,u),m=C(m,n,l),m=((e,r,o,n,a,l,u,s)=>{const{currentDocument:i}=r;return l.arrayFieldSchema&&(n.arrayFieldSchema=l.arrayFieldSchema,n.arrayField=O(e,r,o,a,n.arrayFieldSchema,u,s)),l.schema&&(n.nestedSchema=l.schema,n.nestedInput=!0,n.nestedFields=t.getFieldNames(e,i,{schema:n.nestedSchema,addExtraFields:!1}).map(t=>_(e,r,o,t,n.nestedSchema,s,a,n.path))),n})(e,r,o,m,n,i,a,l),m},O=(e,t,r,o,n,a,l)=>{let u=g(e,t,r,o+".$",n);return u=v(u,o),u=C(u,o,l),u};t.getFieldGroups=(e,r,o,n,a)=>{const{schema:u,currentDocument:s}=r;let i=t.getFieldNames(e,s,{mutableFields:n,schema:u}).map(t=>_(e,r,o,t,u,n));i=c.default(i,"order");let f=l.default(d.default(m.default(i,"group"),e=>e?e.name:"")).map(e=>{const t=e.label||y.capitalize(e.name),r=h.default(i,t=>t.group&&t.group.name===e.name);return Object.assign(Object.assign({},e),{label:t,fields:r})});const p=h.default(i,e=>!e.group);if(p.length){f=[{name:"default",label:"default",order:0,fields:p}].concat(f)}return f=c.default(f,"order"),f}},function(e,t){e.exports=require("lodash/map")},function(e,t){e.exports=require("lodash/sortBy")},function(e,t){e.exports=require("lodash/uniqBy")},function(e,t){e.exports=require("lodash/difference")},function(e,t){e.exports=require("lodash/reject")},function(e,t){e.exports=require("lodash/filter")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isNotSameDocument=void 0;const n=o(r(22)),a=o(r(58));t.isNotSameDocument=(e,t)=>void 0!==n.default(t,(t,r,o)=>!a.default(t,e[r],(e,t)=>{if(!e&&!t)return!0}))},function(e,t){e.exports=require("lodash/isEqualWith")},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||o(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(60),t)},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useWarnOnUnsaved=void 0;const n=r(61),a=o(r(14)),l=r(3),u=a.default("vn:route-transitions");t.useWarnOnUnsaved=({isChanged:e,warnUnsavedChanges:t})=>{const r=l.useIntlContext();n.useBlockTransition({shouldBlock:!(!t||!e),getBlockedMessage:e=>{u("running handlePageLeave",e);return r.formatMessage({id:"forms.confirm_discard",defaultMessage:"Are you sure you want to discard your changes?"})}})}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useBlockTransition=void 0;const n=r(0),a=r(62),l=o(r(14)).default("vn:router-transitions");t.useBlockTransition=({shouldBlock:e,getBlockedMessage:t})=>{const r=n.useRef();n.useEffect(()=>{const o=!!r.current;l("running effect","should block",e,"currently blocked",o);const n=()=>{l("running unblock from effect"),e||r.current&&r.current()},u=e=>{const r=t(e);return l("user is being blocked after trying to leave the page, with message: "+r),e&&(e.returnValue=r),r};e&&(l("should block transition, setting up relevant event listener"),r.current=a.block(u,n)),!e&&o&&(l("should unblock (state has been reinitialized)"),r.current&&r.current())},[e])}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.block=t.UNBLOCK_TRANSITION_EVENT_TYPE=t.BLOCK_TRANSITION_EVENT_TYPE=void 0;const n=o(r(14)).default("vn:route-transition");function a(e){e.preventDefault(),e.returnValue=""}t.BLOCK_TRANSITION_EVENT_TYPE="blocktransition",t.UNBLOCK_TRANSITION_EVENT_TYPE="unblocktransition";t.block=(e,r)=>{n("running block function");const o=new Event(t.BLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(o),"42".addEventListener("beforeunload",a),"42".addEventListener("beforeunload",e);return()=>{n("running unblock function"),r&&(n("running user defined function"),r());const o=new Event(t.UNBLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(o),"42".removeEventListener("beforeunload",a),"42".removeEventListener("beforeunload",e),"42".onbeforeunload=void 0}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,r){"use strict";var o=this&&this.__rest||function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanComponentsProvider=void 0;const a=n(r(0)),l=r(65),u=r(10);t.VulcanComponentsProvider=e=>{var{value:t}=e,r=o(e,["value"]);return a.default.createElement(u.VulcanComponentsContext.Provider,Object.assign({value:Object.assign(Object.assign({},l.defaultVulcanComponents),t||{})},r))}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.defaultVulcanComponents=void 0;const n=r(3),a=r(66),l=o(r(67)),u=r(68),s=r(71),i=r(72),m=r(73),c=r(75),d=r(76),f=r(77),p=r(78),b=r(79),h=r(80),y=r(81),F=r(82),g=r(83),v=r(84),C=r(85),_=r(17),O=r(86),j=r(87),E={Loading:r(88).Loading,FormattedMessage:n.FormattedMessage,Alert:()=>null,Button:j.Button,Icon:()=>null},P={FormError:a.FormError,FormComponentDefault:O.FormComponentDefault,FormComponentPassword:O.FormComponentPassword,FormComponentNumber:O.FormComponentNumber,FormComponentUrl:O.FormComponentUrl,FormComponentEmail:O.FormComponentEmail,FormComponentTextarea:O.FormComponentTextarea,FormComponentCheckbox:O.FormComponentCheckbox,FormComponentCheckboxGroup:O.FormComponentCheckboxGroup,FormComponentRadioGroup:O.FormComponentRadioGroup,FormComponentSelect:O.FormComponentSelect,FormComponentSelectMultiple:O.FormComponentSelectMultiple,FormComponentDateTime:O.FormComponentDateTime,FormComponentDate:O.FormComponentDate,FormComponentTime:O.FormComponentTime,FormComponentStaticText:O.FormComponentStaticText,FormComponentLikert:O.FormComponentLikert,FormComponentAutocomplete:O.FormComponentAutocomplete,FormComponentMultiAutocomplete:O.FormComponentMultiAutocomplete,FormComponent:l.default,FormComponentInner:u.FormComponentInner,FormComponentLoader:s.FormComponentLoader,FormElement:i.FormElement,FormGroup:m.FormGroup,FormGroupLayout:m.FormGroupLayout,FormGroupHeader:m.FormGroupHeader,FormIntl:c.FormIntl,FormIntlItemLayout:c.FormIntlItemLayout,FormIntlLayout:c.FormIntlLayout,FieldErrors:g.FieldErrors,FormErrors:d.FormErrors,FormSubmit:f.FormSubmit,FormLayout:p.FormLayout,FormNestedArray:b.FormNestedArray,FormNestedArrayInnerLayout:b.FormNestedArrayInnerLayout,FormNestedArrayLayout:h.FormNestedArrayLayout,FormNestedItem:y.FormNestedItem,IconAdd:b.IconAdd,IconRemove:b.IconRemove,FormNestedDivider:F.FormNestedDivider,FormNestedItemLayout:y.FormNestedItemLayout,FormNestedObjectLayout:v.FormNestedObjectLayout,FormNestedObject:v.FormNestedObject,FormOptionLabel:C.FormOptionLabel,Form:_.Form};t.defaultVulcanComponents=Object.assign(Object.assign({},E),P)},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormError=void 0;const n=o(r(0)),a=o(r(5)),l=r(1),u=r(2);t.FormError=({error:e,errorContext:t})=>{const r=l.useVulcanComponents(),{getLabel:o}=u.useFormContext(),s=JSON.stringify(e.message||e);let i={id:e.id||"app.defaultError",defaultMessage:s,values:{errorContext:t,defaultMessage:s}};if(e.properties){const t=e.properties.name&&e.properties.name.split(".").slice(-1)[0];i.values=Object.assign(Object.assign(Object.assign({},i.values),{label:t&&o(t,e.properties.locale)}),e.properties)}e.data&&(i.values=Object.assign(Object.assign({},i.values),e.data));const m=a.default(e,"extensions.exception");return m&&(i=Object.assign(Object.assign({},i),{id:m.id,values:m.data})),n.default.createElement(r.FormattedMessage,Object.assign({html:!0},i))},t.FormError.defaultProps={errorContext:""}},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormComponent=void 0;const u=a(r(0)),s=l(r(5)),i=l(r(24)),m=r(13),c=r(1),d=r(25),f=r(2),p=(e,t)=>{const r=e&&e.length?e.length:0;return{charsRemaining:t-r,charsCount:r}},b=({intlInput:e,path:t})=>e?t+"_intl":t,h=(e,t)=>t||d.getAutoInputFromType(e),y=({type:e,input:t,FormComponents:r})=>{if("function"==typeof t){return t}{const o=h(e,t);switch(o){case"text":return r.FormComponentDefault;case"password":return r.FormComponentPassword;case"number":return r.FormComponentNumber;case"url":return r.FormComponentUrl;case"email":return r.FormComponentEmail;case"textarea":return r.FormComponentTextarea;case"checkbox":return r.FormComponentCheckbox;case"checkboxgroup":return r.FormComponentCheckboxGroup;case"radiogroup":return r.FormComponentRadioGroup;case"select":return r.FormComponentSelect;case"selectmultiple":return r.FormComponentSelectMultiple;case"datetime":return r.FormComponentDateTime;case"date":return r.FormComponentDate;case"time":return r.FormComponentTime;case"statictext":return r.FormComponentStaticText;case"likert":return r.FormComponentLikert;case"autocomplete":return r.FormComponentAutocomplete;case"multiautocomplete":return r.FormComponentMultiAutocomplete;default:throw new Error(`Input name "${o}" is not a standard Vulcan form input (type: ${e}, input: ${t})`)}}};t.FormComponent=e=>{const{locale:t,max:r,path:o,datatype:n,input:a,intlInput:l,nestedInput:d,query:F,options:g}=e,{updateCurrentValues:v,deletedValues:C,clearFieldErrors:_}=f.useFormContext(),O=n,j=(({document:e,max:t,intlInput:r,path:o})=>{if(!t)return null;const n=b({intlInput:r,path:o}),a=null==e?void 0:e[n],l=a&&"object"==typeof a?a.value:a;return p(l,t)})(e),[E,P]=u.useState(j),x=e=>{if(!r)throw new Error("Cannot update character count when no max value is set.");P(p(e,r))};u.useEffect(()=>{j&&P(j)},[null==j?void 0:j.charsCount,null==j?void 0:j.charsRemaining]);let D=!1,N=null;"string"==typeof a&&(N=h(O,a),D=!(void 0===r||!N||!["url","email","textarea","text"].includes(N)));const I=()=>{const{locale:t,defaultValue:r,formType:o,datatype:n}=e,a=t?b(e)+".value":b(e),l=e.document;let u=s.default(l,a);const i=t?"":m.getNullValue(n);return C.includes(a)?u=i:m.isEmptyValue(u)&&(u="new"===o&&r?r:i),u},M=t=>(t=t||e.errors||[]).filter(e=>e.path&&e.path.includes(o)),w=c.useVulcanComponents();if(l)return u.default.createElement(w.FormIntl,Object.assign({},e));if(!a&&d){if((e=>e===Array)(O))return u.default.createElement(w.FormNestedArray,Object.assign({},e,{formComponents:w,errors:M(),value:I()}));if((e=>e instanceof i.default)(O))return u.default.createElement(w.FormNestedObject,Object.assign({},e,{formComponents:w,errors:M(),value:I()}))}const k=Object.assign(Object.assign(Object.assign({},e),E||{}),{inputType:h(O,a),value:I(),errors:M(),showCharsRemaining:!!D,handleChange:r=>{if(""===r&&(r=null),O===Number&&null!=r?r=Number(r):O===i.default.Integer&&null!=r&&(r=parseInt(r)),r!==I()){const o=t?{locale:t,value:r}:r;v({[b(e)]:o}),_(b(e))}D&&x(r)},clearField:e=>{e.preventDefault(),e.stopPropagation(),v({[o]:null}),D&&x(null)},formInput:y({FormComponents:w,input:a,type:O})});F||"function"!=typeof g||(k.options=g(k));const S=u.default.createElement(w.FormComponentInner,Object.assign({},k));return F?u.default.createElement(w.FormComponentLoader,Object.assign({},k),S):S},t.formComponentsDependencies=["FormComponentDefault","FormComponentPassword","FormComponentNumber","FormComponentUrl","FormComponentEmail","FormComponentTextarea","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentDateTime","FormComponentDate","FormComponentDate2","FormComponentTime","FormComponentStaticText","FormComponentLikert","FormComponentAutocomplete","FormComponentMultiAutocomplete"],t.default=t.FormComponent},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentInner=void 0;const n=o(r(0)),a=r(3),l=r(69),u=o(r(70)),s=r(25),i=r(1);t.FormComponentInner=e=>{const t=a.useIntlContext(),{inputType:r,disabled:o,clearField:m}=e,{inputClassName:c,name:d,input:f,beforeComponent:p,afterComponent:b,errors:h,showCharsRemaining:y,charsRemaining:F,renderComponent:g,formInput:v}=e,C=i.useVulcanComponents(),_=h&&h.length,O="function"==typeof f?f.name:r,j=u.default("form-input",c,"input-"+d,"form-component-"+(O||"default"),{"input-error":_}),E=(()=>{const{handleChange:t,inputType:r,itemProperties:o,help:n,description:a,loading:u,submitForm:s,formComponents:i,intlKeys:m}=e;return Object.assign(Object.assign({},e),{inputProperties:Object.assign(Object.assign({},l.whitelistInputProps(e)),{onChange:e=>{const o="checkbox"===r?e.target.checked:e.target.value;t&&t(o)}}),itemProperties:Object.assign(Object.assign({},o),{intlKeys:m,Components:i,description:a||n,loading:u})})})(),P=v;return n.default.createElement("div",{className:j},n.default.createElement(P,Object.assign({},E)),_?n.default.createElement(C.FieldErrors,{errors:h}):null,(()=>{if(s.clearableInputs.includes(r)&&!o)return n.default.createElement("button",{className:"form-component-clear",title:t.formatMessage({id:"forms.clear_field"}),onClick:m},n.default.createElement("span",null,"✕"))})(),y&&n.default.createElement("div",{className:u.default("form-control-limit",{danger:F<10})},F))}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.whitelistInputProps=t.getHtmlInputProps=void 0;const n=o(r(11));t.getHtmlInputProps=e=>{const{name:t,path:r,options:o,label:n,onChange:a,onBlur:l,value:u,disabled:s}=e,i=Object.assign(Object.assign({},e.inputProperties),{name:t,path:r,options:o,label:n,onChange:a,onBlur:l,value:u,disabled:s});return Object.assign(Object.assign({},e),{inputProperties:i})};t.whitelistInputProps=e=>n.default(e,["name","path","options","label","onChange","onBlur","value","disabled","placeholder"])},function(e,t){e.exports=require("classnames")},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentLoader=void 0;const u=a(r(0)),s=r(8),i=l(r(20)),m=r(1);t.FormComponentLoader=e=>{const t=m.useVulcanComponents(),{query:r,children:o,options:n,value:a,queryWaitsForValue:l}=e,c="function"==typeof r?r({value:a}):r,[d,{loading:f,error:p,data:b}]=s.useLazyQuery(s.gql(c)),h=i.default(a)||0===(Array.isArray(a)&&a.length);if(u.useEffect(()=>{l&&h||d({variables:{value:a}})},[h,a,l]),p)throw new Error(p.toString());if(f)return u.default.createElement("div",{className:"form-component-loader"},u.default.createElement(t.Loading,null));const y={data:b,queryData:b,queryError:p,loading:f};if("function"==typeof n&&(y.optionsFunction=n,y.options=n.call({},Object.assign(Object.assign({},e),{data:b}))),!u.default.isValidElement(o))throw new Error("Children of FormComponentLoader must be a React element, got "+o);const F=u.default.cloneElement(o,y);return u.default.createElement("div",{className:"form-component-loader"},F)},t.FormComponentLoader.propTypes={}},function(e,t,r){"use strict";var o=this&&this.__rest||function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormElement=void 0;const a=n(r(0)),l=r(2);t.FormElement=a.default.forwardRef((e,t)=>{var{children:r}=e,n=o(e,["children"]);const{submitForm:u}=l.useFormContext();return a.default.createElement("form",Object.assign({},n,{onSubmit:u,ref:t}),r)})},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t},l=this&&this.__rest||function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormGroup=t.FormGroupHeader=t.FormGroupLayout=void 0;const s=a(r(0)),i=u(r(74)),m=r(12),c=r(1),d=r(2);t.FormGroupLayout=e=>{var{anchorName:t,collapsed:r,hasErrors:o,group:n,document:a,toggle:u}=e,i=l(e,["anchorName","collapsed","hasErrors","group","document","toggle"]);return s.default.createElement("fieldset",Object.assign({},i))};t.FormGroupHeader=e=>s.default.createElement("h2",Object.assign({},e));t.FormGroup=e=>{const{name:t,label:r,group:o,fields:n,hidden:a,document:l,currentUser:u,disabled:f,itemProperties:p,prefilledProps:b,formType:h}=e,{errors:y,clearFieldErrors:F}=d.useFormContext(),[g,v]=s.useState(o.startCollapsed||!1),C=()=>v(e=>!e),_=i.default(n,e=>!!y.filter(t=>t.path===e.path).length),O=c.useVulcanComponents(),j="function"==typeof a?a(Object.assign(Object.assign({},e),{document:l})):a||!1,E=s.default.createElement(O.FormGroupHeader,{toggle:C,label:r,collapsed:g,hidden:j,group:o});if(o.adminsOnly&&!m.isAdmin(u))return null;const P=t.split(".").length>1?t.split(".")[1]:t;return s.default.createElement(O.FormGroupLayout,{label:r,anchorName:P,toggle:C,collapsed:g,hidden:j,group:o,heading:"default"===t?null:E,hasErrors:_,document:l},n.map(e=>s.default.createElement(O.FormComponent,Object.assign({key:e.name,disabled:f},e,{document:l,itemProperties:Object.assign(Object.assign({},p),e.itemProperties),clearFieldErrors:F,formType:h,currentUser:u,prefilledProps:b}))))},t.default=t.FormGroup},function(e,t){e.exports=require("lodash/some")},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormIntl=t.FormIntlItemLayout=t.FormIntlLayout=void 0;const n=o(r(0)),a=o(r(7)),l=r(1),u=r(2),s=[];t.FormIntlLayout=({children:e})=>n.default.createElement("div",{className:"form-intl"},e);t.FormIntlItemLayout=({locale:e,children:t})=>n.default.createElement("div",{className:"form-intl-"+e.id},t);t.FormIntl=e=>{const t=l.useVulcanComponents(),{getLabel:r}=u.useFormContext(),{name:o}=e,i=a.default(e,"value","inputProperties","intlInput","nestedInput");return n.default.createElement(t.FormIntlLayout,null,s.map((a,l)=>{return n.default.createElement(t.FormIntlItemLayout,{key:a.id,locale:a},n.default.createElement(t.FormComponent,Object.assign({},i,{label:r(o,a.id),path:(u=l,`${e.path}_intl.${u}`),locale:a.id})));var u}))}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormErrors=void 0;const n=o(r(0)),a=r(2),l=r(1);t.FormErrors=()=>{const e=l.useVulcanComponents(),{errors:t}=a.useFormContext();return n.default.createElement("div",{className:"form-errors"},!!t.length&&n.default.createElement(e.Alert,{className:"flash-message",variant:"danger"},n.default.createElement("ul",null,t.map((t,r)=>n.default.createElement("li",{key:r},n.default.createElement(e.FormError,{error:t,errorContext:"form"}))))))}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormSubmit=void 0;const n=o(r(0)),a=o(r(6)),l=r(12),u=r(1),s=r(2);t.FormSubmit=({submitLabel:e,cancelLabel:t,cancelCallback:r,revertLabel:o,revertCallback:a,document:i,deleteDocument:m,model:c,currentUser:d})=>{const f=u.useVulcanComponents(),{clearForm:p}=s.useFormContext();return n.default.createElement("div",{className:"form-submit"},n.default.createElement(f.Button,{type:"submit",variant:"primary"},e||n.default.createElement(f.FormattedMessage,{id:"forms.submit",defaultMessage:"Submit"})),r?n.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),r(i)}},t||n.default.createElement(f.FormattedMessage,{id:"forms.cancel",defaultMessage:"Cancel"})):null,a?n.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),p(),a(i)}},o||n.default.createElement(f.FormattedMessage,{id:"forms.revert",defaultMessage:"Revert"})):null,m&&l.canDeleteDocument({user:d,document:i,model:c})?n.default.createElement("div",null,n.default.createElement("hr",null),n.default.createElement(f.Button,{variant:"link",onClick:m,className:`delete-link ${c.name}-delete-link`},n.default.createElement(f.Icon,{name:"close"})," ",n.default.createElement(f.FormattedMessage,{id:"forms.delete",defaultMessage:"Delete"}))):null)},t.FormSubmit.propTypes={submitLabel:a.default.node,cancelLabel:a.default.node,cancelCallback:a.default.func,revertLabel:a.default.node,revertCallback:a.default.func,document:a.default.object,deleteDocument:a.default.func,collectionName:a.default.string,classes:a.default.object}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormLayout=void 0;const n=o(r(0)),a=r(1);t.FormLayout=({commonProps:e,formProps:t,repeatErrors:r,submitProps:o,children:l})=>{const u=a.useVulcanComponents();return n.default.createElement(u.FormElement,Object.assign({},t),n.default.createElement(u.FormErrors,Object.assign({},e)),l,r&&n.default.createElement(u.FormErrors,Object.assign({},e)),n.default.createElement(u.FormSubmit,Object.assign({},e,o)))},t.formComponentsDependencies=["FormErrors","FormSubmit","FormElement"]},function(e,t,r){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return n(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.IconRemove=t.IconAdd=t.formComponentsDependencies=t.FormNestedArray=t.FormNestedArrayInnerLayout=void 0;const u=a(r(0)),s=l(r(7)),i=l(r(5)),m=r(2),c=r(1);t.FormNestedArrayInnerLayout=e=>{const{label:t,children:r,addItem:o,BeforeComponent:n,AfterComponent:a}=e,l=c.useVulcanComponents();return u.default.createElement("div",{className:"form-nested-array-inner-layout"},u.default.createElement(n,Object.assign({},e)),r,u.default.createElement(l.FormNestedDivider,{label:t,addItem:o}),u.default.createElement(a,Object.assign({},e)))};t.FormNestedArray=e=>{const{updateCurrentValues:t,deletedValues:r,errors:o}=m.useFormContext(),n=e.value||[],a=()=>{const{prefilledProps:r,path:o}=e;t({[`${o}.${n.length}`]:i.default(r,o+".$")||{}},{mode:"merge"})},l=t=>r.includes(`${e.path}.${t}`);u.useEffect(()=>{e.itemProperties.openNested&&a()},[]);const d=(e=>{let t=0;return e.map((e,r)=>l(r)?0:(t+=1,t))})(n),f=Object.assign({},s.default(e,"value","input","inputProperties","nestedInput","beforeComponent","afterComponent")),{path:p,minCount:b,maxCount:h,arrayField:y}=e,F=c.useVulcanComponents();let g=n.filter(e=>null!=e).length;return f.addItem=!h||g<h?a:null,f.nestedArrayErrors=o.filter(e=>e.path&&e.path===p),f.hasErrors=!(!f.nestedArrayErrors||!f.nestedArrayErrors.length),u.default.createElement(F.FormNestedArrayLayout,Object.assign({},f),n.map((r,o)=>{if(l(o))return null;const n=`${e.path}.${o}`,s=d[o];return u.default.createElement(F.FormNestedArrayInnerLayout,Object.assign({},y,{key:n,addItem:a,itemIndex:o,visibleItemIndex:s,path:n}),u.default.createElement(F.FormNestedItem,Object.assign({},f,{itemIndex:o,visibleItemIndex:s,path:n,removeItem:()=>{var r;r=o,t({[`${e.path}.${r}`]:null})},hideRemove:!!b&&g<=b})))}))},t.formComponentsDependencies=["FormNestedArrayInnerLayout","FormNestedArrayLayout"],t.default=t.FormNestedArray;t.IconAdd=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M448 294.2v-76.4c0-13.3-10.7-24-24-24H286.2V56c0-13.3-10.7-24-24-24h-76.4c-13.3 0-24 10.7-24 24v137.8H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h137.8V456c0 13.3 10.7 24 24 24h76.4c13.3 0 24-10.7 24-24V318.2H424c13.3 0 24-10.7 24-24z"}));t.IconRemove=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M424 318.2c13.3 0 24-10.7 24-24v-76.4c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h400z"}))},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedArrayLayout=void 0;const n=o(r(6)),a=o(r(0)),l=r(1);t.FormNestedArrayLayout=e=>{const{hasErrors:t,nestedArrayErrors:r,label:o,addItem:n,BeforeComponent:u,AfterComponent:s,children:i}=e,m=l.useVulcanComponents();return a.default.createElement("div",{className:"form-group row form-nested "+(t?"input-error":"")},u&&a.default.createElement(u,Object.assign({},e)),a.default.createElement("label",{className:"control-label col-sm-3"},o),a.default.createElement("div",{className:"col-sm-9"},i,n&&a.default.createElement(m.Button,{className:"form-nested-button form-nested-add",size:"sm",variant:"success",onClick:n},a.default.createElement(m.IconAdd,{height:12,width:12})),e.hasErrors?a.default.createElement(m.FieldErrors,{key:"form-nested-errors",errors:r}):null),s&&a.default.createElement(s,Object.assign({},e)))},t.FormNestedArrayLayout.propTypes={hasErrors:n.default.bool.isRequired,nestedArrayErrors:n.default.array,label:n.default.node,hideLabel:n.default.bool,addItem:n.default.func,beforeComponent:n.default.node,afterComponent:n.default.node,formComponents:n.default.object,children:n.default.node},t.default=t.FormNestedArrayLayout},function(e,t,r){"use strict";var o=this&&this.__rest||function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedItem=t.FormNestedItemLayout=void 0;const a=n(r(0)),l=n(r(6)),u=r(3),s=r(1),i=r(3);t.FormNestedItemLayout=({content:e,removeButton:t})=>a.default.createElement("div",{className:"form-nested-item"},a.default.createElement("div",{className:"form-nested-item-inner"},e),t&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},t),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]),t.FormNestedItemLayout.propTypes={content:l.default.node.isRequired,removeButton:l.default.node};t.FormNestedItem=e=>{var{nestedFields:t,name:r,path:n,removeItem:l,itemIndex:u,formComponents:m,hideRemove:c,label:d}=e,f=o(e,["nestedFields","name","path","removeItem","itemIndex","formComponents","hideRemove","label"]);const p=s.useVulcanComponents(),b=i.useIntlContext(),h=void 0!==u;return a.default.createElement(p.FormNestedItemLayout,{content:t.map((e,t)=>a.default.createElement(p.FormComponent,Object.assign({key:t},f,e,{path:`${n}.${e.name}`,itemIndex:u}))),removeButton:h&&!c&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},a.default.createElement(p.Button,{className:"form-nested-button",variant:"danger",size:"sm",iconButton:!0,tabIndex:-1,onClick:()=>{l(r)},"aria-label":b.formatMessage({id:"forms.delete_nested_field"},{label:d})},a.default.createElement(p.IconRemove,{height:12,width:12}))),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]})},t.FormNestedItem.propTypes={path:l.default.string.isRequired,itemIndex:l.default.number,formComponents:l.default.object,hideRemove:l.default.bool},t.FormNestedItem.contextTypes={errors:l.default.array,intl:u.intlShape}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedDivider=void 0;const n=o(r(0)),a=o(r(6));t.FormNestedDivider=({label:e,addItem:t})=>n.default.createElement("div",null),t.FormNestedDivider.propTypes={label:a.default.string,addItem:a.default.func}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FieldErrors=t.formComponentsDependencies=void 0;const n=o(r(0)),a=r(1);t.formComponentsDependencies=["FormError"];t.FieldErrors=({errors:e})=>{const t=a.useVulcanComponents();return n.default.createElement("ul",{className:"form-input-errors"},e.map((e,r)=>n.default.createElement("li",{key:r},n.default.createElement(t.FormError,{error:e,errorContext:"field"}))))}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedObject=t.FormNestedObjectLayout=void 0;const n=o(r(0)),a=o(r(6)),l=o(r(7)),u=r(1),s=r(2);t.FormNestedObjectLayout=({hasErrors:e,label:t,content:r})=>n.default.createElement("div",{className:"form-group row form-nested "+(e?"input-error":"")},n.default.createElement("label",{className:"control-label col-sm-3"},t),n.default.createElement("div",{className:"col-sm-9"},r)),t.FormNestedObjectLayout.propTypes={hasErrors:a.default.oneOfType([a.default.number,a.default.bool]),label:a.default.node,content:a.default.node};t.FormNestedObject=e=>{const t=u.useVulcanComponents(),r=l.default(e,"value","input","inputProperties","nestedInput"),{errors:o}=s.useFormContext(),a=o.filter(t=>t.path&&t.path===e.path),i=a&&a.length;return n.default.createElement(t.FormNestedObjectLayout,{hasErrors:i,label:e.label,content:[n.default.createElement(t.FormNestedItem,Object.assign({key:"form-nested-item"},r,{path:""+e.path})),i?n.default.createElement(t.FieldErrors,{key:"form-nested-errors",errors:a}):null]})},t.FormNestedObject.propTypes={currentValues:a.default.object,path:a.default.string,label:a.default.string,errors:a.default.array.isRequired,formComponents:a.default.object},t.default=t.FormNestedObject},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormOptionLabel=void 0;const n=o(r(0));t.FormOptionLabel=({option:e})=>{const{label:t}=e;return n.default.createElement("span",{className:"form-option-label"},t)}},function(e,t,r){"use strict";var o=this&&this.__rest||function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentMultiAutocomplete=t.FormComponentAutocomplete=t.FormComponentLikert=t.FormComponentStaticText=t.FormComponentTime=t.FormComponentDateTime=t.FormComponentDate=t.FormComponentSelectMultiple=t.FormComponentSelect=t.FormComponentRadioGroup=t.FormComponentCheckboxGroup=t.FormComponentCheckbox=t.FormComponentTextarea=t.FormComponentEmail=t.FormComponentUrl=t.FormComponentNumber=t.FormComponentPassword=t.FormComponentDefault=void 0;const a=n(r(0)),l=r(1),u=e=>{const{inputProperties:t}=e,{label:r,name:n}=t,l=o(t,["label","name"]);return a.default.createElement("div",null,a.default.createElement("label",{htmlFor:n},r),a.default.createElement("input",Object.assign({},l,{id:n,name:n,type:e.type})))},s=e=>{const{inputProperties:t,options:r=[]}=e,{label:o,name:n}=t;if(!Array.isArray(r))throw new Error("HTMLSelectAdapater not yet supporting functional options");return a.default.createElement("div",null,a.default.createElement("label",{htmlFor:n},o),a.default.createElement("select",Object.assign({},t),r.map(({label:e,value:t})=>a.default.createElement("option",{key:t,label:e,value:t}))))};t.FormComponentDefault=e=>a.default.createElement(u,Object.assign({type:"text"},e));t.FormComponentPassword=e=>a.default.createElement(u,Object.assign({type:"password"},e));t.FormComponentNumber=e=>a.default.createElement(u,Object.assign({type:"number"},e));t.FormComponentUrl=e=>a.default.createElement(u,Object.assign({type:"url"},e));t.FormComponentEmail=e=>a.default.createElement(u,Object.assign({type:"email"},e));t.FormComponentTextarea=e=>a.default.createElement("textarea",Object.assign({},e));t.FormComponentCheckbox=e=>a.default.createElement(u,Object.assign({type:"checkbox"},e));t.FormComponentCheckboxGroup=e=>a.default.createElement(u,Object.assign({},e));t.FormComponentRadioGroup=e=>a.default.createElement(u,Object.assign({},e));t.FormComponentSelect=e=>a.default.createElement(s,Object.assign({},e));t.FormComponentSelectMultiple=e=>{const t=l.useVulcanComponents();return a.default.createElement(t.FormComponentSelect,Object.assign({multiple:!0},e))};t.FormComponentDate=e=>a.default.createElement(u,Object.assign({type:"date"},e));t.FormComponentDateTime=e=>a.default.createElement(u,Object.assign({type:"datetime-local"},e));t.FormComponentTime=e=>a.default.createElement(u,Object.assign({type:"time"},e));t.FormComponentStaticText=e=>a.default.createElement("input",Object.assign({disabled:!0},e));t.FormComponentLikert=e=>"Likert component not yet implemented";t.FormComponentAutocomplete=e=>"Autocomplete component not yet implemented";t.FormComponentMultiAutocomplete=e=>"MultiAutocomplete component not yet implemented"},function(e,t,r){"use strict";var o=this&&this.__rest||function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Button=void 0;const a=n(r(0));t.Button=e=>{var{children:t}=e,r=o(e,["children"]);return a.default.createElement("button",Object.assign({},r),t)}},function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Loading=void 0;const n=o(r(0));t.Loading=()=>n.default.createElement("span",{"aria-live":"polite","aria-busy":"true"},"Loading...")}]);
6
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db250ZXh0LnRzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAdnVsY2FuanMvaTE4blwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy91dGlsc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9nZXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwcm9wLXR5cGVzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL29taXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAYXBvbGxvL2NsaWVudFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9jb21wYWN0XCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL1Z1bGNhbkNvbXBvbmVudHMvQ29udGV4dC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcGlja1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImRlYnVnXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VuaXFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL21lcmdlXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NldFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pc0VtcHR5XCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL21vZHVsZXMvc2NoZW1hX3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9maW5kXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL21vZHVsZXMvcGF0aF91dGlscy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJzaW1wbC1zY2hlbWFcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5wdXRzL2NvbnN0cy50cyIsIndlYnBhY2s6Ly8vLi9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db250YWluZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL2Zvcm1GcmFnbWVudHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL3NjaGVtYVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9ncmFwaHFsXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiQHZ1bGNhbmpzL3JlYWN0LWhvb2tzXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL1Z1bGNhbkNvbXBvbmVudHMvRHVtbXkudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtL0Zvcm0udHN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9jb3JlXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2Nsb25lRGVlcFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pc09iamVjdFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9tYXBWYWx1ZXNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvb21pdEJ5XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3BpY2tCeVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC91bnNldFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC91cGRhdGVcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvd2l0aG91dFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pc1BsYWluT2JqZWN0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NpemVcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvdG9QYXRoXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2luaXRpYWxcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZnAvZmxvd1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC90YWtlUmlnaHRcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybS9maWVsZHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL21hcFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9zb3J0QnlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvdW5pcUJ5XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2RpZmZlcmVuY2VcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcmVqZWN0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2ZpbHRlclwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtL3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pc0VxdWFsV2l0aFwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS91c2VXYXJuT25VbnNhdmVkL2luZGV4LnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS91c2VXYXJuT25VbnNhdmVkL3VzZVdhcm5PblVuc2F2ZWQudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL3VzZUJsb2NrVHJhbnNpdGlvbi91c2VCbG9ja1RyYW5zaXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL3VzZUJsb2NrVHJhbnNpdGlvbi9ibG9jay50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vVnVsY2FuQ29tcG9uZW50cy9Qcm92aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL1Z1bGNhbkNvbXBvbmVudHMvZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1FcnJvci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db21wb25lbnQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50SW5uZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS91aV91dGlscy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJjbGFzc25hbWVzXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db21wb25lbnRMb2FkZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtRWxlbWVudC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Hcm91cC50c3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3NvbWVcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUludGwudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtRXJyb3JzLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybVN1Ym1pdC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1MYXlvdXQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkQXJyYXkudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkQXJyYXlMYXlvdXQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkSXRlbS50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1OZXN0ZWREaXZpZGVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRmllbGRFcnJvcnMudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkT2JqZWN0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU9wdGlvbkxhYmVsLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vaW5wdXRzL0Jhc2ljSW5wdXRzLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vY29yZS9CdXR0b24udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9jb3JlL0xvYWRpbmcudHN4Il0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIlZ1bGNhbkNvbXBvbmVudHNDb25zdW1lciIsIlZ1bGNhbkNvbXBvbmVudHNDb250ZXh0IiwiQ29uc3VtZXIiLCJ1c2VWdWxjYW5Db21wb25lbnRzIiwidXNlQ29udGV4dCIsIndpdGhWdWxjYW5Db21wb25lbnRzIiwiQyIsInByb3BzIiwidnVsY2FuQ29tcG9uZW50cyIsImRlcHJlY2F0ZSIsIkZvcm1Db250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsInVzZUZvcm1Db250ZXh0IiwiZm9ybUNvbnRleHQiLCJFcnJvciIsIkFsZXJ0IiwiRHVtbXkiLCJCdXR0b24iLCJGaWVsZEVycm9ycyIsIkZvcm0iLCJGb3JtQ29tcG9uZW50IiwiRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZSIsIkZvcm1Db21wb25lbnRDaGVja2JveCIsIkZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwIiwiRm9ybUNvbXBvbmVudERhdGUiLCJGb3JtQ29tcG9uZW50RGF0ZVRpbWUiLCJGb3JtQ29tcG9uZW50RGVmYXVsdCIsIkZvcm1Db21wb25lbnRFbWFpbCIsIkZvcm1Db21wb25lbnRJbm5lciIsIkZvcm1Db21wb25lbnRMaWtlcnQiLCJGb3JtQ29tcG9uZW50TG9hZGVyIiwiRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlIiwiRm9ybUNvbXBvbmVudE51bWJlciIsIkZvcm1Db21wb25lbnRQYXNzd29yZCIsIkZvcm1Db21wb25lbnRSYWRpb0dyb3VwIiwiRm9ybUNvbXBvbmVudFNlbGVjdCIsIkZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZSIsIkZvcm1Db21wb25lbnRTdGF0aWNUZXh0IiwiRm9ybUNvbXBvbmVudFRleHRhcmVhIiwiRm9ybUNvbXBvbmVudFRpbWUiLCJGb3JtQ29tcG9uZW50VXJsIiwiRm9ybUVsZW1lbnQiLCJGb3JtRXJyb3IiLCJGb3JtRXJyb3JzIiwiRm9ybUdyb3VwIiwiRm9ybUdyb3VwSGVhZGVyIiwiRm9ybUdyb3VwTGF5b3V0IiwiRm9ybUludGwiLCJGb3JtSW50bEl0ZW1MYXlvdXQiLCJGb3JtSW50bExheW91dCIsIkZvcm1MYXlvdXQiLCJGb3JtTmVzdGVkQXJyYXkiLCJGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dCIsIkZvcm1OZXN0ZWRBcnJheUxheW91dCIsIkZvcm1OZXN0ZWREaXZpZGVyIiwiRm9ybU5lc3RlZEl0ZW0iLCJGb3JtTmVzdGVkSXRlbUxheW91dCIsIkZvcm1OZXN0ZWRPYmplY3QiLCJGb3JtTmVzdGVkT2JqZWN0TGF5b3V0IiwiRm9ybU9wdGlvbkxhYmVsIiwiRm9ybVN1Ym1pdCIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJJY29uIiwiSWNvbkFkZCIsIkljb25SZW1vdmUiLCJMb2FkaW5nIiwiZGVlcFZhbHVlIiwib2JqIiwicGF0aCIsInBhdGhBcnJheSIsInNwbGl0IiwibGVuZ3RoIiwiZmxhdHRlbiIsImRhdGEiLCJyZXN1bHQiLCJyZWN1cnNlIiwiY3VyIiwicHJvcCIsInRvU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiaXNFbXB0eSIsImlzRW1wdHlWYWx1ZSIsIm1lcmdlVmFsdWUiLCJjdXJyZW50VmFsdWUiLCJkb2N1bWVudFZhbHVlIiwiZGVsZXRlZFZhbHVlcyIsImRlbGV0ZWRGaWVsZHMiLCJsb2NhbGUiLCJkYXRhdHlwZSIsImdldE5lc3RlZERlbGV0ZWRWYWx1ZXMiLCJoYXNEZWxldGVkVmFsdWVzIiwiZ2V0RGVsZXRlZFZhbHVlcyIsImFjY3VtdWxhdG9yIiwicmVkdWNlIiwicHJlZml4IiwicmVtb3ZlUHJlZml4IiwiZmlsdGVyUGF0aHNCeVByZWZpeCIsImdldEZpZWxkVHlwZSIsImZpZWxkU2NoZW1hIiwidHlwZSIsImdldE51bGxWYWx1ZSIsImZpZWxkVHlwZSIsIkJvb2xlYW4iLCJTdHJpbmciLCJOdW1iZXIiLCJnZXRWYWxpZEZpZWxkcyIsInNjaGVtYSIsImtleXMiLCJmaWx0ZXIiLCJmaWVsZE5hbWUiLCJpbmNsdWRlcyIsImdldFJlYWRhYmxlRmllbGRzIiwiY2FuUmVhZCIsInZpZXdhYmxlQnkiLCJnZXRJbnNlcnRhYmxlRmllbGRzIiwidXNlciIsImZpZWxkIiwiY2FuQ3JlYXRlRmllbGQiLCJnZXRFZGl0YWJsZUZpZWxkcyIsImRvY3VtZW50IiwiY2FuVXBkYXRlRmllbGQiLCJjb252ZXJ0U2NoZW1hIiwib3B0aW9ucyIsInJlbW92ZUFycmF5cyIsImpzb25TY2hlbWEiLCJmb3JFYWNoIiwiZ2V0RmllbGRTY2hlbWEiLCJzdWJTY2hlbWFPclR5cGUiLCJnZXROZXN0ZWRGaWVsZFNjaGVtYU9yVHlwZSIsImFycmF5RmllbGRTY2hlbWEiLCJjb252ZXJ0ZWRTdWJTY2hlbWEiLCJpc1NpbXBsZUFycmF5RmllbGQiLCJzY2hlbWFQcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZSIsImdldFNjaGVtYVR5cGUiLCJnZXRPYmplY3ROZXN0ZWRTY2hlbWEiLCJpc05lc3RlZFNjaGVtYUZpZWxkIiwiYXJyYXlJdGVtU2NoZW1hIiwiZ2V0QXJyYXlOZXN0ZWRTY2hlbWEiLCJvYmplY3RJdGVtU2NoZW1hIiwiZm9ybVByb3BlcnRpZXMiLCJzcGxpdFBhdGgiLCJzdHJpbmciLCJqb2luUGF0aCIsImFycmF5IiwiaXRlbSIsImlzTmFOIiwiZ2V0UGFyZW50UGF0aCIsInBhdGhzIiwiZXhwbG9kZWRQcmVmaXgiLCJtYXAiLCJleHBsb2RlZFBhdGgiLCJleHBsb2RlZFN1ZmZpeCIsInN0YXJ0c1dpdGgiLCJzdGFuZGFyZElucHV0cyIsImNsZWFyYWJsZUlucHV0cyIsImFkdmFuY2VkSW5wdXRzIiwiZGVyaXZlZElucHV0cyIsImFsbFZ1bGNhbklucHV0cyIsImdldEF1dG9JbnB1dEZyb21UeXBlIiwiSW50ZWdlciIsIkRhdGUiLCJkZWJ1Z0Zvcm0iLCJkZWJ1Z1Z1bGNhbiIsIkZvcm1Db250YWluZXIiLCJtb2RlbCIsImRvY3VtZW50SWQiLCJzbHVnIiwiZmllbGRzIiwiYWRkRmllbGRzIiwiaXNFZGl0IiwiZm9ybVR5cGUiLCJWdWxjYW5Db21wb25lbnRzIiwicXVlcnlGcmFnbWVudCIsIm11dGF0aW9uRnJhZ21lbnQiLCJxdWVyeUZyYWdtZW50TmFtZSIsIm11dGF0aW9uRnJhZ21lbnROYW1lIiwiZ3FsIiwiYXV0b0Zvcm1GcmFnbWVudHMiLCJjYXBpdGFsaXplIiwiY2hpbGRQcm9wcyIsIm11dGF0aW9uT3B0aW9ucyIsImZyYWdtZW50IiwiZnJhZ21lbnROYW1lIiwicXVlcnlPcHRpb25zIiwiaW5wdXQiLCJpZCIsImVuYWJsZUNhY2hlIiwiZmV0Y2hQb2xpY3kiLCJwb2xsSW50ZXJ2YWwiLCJza2lwIiwibG9hZGluZyIsInJlZmV0Y2giLCJ1c2VTaW5nbGUiLCJjcmVhdGVEb2N1bWVudCIsInVzZUNyZWF0ZSIsInVwZGF0ZURvY3VtZW50IiwidXNlVXBkYXRlIiwiZGVsZXRlRG9jdW1lbnQiLCJ1c2VEZWxldGUiLCJ2YXJpYWJsZXMiLCJlcnJvcnMiLCJTbWFydEZvcm0iLCJnZXRGcmFnbWVudE5hbWUiLCJtdWx0aVR5cGVOYW1lIiwiZnJhZ21lbnRUeXBlIiwiam9pbiIsImdldFF1ZXJ5RmllbGROYW1lcyIsImdldENyZWF0ZWFibGVGaWVsZHMiLCJnZXRVcGRhdGVhYmxlRmllbGRzIiwiZ2V0TXV0YXRpb25GaWVsZE5hbWVzIiwicmVhZGFibGVGaWVsZE5hbWVzIiwicXVlcnlGaWVsZE5hbWVzIiwiY29uY2F0IiwiZ2V0U2NoZW1hRnJhZ21lbnQiLCJmaWVsZE5hbWVzIiwicHJvdmlkZWRGaWVsZE5hbWVzIiwiaXNNdXRhdGlvbiIsImdldEZyYWdtZW50RmllbGROYW1lcyIsIm9ubHlWaWV3YWJsZSIsImNoaWxkRnJhZ21lbnRzIiwiZ2V0RmllbGRGcmFnbWVudCIsImdldE9iamVjdEZyYWdtZW50IiwiZiIsImdyYXBocWwiLCJ0eXBlTmFtZSIsIm11dGF0aW9uRmllbGROYW1lcyIsImZpZWxkc1dpdGhJbnRsU3VmZml4IiwiYWxsRmllbGRzIiwidXNlcklkIiwidW5zaGlmdCIsIl9pZCIsInF1ZXJ5RnJhZ21lbnRUZXh0IiwiZ2VuZXJhdGVkUXVlcnlGcmFnbWVudCIsIm11dGF0aW9uRnJhZ21lbnRUZXh0IiwiZXh0cmFRdWVyaWVzIiwicXVlcnkiLCJnZXRJbml0aWFsU3RhdGVGcm9tUHJvcHMiLCJuZXh0UHJvcHMiLCJjb252ZXJ0ZWRTY2hlbWEiLCJkZWZhdWx0VmFsdWVzIiwiZGVmYXVsdFZhbHVlIiwiZ2V0RGVmYXVsdFZhbHVlcyIsImluaXRpYWxEb2N1bWVudCIsInByZWZpbGxlZFByb3BzIiwibWluQ291bnQiLCJwdXNoIiwicmVtb3ZlUHJvcGVydHkiLCJkaXNhYmxlZCIsImN1cnJlbnRWYWx1ZXMiLCJvcmlnaW5hbFNjaGVtYSIsImZsYXRTY2hlbWEiLCJjdXJyZW50RG9jdW1lbnQiLCJGb3JtV2FyblVuc2F2ZWQiLCJpc0NoYW5nZWQiLCJ3YXJuVW5zYXZlZENoYW5nZXMiLCJjaGlsZHJlbiIsInVzZVdhcm5PblVuc2F2ZWQiLCJnZXREYXRhIiwiY3VzdG9tQXJncyIsInN0YXRlIiwic3VibWl0Rm9ybUNhbGxiYWNrcyIsImZvcm0iLCJlbmRzV2l0aCIsImFyZ3MiLCJleGNsdWRlUmVtb3ZlZEZpZWxkcyIsImV4Y2x1ZGVIaWRkZW5GaWVsZHMiLCJyZXBsYWNlSW50bEZpZWxkcyIsImFkZEV4dHJhRmllbGRzIiwiZ2V0RmllbGROYW1lcyIsInBhcmVudFBhdGgiLCJ4IiwiY29tcGFjdFBhcmVudCIsInJ1bkNhbGxiYWNrcyIsImNhbGxiYWNrcyIsIml0ZXJhdG9yIiwiaW5pdENhbGxiYWNrIiwiaW5pdGlhbFN0YXRlIiwiaXNGaXJzdFJlbmRlciIsInVzZVJlZiIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJsYXlvdXQiLCJyZXBlYXRFcnJvcnMiLCJzaG93UmVtb3ZlIiwic2hvd0RlbGV0ZSIsInN1Y2Nlc3NGb3JtQ2FsbGJhY2tzIiwiZmFpbHVyZUZvcm1DYWxsYmFja3MiLCJpbnRsIiwidXNlSW50bENvbnRleHQiLCJzZXRFcnJvcnMiLCJ1c2VTdGF0ZSIsInRocm93RXJyb3IiLCJlcnJvciIsImZvcm1FcnJvcnMiLCJnZXRFcnJvcnMiLCJjb25zb2xlIiwibG9nIiwicHJldkVycm9ycyIsInNldERlbGV0ZWRWYWx1ZXMiLCJzZXRDYWxsYmFja3MiLCJzZXRDdXJyZW50VmFsdWVzIiwic2V0Q3VycmVudERvY3VtZW50IiwicmVmZXRjaEZvcm0iLCJzZXREaXNhYmxlZCIsInN1Y2Nlc3MiLCJzZXRTdWNjZXNzIiwiY2xlYXJGb3JtIiwib3B0aW9uc0RvY3VtZW50IiwiZm9ybVJlZiIsIm11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrIiwibXV0YXRpb25UeXBlIiwic3VjY2Vzc0NhbGxiYWNrIiwidGhpcyIsIm11dGF0aW9uRXJyb3JDYWxsYmFjayIsImVycm9yQ2FsbGJhY2siLCJzdWJtaXRGb3JtIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImNvbnRleHROYW1lIiwibXV0YWJsZUZpZWxkcyIsInN1Ym1pdENhbGxiYWNrIiwibmV3TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2siLCJlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2siLCJzdWNjZXNzQ29tcG9uZW50IiwiY3VycmVudFVzZXIiLCJGb3JtQ29tcG9uZW50cyIsImZvcm1MYXlvdXRQcm9wcyIsImZvcm1Hcm91cFByb3BzIiwic3VibWl0TGFiZWwiLCJjYW5jZWxMYWJlbCIsInJldmVydExhYmVsIiwiY2FuY2VsQ2FsbGJhY2siLCJyZXZlcnRDYWxsYmFjayIsIml0ZW1Qcm9wZXJ0aWVzIiwiY29tbW9uUHJvcHMiLCJkb2NDbGFzc05hbWUiLCJtb2RlbE5hbWUiLCJ0b0xvd2VyQ2FzZSIsImZvcm1TdWJtaXRQcm9wcyIsImdyb3VwIiwiZm9ybVByb3BzIiwiY2xhc3NOYW1lIiwic3VibWl0UHJvcHMiLCJnZXRDaGlsZHJlblByb3BzIiwiZG9jdW1lbnRUaXRsZSIsInRpdGxlIiwiZGVsZXRlRG9jdW1lbnRDb25maXJtIiwiZm9ybWF0TWVzc2FnZSIsImNvbmZpcm0iLCJ0aGVuIiwibXV0YXRpb25SZXN1bHQiLCJyZW1vdmVTdWNjZXNzQ2FsbGJhY2siLCJjYXRjaCIsImlzTm90U2FtZURvY3VtZW50IiwiUHJvdmlkZXIiLCJzdWJtaXRGb3JtQ29udGV4dCIsImFkZFRvRGVsZXRlZFZhbHVlcyIsInByZXZEZWxldGVkVmFsdWVzIiwidXBkYXRlQ3VycmVudFZhbHVlcyIsIm5ld1ZhbHVlcyIsImNoYW5nZUNhbGxiYWNrIiwibmV3U3RhdGUiLCJvbGRWYWx1ZSIsImdldERvY3VtZW50IiwiZ2V0TGFiZWwiLCJmaWVsZExvY2FsZSIsImFkZFRvU3VibWl0Rm9ybSIsImNhbGxiYWNrIiwiY2JzIiwiYWRkVG9TdWNjZXNzRm9ybSIsImFkZFRvRmFpbHVyZUZvcm0iLCJjbGVhckZvcm1DYWxsYmFja3MiLCJjbGVhckZpZWxkRXJyb3JzIiwiZ2V0RmllbGRHcm91cHMiLCJjb250ZXh0IiwiY29sbGVjdGlvbk5hbWUiLCJsYWJlbCIsImZvcm1hdExhYmVsIiwiZGVmYXVsdE1lc3NhZ2UiLCJnZXRPcHRpb25MYWJlbCIsIm9wdGlvbiIsImludGxJZCIsIm9wdGlvbnNGcm9tQXJncyIsInJlbW92ZUZpZWxkcyIsInJlbGV2YW50RmllbGRzIiwiaGlkZGVuIiwiaXNJbnRsRmllbGQiLCJpbml0RmllbGQiLCJjb250cm9sIiwiaXRlbUZpZWxkU2NoZW1hIiwiaXRlbURhdGF0eXBlIiwiaW50bEtleXMiLCJnZXRJbnRsS2V5cyIsImludGxJbnB1dCIsImlucHV0UHJvcGVydGllcyIsImRlc2NyaXB0aW9uIiwiZ2V0SW50bExhYmVsIiwiaXNEZXNjcmlwdGlvbiIsImdldERlc2NyaXB0aW9uIiwiaGVscCIsImhhbmRsZUZpZWxkUGF0aCIsImZpZWxkUGF0aCIsImhhbmRsZVBlcm1pc3Npb25zIiwiY3JlYXRlRmllbGQiLCJwYXJlbnRGaWVsZE5hbWUiLCJoYW5kbGVGaWVsZFBhcmVudCIsImFycmF5RmllbGQiLCJjcmVhdGVBcnJheVN1YkZpZWxkIiwibmVzdGVkU2NoZW1hIiwibmVzdGVkSW5wdXQiLCJuZXN0ZWRGaWVsZHMiLCJzdWJGaWVsZE5hbWUiLCJoYW5kbGVGaWVsZENoaWxkcmVuIiwic3ViRmllbGRTY2hlbWEiLCJzdWJGaWVsZCIsImdyb3Vwc1dpdGhGaWVsZHMiLCJnIiwiZ3JvdXBGaWVsZHMiLCJkZWZhdWx0R3JvdXBGaWVsZHMiLCJvcmRlciIsImNoYW5nZWREb2N1bWVudCIsImNvbGxlY3Rpb24iLCJvYmpWYWx1ZSIsIm90aFZhbHVlIiwiZGVidWdUcmFuc2l0aW9ucyIsInVzZUJsb2NrVHJhbnNpdGlvbiIsInNob3VsZEJsb2NrIiwiZ2V0QmxvY2tlZE1lc3NhZ2UiLCJ1bmJsb2NrUmVmIiwiaXNCbG9ja2luZyIsIm9uVW5ibG9jayIsIm9uQmxvY2tlZCIsImV2dCIsIm1lc3NhZ2UiLCJyZXR1cm5WYWx1ZSIsImJsb2NrIiwiYmxvY2tCZWZvcmVVbmxvYWQiLCJCTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUiLCJVTkJMT0NLX1RSQU5TSVRJT05fRVZFTlRfVFlQRSIsInNldENvbmZpcm1hdGlvbk1lc3NhZ2UiLCJibG9ja0V2ZW50IiwiRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInVuYmxvY2tFdmVudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvbmJlZm9yZXVubG9hZCIsIlZ1bGNhbkNvbXBvbmVudHNQcm92aWRlciIsImRlZmF1bHRWdWxjYW5Db21wb25lbnRzIiwiZGVmYXVsdENvcmVDb21wb25lbnRzIiwiZGVmYXVsdEZvcm1Db21wb25lbnRzIiwiZXJyb3JDb250ZXh0IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2VQcm9wcyIsInZhbHVlcyIsInByb3BlcnRpZXMiLCJlcnJvck5hbWUiLCJzbGljZSIsImV4Y2VwdGlvbiIsImh0bWwiLCJkZWZhdWx0UHJvcHMiLCJnZXRDaGFyYWN0ZXJDb3VudHMiLCJtYXgiLCJjaGFyYWN0ZXJDb3VudCIsImNoYXJzUmVtYWluaW5nIiwiY2hhcnNDb3VudCIsImdldFBhdGgiLCJnZXRJbnB1dE5hbWUiLCJnZXRGb3JtSW5wdXQiLCJpbnB1dE5hbWUiLCJjb3VudEZyb21Qcm9wcyIsImludGxPclJlZ3VsYXJWYWx1ZSIsImdldENoYXJhY3RlckNvdW50c0Zyb21Qcm9wcyIsImNoYXJzQ291bnRTdGF0ZSIsInNldENoYXJhY3RlckNvdW50cyIsInVwZGF0ZUNoYXJhY3RlckNvdW50Iiwic2hvd0NoYXJzUmVtYWluaW5nIiwiZ2V0VmFsdWUiLCJudWxsVmFsdWUiLCJpc0FycmF5RmllbGQiLCJmb3JtQ29tcG9uZW50cyIsImlzT2JqZWN0RmllbGQiLCJmY2lQcm9wcyIsImlucHV0VHlwZSIsImhhbmRsZUNoYW5nZSIsInBhcnNlSW50IiwidXBkYXRlVmFsdWUiLCJjbGVhckZpZWxkIiwiZm9ybUlucHV0IiwiZmNpIiwiZm9ybUNvbXBvbmVudHNEZXBlbmRlbmNpZXMiLCJpbnB1dENsYXNzTmFtZSIsImJlZm9yZUNvbXBvbmVudCIsImFmdGVyQ29tcG9uZW50IiwicmVuZGVyQ29tcG9uZW50IiwiaGFzRXJyb3JzIiwiaW5wdXRDbGFzcyIsIndoaXRlbGlzdElucHV0UHJvcHMiLCJvbkNoYW5nZSIsImlucHV0VmFsdWUiLCJ0YXJnZXQiLCJjaGVja2VkIiwiQ29tcG9uZW50cyIsImdldFByb3BlcnRpZXMiLCJGb3JtSW5wdXQiLCJvbkNsaWNrIiwicmVuZGVyQ2xlYXIiLCJkYW5nZXIiLCJnZXRIdG1sSW5wdXRQcm9wcyIsIm9uQmx1ciIsInF1ZXJ5V2FpdHNGb3JWYWx1ZSIsInF1ZXJ5VGV4dCIsImxvYWRGaWVsZFF1ZXJ5IiwidXNlTGF6eVF1ZXJ5IiwidmFsdWVJc0VtcHR5IiwiZXh0cmFQcm9wcyIsInF1ZXJ5RGF0YSIsInF1ZXJ5RXJyb3IiLCJvcHRpb25zRnVuY3Rpb24iLCJpc1ZhbGlkRWxlbWVudCIsImNsb25lRWxlbWVudCIsInByb3BUeXBlcyIsImZvcndhcmRSZWYiLCJyZWYiLCJvdGhlclByb3BzIiwib25TdWJtaXQiLCJhbmNob3JOYW1lIiwiY29sbGFwc2VkIiwidG9nZ2xlIiwic2V0Q29sbGFwc2VkIiwic3RhcnRDb2xsYXBzZWQiLCJpc0hpZGRlbiIsImhlYWRpbmciLCJhZG1pbnNPbmx5IiwiaXNBZG1pbiIsIkxvY2FsZXMiLCJkZWZhdWx0SW5kZXgiLCJ2YXJpYW50IiwiaW5kZXgiLCJlIiwiY2FuRGVsZXRlRG9jdW1lbnQiLCJub2RlIiwiZnVuYyIsImNsYXNzZXMiLCJhZGRJdGVtIiwiQmVmb3JlQ29tcG9uZW50IiwiQWZ0ZXJDb21wb25lbnQiLCJpc0RlbGV0ZWQiLCJvcGVuTmVzdGVkIiwidmlzaWJsZUl0ZW1JbmRleGVzIiwiY3VycmVudEluZGV4Iiwic3ViRG9jdW1lbnQiLCJzdWJEb2N1bWVudEluZHgiLCJjb21wdXRlVmlzaWJsZUluZGV4IiwibWF4Q291bnQiLCJhcnJheUxlbmd0aCIsInNpbmdsZVZhbHVlIiwibmVzdGVkQXJyYXlFcnJvcnMiLCJ2aXNpYmxlSXRlbUluZGV4IiwiaXRlbUluZGV4IiwicmVtb3ZlSXRlbSIsImhpZGVSZW1vdmUiLCJ3aWR0aCIsImhlaWdodCIsInhtbG5zIiwidmlld0JveCIsImZpbGwiLCJzaXplIiwiYm9vbCIsImlzUmVxdWlyZWQiLCJoaWRlTGFiZWwiLCJjb250ZW50IiwicmVtb3ZlQnV0dG9uIiwiaWNvbkJ1dHRvbiIsInRhYkluZGV4IiwibnVtYmVyIiwiY29udGV4dFR5cGVzIiwiaW50bFNoYXBlIiwib25lT2ZUeXBlIiwibmVzdGVkT2JqZWN0RXJyb3JzIiwiSFRNTElucHV0QWRhcHRlciIsIm90aGVySW5wdXRQcm9wZXJ0aWVzIiwiaHRtbEZvciIsIkhUTUxTZWxlY3RBZGFwdGVyIiwibXVsdGlwbGUiXSwibWFwcGluZ3MiOiIyQkFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUEwRGYsT0FyREFGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVB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bVAsVUFBUSxHQUFLblAsSUFDekQsRUFBQXVCLG9CQUF1QnZCLEdBQ2xDLHVDQUNXLEVBQUFlLDBCQUE2QmYsR0FDeEMsNkNBQ1csRUFBQXlCLCtCQUFrQ3pCLEdBQzdDLG1ELGloQkNyR0YsZ0JBR2EsRUFBQVcsT0FBb0IsSSxJQUFBLFNBQUVnUCxHQUFRLEVBQUszUCxFQUFLLElBQXBCLGNBQTJCLE9BQzFELGtEQUFZQSxHQUFRMlAsSyxtTENKdEIsZ0JBRWEsRUFBQWhNLFFBQVUsSUFDckIsNENBQWdCLFNBQVEsWUFBVyxRQUFNIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI2KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsImltcG9ydCB7IGRlcHJlY2F0ZSB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWdWxjYW5Db21wb25lbnRzQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL3R5cGluZ3NcIjtcblxuZXhwb3J0IGNvbnN0IFZ1bGNhbkNvbXBvbmVudHNDb25zdW1lciA9IFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0LkNvbnN1bWVyO1xuXG5leHBvcnQgY29uc3QgdXNlVnVsY2FuQ29tcG9uZW50cyA9ICgpID0+IHVzZUNvbnRleHQoVnVsY2FuQ29tcG9uZW50c0NvbnRleHQpO1xuXG5leHBvcnQgY29uc3Qgd2l0aFZ1bGNhbkNvbXBvbmVudHMgPSAoQykgPT4gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGRlcHJlY2F0ZShcbiAgICBcIjAuMC4wXCIsXG4gICAgXCJVc2luZyB3aXRoVnVsY2FuQ29tcG9uZW50cyBIT0MgPT4gcHJlZmVyIHVzZVZ1bGNhbkNvbXBvbmVudHMgd2l0aCBob29rc1wiXG4gICk7XG4gIHJldHVybiA8QyB2dWxjYW5Db21wb25lbnRzPXt2dWxjYW5Db21wb25lbnRzfSB7Li4ucHJvcHN9IC8+O1xufTtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5cbmludGVyZmFjZSBGb3JtQ29udGV4dFZhbHVlIHtcbiAgYWRkVG9EZWxldGVkVmFsdWVzOiBGdW5jdGlvbjtcbiAgYWRkVG9GYWlsdXJlRm9ybTogRnVuY3Rpb247XG4gIGFkZFRvU3VibWl0Rm9ybTogRnVuY3Rpb247XG4gIGFkZFRvU3VjY2Vzc0Zvcm06IEZ1bmN0aW9uO1xuICBjbGVhckZvcm06IEZ1bmN0aW9uO1xuICBjbGVhckZvcm1DYWxsYmFja3M6IEZ1bmN0aW9uO1xuICBjbGVhckZpZWxkRXJyb3JzOiBGdW5jdGlvbjtcbiAgY3VycmVudFZhbHVlczogb2JqZWN0O1xuICBkZWxldGVkVmFsdWVzOiBBcnJheTxhbnk+O1xuICBlcnJvcnM6IEFycmF5PGFueT47XG4gIGdldERvY3VtZW50OiBGdW5jdGlvbjtcbiAgZ2V0TGFiZWw6IChmaWVsZE5hbWU6IHN0cmluZywgZmllbGRMb2NhbGU/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgaW5pdGlhbERvY3VtZW50OiBvYmplY3Q7XG4gIGlzQ2hhbmdlZDogYm9vbGVhbjtcbiAgcmVmZXRjaEZvcm06IEZ1bmN0aW9uO1xuICAvLyBUT0RPOiB3ZSBkZXByZWNhdGUgdGhpcywgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGFsbG93IGEgY2hpbGQgdG8gc2V0U3RhdGUgdGhpcyB3YXlcbiAgLy8gc2V0Rm9ybVN0YXRlOiBGdW5jdGlvbjtcbiAgc3VibWl0Rm9ybTogUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTEZvcm1FbGVtZW50PltcIm9uU3VibWl0XCJdO1xuICB0aHJvd0Vycm9yOiBGdW5jdGlvbjtcbiAgdXBkYXRlQ3VycmVudFZhbHVlczogRnVuY3Rpb247XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtQ29udGV4dCA9XG4gIFJlYWN0LmNyZWF0ZUNvbnRleHQ8Rm9ybUNvbnRleHRWYWx1ZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuZXhwb3J0IGNvbnN0IHVzZUZvcm1Db250ZXh0ID0gKCkgPT4ge1xuICBjb25zdCBmb3JtQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBpZiAoIWZvcm1Db250ZXh0KVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQSBjb21wb25lbnQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBmb3JtIGNvbnRleHQgYnV0IGl0IGlzIHVuZGVmaW5lZC4gUGxlYXNlIHdyYXAgeW91ciBjb21wb25lbnQgd2l0aCBhIDxGb3JtPi5cIlxuICAgICk7XG4gIHJldHVybiBmb3JtQ29udGV4dDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvaTE4blwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvdXRpbHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2dldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9vbWl0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBhcG9sbG8vY2xpZW50XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9jb21wYWN0XCIpOyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgUG9zc2libGVWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgRHVtbXkgfSBmcm9tIFwiLi9EdW1teVwiO1xuXG4vLyBXZSBuZWVkIHRoaXMgdG8gc2h1dCBUeXBlU2NyaXB0IHVwXG4vLyBZb3Ugc2hvdWxkIHVzZSB0aGUgUHJvdmlkZXIgdG8gZ2V0IHRoZSByaWdodCBkZWZhdWx0IHZhbHVlc1xuZXhwb3J0IGNvbnN0IFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0ID1cbiAgUmVhY3QuY3JlYXRlQ29udGV4dDxQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHM+KHtcbiAgICBBbGVydDogRHVtbXksXG4gICAgQnV0dG9uOiBEdW1teSxcbiAgICBGaWVsZEVycm9yczogRHVtbXksXG4gICAgRm9ybTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudENoZWNrYm94OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudERhdGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnREYXRlVGltZTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudERlZmF1bHQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRFbWFpbDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudElubmVyOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TGlrZXJ0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TG9hZGVyOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnROdW1iZXI6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRQYXNzd29yZDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudFJhZGlvR3JvdXA6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRTZWxlY3Q6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRUZXh0YXJlYTogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudFRpbWU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRVcmw6IER1bW15LFxuICAgIEZvcm1FbGVtZW50OiBEdW1teSxcbiAgICBGb3JtRXJyb3I6IER1bW15LFxuICAgIEZvcm1FcnJvcnM6IER1bW15LFxuICAgIEZvcm1Hcm91cDogRHVtbXksXG4gICAgRm9ybUdyb3VwSGVhZGVyOiBEdW1teSxcbiAgICBGb3JtR3JvdXBMYXlvdXQ6IER1bW15LFxuICAgIEZvcm1JbnRsOiBEdW1teSxcbiAgICBGb3JtSW50bEl0ZW1MYXlvdXQ6IER1bW15LFxuICAgIEZvcm1JbnRsTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkQXJyYXk6IER1bW15LFxuICAgIEZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkQXJyYXlMYXlvdXQ6IER1bW15LFxuICAgIEZvcm1OZXN0ZWREaXZpZGVyOiBEdW1teSxcbiAgICBGb3JtTmVzdGVkSXRlbTogRHVtbXksXG4gICAgRm9ybU5lc3RlZEl0ZW1MYXlvdXQ6IER1bW15LFxuICAgIEZvcm1OZXN0ZWRPYmplY3Q6IER1bW15LFxuICAgIEZvcm1OZXN0ZWRPYmplY3RMYXlvdXQ6IER1bW15LFxuICAgIEZvcm1PcHRpb25MYWJlbDogRHVtbXksXG4gICAgRm9ybVN1Ym1pdDogRHVtbXksXG4gICAgRm9ybWF0dGVkTWVzc2FnZTogRHVtbXksXG4gICAgSWNvbjogRHVtbXksXG4gICAgSWNvbkFkZDogRHVtbXksXG4gICAgSWNvblJlbW92ZTogRHVtbXksXG4gICAgTG9hZGluZzogRHVtbXksXG4gIH0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3BpY2tcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL3Blcm1pc3Npb25zXCIpOyIsImltcG9ydCBtZXJnZSBmcm9tIFwibG9kYXNoL21lcmdlXCI7XG5pbXBvcnQgZmluZCBmcm9tIFwibG9kYXNoL2ZpbmRcIjtcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNQbGFpbk9iamVjdFwiO1xuaW1wb3J0IHNldCBmcm9tIFwibG9kYXNoL3NldFwiO1xuaW1wb3J0IHNpemUgZnJvbSBcImxvZGFzaC9zaXplXCI7XG5cbmltcG9ydCB7IHJlbW92ZVByZWZpeCwgZmlsdGVyUGF0aHNCeVByZWZpeCB9IGZyb20gXCIuL3BhdGhfdXRpbHNcIjtcbmltcG9ydCB7IFZ1bGNhbkZpZWxkU2NoZW1hIH0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcblxuLy8gYWRkIHN1cHBvcnQgZm9yIG5lc3RlZCBwcm9wZXJ0aWVzXG5leHBvcnQgY29uc3QgZGVlcFZhbHVlID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICBjb25zdCBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykge1xuICAgIG9iaiA9IG9ialtwYXRoQXJyYXlbaV1dO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbi8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5MDk4Nzk3L2Zhc3Rlc3Qtd2F5LXRvLWZsYXR0ZW4tdW4tZmxhdHRlbi1uZXN0ZWQtanNvbi1vYmplY3RzXG5leHBvcnQgY29uc3QgZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGN1cikgIT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IGN1cjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXIubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArIFwiW1wiICsgaSArIFwiXVwiKTtcbiAgICAgIGlmIChsID09IDApIHJlc3VsdFtwcm9wXSA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaXNFbXB0eSA9IHRydWU7XG4gICAgICBmb3IgKHZhciBwIGluIGN1cikge1xuICAgICAgICBpc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgIHJlY3Vyc2UoY3VyW3BdLCBwcm9wID8gcHJvcCArIFwiLlwiICsgcCA6IHApO1xuICAgICAgfVxuICAgICAgaWYgKGlzRW1wdHkgJiYgcHJvcCkgcmVzdWx0W3Byb3BdID0ge307XG4gICAgfVxuICB9XG4gIHJlY3Vyc2UoZGF0YSwgXCJcIik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFbXB0eVZhbHVlID0gKHZhbHVlKSA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgdmFsdWUgPT09IG51bGwgfHxcbiAgdmFsdWUgPT09IFwiXCIgfHxcbiAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCk7XG5cbi8qKlxuICogTWVyZ2VzIHZhbHVlcy4gSXQgdGFrZXMgaW50byBhY2NvdW50IHRoZSBjdXJyZW50LCBvcmlnaW5hbCBhbmQgZGVsZXRlZCB2YWx1ZXMsXG4gKiBhbmQgdGhlIG1lcmdlIHByb2R1Y2VzIHRoZSBwcm9wZXIgdHlwZSBmb3Igc2ltcGxlIG9iamVjdHMgb3IgYXJyYXlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICogIEZvcm0gY29tcG9uZW50IHByb3BzLiBPbmx5IHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIHRoaXMgZnVuY3Rpb24gYXJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0geyp9IHByb3BzLmN1cnJlbnRWYWx1ZVxuICogIEN1cnJlbnQgdmFsdWUgb2YgdGhlIGZpZWxkXG4gKiBAcGFyYW0geyp9IHByb3BzLmRvY3VtZW50VmFsdWVcbiAqICBPcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAqIEByZXR1cm4geyp8dW5kZWZpbmVkfVxuICogIE1lcmdlZCB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm8gbWVyZ2Ugd2FzIHBlcmZvcm1lZFxuICovXG5leHBvcnQgY29uc3QgbWVyZ2VWYWx1ZSA9ICh7XG4gIGN1cnJlbnRWYWx1ZSxcbiAgZG9jdW1lbnRWYWx1ZSxcbiAgZGVsZXRlZFZhbHVlczogZGVsZXRlZEZpZWxkcyxcbiAgcGF0aCxcbiAgbG9jYWxlLFxuICBkYXRhdHlwZSxcbn0pID0+IHtcbiAgaWYgKGxvY2FsZSkge1xuICAgIC8vIG5vdGU6IGludGwgZmllbGRzIGFyZSBvZiB0eXBlIE9iamVjdCBidXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgU3RyaW5nc1xuICAgIHJldHVybiBjdXJyZW50VmFsdWUgfHwgZG9jdW1lbnRWYWx1ZSB8fCBcIlwiO1xuICB9XG5cbiAgLy8gbm90ZTogcmV0cmlldmUgbmVzdGVkIGRlbGV0ZWQgdmFsdWVzIGlzIHBlcmZvcm1lZCBoZXJlIHRvIGF2b2lkIHNraXBwaW5nXG4gIC8vIHRoZSBtZXJnZSBpbiBjYXNlIHRoZSBjdXJyZW50IGZpZWxkIGlzIG5vdCBpbiBgY3VycmVudFZhbHVlc2AgYnV0IGEgbmVzdGVkXG4gIC8vIHByb3BlcnR5IGhhcyBiZWVuIHJlbW92ZWQgZGlyZWN0bHkgYnkgcGF0aFxuICBjb25zdCBkZWxldGVkVmFsdWVzID0gZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcyhwYXRoLCBkZWxldGVkRmllbGRzKTtcbiAgY29uc3QgaGFzRGVsZXRlZFZhbHVlcyA9ICEhc2l6ZShkZWxldGVkVmFsdWVzKTtcbiAgaWYgKFxuICAgIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkgfHwgaGFzRGVsZXRlZFZhbHVlcykgJiZcbiAgICBmaW5kKGRhdGF0eXBlLCBbXCJ0eXBlXCIsIEFycmF5XSlcbiAgKSB7XG4gICAgcmV0dXJuIG1lcmdlKFtdLCBkb2N1bWVudFZhbHVlLCBjdXJyZW50VmFsdWUsIGRlbGV0ZWRWYWx1ZXMpO1xuICB9IGVsc2UgaWYgKFxuICAgIChpc1BsYWluT2JqZWN0KGN1cnJlbnRWYWx1ZSkgfHwgaGFzRGVsZXRlZFZhbHVlcykgJiZcbiAgICBmaW5kKGRhdGF0eXBlLCBbXCJ0eXBlXCIsIE9iamVjdF0pXG4gICkge1xuICAgIHJldHVybiBtZXJnZSh7fSwgZG9jdW1lbnRWYWx1ZSwgY3VycmVudFZhbHVlLCBkZWxldGVkVmFsdWVzKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpc3Qgb2YgZmllbGQgbmFtZXMgdG8gYW4gb2JqZWN0IG9mIGRlbGV0ZWQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW118T2JqZWN0LjxzdHJpbmd8c3RyaW5nPn0gZGVsZXRlZEZpZWxkc1xuICogIExpc3Qgb2YgZGVsZXRlZCBmaWVsZCBuYW1lcyBvciBwYXRoc1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXk9fSBhY2N1bXVsYXRvcj17fVxuICogIFZhbHVlIHRvIHJlZHVjZSB0aGUgdmFsdWVzIHRvXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9XG4gKiAgRGVsZXRlZCB2YWx1ZXMsIHdpdGggdGhlIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IHRha2luZyB0aGUgcmVjZWl2ZWQgZGVsZXRlZFxuICogIGZpZWxkcyBhcyBwYXRoc1xuICogQGV4YW1wbGVcbiAqICBjb25zdCBkZWxldGVkRmllbGRzID0gW1xuICogICAgJ2ZpZWxkLnN1YkZpZWxkJyxcbiAqICAgICdmaWVsZC5zdWJGaWVsZEFycmF5WzBdJyxcbiAqICAgICdmaWVsZEFycmF5WzBdJyxcbiAqICAgICdmaWVsZEFycmF5WzJdLm5hbWUnLFxuICogIF07XG4gKiAgZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcyhkZWxldGVkRmllbGRzKTtcbiAqICAvLyA9PiB7ICdmaWVsZCc6IHsgJ3N1YkZpZWxkJzogbnVsbCwgJ3N1YkZpZWxkQXJyYXknOiBbbnVsbF0gfSwgJ2ZpZWxkQXJyYXknOiBbbnVsbCwgdW5kZWZpbmVkLCB7IG5hbWU6IG51bGwgfSB9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWxldGVkVmFsdWVzID0gKGRlbGV0ZWRGaWVsZHMsIGFjY3VtdWxhdG9yID0ge30pID0+XG4gIGRlbGV0ZWRGaWVsZHMucmVkdWNlKFxuICAgIChkZWxldGVkVmFsdWVzLCBwYXRoKSA9PiBzZXQoZGVsZXRlZFZhbHVlcywgcGF0aCwgbnVsbCksXG4gICAgYWNjdW11bGF0b3JcbiAgKTtcblxuLyoqXG4gKiBGaWx0ZXJzIHRoZSBnaXZlbiBmaWVsZCBuYW1lcyBieSBwcmVmaXgsIHJlbW92ZXMgaXQgZnJvbSBlYWNoIG9uZSBvZiB0aGVtXG4gKiBhbmQgY29udmVydCB0aGUgbGlzdCB0byBhbiBvYmplY3Qgb2YgZGVsZXRlZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBwcmVmaXhcbiAqICBQcmVmaXggdG8gZmlsdGVyIGFuZCByZW1vdmUgZnJvbSBkZWxldGVkIGZpZWxkc1xuICogQHBhcmFtIHtzdHJpbmdbXXxPYmplY3QuPHN0cmluZ3xzdHJpbmc+fSBkZWxldGVkRmllbGRzXG4gKiAgTGlzdCBvZiBkZWxldGVkIGZpZWxkIG5hbWVzIG9yIHBhdGhzXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheT19IGFjY3VtdWxhdG9yPXt9XG4gKiAgVmFsdWUgdG8gcmVkdWNlIHRoZSB2YWx1ZXMgdG9cbiAqIEByZXR1cm4ge09iamVjdC48c3RyaW5nLCBudWxsPn1cbiAqICBPYmplY3Qga2V5ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVsZXRlZCBmaWVsZHMsIHZhbHVlZCB3aXRoIGBudWxsYFxuICogQGV4YW1wbGVcbiAqICBjb25zdCBkZWxldGVkRmllbGRzID0gW1xuICogICAgJ2ZpZWxkLnN1YkZpZWxkJyxcbiAqICAgICdmaWVsZC5zdWJGaWVsZEFycmF5WzBdJyxcbiAqICAgICdmaWVsZEFycmF5WzBdJyxcbiAqICAgICdmaWVsZEFycmF5WzJdLm5hbWUnLFxuICogIF07XG4gKiAgZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcygnZmllbGQnLCBkZWxldGVkRmllbGRzKTtcbiAqICAvLyA9PiB7ICdzdWJGaWVsZCc6IG51bGwsICdzdWJGaWVsZEFycmF5JzogW251bGxdIH1cbiAqICBnZXROZXN0ZWREZWxldGVkVmFsdWVzKCdmaWVsZEFycmF5JywgZGVsZXRlZEZpZWxkcyk7XG4gKiAgLy8gPT4geyAnMCc6IG51bGwsICcyJzogeyAnbmFtZSc6IG51bGwgfSB9XG4gKiAgZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcygnZmllbGRBcnJheScsIGRlbGV0ZWRGaWVsZHMsIFtdKTtcbiAqICAvLyA9PiBbbnVsbCwgdW5kZWZpbmVkLCB7ICduYW1lJzogbnVsbCB9IF1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMgPSAoXG4gIHByZWZpeCxcbiAgZGVsZXRlZEZpZWxkcyxcbiAgYWNjdW11bGF0b3IgPSB7fVxuKSA9PlxuICBnZXREZWxldGVkVmFsdWVzKFxuICAgIHJlbW92ZVByZWZpeChwcmVmaXgsIGZpbHRlclBhdGhzQnlQcmVmaXgocHJlZml4LCBkZWxldGVkRmllbGRzKSksXG4gICAgYWNjdW11bGF0b3JcbiAgKTtcblxuLy9UT0RPOiBjaGVjayBpZiBpdCBzdGlsbCB3b3JrcyBhcyBleHBlY3RlZFxuLy8gcHJldmlvdXNseSB3YXMgZGF0YVR5cGVbMF0udHlwZVxuZXhwb3J0IGNvbnN0IGdldEZpZWxkVHlwZSA9IChmaWVsZFNjaGVtYTogVnVsY2FuRmllbGRTY2hlbWEpID0+XG4gIGZpZWxkU2NoZW1hLnR5cGU7XG4vKipcbiAqIEdldCBhcHByb3ByaWF0ZSBudWxsIHZhbHVlIGZvciB2YXJpb3VzIGZpZWxkIHR5cGVzXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZGF0YXR5cGVcbiAqIEZpZWxkJ3MgZGF0YXR5cGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE51bGxWYWx1ZSA9IChkYXRhdHlwZSkgPT4ge1xuICBjb25zdCBmaWVsZFR5cGUgPSBnZXRGaWVsZFR5cGUoZGF0YXR5cGUpO1xuICBpZiAoZmllbGRUeXBlID09PSBBcnJheSkge1xuICAgIHJldHVybiBbXTtcbiAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT09IEJvb2xlYW4pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSBTdHJpbmcpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT09IE51bWJlcikge1xuICAgIHJldHVybiBcIlwiO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vcm1hbGl6ZSB0byBudWxsXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJkZWJ1Z1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdW5pcVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCIpOyIsImV4cG9ydCAqIGZyb20gXCIuL0Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGluZ3NcIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tZXJnZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc0VtcHR5XCIpOyIsIi8qXG4gKiBTY2hlbWEgY29udmVydGVyL2dldHRlcnNcbiAqL1xuaW1wb3J0IHsgY2FuQ3JlYXRlRmllbGQsIGNhblVwZGF0ZUZpZWxkIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgVnVsY2FuRmllbGRTY2hlbWEsIFZ1bGNhblNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFR5cGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKiBnZXR0ZXJzICovXG4vLyBmaWx0ZXIgb3V0IGZpZWxkcyB3aXRoIFwiLlwiIG9yIFwiJFwiXG5leHBvcnQgY29uc3QgZ2V0VmFsaWRGaWVsZHMgPSAoc2NoZW1hKSA9PiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihcbiAgICAoZmllbGROYW1lKSA9PiAhZmllbGROYW1lLmluY2x1ZGVzKFwiJFwiKSAmJiAhZmllbGROYW1lLmluY2x1ZGVzKFwiLlwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlYWRhYmxlRmllbGRzID0gKHNjaGVtYSkgPT4ge1xuICAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICByZXR1cm4gZ2V0VmFsaWRGaWVsZHMoc2NoZW1hKS5maWx0ZXIoXG4gICAgKGZpZWxkTmFtZSkgPT4gc2NoZW1hW2ZpZWxkTmFtZV0uY2FuUmVhZCB8fCBzY2hlbWFbZmllbGROYW1lXS52aWV3YWJsZUJ5XG4gICk7XG59O1xuXG4vKlxuXG5Db252ZXJ0IGEgbmVzdGVkIFNpbXBsZVNjaGVtYSBzY2hlbWEgaW50byBhIEpTT04gb2JqZWN0XG5JZiBmbGF0dGVuID0gdHJ1ZSwgd2lsbCBjcmVhdGUgYSBmbGF0IG9iamVjdCBpbnN0ZWFkIG9mIG5lc3RlZCB0cmVlXG5cbi8qIHBlcm1pc3Npb25zICovXG5cbi8qKlxuICogQG1ldGhvZCBNb25nby5Db2xsZWN0aW9uLmdldEluc2VydGFibGVGaWVsZHNcbiAqIEdldCBhbiBhcnJheSBvZiBhbGwgZmllbGRzIGVkaXRhYmxlIGJ5IGEgc3BlY2lmaWMgdXNlciBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gdXNlciDigJMgdGhlIHVzZXIgZm9yIHdoaWNoIHRvIGNoZWNrIGZpZWxkIHBlcm1pc3Npb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbnNlcnRhYmxlRmllbGRzID0gZnVuY3Rpb24gKHNjaGVtYSwgdXNlcikge1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihmdW5jdGlvbiAoZmllbGROYW1lKSB7XG4gICAgdmFyIGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgcmV0dXJuIGNhbkNyZWF0ZUZpZWxkKHVzZXIsIGZpZWxkKTtcbiAgfSk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgTW9uZ28uQ29sbGVjdGlvbi5nZXRFZGl0YWJsZUZpZWxkc1xuICogR2V0IGFuIGFycmF5IG9mIGFsbCBmaWVsZHMgZWRpdGFibGUgYnkgYSBzcGVjaWZpYyB1c2VyIGZvciBhIGdpdmVuIGNvbGxlY3Rpb24gKGFuZCBvcHRpb25hbGx5IGRvY3VtZW50KVxuICogQHBhcmFtIHtPYmplY3R9IHVzZXIg4oCTIHRoZSB1c2VyIGZvciB3aGljaCB0byBjaGVjayBmaWVsZCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVGaWVsZHMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1c2VyLCBkb2N1bWVudCkge1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihmdW5jdGlvbiAoZmllbGROYW1lKSB7XG4gICAgdmFyIGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgcmV0dXJuIGNhblVwZGF0ZUZpZWxkKHVzZXIsIGZpZWxkLCBkb2N1bWVudCk7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzO1xufTtcblxuLyoqXG4gKiBWdWxjYW4gU2NoZW1hID0+IEZvcm0gU2NoZW1hXG4gKiBUT0RPOiB0eXBlIHRoaXMgYmV0dGVyXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRTY2hlbWEgPSAoXG4gIHNjaGVtYTogVnVsY2FuU2NoZW1hLFxuICBvcHRpb25zOiB7IGZsYXR0ZW4/OiBib29sZWFuOyByZW1vdmVBcnJheXM/OiBib29sZWFuIH0gPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHsgZmxhdHRlbiA9IGZhbHNlLCByZW1vdmVBcnJheXMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXG4gIGxldCBqc29uU2NoZW1hID0ge307XG5cbiAgT2JqZWN0LmtleXMoc2NoZW1hKS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcbiAgICAvLyBleGNsdWRlIGFycmF5IGZpZWxkc1xuICAgIGlmIChyZW1vdmVBcnJheXMgJiYgZmllbGROYW1lLmluY2x1ZGVzKFwiJFwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGV4dHJhY3Qgc2NoZW1hXG4gICAganNvblNjaGVtYVtmaWVsZE5hbWVdID0gZ2V0RmllbGRTY2hlbWEoZmllbGROYW1lLCBzY2hlbWEpO1xuXG4gICAgLy8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBuZXN0ZWQgZmllbGRcbiAgICAvLyBhbmQgZ2V0IGl0cyBzY2hlbWEgaWYgcG9zc2libGUgb3IgaXRzIHR5cGUgb3RoZXJ3aXNlXG4gICAgY29uc3Qgc3ViU2NoZW1hT3JUeXBlID0gZ2V0TmVzdGVkRmllbGRTY2hlbWFPclR5cGUoZmllbGROYW1lLCBzY2hlbWEpO1xuICAgIGlmIChzdWJTY2hlbWFPclR5cGUpIHtcbiAgICAgIC8vIHJlbWVtYmVyIHRoZSBzdWJzY2hlbWEgaWYgaXQgZXhpc3RzLCBhbGxvdyB0byBjdXN0b21pemUgbGFiZWxzIGZvciBlYWNoIGdyb3VwIG9mIGl0ZW1zIGZvciBhcnJheXMgb2Ygb2JqZWN0c1xuICAgICAganNvblNjaGVtYVtmaWVsZE5hbWVdLmFycmF5RmllbGRTY2hlbWEgPSBnZXRGaWVsZFNjaGVtYShcbiAgICAgICAgYCR7ZmllbGROYW1lfS4kYCxcbiAgICAgICAgc2NoZW1hXG4gICAgICApO1xuXG4gICAgICAvLyBjYWxsIGNvbnZlcnRTY2hlbWEgcmVjdXJzaXZlbHkgb24gdGhlIHN1YlNjaGVtYVxuICAgICAgY29uc3QgY29udmVydGVkU3ViU2NoZW1hID0gY29udmVydFNjaGVtYShzdWJTY2hlbWFPclR5cGUsIG9wdGlvbnMpO1xuICAgICAgLy8gbmVzdGVkIHNjaGVtYSBjYW4gYmUgYSBmaWVsZCBzY2hlbWEgKHt0eXBlLCBjYW5SZWFkLCBldGMufSkgKGNvbnZlcnRlZFNjaGVtYSB3aWxsIGJlIG51bGwpXG4gICAgICAvLyBvciBhIHNjaGVtYSBvbiBpdHMgb3duIHdpdGggc3ViZmllbGRzIChjb252ZXJ0ZWRTY2hlbWEgd2lsbCByZXR1cm4gc210aClcbiAgICAgIGlmICghY29udmVydGVkU3ViU2NoZW1hKSB7XG4gICAgICAgIC8vIHN1YlNjaGVtYSBpcyBhIHNpbXBsZSBmaWVsZCBpbiB0aGlzIGNhc2UgKGVnIGFycmF5IG9mIG51bWJlcnMpXG4gICAgICAgIGpzb25TY2hlbWFbZmllbGROYW1lXS5pc1NpbXBsZUFycmF5RmllbGQgPSB0cnVlOyAvL2dldEZpZWxkU2NoZW1hKGAke2ZpZWxkTmFtZX0uJGAsIHNjaGVtYSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdWJTY2hlbWEgaXMgYSBmdWxsIHNjaGVtYSB3aXRoIG11bHRpcGxlIGZpZWxkcyAoZWcgYXJyYXkgb2Ygb2JqZWN0cylcbiAgICAgICAgaWYgKGZsYXR0ZW4pIHtcbiAgICAgICAgICBqc29uU2NoZW1hID0geyAuLi5qc29uU2NoZW1hLCAuLi5jb252ZXJ0ZWRTdWJTY2hlbWEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uU2NoZW1hW2ZpZWxkTmFtZV0uc2NoZW1hID0gY29udmVydGVkU3ViU2NoZW1hO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGpzb25TY2hlbWE7XG59O1xuXG4vKlxuXG5HZXQgYSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWVsZCdzIHNjaGVtYVxuXG4qL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkU2NoZW1hID0gKGZpZWxkTmFtZTogc3RyaW5nLCBzY2hlbWE6IFZ1bGNhblNjaGVtYSkgPT4ge1xuICBsZXQgZmllbGRTY2hlbWEgPSB7fTtcbiAgc2NoZW1hUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBzY2hlbWFbZmllbGROYW1lXT8uW3Byb3BlcnR5XTtcbiAgICBpZiAocHJvcGVydHlWYWx1ZSkge1xuICAgICAgZmllbGRTY2hlbWFbcHJvcGVydHldID0gcHJvcGVydHlWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmllbGRTY2hlbWE7XG59O1xuXG4vLyB0eXBlIGlzIGFuIGFycmF5IGR1ZSB0byB0aGUgcG9zc2liaWxpdHkgb2YgdXNpbmcgU2ltcGxlU2NoZW1hLm9uZU9mXG4vLyByaWdodCBub3cgd2Ugc3VwcG9ydCBvbmx5IGZpZWxkcyB3aXRoIG9uZSB0eXBlXG5leHBvcnQgY29uc3QgZ2V0U2NoZW1hVHlwZSA9IChmaWVsZFNjaGVtYTogVnVsY2FuRmllbGRTY2hlbWEpID0+XG4gIGdldEZpZWxkVHlwZShmaWVsZFNjaGVtYSk7XG5cbmNvbnN0IGdldEFycmF5TmVzdGVkU2NoZW1hID0gKGZpZWxkTmFtZTogc3RyaW5nLCBzY2hlbWE6IFZ1bGNhblNjaGVtYSkgPT4ge1xuICBjb25zdCBhcnJheUl0ZW1TY2hlbWEgPSBzY2hlbWFbYCR7ZmllbGROYW1lfS4kYF07XG4gIGNvbnN0IG5lc3RlZFNjaGVtYSA9IGFycmF5SXRlbVNjaGVtYSAmJiBnZXRTY2hlbWFUeXBlKGFycmF5SXRlbVNjaGVtYSk7XG4gIHJldHVybiBuZXN0ZWRTY2hlbWE7XG59O1xuXG4vLyBUT0RPOiBub3QgMTAwJSBpdCdzIHZhbGlkIHdpdGggY3VycmVudCBpbXBsZW1lbnRhdGlvblxuY29uc3QgaXNOZXN0ZWRTY2hlbWFGaWVsZCA9IChmaWVsZFNjaGVtYTogVnVsY2FuRmllbGRTY2hlbWEpID0+IHtcbiAgY29uc3QgZmllbGRUeXBlID0gZ2V0U2NoZW1hVHlwZShmaWVsZFNjaGVtYSk7XG4gIHJldHVybiBmaWVsZFR5cGUgJiYgdHlwZW9mIGZpZWxkVHlwZSA9PT0gXCJvYmplY3RcIjtcbn07XG5jb25zdCBnZXRPYmplY3ROZXN0ZWRTY2hlbWEgPSAoZmllbGROYW1lOiBzdHJpbmcsIHNjaGVtYTogVnVsY2FuU2NoZW1hKSA9PiB7XG4gIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gIGlmICghaXNOZXN0ZWRTY2hlbWFGaWVsZChmaWVsZFNjaGVtYSkpIHJldHVybiBudWxsO1xuICBjb25zdCBuZXN0ZWRTY2hlbWEgPSBmaWVsZFNjaGVtYSAmJiBnZXRTY2hlbWFUeXBlKGZpZWxkU2NoZW1hKTtcbiAgcmV0dXJuIG5lc3RlZFNjaGVtYTtcbn07XG4vKlxuXG5HaXZlbiBhbiBhcnJheSBmaWVsZCwgZ2V0IGl0cyBuZXN0ZWQgc2NoZW1hXG5JZiB0aGUgZmllbGQgaXMgbm90IGFuIG9iamVjdCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3ViZmllbGQgdHlwZSBpbnN0ZWFkXG4qL1xuZXhwb3J0IGNvbnN0IGdldE5lc3RlZEZpZWxkU2NoZW1hT3JUeXBlID0gKGZpZWxkTmFtZSwgc2NoZW1hKSA9PiB7XG4gIGNvbnN0IGFycmF5SXRlbVNjaGVtYSA9IGdldEFycmF5TmVzdGVkU2NoZW1hKGZpZWxkTmFtZSwgc2NoZW1hKTtcbiAgaWYgKCFhcnJheUl0ZW1TY2hlbWEpIHtcbiAgICAvLyBsb29rIGZvciBhbiBvYmplY3Qgc2NoZW1hXG4gICAgY29uc3Qgb2JqZWN0SXRlbVNjaGVtYSA9IGdldE9iamVjdE5lc3RlZFNjaGVtYShmaWVsZE5hbWUsIHNjaGVtYSk7XG4gICAgLy8gbm8gc2NoZW1hIHdhcyBmb3VuZFxuICAgIGlmICghb2JqZWN0SXRlbVNjaGVtYSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG9iamVjdEl0ZW1TY2hlbWE7XG4gIH1cbiAgcmV0dXJuIGFycmF5SXRlbVNjaGVtYTtcbn07XG5cbmV4cG9ydCBjb25zdCBzY2hlbWFQcm9wZXJ0aWVzID0gW1xuICBcInR5cGVcIixcbiAgXCJsYWJlbFwiLFxuICBcIm9wdGlvbmFsXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJtaW5cIixcbiAgXCJtYXhcIixcbiAgXCJleGNsdXNpdmVNaW5cIixcbiAgXCJleGNsdXNpdmVNYXhcIixcbiAgXCJtaW5Db3VudFwiLFxuICBcIm1heENvdW50XCIsXG4gIFwiYWxsb3dlZFZhbHVlc1wiLFxuICBcInJlZ0V4XCIsXG4gIFwiYmxhY2tib3hcIixcbiAgXCJ0cmltXCIsXG4gIFwiY3VzdG9tXCIsXG4gIFwiZGVmYXVsdFZhbHVlXCIsXG4gIFwiYXV0b1ZhbHVlXCIsXG4gIFwiaGlkZGVuXCIsIC8vIGhpZGRlbjogdHJ1ZSBtZWFucyB0aGUgZmllbGQgaXMgbmV2ZXIgc2hvd24gaW4gYSBmb3JtIG5vIG1hdHRlciB3aGF0XG4gIFwibXVzdENvbXBsZXRlXCIsIC8vIG11c3RDb21wbGV0ZTogdHJ1ZSBtZWFucyB0aGUgZmllbGQgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbXBsZXRlIHByb2ZpbGVcbiAgXCJmb3JtXCIsIC8vIGZvcm0gcGxhY2Vob2xkZXJcbiAgXCJpbnB1dFByb3BlcnRpZXNcIiwgLy8gZm9ybSBwbGFjZWhvbGRlclxuICBcIml0ZW1Qcm9wZXJ0aWVzXCIsXG4gIFwiY29udHJvbFwiLCAvLyBTbWFydEZvcm0gY29udHJvbCAoU3RyaW5nIG9yIFJlYWN0IGNvbXBvbmVudClcbiAgXCJpbnB1dFwiLCAvLyBTbWFydEZvcm0gY29udHJvbCAoU3RyaW5nIG9yIFJlYWN0IGNvbXBvbmVudClcbiAgXCJhdXRvZm9ybVwiLCAvLyBsZWdhY3kgZm9ybSBwbGFjZWhvbGRlcjsgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAobm90IHVzZWQgYW55bW9yZSlcbiAgXCJvcmRlclwiLCAvLyBwb3NpdGlvbiBpbiB0aGUgZm9ybVxuICBcImdyb3VwXCIsIC8vIGZvcm0gZmllbGRzZXQgZ3JvdXBcbiAgXCJvbkNyZWF0ZVwiLCAvLyBmaWVsZCBpbnNlcnQgY2FsbGJhY2tcbiAgXCJvblVwZGF0ZVwiLCAvLyBmaWVsZCBlZGl0IGNhbGxiYWNrXG4gIFwib25EZWxldGVcIiwgLy8gZmllbGQgcmVtb3ZlIGNhbGxiYWNrXG4gIFwib25JbnNlcnRcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJvbkVkaXRcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJvblJlbW92ZVwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcImNhblJlYWRcIixcbiAgXCJjYW5DcmVhdGVcIixcbiAgXCJjYW5VcGRhdGVcIixcbiAgXCJ2aWV3YWJsZUJ5XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwiaW5zZXJ0YWJsZUJ5XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwiZWRpdGFibGVCeVwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcInJlc29sdmVBc1wiLFxuICBcInNlYXJjaGFibGVcIixcbiAgXCJkZXNjcmlwdGlvblwiLFxuICBcImJlZm9yZUNvbXBvbmVudFwiLFxuICBcImFmdGVyQ29tcG9uZW50XCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJvcHRpb25zXCIsXG4gIFwicXVlcnlcIixcbiAgXCJxdWVyeVdhaXRzRm9yVmFsdWVcIixcbiAgXCJhdXRvY29tcGxldGVRdWVyeVwiLFxuICBcImZpZWxkUHJvcGVydGllc1wiLFxuICBcImludGxcIixcbiAgXCJpbnRsSWRcIixcbl07XG5cbmV4cG9ydCBjb25zdCBmb3JtUHJvcGVydGllcyA9IFtcbiAgXCJvcHRpb25hbFwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwibWluXCIsXG4gIFwibWF4XCIsXG4gIFwiZXhjbHVzaXZlTWluXCIsXG4gIFwiZXhjbHVzaXZlTWF4XCIsXG4gIFwibWluQ291bnRcIixcbiAgXCJtYXhDb3VudFwiLFxuICBcImFsbG93ZWRWYWx1ZXNcIixcbiAgXCJyZWdFeFwiLFxuICBcImJsYWNrYm94XCIsXG4gIFwidHJpbVwiLFxuICBcImN1c3RvbVwiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImF1dG9WYWx1ZVwiLFxuICBcIm11c3RDb21wbGV0ZVwiLCAvLyBtdXN0Q29tcGxldGU6IHRydWUgbWVhbnMgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBjb21wbGV0ZSBwcm9maWxlXG4gIFwiZm9ybVwiLCAvLyBmb3JtIHBsYWNlaG9sZGVyXG4gIFwiaW5wdXRQcm9wZXJ0aWVzXCIsIC8vIGZvcm0gcGxhY2Vob2xkZXJcbiAgXCJpdGVtUHJvcGVydGllc1wiLFxuICBcImNvbnRyb2xcIiwgLy8gU21hcnRGb3JtIGNvbnRyb2wgKFN0cmluZyBvciBSZWFjdCBjb21wb25lbnQpXG4gIFwiaW5wdXRcIiwgLy8gU21hcnRGb3JtIGNvbnRyb2wgKFN0cmluZyBvciBSZWFjdCBjb21wb25lbnQpXG4gIFwib3JkZXJcIiwgLy8gcG9zaXRpb24gaW4gdGhlIGZvcm1cbiAgXCJncm91cFwiLCAvLyBmb3JtIGZpZWxkc2V0IGdyb3VwXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJiZWZvcmVDb21wb25lbnRcIixcbiAgXCJhZnRlckNvbXBvbmVudFwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwib3B0aW9uc1wiLFxuICBcInF1ZXJ5XCIsXG4gIFwicXVlcnlXYWl0c0ZvclZhbHVlXCIsXG4gIFwiYXV0b2NvbXBsZXRlUXVlcnlcIixcbiAgXCJmaWVsZFByb3BlcnRpZXNcIixcbl07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvZmluZFwiKTsiLCJpbXBvcnQgdG9QYXRoIGZyb20gXCJsb2Rhc2gvdG9QYXRoXCI7XG5pbXBvcnQgaW5pdGlhbCBmcm9tIFwibG9kYXNoL2luaXRpYWxcIjtcbmltcG9ydCBmbG93IGZyb20gXCJsb2Rhc2gvZnAvZmxvd1wiO1xuaW1wb3J0IHRha2VSaWdodCBmcm9tIFwibG9kYXNoL3Rha2VSaWdodFwiO1xuXG4vKipcbiAqIFNwbGl0cyBhIHBhdGggaW4gc3RyaW5nIGZvcm1hdCBpbnRvIGFuIGFycmF5LlxuICovXG5leHBvcnQgY29uc3Qgc3BsaXRQYXRoID0gKHN0cmluZzogc3RyaW5nKSA9PiB0b1BhdGgoc3RyaW5nKTtcblxuLyoqXG4gKiBKb2lucyBhIHBhdGggaW4gYXJyYXkgZm9ybWF0IGludG8gYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBqb2luUGF0aCA9IChhcnJheTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPik6IHN0cmluZyA9PlxuICBhcnJheS5yZWR1Y2U8c3RyaW5nPihcbiAgICAoc3RyaW5nLCBpdGVtKSA9PlxuICAgICAgc3RyaW5nICtcbiAgICAgIChOdW1iZXIuaXNOYU4oTnVtYmVyKGl0ZW0pKVxuICAgICAgICA/IGAke3N0cmluZyA9PT0gXCJcIiA/IFwiXCIgOiBcIi5cIn0ke2l0ZW19YFxuICAgICAgICA6IGBbJHtpdGVtfV1gKSxcbiAgICBcIlwiXG4gICk7XG5cbi8qKlxuICogUmV0cmlldmVzIHBhcmVudCBwYXRoIGZyb20gdGhlIGdpdmVuIG9uZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiAgUGF0aCBpbiBzdHJpbmcgZm9ybWF0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQYXJlbnRQYXRoID0gZmxvdyhzcGxpdFBhdGgsIGluaXRpYWwsIGpvaW5QYXRoKTtcblxuLyoqXG4gKiBSZW1vdmVzIHByZWZpeCBmcm9tIHRoZSBnaXZlbiBwYXRocy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBwYXRoc1xuICogQHJldHVybiB7U3RyaW5nW119XG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQcmVmaXggPSAoXG4gIHByZWZpeDogc3RyaW5nLFxuICBwYXRoczogQXJyYXk8c3RyaW5nPlxuKTogQXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGV4cGxvZGVkUHJlZml4ID0gc3BsaXRQYXRoKHByZWZpeCk7XG4gIHJldHVybiBwYXRocy5tYXAoKHBhdGgpID0+IHtcbiAgICBpZiAocGF0aCA9PT0gcHJlZml4KSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgY29uc3QgZXhwbG9kZWRQYXRoID0gc3BsaXRQYXRoKHBhdGgpO1xuICAgIGNvbnN0IGV4cGxvZGVkU3VmZml4ID0gdGFrZVJpZ2h0KFxuICAgICAgZXhwbG9kZWRQYXRoLFxuICAgICAgZXhwbG9kZWRQYXRoLmxlbmd0aCAtIGV4cGxvZGVkUHJlZml4Lmxlbmd0aFxuICAgICk7XG4gICAgcmV0dXJuIGpvaW5QYXRoKGV4cGxvZGVkU3VmZml4KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEZpbHRlcnMgcGF0aHMgdGhhdCBoYXZlIHRoZSBnaXZlbiBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtTdHJpbmdbXX0gcGF0aHNcbiAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICovXG5leHBvcnQgY29uc3QgZmlsdGVyUGF0aHNCeVByZWZpeCA9IChwcmVmaXg6IHN0cmluZywgcGF0aHM6IEFycmF5PHN0cmluZz4pID0+XG4gIHBhdGhzLmZpbHRlcihcbiAgICAocGF0aCkgPT5cbiAgICAgIHBhdGggPT09IHByZWZpeCB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKGAke3ByZWZpeH0uYCkgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChgJHtwcmVmaXh9W2ApXG4gICk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzaW1wbC1zY2hlbWFcIik7IiwiaW1wb3J0IHtcbiAgVnVsY2FuRmllbGRUeXBlLFxuICBWdWxjYW5Db3JlSW5wdXQsXG4gIFZ1bGNhbkZpZWxkSW5wdXQsXG59IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgU2ltcGxlU2NoZW1hIGZyb20gXCJzaW1wbC1zY2hlbWFcIjtcblxuZXhwb3J0IGNvbnN0IHN0YW5kYXJkSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQ+ID0gW1xuICBcIm51bWJlclwiLFxuICBcInVybFwiLFxuICBcImVtYWlsXCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJjaGVja2JveFwiLFxuICBcImNoZWNrYm94Z3JvdXBcIixcbiAgXCJyYWRpb2dyb3VwXCIsXG4gIFwic2VsZWN0XCIsXG4gIFwic2VsZWN0bXVsdGlwbGVcIixcbiAgXCJkYXRldGltZVwiLFxuICBcImRhdGVcIixcbiAgXCJ0aW1lXCIsXG4gIFwidGV4dFwiLFxuICBcInBhc3N3b3JkXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgY2xlYXJhYmxlSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQ+ID0gW1xuICBcImRhdGVcIixcbiAgLy8gIFwiZGF0ZTJcIixcbiAgXCJkYXRldGltZVwiLFxuICBcInRpbWVcIixcbiAgXCJzZWxlY3RcIixcbiAgXCJyYWRpb2dyb3VwXCIsXG5dO1xuZXhwb3J0IGNvbnN0IGFkdmFuY2VkSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQ+ID0gW1xuICBcImxpa2VydFwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcIm11bHRpYXV0b2NvbXBsZXRlXCIsXG5dO1xuZXhwb3J0IHR5cGUgRGVyaXZlZElucHV0ID0gXCJuZXN0ZWRcIjtcbmV4cG9ydCBjb25zdCBkZXJpdmVkSW5wdXRzOiBBcnJheTxEZXJpdmVkSW5wdXQ+ID0gW1wibmVzdGVkXCJdO1xuZXhwb3J0IGNvbnN0IGFsbFZ1bGNhbklucHV0czogQXJyYXk8VnVsY2FuQ29yZUlucHV0IHwgRGVyaXZlZElucHV0PiA9IFtcbiAgLi4uc3RhbmRhcmRJbnB1dHMsXG4gIC4uLmFkdmFuY2VkSW5wdXRzLFxuICAvLyBkZXJpdmVkIGlucHV0cyBhcmUgc3BlY2lmaWMgdG8gdGhlIEZvcm0gaW50ZXJuYWwgY29tcHV0YXRpb25zXG4gIC8vIGl0IGNhbid0IGJlIHNldCBieSB0aGUgdXNlclxuICAuLi5kZXJpdmVkSW5wdXRzLFxuXTtcblxuZXhwb3J0IGNvbnN0IGdldEF1dG9JbnB1dEZyb21UeXBlID0gKFxuICBmaWVsZFR5cGU6IFZ1bGNhbkZpZWxkVHlwZVxuKTogVnVsY2FuQ29yZUlucHV0ID0+IHtcbiAgY29uc3QgYXV0b1R5cGUgPVxuICAgIGZpZWxkVHlwZSA9PT0gTnVtYmVyIHx8IGZpZWxkVHlwZSA9PT0gU2ltcGxlU2NoZW1hLkludGVnZXJcbiAgICAgID8gXCJudW1iZXJcIlxuICAgICAgOiBmaWVsZFR5cGUgPT09IEJvb2xlYW5cbiAgICAgID8gXCJjaGVja2JveFwiXG4gICAgICA6IGZpZWxkVHlwZSA9PT0gRGF0ZVxuICAgICAgPyBcImRhdGVcIlxuICAgICAgOiBcInRleHRcIjtcbiAgcmV0dXJuIGF1dG9UeXBlO1xufTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHMvZm9ybVwiO1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vRm9ybUNvbnRhaW5lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRm9ybVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Qcm92aWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db250ZXh0XCI7XG4iLCIvKlxuXG5Gb3JtQ29udGFpbmVyIGFrYSBTbWFydEZvcm1cblxuQ2hhbmdlcyBjb21wYXJlZCB0byBWdWxjYW4gTWV0ZW9yOlxuXG4tIHByZXZpb3VzbHkgd2FzIG5hbWVkIEZvcm1XcmFwcGVyXG4tIGFjY2VwdHMgYSBtb2RlbCBpbnN0ZWFkIG9mIGNvbGxlY3Rpb25cbi0gbm8gcXVlcnlGcmFnbWVudE5hbWUgKHJlc3AuIG11dGF0aW9uIG5hbWUpLCBpbnN0ZWFkIHlvdSBuZWVkIHRvIHBhc3MgdGhlIGZyYWdtZW50IGV4cGxpY2l0ZWx5XG5cblRlY2huaWNhbGx5LCB0aGlzIGlzIGEgR3JhcGhxbFNtYXJ0Rm9ybSwgd2hpbGUgRm9ybS50c3ggaXMgdGhlIG1vcmVcbmdlbmVyaWMgU21hcnRGb3JtLCBvciBhIFwiTW9kZWxGb3JtXCIuXG5cblxuLS0tXG5cbkdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudCBmb3IgdGhlIGN1cnJlbnQgZm9ybSwgdGhlblxud3JhcCB0aGUgbWFpbiBGb3JtIGNvbXBvbmVudCB3aXRoIHRoZSBuZWNlc3NhcnkgSG9DcyB3aGlsZSBwYXNzaW5nXG50aGVtIHRoZSBmcmFnbWVudC5cblxuVGhpcyBjb21wb25lbnQgaXMgaXRzZWxmIHdyYXBwZWQgd2l0aDpcblxuLSB3aXRoQ3VycmVudFVzZXJcbi0gd2l0aEFwb2xsbyAodXNlZCB0byBhY2Nlc3MgdGhlIEFwb2xsbyBjbGllbnQgZm9yIGZvcm0gcHJlLXBvcHVsYXRpb24pXG5cbkFuZCB3cmFwcyB0aGUgRm9ybSBjb21wb25lbnQgd2l0aDpcblxuLSB3aXRoTmV3XG5cbk9yOlxuXG4tIHdpdGhTaW5nbGVcbi0gd2l0aFVwZGF0ZVxuLSB3aXRoRGVsZXRlXG5cbihXaGVuIHdyYXBwaW5nIHdpdGggd2l0aFNpbmdsZSwgd2l0aFVwZGF0ZSwgYW5kIHdpdGhEZWxldGUsIGEgc3BlY2lhbCBMb2FkZXJcbmNvbXBvbmVudCBpcyBhbHNvIGFkZGVkIHRvIHdhaXQgZm9yIHdpdGhTaW5nbGUncyBsb2FkaW5nIHByb3AgdG8gYmUgZmFsc2UpXG5cbiovXG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgLy8gd2l0aEN1cnJlbnRVc2VyLFxuLy8gVXRpbHMsXG4vLyBnZXRGcmFnbWVudCxcbi8vXCJtZXRlb3IvdnVsY2FuOmNvcmVcIjtcbmltcG9ydCB7IGdxbCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuXG5pbXBvcnQgZ2V0Rm9ybUZyYWdtZW50cyBmcm9tIFwiLi9tb2R1bGVzL2Zvcm1GcmFnbWVudHNcIjtcbi8vIGltcG9ydCB7IFZ1bGNhbk1vZGVsIH0gZnJvbSBcIkB2dWxjYW5qcy9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgVnVsY2FuR3JhcGhxbE1vZGVsLFxuICBDcmVhdGVWYXJpYWJsZXMsXG4gIFVwZGF0ZVZhcmlhYmxlcyxcbiAgRGVsZXRlVmFyaWFibGVzLFxufSBmcm9tIFwiQHZ1bGNhbmpzL2dyYXBocWxcIjtcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQge1xuICB1c2VTaW5nbGUsXG4gIHVzZUNyZWF0ZSxcbiAgdXNlVXBkYXRlLFxuICB1c2VEZWxldGUsXG4gIFVzZVNpbmdsZU9wdGlvbnMsXG59IGZyb20gXCJAdnVsY2FuanMvcmVhY3QtaG9va3NcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyBGZXRjaFJlc3VsdCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuLy8gaW1wb3J0IHsgRm9ybVR5cGUgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBkZWJ1Z1Z1bGNhbiB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmNvbnN0IGRlYnVnRm9ybSA9IGRlYnVnVnVsY2FuKFwiZm9ybVwiKTtcblxuLy8gTXV0YXRpb24gdGhhdCB5aWVsZCBhIHN1Y2Nlc3MgcmVzdWx0XG50eXBlIFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxURGF0YSA9IE9iamVjdD4gPSBGZXRjaFJlc3VsdDxURGF0YT4gJiB7XG4gIGRhdGE6IFREYXRhO1xufTtcbi8qKlxuICogVHlwZWd1YXJlZCB0byBhbGxvdyBjb25zaWRlcmluZyB0aGUgcmVxdWVzdCBhcyBzdWNjZXNzZnVsXG4gKi9cbmNvbnN0IGlzU3VjY2Vzc2Z1bCA9IGZ1bmN0aW9uIDxUID0gYW55PihcbiAgcmVzdWx0OiBGZXRjaFJlc3VsdDxUPiB8IHVuZGVmaW5lZFxuKTogcmVzdWx0IGlzIFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxUPiB7XG4gIHJldHVybiAhIXJlc3VsdD8uZGF0YTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbnRhaW5lclByb3BzIHtcbiAgbW9kZWw6IFZ1bGNhbkdyYXBocWxNb2RlbDtcbiAgLyoqIERvY3VtZW50IGlkIGZvciBlZGl0aW9uIG1vZGUsIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgZG9jdW1lbnQgKi9cbiAgZG9jdW1lbnRJZD86IHN0cmluZztcbiAgLyoqIFNsdWcgKD0gaHVtYW4gcmVhZGFibGUgdW5pcXVlIGlkKSBmb3IgZWRpdGlvbiBtb2RlLCB3aWxsIGF1dG9tYXRpY2FsbHkgZmV0Y2ggdGhlIGRvY3VtZW50ICovXG4gIHNsdWc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaXN0IG9ubHkgdGhvc2UgZmllbGRzIGluIHRoZSBmb3JtXG4gICAqL1xuICBmaWVsZHM/OiBBcnJheTxzdHJpbmc+O1xuICAvKipcbiAgICogTGlzdCBkZWZhdWx0IGZpZWxkcyArIHRob3NlIGFkZGl0aW9uYWwgZmllbGRzIGFzIHdlbGxcbiAgICovXG4gIGFkZEZpZWxkcz86IEFycmF5PHN0cmluZz47XG4gIC8qKiBGb3JjZSBhIHF1ZXJ5IGZyYWdtZW50ICovXG4gIHF1ZXJ5RnJhZ21lbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3JjZSBhIG11dGF0aW9uIGZyYWdtZW50ICovXG4gIG11dGF0aW9uRnJhZ21lbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3JjZSBhIHF1ZXJ5IGZyYWdtZW50ICovXG4gIHF1ZXJ5RnJhZ21lbnROYW1lPzogc3RyaW5nO1xuICAvKiogRm9yY2UgYSBtdXRhdGlvbiBmcmFnbWVudCAqL1xuICBtdXRhdGlvbkZyYWdtZW50TmFtZT86IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIFNtYXJ0Rm9ybVByb3BzID0gRm9ybUNvbnRhaW5lclByb3BzO1xuXG4vLyBGb25jdGlvbm5hbCB2ZXJzaW9uIHRvIGJlIGFibGUgdG8gdXNlIGhvb2tzXG5leHBvcnQgY29uc3QgRm9ybUNvbnRhaW5lciA9IChwcm9wczogRm9ybUNvbnRhaW5lclByb3BzKSA9PiB7XG4gIGNvbnN0IHsgbW9kZWwsIGRvY3VtZW50SWQsIHNsdWcsIGZpZWxkcywgYWRkRmllbGRzIH0gPSBwcm9wcztcbiAgY29uc3QgeyBzY2hlbWEgfSA9IG1vZGVsO1xuICAvLyBpZiBhIGRvY3VtZW50IGlzIGJlaW5nIHBhc3NlZCwgdGhpcyBpcyBhbiBlZGl0IGZvcm1cbiAgY29uc3QgaXNFZGl0ID0gZG9jdW1lbnRJZCB8fCBzbHVnO1xuICBjb25zdCBzZWxlY3RvciA9IHtcbiAgICBkb2N1bWVudElkLFxuICAgIHNsdWcsXG4gIH07XG4gIGNvbnN0IGZvcm1UeXBlID0gaXNFZGl0ID8gXCJlZGl0XCIgOiBcIm5ld1wiO1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIC8vIGdldCBmcmFnbWVudCB1c2VkIHRvIGRlY2lkZSB3aGF0IGRhdGEgdG8gbG9hZCBmcm9tIHRoZSBzZXJ2ZXIgdG8gcG9wdWxhdGUgdGhlIGZvcm0sXG4gIC8vIGFzIHdlbGwgYXMgd2hhdCBkYXRhIHRvIGFzayBmb3IgYXMgcmV0dXJuIHZhbHVlIGZvciB0aGUgbXV0YXRpb25cbiAgLy8gVE9ETzogbW92ZSBvdXQgb2YgdGhlIGNvbXBvbmVudFxuICAvL2NvbnN0IGdldEZyYWdtZW50cyA9ICgpID0+IHtcbiAgbGV0IHF1ZXJ5RnJhZ21lbnQ7XG4gIGxldCBxdWVyeUZyYWdtZW50TmFtZSA9IHByb3BzLnF1ZXJ5RnJhZ21lbnROYW1lO1xuICBsZXQgbXV0YXRpb25GcmFnbWVudDtcbiAgbGV0IG11dGF0aW9uRnJhZ21lbnROYW1lID0gcHJvcHMubXV0YXRpb25GcmFnbWVudE5hbWU7XG5cbiAgLy8gaWYgcXVlcnlGcmFnbWVudCBvciBtdXRhdGlvbkZyYWdtZW50IHByb3BzIGFyZSBzcGVjaWZpZWQsIGFjY2VwdCBlaXRoZXIgZnJhZ21lbnQgb2JqZWN0IG9yIGZyYWdtZW50IHN0cmluZ1xuICAvLyBUT0RPOiBub3Qgc3VyZSB3ZSBhY3R1YWxseSBuZWVkIHRoYXQsIGdBcG9sbG8gYWNjZXB0cyBmcmFnbWVudHMgb3Igc3RyaW5nIG5vcm1hbGx5XG4gIGlmIChwcm9wcy5xdWVyeUZyYWdtZW50KSB7XG4gICAgcXVlcnlGcmFnbWVudCA9XG4gICAgICB0eXBlb2YgcHJvcHMucXVlcnlGcmFnbWVudCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGdxbGBcbiAgICAgICAgICAgICR7cHJvcHMucXVlcnlGcmFnbWVudH1cbiAgICAgICAgICBgXG4gICAgICAgIDogcHJvcHMucXVlcnlGcmFnbWVudDtcbiAgfVxuICBpZiAocHJvcHMubXV0YXRpb25GcmFnbWVudCkge1xuICAgIG11dGF0aW9uRnJhZ21lbnQgPVxuICAgICAgdHlwZW9mIHByb3BzLm11dGF0aW9uRnJhZ21lbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBncWxgXG4gICAgICAgICAgICAke3Byb3BzLm11dGF0aW9uRnJhZ21lbnR9XG4gICAgICAgICAgYFxuICAgICAgICA6IHByb3BzLm11dGF0aW9uRnJhZ21lbnQ7XG4gIH1cblxuICAvLyBzYW1lIHdpdGggcXVlcnlGcmFnbWVudE5hbWUgYW5kIG11dGF0aW9uRnJhZ21lbnROYW1lXG4gIC8qXG4gICAgIGlmICh0aGlzLnByb3BzLnF1ZXJ5RnJhZ21lbnROYW1lKSB7XG4gICAgICAgcXVlcnlGcmFnbWVudCA9IGdldEZyYWdtZW50KHRoaXMucHJvcHMucXVlcnlGcmFnbWVudE5hbWUpO1xuICAgICB9XG4gICAgIGlmICh0aGlzLnByb3BzLm11dGF0aW9uRnJhZ21lbnROYW1lKSB7XG4gICAgICAgbXV0YXRpb25GcmFnbWVudCA9IGdldEZyYWdtZW50KHRoaXMucHJvcHMubXV0YXRpb25GcmFnbWVudE5hbWUpO1xuICAgICB9XG4gICAgICovXG5cbiAgaWYgKCFxdWVyeUZyYWdtZW50IHx8ICFtdXRhdGlvbkZyYWdtZW50KSB7XG4gICAgLy8gYXV0b2dlbmVyYXRlZCBmcmFnbWVudHNcbiAgICBjb25zdCBhdXRvRm9ybUZyYWdtZW50cyA9IGdldEZvcm1GcmFnbWVudHMoe1xuICAgICAgZm9ybVR5cGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGFkZEZpZWxkcyxcbiAgICB9KTtcblxuICAgIHF1ZXJ5RnJhZ21lbnQgPSBxdWVyeUZyYWdtZW50IHx8IGF1dG9Gb3JtRnJhZ21lbnRzLnF1ZXJ5RnJhZ21lbnQ7XG4gICAgcXVlcnlGcmFnbWVudE5hbWUgPSBhdXRvRm9ybUZyYWdtZW50cy5xdWVyeUZyYWdtZW50TmFtZTtcbiAgICBtdXRhdGlvbkZyYWdtZW50ID0gbXV0YXRpb25GcmFnbWVudCB8fCBhdXRvRm9ybUZyYWdtZW50cy5tdXRhdGlvbkZyYWdtZW50O1xuICAgIG11dGF0aW9uRnJhZ21lbnROYW1lID0gYXV0b0Zvcm1GcmFnbWVudHMubXV0YXRpb25GcmFnbWVudE5hbWU7XG4gIH1cblxuICAvLyBnZXQgcXVlcnkgJiBtdXRhdGlvbiBmcmFnbWVudHMgZnJvbSBwcm9wcyBvciBlbHNlIGRlZmF1bHQgdG8gc2FtZSBhcyBnZW5lcmF0ZWRGcmFnbWVudFxuICAvL3JldHVybiB7XG4gIC8vICBxdWVyeUZyYWdtZW50LFxuICAvLyAgbXV0YXRpb25GcmFnbWVudCxcbiAgLy99O1xuICAvL31cblxuICBjb25zdCBwcmVmaXggPSBgJHttb2RlbC5uYW1lfSR7Y2FwaXRhbGl6ZShmb3JtVHlwZSl9YDtcbiAgLy8gcHJvcHMgdG8gcGFzcyBvbiB0byBjaGlsZCBjb21wb25lbnQgKGkuZS4gPEZvcm0gLz4pXG4gIGNvbnN0IGNoaWxkUHJvcHMgPSB7XG4gICAgZm9ybVR5cGUsXG4gICAgc2NoZW1hLFxuICB9O1xuXG4gIC8vIG9wdGlvbnMgZm9yIHVzZUNyZWF0ZSwgdXNlVXBkYXRlIGFuZCB1c2VEZWxldGVcbiAgY29uc3QgbXV0YXRpb25PcHRpb25zID0ge1xuICAgIG1vZGVsLFxuICAgIC8vIGNvbGxlY3Rpb246IHRoaXMucHJvcHMuY29sbGVjdGlvbixcbiAgICBmcmFnbWVudDogbXV0YXRpb25GcmFnbWVudCxcbiAgICBmcmFnbWVudE5hbWU6IG11dGF0aW9uRnJhZ21lbnROYW1lLFxuICB9O1xuXG4gIGNvbnN0IHF1ZXJ5T3B0aW9uczogVXNlU2luZ2xlT3B0aW9uczxhbnk+ID0ge1xuICAgIG1vZGVsLFxuICAgIC8vIFRPRE86IHdoYXQgdGhpcyBvcHRpb24gZG9lcz9cbiAgICAvLyBxdWVyeU5hbWU6IGAke3ByZWZpeH1Gb3JtUXVlcnlgLFxuICAgIGZyYWdtZW50OiBxdWVyeUZyYWdtZW50LFxuICAgIGZyYWdtZW50TmFtZTogcXVlcnlGcmFnbWVudE5hbWUsXG4gICAgLy8gZnJhZ21lbnROYW1lP1xuICAgIGlucHV0OiB7XG4gICAgICBpZDogZG9jdW1lbnRJZCxcbiAgICAgIGVuYWJsZUNhY2hlOiBmYWxzZSxcbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgc2x1Z1xuICAgIH0sXG4gICAgcXVlcnlPcHRpb25zOiB7XG4gICAgICAvLyB3ZSBhbHdheXMgd2FudCB0byBsb2FkIGEgZnJlc2ggY29weSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgIGZldGNoUG9saWN5OiBcIm5ldHdvcmstb25seVwiIGFzIFwibmV0d29yay1vbmx5XCIsIC8vIGNhc3QgaXMgZm9yIGZpeGluZyBhbm5veWluZyBUUyBpc3N1ZS4uLiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWFwb2xsby9pc3N1ZXMvOTM2XG4gICAgICBwb2xsSW50ZXJ2YWw6IDAsIC8vIG5vIHBvbGxpbmcsIG9ubHkgbG9hZCBkYXRhIG9uY2VcbiAgICAgIHNraXA6IGZvcm1UeXBlID09PSBcIm5ld1wiLFxuICAgIH0sXG4gIH07XG4gIC8qIGRlYnVnXG4gIGNvbnNvbGUubG9nKFxuICAgIFwiTVVUXCIsXG4gICAgKG11dGF0aW9uRnJhZ21lbnQgYXMgYW55KS5sb2Muc291cmNlLmJvZHksXG4gICAgbXV0YXRpb25GcmFnbWVudE5hbWVcbiAgKTtcbiAgY29uc29sZS5sb2coXG4gICAgXCJRVUVSWVwiLFxuICAgIChxdWVyeUZyYWdtZW50IGFzIGFueSkubG9jLnNvdXJjZS5ib2R5LFxuICAgIHF1ZXJ5RnJhZ21lbnROYW1lXG4gICk7Ki9cbiAgY29uc3QgeyBkYXRhLCBkb2N1bWVudCwgbG9hZGluZywgcmVmZXRjaCB9ID0gdXNlU2luZ2xlKHF1ZXJ5T3B0aW9ucyk7XG4gIGlmIChmb3JtVHlwZSAhPT0gXCJuZXdcIikge1xuICAgIGRlYnVnRm9ybShcbiAgICAgIFwidXNlU2luZ2xlIHJlc3VsdFwiLFxuICAgICAgXCJkYXRhXCIsXG4gICAgICBkYXRhLFxuICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBcImxvYWRpbmdcIixcbiAgICAgIGxvYWRpbmdcbiAgICApO1xuICB9XG4gIC8vIFRPRE86IHBhc3MgdGhlIGNyZWF0aW9uIGZ1bmN0aW9ucyBkb3duIHRvIHRoZSBGb3JtXG4gIGNvbnN0IFtjcmVhdGVEb2N1bWVudF0gPSB1c2VDcmVhdGUobXV0YXRpb25PcHRpb25zKTtcbiAgY29uc3QgW3VwZGF0ZURvY3VtZW50XSA9IHVzZVVwZGF0ZShtdXRhdGlvbk9wdGlvbnMpO1xuICBjb25zdCBbZGVsZXRlRG9jdW1lbnRdID0gdXNlRGVsZXRlKG11dGF0aW9uT3B0aW9ucyk7XG5cbiAgLy8gY2FsbGJhY2tzXG4gIC8qXG4gIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gPFREYXRhID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxURGF0YT5cbiAgKSB7XG4gICAgZ2V0RG9jdW1lbnRGcm9tUmVzdWx0KHJlc3VsdCwgXCJuZXdcIik7XG4gIH07XG4gIGNvbnN0IGVkaXRNdXRhdGlvblN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uIDxURGF0YSA9IE9iamVjdD4oXG4gICAgcmVzdWx0OiBTdWNjZXNzZnVsRmV0Y2hSZXN1bHQ8VERhdGE+XG4gICkge1xuICAgIGdldERvY3VtZW50RnJvbVJlc3VsdChyZXN1bHQsIFwiZWRpdFwiKTtcbiAgfTtcbiAgKi9cblxuICAvKlxuICBUaGUgY3JlYXRlIGhvb2sgYWxyZWFkeSBjcmVhdGVzIGEgZG9jdW1lbnQgcHJvcCBpbiBhIG1vcmUgc3RhYmxlIHdheVxuICBjb25zdCBnZXREb2N1bWVudEZyb21SZXN1bHQgPSBmdW5jdGlvbiA8VERhdGEgPSBPYmplY3Q+KFxuICAgIC8vIG11c3QgYmUgY2FsbGVkIG9ubHkgb24gdmFsaWQgcmVzdWx0c1xuICAgIHJlc3VsdDogU3VjY2Vzc2Z1bEZldGNoUmVzdWx0PFREYXRhPiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBUT0RPOiBxdWl0ZSByaXNreS4uLiB3ZSBzaG91bGQgaGF2ZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoZSBkb2N1bWVudFxuICAgIGxldCBkb2N1bWVudCA9IHJlc3VsdC5kYXRhW09iamVjdC5rZXlzKHJlc3VsdC5kYXRhKVswXV0uZGF0YTsgLy8gZG9jdW1lbnQgaXMgYWx3YXlzIG9uIGZpcnN0IHByb3BlcnR5XG5cbiAgICByZXR1cm4gZG9jdW1lbnQ7XG4gIH07Ki9cbiAgLy8gZm9yIG5ldyBtdXRhdGlvbiwgcnVuIHJlZmV0Y2ggZnVuY3Rpb24gaWYgaXQgZXhpc3RzXG4gIC8qXG4gIGlmIChtdXRhdGlvblR5cGUgPT09IFwibmV3XCIgJiYgcmVmZXRjaCkgcmVmZXRjaCgpO1xuICAqL1xuXG4gIGNvbnN0IGNyZWF0ZUFuZFJldHVybkRvY3VtZW50ID0gYXN5bmMgKHZhcmlhYmxlczogQ3JlYXRlVmFyaWFibGVzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRG9jdW1lbnQodmFyaWFibGVzKTtcbiAgICBjb25zdCB7IGVycm9ycywgZG9jdW1lbnQgfSA9IHJlc3VsdDtcbiAgICByZXR1cm4ge1xuICAgICAgZG9jdW1lbnQsXG4gICAgICBlcnJvcnMsXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQW5kUmV0dXJuRG9jdW1lbnQgPSBhc3luYyAodmFyaWFibGVzOiBVcGRhdGVWYXJpYWJsZXMpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVEb2N1bWVudCh2YXJpYWJsZXMpO1xuICAgIGNvbnN0IHsgZXJyb3JzLCBkb2N1bWVudCB9ID0gcmVzdWx0O1xuICAgIHJldHVybiB7XG4gICAgICBkb2N1bWVudCxcbiAgICAgIGVycm9ycyxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZURvY3VtZW50QW5kUmVmZXRjaCA9IGFzeW5jICh2YXJpYWJsZXM6IERlbGV0ZVZhcmlhYmxlcykgPT4ge1xuICAgIGF3YWl0IGRlbGV0ZURvY3VtZW50KHZhcmlhYmxlcyBhcyBhbnkpO1xuICB9O1xuXG4gIGlmIChpc0VkaXQgJiYgbG9hZGluZykge1xuICAgIHJldHVybiA8VnVsY2FuQ29tcG9uZW50cy5Mb2FkaW5nIC8+O1xuICB9XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybVxuICAgICAgZG9jdW1lbnQ9e2RvY3VtZW50fVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGNyZWF0ZURvY3VtZW50PXtjcmVhdGVBbmRSZXR1cm5Eb2N1bWVudCAvKmNyZWF0ZURvY3VtZW50Ki99XG4gICAgICB1cGRhdGVEb2N1bWVudD17dXBkYXRlQW5kUmV0dXJuRG9jdW1lbnR9XG4gICAgICBkZWxldGVEb2N1bWVudD17ZGVsZXRlRG9jdW1lbnRBbmRSZWZldGNofVxuICAgICAgcmVmZXRjaD17cmVmZXRjaH1cbiAgICAgIHsuLi5jaGlsZFByb3BzfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKlxuRm9ybUNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIC8vIG1haW4gb3B0aW9uc1xuICBkb2N1bWVudElkOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBpZiBhIGRvY3VtZW50IGlzIHBhc3NlZCwgdGhpcyB3aWxsIGJlIGFuIGVkaXQgZm9ybVxuICBtdXRhdGlvbkZyYWdtZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICBtdXRhdGlvbkZyYWdtZW50TmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvLyBncmFwaFFMXG4gIC8vIGNyZWF0ZUZvbywgZGVsZXRlRm9vLCB1cGRhdGVGb29cbiAgLy8gbmV3TXV0YXRpb246IFByb3BUeXBlcy5mdW5jLCAvLyB0aGUgbmV3IG11dGF0aW9uXG4gIC8vIGVkaXRNdXRhdGlvbjogUHJvcFR5cGVzLmZ1bmMsIC8vIHRoZSBlZGl0IG11dGF0aW9uXG4gIC8vIHJlbW92ZU11dGF0aW9uOiBQcm9wVHlwZXMuZnVuYywgLy8gdGhlIHJlbW92ZSBtdXRhdGlvblxuXG4gIC8vIGZvcm1cbiAgcHJlZmlsbGVkUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGxheW91dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZmllbGRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgaGlkZUZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIGFkZEZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIHNob3dSZW1vdmU6IFByb3BUeXBlcy5ib29sLFxuICBzdWJtaXRMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGNhbmNlbExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgcmV2ZXJ0TGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICByZXBlYXRFcnJvcnM6IFByb3BUeXBlcy5ib29sLFxuICB3YXJuVW5zYXZlZENoYW5nZXM6IFByb3BUeXBlcy5ib29sLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICBpdGVtUHJvcGVydGllczogUHJvcFR5cGVzLm9iamVjdCxcbiAgc3VjY2Vzc0NvbXBvbmVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmVsZW1lbnRdKSxcbiAgY29udGV4dE5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLy8gY2FsbGJhY2tzXG4gIC4uLmNhbGxiYWNrUHJvcHMsXG5cbiAgY3VycmVudFVzZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsaWVudDogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbkZvcm1Db250YWluZXIuZGVmYXVsdFByb3BzID0ge1xuICBsYXlvdXQ6IFwiaG9yaXpvbnRhbFwiLFxufTtcbiovXG5cbi8qXG5yZWdpc3RlckNvbXBvbmVudCh7XG4gIG5hbWU6ICdTbWFydEZvcm0nLFxuICBjb21wb25lbnQ6IEZvcm1Db250YWluZXIsXG4gIGhvY3M6IFt3aXRoQ3VycmVudFVzZXIsIHdpdGhBcG9sbG8sIHdpdGhSb3V0ZXIsIHdpdGhDb2xsZWN0aW9uUHJvcHNdLFxufSk7XG4qL1xuXG5leHBvcnQgY29uc3QgU21hcnRGb3JtID0gRm9ybUNvbnRhaW5lcjtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybUNvbnRhaW5lcjtcbiIsIi8qKlxuICogR2VuZXJhdGUgbXV0YXRpb24gYW5kIHF1ZXJ5IGZyYWdtZW50cyBmb3IgYSBmb3JtIGJhc2VkIG9uIHRoZSBzY2hlbWFcbiAqIFRPRE86IHJlZmFjdG9yIHRvIG11dHVhbGl6ZSBtb3JlIGNvZGUgd2l0aCB2dWxjYW4tY29yZSBkZWZhdWx0RnJhZ21lbnQgZnVuY3Rpb25zXG4gKiBUT0RPOiBtb3ZlIHRvIGxpYiB3aGVuIHJlZmFjdG9yZWRcbiAqL1xuaW1wb3J0IF91bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IF9pbnRlcnNlY3Rpb24gZnJvbSBcImxvZGFzaC9pbnRlcnNlY3Rpb25cIjtcbmltcG9ydCB7IGdxbCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0Q3JlYXRlYWJsZUZpZWxkcyxcbiAgZ2V0VXBkYXRlYWJsZUZpZWxkcyxcbiAgZ2V0RnJhZ21lbnRGaWVsZE5hbWVzLFxuICAvL2lzQmxhY2tib3gsXG59IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQge1xuICBnZXRGaWVsZEZyYWdtZW50LFxuICBWdWxjYW5HcmFwaHFsTW9kZWwsXG4gIC8vaXNCbGFja2JveCxcbn0gZnJvbSBcIkB2dWxjYW5qcy9ncmFwaHFsXCI7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBGb3JtVHlwZSB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5pbXBvcnQgY29tcGFjdCBmcm9tIFwibG9kYXNoL2NvbXBhY3RcIjtcbi8vICBnZXRGaWVsZEZyYWdtZW50LFxuY29uc3QgaW50bFN1ZmZpeCA9IFwiX2ludGxcIjtcblxuLy8gUG9zdHNFZGl0Rm9ybVF1ZXJ5RnJhZ21lbnQvUG9zdHNOZXdGb3JtTXV0YXRpb25GcmFnbWVudC9ldGMuXG5jb25zdCBnZXRGcmFnbWVudE5hbWUgPSAoXG4gIGZvcm1UeXBlOiBGb3JtVHlwZSxcbiAgbXVsdGlUeXBlTmFtZTogc3RyaW5nLFxuICBmcmFnbWVudFR5cGU6IFwibXV0YXRpb25cIiB8IFwicXVlcnlcIlxuKSA9PlxuICBbbXVsdGlUeXBlTmFtZSwgZm9ybVR5cGUsIFwiZm9ybVwiLCBmcmFnbWVudFR5cGUsIFwiZnJhZ21lbnRcIl1cbiAgICAubWFwKGNhcGl0YWxpemUpXG4gICAgLmpvaW4oXCJcIik7XG5cbi8vIGdldCBtb2RpZmlhYmxlIGZpZWxkcyBpbiB0aGUgcXVlcnkgZWl0aGVyIGZvciB1cGRhdGUgb3IgY3JlYXRlIG9wZXJhdGlvbnNcbmNvbnN0IGdldFF1ZXJ5RmllbGROYW1lcyA9ICh7IHNjaGVtYSwgb3B0aW9ucyB9KSA9PiB7XG4gIGNvbnN0IHF1ZXJ5RmllbGRzID1cbiAgICBvcHRpb25zLmZvcm1UeXBlID09PSBcIm5ld1wiXG4gICAgICA/IGdldENyZWF0ZWFibGVGaWVsZHMoc2NoZW1hKVxuICAgICAgOiBnZXRVcGRhdGVhYmxlRmllbGRzKHNjaGVtYSk7XG4gIHJldHVybiBxdWVyeUZpZWxkcztcbn07XG4vLyBhZGQgcmVhZGFibGUgZmllbGRzIHRvIG11dGF0aW9uIGZpZWxkc1xuY29uc3QgZ2V0TXV0YXRpb25GaWVsZE5hbWVzID0gKHsgcmVhZGFibGVGaWVsZE5hbWVzLCBxdWVyeUZpZWxkTmFtZXMgfSkgPT4ge1xuICByZXR1cm4gX3VuaXEocXVlcnlGaWVsZE5hbWVzLmNvbmNhdChyZWFkYWJsZUZpZWxkTmFtZXMpKTtcbn07XG5cbi8qXG5jb25zdCBnZXRGaWVsZEZyYWdtZW50ID0gKHsgc2NoZW1hLCBmaWVsZE5hbWUsIG9wdGlvbnMgfSkgPT4ge1xuICAgIGxldCBmaWVsZEZyYWdtZW50ID0gZmllbGROYW1lO1xuICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgaWYgKCEoZmllbGQgJiYgZmllbGQudHlwZSkpIHJldHVybiBmaWVsZE5hbWU7XG4gICAgY29uc3QgZmllbGRUeXBlID0gZmllbGQudHlwZS5zaW5nbGVUeXBlO1xuICAgIGNvbnN0IGZpZWxkVHlwZU5hbWUgPVxuICAgICAgICB0eXBlb2YgZmllbGRUeXBlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgPyAnT2JqZWN0J1xuICAgICAgICAgICAgOiB0eXBlb2YgZmllbGRUeXBlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgPyBmaWVsZFR5cGUubmFtZVxuICAgICAgICAgICAgICAgIDogZmllbGRUeXBlO1xuXG4gICAgaWYgKGZpZWxkTmFtZS5zbGljZSgtNSkgPT09IGludGxTdWZmaXgpIHtcbiAgICAgICAgZmllbGRGcmFnbWVudCA9IGAke2ZpZWxkTmFtZX17IGxvY2FsZSB2YWx1ZSB9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBjYWxsIGZvciBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzXG4gICAgICAgICAgICBjYXNlICdPYmplY3QnOlxuICAgICAgICAgICAgICAgIGlmICghaXNCbGFja2JveChmaWVsZCkgJiYgZmllbGRUeXBlLl9zY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRGcmFnbWVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBmaWVsZFR5cGUuX3NjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJheSc6XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVtRmllbGROYW1lID0gYCR7ZmllbGROYW1lfS4kYDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUl0ZW1GaWVsZCA9IHNjaGVtYVthcnJheUl0ZW1GaWVsZE5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIG5vdGU6IG1ha2Ugc3VyZSBmaWVsZCBoYXMgYW4gYXNzb2NpYXRlZCBhcnJheSBpdGVtIGZpZWxkXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5SXRlbUZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkIHdpbGwgZWl0aGVyIGJlIG5hdGl2ZSB2YWx1ZSBvciBhIGFuIG9iamVjdCAoZmlyc3QgY2FzZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVtRmllbGRUeXBlID0gYXJyYXlJdGVtRmllbGQudHlwZS5zaW5nbGVUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5SXRlbUZpZWxkLmJsYWNrYm94ICYmIGFycmF5SXRlbUZpZWxkVHlwZS5fc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZyYWdtZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50TmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IGFycmF5SXRlbUZpZWxkVHlwZS5fc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpbnRsIG9yIHJldHVybiBmaWVsZE5hbWVcbiAgICAgICAgICAgICAgICBmaWVsZEZyYWdtZW50ID0gZmllbGROYW1lO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWVsZEZyYWdtZW50O1xufTtcbiovXG5cbi8vIGdldCBmcmFnbWVudCBmb3IgYSB3aG9sZSBzY2hlbWEgKHJvb3Qgc2NoZW1hIG9yIG5lc3RlZCBzY2hlbWEgb2YgYW4gb2JqZWN0IG9yIGFuIGFycmF5KVxuY29uc3QgZ2V0U2NoZW1hRnJhZ21lbnQgPSAoe1xuICBzY2hlbWEsXG4gIGZyYWdtZW50TmFtZSxcbiAgb3B0aW9ucyxcbiAgZmllbGROYW1lczogcHJvdmlkZWRGaWVsZE5hbWVzLFxufSkgPT4ge1xuICAvLyBkaWZmZXJlbnRpYXRlIG11dGF0aW9uL3F1ZXJ5IGFuZCBjcmVhdGUvdXBkYXRlIGNhc2VzXG4gIC8vIHJlc3BlY3QgcHJvdmlkZWQgZmllbGROYW1lcyBpZiBhbnkgKG5lZWRlZCBmb3IgdGhlIHJvb3Qgc2NoZW1hKVxuICBjb25zdCBmaWVsZE5hbWVzID1cbiAgICBwcm92aWRlZEZpZWxkTmFtZXMgfHxcbiAgICAob3B0aW9ucy5pc011dGF0aW9uXG4gICAgICA/IGdldE11dGF0aW9uRmllbGROYW1lcyh7XG4gICAgICAgICAgcXVlcnlGaWVsZE5hbWVzOiBnZXRRdWVyeUZpZWxkTmFtZXMoeyBzY2hlbWEsIG9wdGlvbnMgfSksXG4gICAgICAgICAgcmVhZGFibGVGaWVsZE5hbWVzOiBnZXRGcmFnbWVudEZpZWxkTmFtZXMoe1xuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgb3B0aW9uczogeyBvbmx5Vmlld2FibGU6IHRydWUgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgIDogZ2V0UXVlcnlGaWVsZE5hbWVzKHsgc2NoZW1hLCBvcHRpb25zIH0pKTtcblxuICBjb25zdCBjaGlsZEZyYWdtZW50cyA9XG4gICAgZmllbGROYW1lcy5sZW5ndGggJiZcbiAgICBmaWVsZE5hbWVzXG4gICAgICAubWFwKChmaWVsZE5hbWUpID0+XG4gICAgICAgIGdldEZpZWxkRnJhZ21lbnQoe1xuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBnZXRPYmplY3RGcmFnbWVudDogZ2V0U2NoZW1hRnJhZ21lbnQsIC8vIGFsbG93IHRvIHJldXNlIHRoZSBjb2RlIGZyb20gZGVmYXVsdEZyYWdtZW50IHdpdGggYW5vdGhlciBiZWhhdmlvdXJcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC8vIHJlbW92ZSBlbXB0eSB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+ICEhZik7XG4gIGlmIChjaGlsZEZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYCR7ZnJhZ21lbnROYW1lfSB7ICR7Y2hpbGRGcmFnbWVudHMuam9pbihcIlxcblwiKX0gfWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIHF1ZXJ5IGFuZCBtdXRhdGlvbiBmcmFnbWVudHMgZm9yIGZvcm1zLCBkeW5hbWljYWxseSAgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGZpZWxkc1xuICovXG5jb25zdCBnZXRGb3JtRnJhZ21lbnRzID0gKHtcbiAgZm9ybVR5cGUgPSBcIm5ld1wiLFxuICBtb2RlbCxcbiAgZmllbGRzLCAvLyByZXN0cmljdCBvbiBjZXJ0YWluIGZpZWxkc1xuICBhZGRGaWVsZHMsIC8vIGFkZCBhZGRpdGlvbmFsIGZpZWxkcyAoZWcgdG8gZGlzcGxheSBzdGF0aWMgZmllbGRzKVxufToge1xuICBtb2RlbDogVnVsY2FuR3JhcGhxbE1vZGVsO1xuICBmb3JtVHlwZTogRm9ybVR5cGU7XG4gIGZpZWxkcz86IEFycmF5PHN0cmluZz47IC8vIHJlc3RyaWN0IG9uIGNlcnRhaW4gZmllbGRzXG4gIGFkZEZpZWxkcz86IEFycmF5PHN0cmluZz47IC8vIGFkZCBhZGRpdGlvbmFsIGZpZWxkcyAoZWcgdG8gZGlzcGxheSBzdGF0aWMgZmllbGRzKVxufSkgPT4ge1xuICBjb25zdCB7IHNjaGVtYSwgbmFtZSwgZ3JhcGhxbCB9ID0gbW9kZWw7XG4gIGNvbnN0IHsgdHlwZU5hbWUsIG11bHRpVHlwZU5hbWUgfSA9IGdyYXBocWw7XG4gIC8vIGdldCB0aGUgcm9vdCBzY2hlbWEgZmllbGROYW1lc1xuICBsZXQgcXVlcnlGaWVsZE5hbWVzID0gZ2V0UXVlcnlGaWVsZE5hbWVzKHsgc2NoZW1hLCBvcHRpb25zOiB7IGZvcm1UeXBlIH0gfSk7XG4gIGxldCBtdXRhdGlvbkZpZWxkTmFtZXMgPSBnZXRNdXRhdGlvbkZpZWxkTmFtZXMoe1xuICAgIHF1ZXJ5RmllbGROYW1lcyxcbiAgICByZWFkYWJsZUZpZWxkTmFtZXM6IGdldEZyYWdtZW50RmllbGROYW1lcyh7XG4gICAgICBzY2hlbWEsXG4gICAgICBvcHRpb25zOiB7IG9ubHlWaWV3YWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICB9KTtcblxuICAvLyBpZiBcImZpZWxkc1wiIHByb3AgaXMgc3BlY2lmaWVkLCByZXN0cmljdCBsaXN0IG9mIGZpZWxkcyB0byBpdFxuICBpZiAoZmllbGRzICYmIGZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgIC8vIGFkZCBcIl9pbnRsXCIgc3VmZml4IHRvIGFsbCBmaWVsZHMgaW4gY2FzZSBzb21lIG9mIHRoZW0gYXJlIGludGwgZmllbGRzXG4gICAgY29uc3QgZmllbGRzV2l0aEludGxTdWZmaXggPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7ZmllbGR9JHtpbnRsU3VmZml4fWApO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IFsuLi5maWVsZHMsIC4uLmZpZWxkc1dpdGhJbnRsU3VmZml4XTtcbiAgICBxdWVyeUZpZWxkTmFtZXMgPSBfaW50ZXJzZWN0aW9uKHF1ZXJ5RmllbGROYW1lcywgYWxsRmllbGRzKTtcbiAgICBtdXRhdGlvbkZpZWxkTmFtZXMgPSBfaW50ZXJzZWN0aW9uKG11dGF0aW9uRmllbGROYW1lcywgYWxsRmllbGRzKTtcbiAgfVxuXG4gIC8vIGFkZCBcImFkZEZpZWxkc1wiIHByb3AgY29udGVudHMgdG8gbGlzdCBvZiBmaWVsZHNcbiAgaWYgKGFkZEZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgcXVlcnlGaWVsZE5hbWVzID0gcXVlcnlGaWVsZE5hbWVzLmNvbmNhdChhZGRGaWVsZHMpO1xuICAgIG11dGF0aW9uRmllbGROYW1lcyA9IG11dGF0aW9uRmllbGROYW1lcy5jb25jYXQoYWRkRmllbGRzKTtcbiAgfVxuXG4gIC8vIHVzZXJJZCBpcyB1c2VkIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9ucywgc28gYWRkIGl0IHRvIGZyYWdtZW50cyBpZiBwb3NzaWJsZVxuICBpZiAoc2NoZW1hLnVzZXJJZCkge1xuICAgIHF1ZXJ5RmllbGROYW1lcy51bnNoaWZ0KFwidXNlcklkXCIpO1xuICAgIG11dGF0aW9uRmllbGROYW1lcy51bnNoaWZ0KFwidXNlcklkXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5faWQpIHtcbiAgICBxdWVyeUZpZWxkTmFtZXMudW5zaGlmdChcIl9pZFwiKTtcbiAgICBtdXRhdGlvbkZpZWxkTmFtZXMudW5zaGlmdChcIl9pZFwiKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHVuaWNpdHkgKF9pZCBjYW4gYmUgYWRkZWQgdHdpY2UpXG4gIHF1ZXJ5RmllbGROYW1lcyA9IF91bmlxKHF1ZXJ5RmllbGROYW1lcyk7XG4gIG11dGF0aW9uRmllbGROYW1lcyA9IF91bmlxKG11dGF0aW9uRmllbGROYW1lcyk7XG5cbiAgaWYgKHF1ZXJ5RmllbGROYW1lcy5sZW5ndGggPT09IDApXG4gICAgLy8gTk9URTogaW4gdGhlb3J5LCB5b3UgY291bGQgaGF2ZSBubyBxdWVyaWFibGUgZmllbGRzLCBidXQgbXV0YWJsZSBmaWVsZHMgPT5cbiAgICAvLyBhIGZvcm0gZm9yIGRhdGEgdGhhdCB5b3UgY2FuIGNyZWF0ZSBidXQgY2FuIG5ldmVyIHNlZS4uLlxuICAgIC8vIFNpbmNlIHRoYXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UsIHdlIHRocm93IGFuIGVycm9yIHRvIHNlY3VyZSB0aGUgZW5kIHVzZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kZWwgXCIke21vZGVsLm5hbWV9XCIgaGFzIG5vIHF1ZXJ5YWJsZSBmaWVsZHMsIGNhbm5vdCBjcmVhdGUgYSBmb3JtIGZvciBpdC4gUGxlYXNlIGFkZCByZWFkYWJsZS9jcmVhdGVhYmxlL3VwZGF0ZWFibGUgZmllbGRzIHRvIHRoZSBtb2RlbCBzY2hlbWEuYFxuICAgICk7XG4gIGlmIChtdXRhdGlvbkZpZWxkTmFtZXMubGVuZ3RoID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2RlbCBcIiR7bW9kZWwubmFtZX1cIiBoYXMgbm8gbXV0YWJsZSBmaWVsZHMsIGNhbm5vdCBjcmVhdGUgYSBmb3JtIGZvciBpdC4gUGxlYXNlIGFkZCBjcmVhdGVhYmxlL3VwZGF0ZWFibGUgZmllbGRzIHRvIG1vZGVsIHNjaGVtYS5gXG4gICAgKTtcblxuICBjb25zdCBxdWVyeUZyYWdtZW50TmFtZSA9IGdldEZyYWdtZW50TmFtZShcbiAgICBmb3JtVHlwZSxcbiAgICBtdWx0aVR5cGVOYW1lLCAvLyBwcmV2aW91c2x5IGNvbGxlY3Rpb25OYW1lIC8vbmFtZSxcbiAgICBcInF1ZXJ5XCJcbiAgKTtcbiAgLy8gZ2VuZXJhdGUgcXVlcnkgZnJhZ21lbnQgYmFzZWQgb24gdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSBlZGl0ZWQuIE5vdGU6IGFsd2F5cyBhZGQgX2lkLCBhbmQgdXNlcklkIGlmIHBvc3NpYmxlLlxuICAvLyBUT0RPOiBzdXBwb3J0IG5lc3RpbmdcbiAgY29uc3QgcXVlcnlGcmFnbWVudFRleHQgPSBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgc2NoZW1hLFxuICAgIGZyYWdtZW50TmFtZTogYGZyYWdtZW50ICR7cXVlcnlGcmFnbWVudE5hbWV9IG9uICR7dHlwZU5hbWV9YCxcbiAgICBvcHRpb25zOiB7IGZvcm1UeXBlLCBpc011dGF0aW9uOiBmYWxzZSB9LFxuICAgIGZpZWxkTmFtZXM6IHF1ZXJ5RmllbGROYW1lcyxcbiAgfSk7XG4gIGlmICghcXVlcnlGcmFnbWVudFRleHQpIHtcbiAgICAvLyBOT1RFOiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbXB0eSBhcnJheSBmb3IgZmllbGQgbmFtZXNcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5uYW1lfSB3aXRoIGZpZWxkcyAke3F1ZXJ5RmllbGROYW1lc30geWllbGQgYW4gZW1wdHkgcXVlcnkgZnJhZ21lbnQuYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuZXJhdGVkUXVlcnlGcmFnbWVudCA9IGdxbChxdWVyeUZyYWdtZW50VGV4dCk7XG5cbiAgY29uc3QgbXV0YXRpb25GcmFnbWVudE5hbWUgPSBnZXRGcmFnbWVudE5hbWUoXG4gICAgZm9ybVR5cGUsXG4gICAgbXVsdGlUeXBlTmFtZSwgLy8gcHJldmlvdXNseSBjb2xsZWN0aW9uTmFtZSxcbiAgICBcIm11dGF0aW9uXCJcbiAgKTtcbiAgY29uc3QgbXV0YXRpb25GcmFnbWVudFRleHQgPSBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgc2NoZW1hLFxuICAgIGZyYWdtZW50TmFtZTogYGZyYWdtZW50ICR7bXV0YXRpb25GcmFnbWVudE5hbWV9IG9uICR7dHlwZU5hbWV9YCxcbiAgICBvcHRpb25zOiB7IGZvcm1UeXBlLCBpc011dGF0aW9uOiB0cnVlIH0sXG4gICAgZmllbGROYW1lczogbXV0YXRpb25GaWVsZE5hbWVzLFxuICB9KTtcbiAgaWYgKCFtdXRhdGlvbkZyYWdtZW50VGV4dCkge1xuICAgIC8vIE5PVEU6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB3ZSBkb24ndCBoYXZlIGFuIGVtcHR5IGFycmF5IGZvciBmaWVsZCBuYW1lc1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2RlbCAke21vZGVsLm5hbWV9IHdpdGggZmllbGRzICR7bXV0YXRpb25GaWVsZE5hbWVzfSB5aWVsZCBhbiBlbXB0eSBtdXRhdGlvbiBmcmFnbWVudC5gXG4gICAgKTtcbiAgfVxuICAvLyBnZW5lcmF0ZSBtdXRhdGlvbiBmcmFnbWVudCBiYXNlZCBvbiB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIGVkaXRlZCBhbmQvb3Igdmlld2VkLiBOb3RlOiBhbHdheXMgYWRkIF9pZCwgYW5kIHVzZXJJZCBpZiBwb3NzaWJsZS5cbiAgLy8gVE9ETzogc3VwcG9ydCBuZXN0aW5nXG4gIGNvbnN0IGdlbmVyYXRlZE11dGF0aW9uRnJhZ21lbnQgPSBncWwobXV0YXRpb25GcmFnbWVudFRleHQpO1xuXG4gIC8vIGlmIGFueSBmaWVsZCBzcGVjaWZpZXMgZXh0cmEgcXVlcmllcywgYWRkIHRoZW1cbiAgY29uc3QgZXh0cmFRdWVyaWVzID0gY29tcGFjdChcbiAgICBnZXRRdWVyeUZpZWxkTmFtZXMoeyBzY2hlbWEsIG9wdGlvbnM6IHsgZm9ybVR5cGUgfSB9KS5tYXAoKGZpZWxkTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgICAgIHJldHVybiBmaWVsZC5xdWVyeTtcbiAgICB9KVxuICApO1xuICAvLyBnZXQgcXVlcnkgJiBtdXRhdGlvbiBmcmFnbWVudHMgZnJvbSBwcm9wcyBvciBlbHNlIGRlZmF1bHQgdG8gc2FtZSBhcyBnZW5lcmF0ZWRGcmFnbWVudFxuICByZXR1cm4ge1xuICAgIHF1ZXJ5RnJhZ21lbnQ6IGdlbmVyYXRlZFF1ZXJ5RnJhZ21lbnQsXG4gICAgbXV0YXRpb25GcmFnbWVudDogZ2VuZXJhdGVkTXV0YXRpb25GcmFnbWVudCxcbiAgICBxdWVyeUZyYWdtZW50TmFtZSxcbiAgICBtdXRhdGlvbkZyYWdtZW50TmFtZSxcbiAgICBleHRyYVF1ZXJpZXMsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRGb3JtRnJhZ21lbnRzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL3NjaGVtYVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvZ3JhcGhxbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvcmVhY3QtaG9va3NcIik7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZXhwb3J0IGludGVyZmFjZSBEdW1teVByb3BzIHt9XG5cbmV4cG9ydCBjb25zdCBEdW1teSA9ICgpID0+IChcbiAgPHNwYW4+XG4gICAgWW91IGhhdmUgbm90IHNldHVwIFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlci4gUGxlYXNlIGFkZCBmb2xsb3dpbmcgY29kZSBpblxuICAgIHlvdXIgYXBwOntcIiBcIn1cbiAgICA8Y29kZT57YGltcG9ydCB7IFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlciB9IGZyb20gXCJAdnVsY2FuanMvcmVhY3QtdWlcIjsgY29uc3QgWW91ckFwcCA9IDxWdWxjYW5Db21wb25lbnRzUHJvdmlkZXI+ey8qIHlvdXIgYXBwICovfTwvVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyPjt9YH08L2NvZGU+XG4gIDwvc3Bhbj5cbik7XG4iLCIvKlxuXG5NYWluIGZvcm0gY29tcG9uZW50LlxuXG5UaGlzIGNvbXBvbmVudCBleHBlY3RzOlxuXG4jIyMgQWxsIEZvcm1zOlxuXG4tIGNvbGxlY3Rpb25cbi0gY3VycmVudFVzZXJcbi0gY2xpZW50IChBcG9sbG8gY2xpZW50KVxuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBydW5DYWxsYmFja3MsIGdldEVycm9ycyB9IGZyb20gXCJAdnVsY2FuanMvY29yZVwiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmltcG9ydCB7IHJlbW92ZVByb3BlcnR5IH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcImxvZGFzaC9maWx0ZXJcIjtcbmltcG9ydCBjbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcbmltcG9ydCBjb21wYWN0IGZyb20gXCJsb2Rhc2gvY29tcGFjdFwiO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNPYmplY3RcIjtcbmltcG9ydCBtYXBWYWx1ZXMgZnJvbSBcImxvZGFzaC9tYXBWYWx1ZXNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwibG9kYXNoL21lcmdlXCI7XG5pbXBvcnQgb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCBvbWl0QnkgZnJvbSBcImxvZGFzaC9vbWl0QnlcIjtcbmltcG9ydCBwaWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuaW1wb3J0IHBpY2tCeSBmcm9tIFwibG9kYXNoL3BpY2tCeVwiO1xuaW1wb3J0IHNldCBmcm9tIFwibG9kYXNoL3NldFwiO1xuaW1wb3J0IHVuc2V0IGZyb20gXCJsb2Rhc2gvdW5zZXRcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcImxvZGFzaC91cGRhdGVcIjtcbmltcG9ydCB3aXRob3V0IGZyb20gXCJsb2Rhc2gvd2l0aG91dFwiO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1MYXlvdXRQcm9wcyB9IGZyb20gXCIuLi9Gb3JtTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1TdWJtaXRQcm9wcyB9IGZyb20gXCIuLi9Gb3JtU3VibWl0XCI7XG5cbmltcG9ydCB7XG4gIGNvbnZlcnRTY2hlbWEsXG4gIGdldEVkaXRhYmxlRmllbGRzLFxuICBnZXRJbnNlcnRhYmxlRmllbGRzLFxufSBmcm9tIFwiLi4vbW9kdWxlcy9zY2hlbWFfdXRpbHNcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL21vZHVsZXMvcGF0aF91dGlsc1wiO1xuLy8gaW1wb3J0IHdpdGhDb2xsZWN0aW9uUHJvcHMgZnJvbSBcIi4vd2l0aENvbGxlY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiLi4vRm9ybUNvbnRleHRcIjtcbmltcG9ydCB7IGdldEZpZWxkR3JvdXBzLCBnZXRGaWVsZE5hbWVzLCBnZXRMYWJlbCB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgaXNOb3RTYW1lRG9jdW1lbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgdXNlV2Fybk9uVW5zYXZlZCB9IGZyb20gXCIuLi91c2VXYXJuT25VbnNhdmVkXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuaW1wb3J0IHR5cGUgeyBGb3JtVHlwZSB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5pbXBvcnQge1xuICBDcmVhdGVEb2N1bWVudFJlc3VsdCxcbiAgRm9ybVByb3BzLFxuICBGb3JtU3RhdGUsXG4gIFVwZGF0ZURvY3VtZW50UmVzdWx0LFxufSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBNdXRhdGlvblJlc3VsdCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuXG4vLyBwcm9wcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgZm9ybSByZXNldFxuY29uc3QgUkVTRVRfUFJPUFMgPSBbXG4gIFwibW9kZWxcIixcbiAgLy8gXCJjb2xsZWN0aW9uXCIsXG4gIC8vIFwiY29sbGVjdGlvbk5hbWVcIixcbiAgXCJkb2N1bWVudFwiLFxuICBcInNjaGVtYVwiLFxuICBcImN1cnJlbnRVc2VyXCIsXG4gIFwiZmllbGRzXCIsXG4gIFwicmVtb3ZlRmllbGRzXCIsXG4gIFwicHJlZmlsbGVkUHJvcHNcIiwgLy8gVE9ETzogcHJlZmlsbGVkUHJvcHMgc2hvdWxkIGJlIG1lcmdlZCBpbnN0ZWFkP1xuXTtcblxuY29uc3QgY29tcGFjdFBhcmVudCA9IChvYmplY3QsIHBhdGgpID0+IHtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhcmVudFBhdGgocGF0aCk7XG5cbiAgLy8gbm90ZTogd2Ugb25seSB3YW50IHRvIGNvbXBhY3QgYXJyYXlzLCBub3Qgb2JqZWN0c1xuICBjb25zdCBjb21wYWN0SWZBcnJheSA9ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGNvbXBhY3QoeCkgOiB4KTtcblxuICB1cGRhdGUob2JqZWN0LCBwYXJlbnRQYXRoLCBjb21wYWN0SWZBcnJheSk7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0VmFsdWVzID0gKGNvbnZlcnRlZFNjaGVtYSkgPT4ge1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgd29yayB3aXRoIG5lc3RlZCBzY2hlbWFzLCB0b29cbiAgcmV0dXJuIHBpY2tCeShcbiAgICBtYXBWYWx1ZXMoY29udmVydGVkU2NoZW1hLCAoZmllbGQpID0+IGZpZWxkLmRlZmF1bHRWYWx1ZSksXG4gICAgKHZhbHVlKSA9PiB2YWx1ZVxuICApO1xufTtcblxuY29uc3QgY29tcGFjdE9iamVjdCA9IChvKSA9PiBvbWl0QnkobywgKGYpID0+IGYgPT09IG51bGwgfHwgZiA9PT0gdW5kZWZpbmVkKTtcblxuY29uc3QgZ2V0SW5pdGlhbFN0YXRlRnJvbVByb3BzID0gKG5leHRQcm9wczogRm9ybVByb3BzKTogRm9ybVN0YXRlID0+IHtcbiAgY29uc3Qgc2NoZW1hID0gbmV4dFByb3BzLnNjaGVtYSB8fCBuZXh0UHJvcHMubW9kZWwuc2NoZW1hO1xuICBjb25zdCBjb252ZXJ0ZWRTY2hlbWEgPSBjb252ZXJ0U2NoZW1hKHNjaGVtYSk7XG4gIGNvbnN0IGZvcm1UeXBlOiBGb3JtVHlwZSA9IG5leHRQcm9wcy5kb2N1bWVudCA/IFwiZWRpdFwiIDogXCJuZXdcIjtcbiAgLy8gZm9yIG5ldyBkb2N1bWVudCBmb3JtcywgYWRkIGRlZmF1bHQgdmFsdWVzIHRvIGluaXRpYWwgZG9jdW1lbnRcbiAgY29uc3QgZGVmYXVsdFZhbHVlcyA9XG4gICAgZm9ybVR5cGUgPT09IFwibmV3XCIgPyBnZXREZWZhdWx0VmFsdWVzKGNvbnZlcnRlZFNjaGVtYSkgOiB7fTtcbiAgLy8gbm90ZTogd2UgcmVtb3ZlIG51bGwvdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBsb2FkZWQgZG9jdW1lbnQgc28gdGhleSBkb24ndCBvdmVyd3JpdGUgcG9zc2libGUgcHJlZmlsbGVkUHJvcHNcbiAgY29uc3QgaW5pdGlhbERvY3VtZW50ID0gbWVyZ2UoXG4gICAge30sXG4gICAgZGVmYXVsdFZhbHVlcyxcbiAgICBuZXh0UHJvcHMucHJlZmlsbGVkUHJvcHMsXG4gICAgY29tcGFjdE9iamVjdChuZXh0UHJvcHMuZG9jdW1lbnQpXG4gICk7XG5cbiAgLy9pZiBtaW5Db3VudCBpcyBzcGVjaWZpZWQsIGdvIGFoZWFkIGFuZCBjcmVhdGUgZW1wdHkgbmVzdGVkIGRvY3VtZW50c1xuICBPYmplY3Qua2V5cyhjb252ZXJ0ZWRTY2hlbWEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGxldCBtaW5Db3VudCA9IGNvbnZlcnRlZFNjaGVtYVtrZXldLm1pbkNvdW50O1xuICAgIGlmIChtaW5Db3VudCkge1xuICAgICAgaW5pdGlhbERvY3VtZW50W2tleV0gPSBpbml0aWFsRG9jdW1lbnRba2V5XSB8fCBbXTtcbiAgICAgIHdoaWxlIChpbml0aWFsRG9jdW1lbnRba2V5XS5sZW5ndGggPCBtaW5Db3VudClcbiAgICAgICAgaW5pdGlhbERvY3VtZW50W2tleV0ucHVzaCh7fSk7XG4gICAgfVxuICB9KTtcblxuICAvLyByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiB0aGUgYF9fdHlwZW5hbWVgIHByb3BlcnR5IGZyb20gZG9jdW1lbnRcbiAgcmVtb3ZlUHJvcGVydHkoaW5pdGlhbERvY3VtZW50LCBcIl9fdHlwZW5hbWVcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlZDogbmV4dFByb3BzLmRpc2FibGVkLFxuICAgIGVycm9yczogW10sXG4gICAgZGVsZXRlZFZhbHVlczogW10sXG4gICAgY3VycmVudFZhbHVlczoge30sXG4gICAgb3JpZ2luYWxTY2hlbWE6IGNvbnZlcnRTY2hlbWEoc2NoZW1hLCB7IHJlbW92ZUFycmF5czogZmFsc2UgfSksXG4gICAgLy8gY29udmVydCBTaW1wbGVTY2hlbWEgc2NoZW1hIGludG8gSlNPTiBvYmplY3RcbiAgICBzY2hlbWE6IGNvbnZlcnRlZFNjaGVtYSxcbiAgICAvLyBBbHNvIHN0b3JlIGFsbCBmaWVsZCBzY2hlbWFzIChpbmNsdWRpbmcgbmVzdGVkIHNjaGVtYXMpIGluIGEgZmxhdCBzdHJ1Y3R1cmVcbiAgICBmbGF0U2NoZW1hOiBjb252ZXJ0U2NoZW1hKHNjaGVtYSwgeyBmbGF0dGVuOiB0cnVlIH0pLFxuICAgIC8vIHRoZSBpbml0aWFsIGRvY3VtZW50IHBhc3NlZCBhcyBwcm9wc1xuICAgIGluaXRpYWxEb2N1bWVudCxcbiAgICAvLyBpbml0aWFsaXplIHRoZSBjdXJyZW50IGRvY3VtZW50IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsIGRvY3VtZW50XG4gICAgY3VycmVudERvY3VtZW50OiBpbml0aWFsRG9jdW1lbnQsXG4gIH07XG59O1xuXG5jb25zdCBnZXRDaGlsZHJlblByb3BzID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiZGlzYWJsZWRcIiB8IFwiY3VycmVudERvY3VtZW50XCI+LFxuICBvcHRpb25zOiB7IGZvcm1UeXBlOiBGb3JtVHlwZSB9LFxuICAvLyBUT0RPOiB0aGF0IGJlbG9uZ3MgdG8gdGhlIGNvbnRleHQgaW5zdGVhZFxuICBjYWxsYmFja3M6IHsgZGVsZXRlRG9jdW1lbnQ6IEZ1bmN0aW9uIH1cbik6IHtcbiAgZm9ybUxheW91dFByb3BzOiBGb3JtTGF5b3V0UHJvcHM7XG4gIGZvcm1Hcm91cFByb3BzOiBGdW5jdGlvbjtcbiAgY29tbW9uUHJvcHM6IGFueTtcbiAgZm9ybVN1Ym1pdFByb3BzOiBGb3JtU3VibWl0UHJvcHM7XG59ID0+IHtcbiAgY29uc3Qge1xuICAgIGN1cnJlbnRVc2VyLFxuICAgIHJlcGVhdEVycm9ycyxcbiAgICBzdWJtaXRMYWJlbCxcbiAgICBjYW5jZWxMYWJlbCxcbiAgICByZXZlcnRMYWJlbCxcbiAgICBjYW5jZWxDYWxsYmFjayxcbiAgICByZXZlcnRDYWxsYmFjayxcbiAgICBpZCxcbiAgICBtb2RlbCxcbiAgICBwcmVmaWxsZWRQcm9wcyxcbiAgICBpdGVtUHJvcGVydGllcyxcbiAgICBjb250ZXh0TmFtZSxcbiAgICBzaG93UmVtb3ZlLFxuICAgIHNob3dEZWxldGUsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyBkaXNhYmxlZCwgY3VycmVudERvY3VtZW50IH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBmb3JtVHlwZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyBkZWxldGVEb2N1bWVudCB9ID0gY2FsbGJhY2tzO1xuICBjb25zdCBjb21tb25Qcm9wcyA9IHtcbiAgICBkb2N1bWVudDogY3VycmVudERvY3VtZW50LFxuICAgIGZvcm1UeXBlLFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIGRpc2FibGVkLFxuICAgIHByZWZpbGxlZFByb3BzLFxuICAgIGl0ZW1Qcm9wZXJ0aWVzLFxuICAgIGNvbnRleHROYW1lLFxuICB9O1xuXG4gIGNvbnN0IGRvY0NsYXNzTmFtZSA9IGBkb2N1bWVudC0ke2Zvcm1UeXBlfWA7XG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZm9ybVByb3BzID0ge1xuICAgIGNsYXNzTmFtZTogYCR7ZG9jQ2xhc3NOYW1lfSAke2RvY0NsYXNzTmFtZX0tJHttb2RlbE5hbWV9YCxcbiAgICBpZDogaWQsXG4gICAgLy8gSXQncyB0aGUgZm9ybSBlbGVtZW50IHJlc3BvbnNpYmlsaXR5IHRvIGdldCBzdWJtaXRGb3JtIGZyb20gY29udGV4dFxuICAgIC8vIG9uU3VibWl0OiB0aGlzLnN1Ym1pdEZvcm0oZm9ybVR5cGUpLFxuICAgIC8vIFRPRE86IHVwZGF0ZSB0byB1c2VSZWZcbiAgICAvL3JlZjogKGUpID0+IHtcbiAgICAvLyAgdGhpcy5mb3JtID0gZTtcbiAgICAvL30sXG4gIH07XG5cbiAgY29uc3QgZm9ybUdyb3VwUHJvcHMgPSAoZ3JvdXApID0+ICh7XG4gICAga2V5OiBncm91cC5uYW1lLFxuICAgIC4uLmdyb3VwLFxuICAgIGdyb3VwOiBvbWl0KGdyb3VwLCBbXCJmaWVsZHNcIl0pLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICB9KTtcblxuICBjb25zdCBmb3JtU3VibWl0UHJvcHMgPSB7XG4gICAgbW9kZWwsXG4gICAgY3VycmVudFVzZXIsXG4gICAgc3VibWl0TGFiZWwsXG4gICAgY2FuY2VsTGFiZWwsXG4gICAgcmV2ZXJ0TGFiZWwsXG4gICAgY2FuY2VsQ2FsbGJhY2ssXG4gICAgcmV2ZXJ0Q2FsbGJhY2ssXG4gICAgZG9jdW1lbnQ6IGN1cnJlbnREb2N1bWVudCxcbiAgICAvLyBUT0RPOiBzaG91bGQgcHJvYmFibHkgYmUgcGFzc2VkIHRocm91Z2ggY29udGV4dFxuICAgIGRlbGV0ZURvY3VtZW50OlxuICAgICAgKGZvcm1UeXBlID09PSBcImVkaXRcIiAmJiBzaG93UmVtb3ZlICYmIHNob3dEZWxldGUgJiYgZGVsZXRlRG9jdW1lbnQpIHx8XG4gICAgICBudWxsLFxuICB9O1xuXG4gIGNvbnN0IGZvcm1MYXlvdXRQcm9wcyA9IHtcbiAgICBmb3JtUHJvcHM6IGZvcm1Qcm9wcyxcbiAgICByZXBlYXRFcnJvcnM6IHJlcGVhdEVycm9ycyxcbiAgICBzdWJtaXRQcm9wczogZm9ybVN1Ym1pdFByb3BzLFxuICAgIGNvbW1vblByb3BzLFxuICB9O1xuICByZXR1cm4ge1xuICAgIGNvbW1vblByb3BzLFxuICAgIGZvcm1TdWJtaXRQcm9wcyxcbiAgICBmb3JtR3JvdXBQcm9wcyxcbiAgICBmb3JtTGF5b3V0UHJvcHMsXG4gIH07XG59O1xuXG4vLyBjb21wb25lbnQgZm9ybSB1bnRpbCB3ZSBnbyBzdGF0ZWxlc3NcbmNvbnN0IEZvcm1XYXJuVW5zYXZlZCA9ICh7XG4gIGlzQ2hhbmdlZCxcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzLFxuICBjaGlsZHJlbixcbn06IHtcbiAgaXNDaGFuZ2VkOiBib29sZWFuO1xuICB3YXJuVW5zYXZlZENoYW5nZXM/OiBib29sZWFuO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4ge1xuICB1c2VXYXJuT25VbnNhdmVkKHtcbiAgICBpc0NoYW5nZWQsXG4gICAgd2FyblVuc2F2ZWRDaGFuZ2VzLFxuICB9KTtcbiAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbn07XG5cbi8qXG5cbiAgTGlrZSBnZXREb2N1bWVudCwgYnV0IGNyb3NzLXJlZmVyZW5jZSB3aXRoIGdldEZpZWxkTmFtZXMoKVxuICB0byBvbmx5IHJldHVybiBmaWVsZHMgdGhhdCBhY3R1YWxseSBuZWVkIHRvIGJlIHN1Ym1pdHRlZFxuXG4gIEFsc28gcmVtb3ZlIGFueSBkZWxldGVkIHZhbHVlcy5cblxuICAqL1xuY29uc3QgZ2V0RGF0YSA9IChcbiAgY3VzdG9tQXJncyxcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJkZWxldGVkVmFsdWVzXCI+LFxuICAvLyBwcmV2aW91c2x5IGZyb20gXCJ0aGlzXCIgb2JqZWN0XG4gIHsgc3VibWl0Rm9ybUNhbGxiYWNrcywgZm9ybSB9OiBhbnlcbikgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgbW9kZWwsIHByZWZpbGxlZFByb3BzIH0gPSBwcm9wcztcbiAgLy8gd2Ugd2FudCB0byBrZWVwIHByZWZpbGxlZCBkYXRhIGV2ZW4gZm9yIGhpZGRlbi9yZW1vdmVkIGZpZWxkc1xuICBsZXQgZGF0YSA9IHByZWZpbGxlZFByb3BzIHx8IHt9O1xuXG4gIC8vIG9taXQgcHJlZmlsbGVkIHByb3BzIGZvciBuZXN0ZWQgZmllbGRzXG4gIGRhdGEgPSBvbWl0QnkoZGF0YSwgKHZhbHVlLCBrZXkpID0+IGtleS5lbmRzV2l0aChcIi4kXCIpKTtcblxuICBjb25zdCBhcmdzID0ge1xuICAgIHNjaGVtYTogbW9kZWwuc2NoZW1hLFxuICAgIGV4Y2x1ZGVSZW1vdmVkRmllbGRzOiBmYWxzZSxcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzOiBmYWxzZSxcbiAgICByZXBsYWNlSW50bEZpZWxkczogdHJ1ZSxcbiAgICBhZGRFeHRyYUZpZWxkczogZmFsc2UsXG4gICAgLi4uY3VzdG9tQXJncyxcbiAgfTtcblxuICAvLyBvbmx5IGtlZXAgcmVsZXZhbnQgZmllbGRzXG4gIC8vIGZvciBpbnRsIGZpZWxkcywgbWFrZSBzdXJlIHdlIGxvb2sgaW4gZm9vX2ludGwgYW5kIG5vdCBmb29cbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGROYW1lcyhwcm9wcywgY3VycmVudERvY3VtZW50LCBhcmdzKTtcbiAgZGF0YSA9IHsgLi4uZGF0YSwgLi4ucGljayhjdXJyZW50RG9jdW1lbnQsIC4uLmZpZWxkcykgfTtcblxuICAvLyBjb21wYWN0IGRlbGV0ZWQgdmFsdWVzXG4gIHN0YXRlLmRlbGV0ZWRWYWx1ZXMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLypcblxuICAgICAgICBJZiBkZWxldGVkIGZpZWxkIGlzIGEgbmVzdGVkIGZpZWxkLCBuZXN0ZWQgYXJyYXksIG9yIG5lc3RlZCBhcnJheSBpdGVtLCB0cnkgdG8gY29tcGFjdCBpdHMgcGFyZW50IGFycmF5XG5cbiAgICAgICAgLSBOZXN0ZWQgZmllbGQ6ICdhZGRyZXNzLmNpdHknXG4gICAgICAgIC0gTmVzdGVkIGFycmF5OiAnYWRkcmVzc2VzLjEnXG4gICAgICAgIC0gTmVzdGVkIGFycmF5IGl0ZW06ICdhZGRyZXNzZXMuMS5jaXR5J1xuXG4gICAgICAgICovXG4gICAgICBjb21wYWN0UGFyZW50KGRhdGEsIHBhdGgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcnVuIGRhdGEgb2JqZWN0IHRocm91Z2ggc3VibWl0Rm9ybSBjYWxsYmFja3NcbiAgZGF0YSA9IHJ1bkNhbGxiYWNrcyh7XG4gICAgY2FsbGJhY2tzOiBzdWJtaXRGb3JtQ2FsbGJhY2tzLFxuICAgIGl0ZXJhdG9yOiBkYXRhLFxuICAgIGFyZ3M6IFtcbiAgICAgIHtcbiAgICAgICAgLypmb3JtOiB0aGlzKi9cbiAgICAgIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgRm9ybSA9IChwcm9wczogRm9ybVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgaW5pdENhbGxiYWNrLCBjcmVhdGVEb2N1bWVudCwgdXBkYXRlRG9jdW1lbnQsIGRlbGV0ZURvY3VtZW50IH0gPVxuICAgIHByb3BzO1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICBjb25zdCB7IHNjaGVtYSwgb3JpZ2luYWxTY2hlbWEsIGZsYXRTY2hlbWEsIGluaXRpYWxEb2N1bWVudCB9ID0gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBpc0ZpcnN0UmVuZGVyID0gdXNlUmVmKHRydWUpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0ZpcnN0UmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgIGlzRmlyc3RSZW5kZXIuY3VycmVudCA9IGZhbHNlOyAvLyB0b2dnbGUgZmxhZyBhZnRlciBmaXJzdCByZW5kZXIvbW91bnRpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluaXRDYWxsYmFjaykgaW5pdENhbGxiYWNrKGluaXRpYWxTdGF0ZS5jdXJyZW50RG9jdW1lbnQpO1xuICB9LCBbaW5pdENhbGxiYWNrXSk7XG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYXlvdXQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgIHByZWZpbGxlZFByb3BzOiB7fSxcbiAgICByZXBlYXRFcnJvcnM6IGZhbHNlLFxuICAgIHNob3dSZW1vdmU6IHRydWUsXG4gICAgc2hvd0RlbGV0ZTogdHJ1ZSxcbiAgfTtcbiAgY29uc3QgYWxsUHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgLi4ucHJvcHMgfTtcbiAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IHt9O1xuICBjb25zdCBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgY29uc3Qgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBjb25zdCBmYWlsdXJlRm9ybUNhbGxiYWNrczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsQ29udGV4dCgpO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVycm9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLypcblxuICBBZGQgZXJyb3IgdG8gZm9ybSBzdGF0ZVxuXG4gIEVycm9ycyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgLSBpZDogdXNlZCBhcyBhbiBpbnRlcm5hdGlvbmFsaXphdGlvbiBrZXksIGZvciBleGFtcGxlIGBlcnJvcnMucmVxdWlyZWRgXG4gICAgLSBwYXRoOiBmb3IgZmllbGQtc3BlY2lmaWMgZXJyb3JzLCB0aGUgcGF0aCBvZiB0aGUgZmllbGQgd2l0aCB0aGUgaXNzdWVcbiAgICAtIHByb3BlcnRpZXM6IGFkZGl0aW9uYWwgZGF0YS4gV2lsbCBiZSBwYXNzZWQgdG8gdnVsY2FuLWkxOG4gYXMgdmFsdWVzXG4gICAgLSBtZXNzYWdlOiBpZiBpZCBjYW5ub3QgYmUgdXNlZCBhcyBpODFuIGtleSwgbWVzc2FnZSB3aWxsIGJlIHVzZWRcblxuICAqL1xuICBjb25zdCBbZXJyb3JzLCBzZXRFcnJvcnNdID0gdXNlU3RhdGU8QXJyYXk8YW55Pj4oW10pO1xuICBjb25zdCB0aHJvd0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgbGV0IGZvcm1FcnJvcnMgPSBnZXRFcnJvcnMoZXJyb3IpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhmb3JtRXJyb3JzKTtcblxuICAgIC8vIGFkZCBlcnJvcihzKSB0byBzdGF0ZVxuICAgIHNldEVycm9ycygocHJldkVycm9ycykgPT4gWy4uLnByZXZFcnJvcnMsIC4uLmZvcm1FcnJvcnNdKTtcbiAgfTtcblxuICAvKlxuXG4gIENsZWFyIGVycm9ycyBmb3IgYSBmaWVsZFxuXG4gICovXG4gIGNvbnN0IGNsZWFyRmllbGRFcnJvcnMgPSAocGF0aCkgPT4ge1xuICAgIHNldEVycm9ycygocHJldkVycm9ycykgPT5cbiAgICAgIHByZXZFcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGF0aCAhPT0gcGF0aClcbiAgICApO1xuICB9O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgY29uc3QgW2RlbGV0ZWRWYWx1ZXMsIHNldERlbGV0ZWRWYWx1ZXNdID0gdXNlU3RhdGU8QXJyYXk8YW55Pj4oW10pO1xuXG4gIC8vIGFkZCBzb21ldGhpbmcgdG8gZGVsZXRlZCB2YWx1ZXNcbiAgY29uc3QgYWRkVG9EZWxldGVkVmFsdWVzID0gKG5hbWUpID0+IHtcbiAgICBzZXREZWxldGVkVmFsdWVzKChwcmV2RGVsZXRlZFZhbHVlcykgPT4gWy4uLnByZXZEZWxldGVkVmFsdWVzLCBuYW1lXSk7XG4gIH07XG5cbiAgaW50ZXJmYWNlIENhbGxiYWNrcyB7XG4gICAgc3VibWl0Rm9ybUNhbGxiYWNrczogQXJyYXk8YW55PjtcbiAgICBzdWNjZXNzRm9ybUNhbGxiYWNrczogQXJyYXk8YW55PjtcbiAgICBmYWlsdXJlRm9ybUNhbGxiYWNrczogQXJyYXk8YW55PjtcbiAgfVxuICBjb25zdCBbY2FsbGJhY2tzLCBzZXRDYWxsYmFja3NdID0gdXNlU3RhdGU8Q2FsbGJhY2tzPih7XG4gICAgc3VibWl0Rm9ybUNhbGxiYWNrczogW10sXG4gICAgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IFtdLFxuICAgIGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgfSk7XG4gIC8vIGFkZCBhIGNhbGxiYWNrIHRvIHRoZSBmb3JtIHN1Ym1pc3Npb25cbiAgY29uc3QgYWRkVG9TdWJtaXRGb3JtID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgc2V0Q2FsbGJhY2tzKChjYnMpID0+ICh7XG4gICAgICAuLi5jYnMsXG4gICAgICBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBbLi4uY2JzLnN1Ym1pdEZvcm1DYWxsYmFja3MsIGNhbGxiYWNrXSxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gYWRkIGEgY2FsbGJhY2sgdG8gZm9ybSBzdWJtaXNzaW9uIHN1Y2Nlc3NcbiAgY29uc3QgYWRkVG9TdWNjZXNzRm9ybSA9IChjYWxsYmFjaykgPT4ge1xuICAgIHNldENhbGxiYWNrcygoY2JzKSA9PiAoe1xuICAgICAgLi4uY2JzLFxuICAgICAgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IFsuLi5jYnMuc3VjY2Vzc0Zvcm1DYWxsYmFja3MsIGNhbGxiYWNrXSxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gYWRkIGEgY2FsbGJhY2sgdG8gZm9ybSBzdWJtaXNzaW9uIGZhaWx1cmVcbiAgY29uc3QgYWRkVG9GYWlsdXJlRm9ybSA9IChjYWxsYmFjaykgPT4ge1xuICAgIHNldENhbGxiYWNrcygoY2JzKSA9PiAoe1xuICAgICAgLi4uY2JzLFxuICAgICAgZmFpbHVyZUZvcm1DYWxsYmFja3M6IFsuLi5jYnMuZmFpbHVyZUZvcm1DYWxsYmFja3MsIGNhbGxiYWNrXSxcbiAgICB9KSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYXJGb3JtQ2FsbGJhY2tzID0gKCkgPT4ge1xuICAgIHNldENhbGxiYWNrcyh7XG4gICAgICBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICAgIHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICAgIGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICAvKlxuICBzZXRGb3JtU3RhdGUgPSAoZm4pID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKGZuKTtcbiAgfTtcbiAgKi9cblxuICBjb25zdCBbY3VycmVudFZhbHVlcywgc2V0Q3VycmVudFZhbHVlc10gPSB1c2VTdGF0ZTxPYmplY3Q+KHt9KTtcblxuICBjb25zdCBzdWJtaXRGb3JtQ29udGV4dCA9IChmb3JtVHlwZTogRm9ybVR5cGUpID0+IChldmVudCAvKm5ld1ZhbHVlcyovKSA9PiB7XG4gICAgLypcbiAgICBUT0RPOiBwcmV2aW91c2x5IHRoaXMgY2FsbGJhY2sgd2FzIHVwZGF0aW5nIHRoZSBjdXJyZW50IHZhbHVlcyB3aXRoIG5ldyB2YWx1ZXMgYWZ0ZXIgdGhpcyBjYWxsXG4gICAgTmVlZCB0byBjaGVjayBob3cgdGhpcyB3b3JrZWQgaW4gVnVsY2FuIGluaXRpYWxseVxuICAgIHNldEN1cnJlbnRWYWx1ZXMoKHByZXZDdXJyZW50VmFsdWVzKSA9PiAoe1xuICAgICAgLi4ucHJldkN1cnJlbnRWYWx1ZXMsXG4gICAgICAuLi5uZXdWYWx1ZXMsXG4gICAgfSkpO1xuICAgICovXG4gICAgLy8gVE9ETzogcHJldmlvdXNseSwgdGhpcyB3YXMgdXNpbmcgYSBjYWxsYmFjayBmcm9tIHNldEN1cnJlbnRWYWx1ZXNcbiAgICAvLyB0aGlzIG5lZWRzIHRvIGJlIHJlYXJjaGl0ZWN0dXJlZCB0byB3b3JrIHdpdGhvdXQsIHdpbGwgbmVlZCBzb21lIGNoZWNrXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTYyNDc0MzMvaG93LXRvLXVzZS1zZXRzdGF0ZS1jYWxsYmFjay1vbi1yZWFjdC1ob29rc1xuICAgIHN1Ym1pdEZvcm0oZm9ybVR5cGUpKGV2ZW50KTtcbiAgfTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8qXG5cbiAgV2hlbiBwcm9wcyBjaGFuZ2UsIHJlaW5pdGlhbGl6ZSB0aGUgZm9ybSAgc3RhdGVcbiAgVHJpZ2dlcmVkIG9ubHkgZm9yIGRhdGEgcmVsYXRlZCBwcm9wcyAoY29sbGVjdGlvbiwgZG9jdW1lbnQsIGN1cnJlbnRVc2VyIGV0Yy4pXG5cbiAgQHNlZSBodHRwczovL3JlYWN0anMub3JnL2Jsb2cvMjAxOC8wNi8wNy95b3UtcHJvYmFibHktZG9udC1uZWVkLWRlcml2ZWQtc3RhdGUuaHRtbFxuXG4gICovXG4gIC8qXG4gIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGNvbnN0IG5lZWRSZXNldCA9ICEhUkVTRVRfUFJPUFMuZmluZChcbiAgICAgIChwcm9wKSA9PiAhaXNFcXVhbCh0aGlzLnByb3BzW3Byb3BdLCBuZXh0UHJvcHNbcHJvcF0pXG4gICAgKTtcbiAgICBpZiAobmVlZFJlc2V0KSB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICBpZiAobmV4dFByb3BzLmluaXRDYWxsYmFjaylcbiAgICAgICAgbmV4dFByb3BzLmluaXRDYWxsYmFjayhuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQpO1xuICAgIH1cbiAgfSovXG5cbiAgY29uc3QgW2N1cnJlbnREb2N1bWVudCwgc2V0Q3VycmVudERvY3VtZW50XSA9XG4gICAgdXNlU3RhdGU8e1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBfaWQ/OiBzdHJpbmc7XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgIH0+KGluaXRpYWxEb2N1bWVudCk7XG5cbiAgLypcblxuICBNYW51YWxseSB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIG9uZSBvciBtb3JlIGZpZWxkcyhpLmUuIG9uIGNoYW5nZSBvciBibHVyKS5cblxuICAqL1xuICBjb25zdCB1cGRhdGVDdXJyZW50VmFsdWVzID0gKG5ld1ZhbHVlcywgb3B0aW9uczogeyBtb2RlPzogc3RyaW5nIH0gPSB7fSkgPT4ge1xuICAgIC8vIGRlZmF1bHQgdG8gb3ZlcndyaXRpbmcgb2xkIHZhbHVlIHdpdGggbmV3XG4gICAgY29uc3QgeyBtb2RlID0gXCJvdmVyd3JpdGVcIiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGNoYW5nZUNhbGxiYWNrIH0gPSBwcm9wcztcblxuICAgIC8vIGtlZXAgdGhlIHByZXZpb3VzIG9uZXMgYW5kIGV4dGVuZCAod2l0aCBwb3NzaWJsZSByZXBsYWNlbWVudCkgd2l0aCBuZXcgb25lc1xuICAgIC8vIGtlZXAgb25seSB0aGUgcmVsZXZhbnQgcHJvcGVydGllc1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgY3VycmVudFZhbHVlczogY2xvbmVEZWVwKGN1cnJlbnRWYWx1ZXMpLFxuICAgICAgY3VycmVudERvY3VtZW50OiBjbG9uZURlZXAoY3VycmVudERvY3VtZW50KSxcbiAgICAgIGRlbGV0ZWRWYWx1ZXM6IGNsb25lRGVlcChkZWxldGVkVmFsdWVzKSxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmtleXMobmV3VmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBrZXk7XG4gICAgICBsZXQgdmFsdWUgPSBuZXdWYWx1ZXNba2V5XTtcblxuICAgICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZGVsZXRlIHZhbHVlXG4gICAgICAgIHVuc2V0KG5ld1N0YXRlLmN1cnJlbnRWYWx1ZXMsIHBhdGgpO1xuICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoLCBudWxsKTtcbiAgICAgICAgbmV3U3RhdGUuZGVsZXRlZFZhbHVlcyA9IFsuLi5uZXdTdGF0ZS5kZWxldGVkVmFsdWVzLCBwYXRoXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDEuIHVwZGF0ZSBjdXJyZW50VmFsdWVzXG4gICAgICAgIHNldChuZXdTdGF0ZS5jdXJyZW50VmFsdWVzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICAgICAgLy8gMi4gdXBkYXRlIGN1cnJlbnREb2N1bWVudFxuICAgICAgICAvLyBGb3IgYXJyYXlzIGFuZCBvYmplY3RzLCBnaXZlIG9wdGlvbiB0byBtZXJnZSBpbnN0ZWFkIG9mIG92ZXJ3cml0ZVxuICAgICAgICBpZiAobW9kZSA9PT0gXCJtZXJnZVwiICYmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc09iamVjdCh2YWx1ZSkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBnZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoKTtcbiAgICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoLCBtZXJnZShvbGRWYWx1ZSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBpbiBjYXNlIHZhbHVlIGhhZCBwcmV2aW91c2x5IGJlZW4gZGVsZXRlZCwgXCJ1bmRlbGV0ZVwiIGl0XG4gICAgICAgIG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMgPSB3aXRob3V0KG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMsIHBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VDYWxsYmFjaykgY2hhbmdlQ2FsbGJhY2sobmV3U3RhdGUuY3VycmVudERvY3VtZW50KTtcblxuICAgIC8vIFRPRE86IHByZWZlciAgYSByZWR1Y2VyXG4gICAgc2V0Q3VycmVudFZhbHVlcyhuZXdTdGF0ZS5jdXJyZW50VmFsdWVzKTtcbiAgICBzZXRDdXJyZW50RG9jdW1lbnQobmV3U3RhdGUuY3VycmVudERvY3VtZW50KTtcbiAgICBzZXREZWxldGVkVmFsdWVzKG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMpO1xuICB9O1xuXG4gIC8qXG5cbiAgUmVmZXRjaCB0aGUgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2UgKGluIGNhc2UgaXQgd2FzIHVwZGF0ZWQgYnkgYW5vdGhlciBwcm9jZXNzIG9yIHRvIHJlc2V0IHRoZSBmb3JtKVxuXG4gICovXG4gIGNvbnN0IHJlZmV0Y2hGb3JtID0gKCkgPT4ge1xuICAgIGlmIChwcm9wcy5yZWZldGNoKSB7XG4gICAgICBwcm9wcy5yZWZldGNoKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFtkaXNhYmxlZCwgc2V0RGlzYWJsZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOyAvLyBUT0RPXG4gIGNvbnN0IFtzdWNjZXNzLCBzZXRTdWNjZXNzXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsgLy8gVE9ET1xuICAvKipcbiAgICogQ2xlYXJzIGZvcm0gZXJyb3JzIGFuZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIENsZWFyIGZvcm1cbiAgICogIC8vIGZvcm0gd2lsbCBiZSBmdWxseSBlbXB0aWVkLCB3aXRoIGV4Y2VwdGlvbiBvZiBwcmVmaWxsZWQgdmFsdWVzXG4gICAqICBjbGVhckZvcm0oeyBkb2N1bWVudDoge30gfSk7XG4gICAqXG4gICAqIEBleGFtcGxlIFJlc2V0L3JldmVydCBmb3JtXG4gICAqICAvLyBmb3JtIHdpbGwgYmUgcmV2ZXJ0ZWQgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICogIGNsZWFyRm9ybSgpO1xuICAgKlxuICAgKiBAZXhhbXBsZSBDbGVhciB3aXRoIG5ldyB2YWx1ZXNcbiAgICogIC8vIGZvcm0gd2lsbCBiZSBjbGVhcmVkIGJ1dCBpbml0aWFsaXplZCB3aXRoIHRoZSBuZXcgZG9jdW1lbnRcbiAgICogIGNvbnN0IGRvY3VtZW50ID0ge1xuICAgKiAgICAvLyAuLi4gc29tZSB2YWx1ZXNcbiAgICogIH07XG4gICAqICBjbGVhckZvcm0oeyBkb2N1bWVudCB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucy5kb2N1bWVudFxuICAgKiAgRG9jdW1lbnQgdG8gdXNlIGFzIG5ldyBpbml0aWFsIGRvY3VtZW50IHdoZW4gdmFsdWVzIGFyZSBjbGVhcmVkIGluc3RlYWQgb2ZcbiAgICogIHRoZSBleGlzdGluZyBvbmUuIE5vdGUgdGhhdCBwcmVmaWxsZWQgcHJvcHMgd2lsbCBiZSBtZXJnZWRcbiAgICovXG4gIGNvbnN0IGNsZWFyRm9ybSA9IChvcHRpb25zOiB7IGRvY3VtZW50PzogYW55IH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZG9jdW1lbnQ6IG9wdGlvbnNEb2N1bWVudCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBkb2N1bWVudCA9IG9wdGlvbnNEb2N1bWVudFxuICAgICAgPyBtZXJnZSh7fSwgcHJvcHMucHJlZmlsbGVkUHJvcHMsIG9wdGlvbnNEb2N1bWVudClcbiAgICAgIDogbnVsbDtcbiAgICAvLyBUT0RPOiBwcmVmZXIgYSByZWR1Y2VyXG4gICAgc2V0RXJyb3JzKFtdKTtcbiAgICBzZXRDdXJyZW50VmFsdWVzKHt9KTtcbiAgICBzZXREZWxldGVkVmFsdWVzKFtdKTtcbiAgICBzZXRDdXJyZW50RG9jdW1lbnQoZG9jdW1lbnQgfHwgaW5pdGlhbERvY3VtZW50KTtcbiAgICAvLyBzZXRJbml0aWFsRG9jdW1lbnQoZG9jdW1lbnQgfHwgaW5pdGlhbERvY3VtZW50KTtcbiAgICBzZXREaXNhYmxlZChmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgbmV3TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VE1vZGVsID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IENyZWF0ZURvY3VtZW50UmVzdWx0PFRNb2RlbD5cbiAgKSB7XG4gICAgbXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0LCBcIm5ld1wiKTtcbiAgfTtcblxuICBjb25zdCBlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VE1vZGVsID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IFVwZGF0ZURvY3VtZW50UmVzdWx0PFRNb2RlbD5cbiAgKSB7XG4gICAgbXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0LCBcImVkaXRcIik7XG4gIH07XG5cbiAgY29uc3QgZm9ybVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VE1vZGVsID0gT2JqZWN0PihcbiAgICAvLyBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uIHZhbGlkIHJlc3VsdHNcbiAgICByZXN1bHQ6IENyZWF0ZURvY3VtZW50UmVzdWx0PFRNb2RlbD4sXG4gICAgbXV0YXRpb25UeXBlOiBGb3JtVHlwZVxuICApIHtcbiAgICAvLyBUT0RPOiB1c2UgYSByZWR1Y2VyXG4gICAgc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgIHNldFN1Y2Nlc3ModHJ1ZSk7XG4gICAgLy8gZm9yIG5ldyBtdXRhdGlvbiwgcnVuIHJlZmV0Y2ggZnVuY3Rpb24gaWYgaXQgZXhpc3RzXG4gICAgLy8gVE9ETzogdGhlIGNyZWF0ZSBtdXRhdGlvbiBzaG91bGQgYWxyZWFkeSByZXR1cm4gdGhlIGZyZXNoZXN0IHZhbHVlLCBkbyB3ZSByZWFsbHkgbmVlZCB0aGF0P1xuICAgIC8vIGluc3RlYWQgd2UgbWlnaHQgd2FudCB0byB1cGRhdGUgY3VycmVudFJlc3VsdCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNyZWF0aW9uXG4gICAgaWYgKG11dGF0aW9uVHlwZSA9PT0gXCJuZXdcIikgcmVmZXRjaEZvcm0oKTtcbiAgICBsZXQgeyBkb2N1bWVudCB9ID0gcmVzdWx0O1xuXG4gICAgLy8gY2FsbCB0aGUgY2xlYXIgZm9ybSBtZXRob2QgKGkuZS4gdHJpZ2dlciBzZXRTdGF0ZSkgb25seSBpZiB0aGUgZm9ybSBoYXMgbm90IGJlZW4gdW5tb3VudGVkXG4gICAgLy8gKHdlIGFyZSBpbiBhbiBhc3luYyBjYWxsYmFjaywgZXZlcnl0aGluZyBjYW4gaGFwcGVuISlcbiAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCByZWx5IG9uIGEgcmVmXG4gICAgaWYgKGZvcm1SZWYuY3VycmVudCkge1xuICAgICAgY2xlYXJGb3JtKHtcbiAgICAgICAgZG9jdW1lbnQ6IG11dGF0aW9uVHlwZSA9PT0gXCJlZGl0XCIgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHJ1biBkb2N1bWVudCB0aHJvdWdoIG11dGF0aW9uIHN1Y2Nlc3MgY2FsbGJhY2tzXG4gICAgZG9jdW1lbnQgPSBydW5DYWxsYmFja3Moe1xuICAgICAgY2FsbGJhY2tzOiBzdWNjZXNzRm9ybUNhbGxiYWNrcyxcbiAgICAgIGl0ZXJhdG9yOiBkb2N1bWVudCxcbiAgICAgIGFyZ3M6IFt7IGZvcm06IGZvcm1SZWYuY3VycmVudCB9XSxcbiAgICB9KTtcblxuICAgIC8vIHJ1biBzdWNjZXNzIGNhbGxiYWNrIGlmIGl0IGV4aXN0c1xuICAgIGlmIChwcm9wcy5zdWNjZXNzQ2FsbGJhY2spIHByb3BzLnN1Y2Nlc3NDYWxsYmFjayhkb2N1bWVudCwgeyBmb3JtOiB0aGlzIH0pO1xuICB9O1xuXG4gIC8vIGNhdGNoIGdyYXBocWwgZXJyb3JzXG4gIGNvbnN0IG11dGF0aW9uRXJyb3JDYWxsYmFjayA9IChkb2N1bWVudCwgZXJyb3IpID0+IHtcbiAgICBzZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoXCIvLyBncmFwaFFMIEVycm9yXCIpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAvLyBydW4gbXV0YXRpb24gZmFpbHVyZSBjYWxsYmFja3Mgb24gZXJyb3IsIHdlIGRvIG5vdCBhbGxvdyB0aGUgY2FsbGJhY2tzIHRvIGNoYW5nZSB0aGUgZXJyb3JcbiAgICBydW5DYWxsYmFja3Moe1xuICAgICAgY2FsbGJhY2tzOiBmYWlsdXJlRm9ybUNhbGxiYWNrcyxcbiAgICAgIGl0ZXJhdG9yOiBlcnJvcixcbiAgICAgIGFyZ3M6IFt7IGVycm9yLCBmb3JtOiBmb3JtUmVmLmN1cnJlbnQgfV0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWlzRW1wdHkoZXJyb3IpKSB7XG4gICAgICAvLyBhZGQgZXJyb3IgdG8gc3RhdGVcbiAgICAgIHRocm93RXJyb3IoZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIHJ1biBlcnJvciBjYWxsYmFjayBpZiBpdCBleGlzdHNcbiAgICBpZiAocHJvcHMuZXJyb3JDYWxsYmFjaylcbiAgICAgIHByb3BzLmVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIGVycm9yLCB7IGZvcm06IHRoaXMgfSk7XG5cbiAgICAvLyBzY3JvbGwgYmFjayB1cCB0byBzaG93IGVycm9yIG1lc3NhZ2VzXG4gICAgLy8gVE9ETzogbWlncmF0ZSB0aGlzIHRvIHNjcm9sbCBvbiB0b3Agb2YgdGhlIGZvcm1cbiAgICAvL1V0aWxzLnNjcm9sbEludG9WaWV3KFwiLmZsYXNoLW1lc3NhZ2VcIik7XG4gIH07XG5cbiAgLypcblxuICBTdWJtaXQgZm9ybSBoYW5kbGVyXG5cbiAgKi9cbiAgY29uc3Qgc3VibWl0Rm9ybSA9IChmb3JtVHlwZTogRm9ybVR5cGUpID0+IGFzeW5jIChldmVudD86IEV2ZW50KSA9PiB7XG4gICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudCAmJiBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHsgY29udGV4dE5hbWUgfSA9IHByb3BzO1xuXG4gICAgLy8gaWYgZm9ybSBpcyBkaXNhYmxlZCAodGhlcmUgaXMgYWxyZWFkeSBhIHN1Ym1pdCBoYW5kbGVyIHJ1bm5pbmcpIGRvbid0IGRvIGFueXRoaW5nXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgZXJyb3JzIGFuZCBkaXNhYmxlIGZvcm0gd2hpbGUgaXQncyBzdWJtaXR0aW5nXG4gICAgc2V0RXJyb3JzKFtdKTtcbiAgICBzZXREaXNhYmxlZCh0cnVlKTtcblxuICAgIC8vIGNvbXBsZXRlIHRoZSBkYXRhIHdpdGggdmFsdWVzIGZyb20gY3VzdG9tIGNvbXBvbmVudHNcbiAgICAvLyBub3RlOiBpdCBmb2xsb3dzIHRoZSBzYW1lIGxvZ2ljIGFzIFNtYXJ0Rm9ybSdzIGdldERvY3VtZW50IG1ldGhvZFxuICAgIGxldCBkYXRhID0gZ2V0RGF0YShcbiAgICAgIHsgcmVwbGFjZUludGxGaWVsZHM6IHRydWUsIGFkZEV4dHJhRmllbGRzOiBmYWxzZSwgbXV0YWJsZUZpZWxkcyB9LFxuICAgICAgcHJvcHMsXG4gICAgICB7XG4gICAgICAgIGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgZGVsZXRlZFZhbHVlcyxcbiAgICAgIH0sXG4gICAgICB7IGZvcm06IGZvcm1SZWYuY3VycmVudCwgc3VibWl0Rm9ybUNhbGxiYWNrcyB9XG4gICAgKTtcblxuICAgIC8vIGlmIHRoZXJlJ3MgYSBzdWJtaXQgY2FsbGJhY2ssIHJ1biBpdFxuICAgIGlmIChwcm9wcy5zdWJtaXRDYWxsYmFjaykge1xuICAgICAgZGF0YSA9IHByb3BzLnN1Ym1pdENhbGxiYWNrKGRhdGEpIHx8IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1UeXBlID09PSBcIm5ld1wiKSB7XG4gICAgICAvLyBjcmVhdGUgZG9jdW1lbnQgZm9ybVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRG9jdW1lbnQoe1xuICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgY29udGV4dE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBUT0RPOiBwcmV2aW91c2x5IGdvdCBmcm9tIG1ldGEsIHdlIGNvdWxkIGhhdmUgbW9yZSB0aGFuIDEgZXJyb3JcbiAgICAgICAgICBtdXRhdGlvbkVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIHJlc3VsdC5lcnJvcnNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG11dGF0aW9uRXJyb3JDYWxsYmFjayhkb2N1bWVudCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1cGRhdGUgZG9jdW1lbnQgZm9ybVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRJZCA9IGN1cnJlbnREb2N1bWVudC5faWQ7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZURvY3VtZW50KHtcbiAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgaWQ6IGRvY3VtZW50SWQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgY29udGV4dE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBtb3JlIHRoYW4gMSBlcnJvclxuICAgICAgICBpZiAocmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgbXV0YXRpb25FcnJvckNhbGxiYWNrKGRvY3VtZW50LCByZXN1bHQuZXJyb3JzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbXV0YXRpb25FcnJvckNhbGxiYWNrKGRvY3VtZW50LCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qXG5cbiAgRGVsZXRlIGRvY3VtZW50IGhhbmRsZXJcblxuICAqL1xuICBjb25zdCBkZWxldGVEb2N1bWVudFdpdGhDb25maXJtID0gKCkgPT4ge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gY3VycmVudERvY3VtZW50O1xuICAgIGNvbnN0IGRvY3VtZW50SWQgPSBwcm9wcy5kb2N1bWVudC5faWQ7XG4gICAgY29uc3QgZG9jdW1lbnRUaXRsZSA9IGRvY3VtZW50LnRpdGxlIHx8IGRvY3VtZW50Lm5hbWUgfHwgXCJcIjtcblxuICAgIGNvbnN0IGRlbGV0ZURvY3VtZW50Q29uZmlybSA9IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgIHsgaWQ6IFwiZm9ybXMuZGVsZXRlX2NvbmZpcm1cIiB9LFxuICAgICAgeyB0aXRsZTogZG9jdW1lbnRUaXRsZSB9XG4gICAgKTtcblxuICAgIGlmICh3aW5kb3cuY29uZmlybShkZWxldGVEb2N1bWVudENvbmZpcm0pKSB7XG4gICAgICBkZWxldGVEb2N1bWVudCh7IGlucHV0OiB7IGlkOiBkb2N1bWVudElkIH0gfSlcbiAgICAgICAgLnRoZW4oKG11dGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgLy8gdGhlIG11dGF0aW9uIHJlc3VsdCBsb29rcyBsaWtlIHtkYXRhOntjb2xsZWN0aW9uUmVtb3ZlOiBudWxsfX0gaWYgc3VjY2VlZGVkXG4gICAgICAgICAgaWYgKHByb3BzLnJlbW92ZVN1Y2Nlc3NDYWxsYmFjaylcbiAgICAgICAgICAgIHByb3BzLnJlbW92ZVN1Y2Nlc3NDYWxsYmFjayh7IGRvY3VtZW50SWQsIGRvY3VtZW50VGl0bGUgfSk7XG4gICAgICAgICAgcmVmZXRjaEZvcm0oKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcHMgdG8gUGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVuZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIGNvbnN0IHsgc3VjY2Vzc0NvbXBvbmVudCwgZG9jdW1lbnQsIGN1cnJlbnRVc2VyLCBtb2RlbCwgd2FyblVuc2F2ZWRDaGFuZ2VzIH0gPVxuICAgIHByb3BzO1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBjb25zdCBmb3JtVHlwZTogXCJlZGl0XCIgfCBcIm5ld1wiID0gZG9jdW1lbnQgPyBcImVkaXRcIiA6IFwibmV3XCI7XG5cbiAgLy8gRmllbGRzIGNvbXB1dGF0aW9uXG4gIGNvbnN0IG11dGFibGVGaWVsZHMgPVxuICAgIGZvcm1UeXBlID09PSBcImVkaXRcIlxuICAgICAgPyBnZXRFZGl0YWJsZUZpZWxkcyhzY2hlbWEsIGN1cnJlbnRVc2VyLCBpbml0aWFsRG9jdW1lbnQpXG4gICAgICA6IGdldEluc2VydGFibGVGaWVsZHMoc2NoZW1hLCBjdXJyZW50VXNlcik7XG5cbiAgY29uc3QgeyBmb3JtTGF5b3V0UHJvcHMsIGZvcm1Hcm91cFByb3BzIH0gPSBnZXRDaGlsZHJlblByb3BzKFxuICAgIHByb3BzLFxuICAgIHsgZGlzYWJsZWQsIGN1cnJlbnREb2N1bWVudCB9LFxuICAgIHtcbiAgICAgIGZvcm1UeXBlLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVsZXRlRG9jdW1lbnQ6IGRlbGV0ZURvY3VtZW50V2l0aENvbmZpcm0sXG4gICAgfVxuICApO1xuICBjb25zdCBpc0NoYW5nZWQgPSBpc05vdFNhbWVEb2N1bWVudChpbml0aWFsRG9jdW1lbnQsIGN1cnJlbnREb2N1bWVudCk7XG5cbiAgcmV0dXJuIHN1Y2Nlc3MgJiYgc3VjY2Vzc0NvbXBvbmVudCA/IChcbiAgICBzdWNjZXNzQ29tcG9uZW50XG4gICkgOiAoXG4gICAgPEZvcm1XYXJuVW5zYXZlZFxuICAgICAgaXNDaGFuZ2VkPXtpc0NoYW5nZWR9XG4gICAgICB3YXJuVW5zYXZlZENoYW5nZXM9e3dhcm5VbnNhdmVkQ2hhbmdlc31cbiAgICA+XG4gICAgICA8Rm9ybUNvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICB0aHJvd0Vycm9yLFxuICAgICAgICAgIGNsZWFyRm9ybSxcbiAgICAgICAgICByZWZldGNoRm9ybSxcbiAgICAgICAgICBpc0NoYW5nZWQsXG4gICAgICAgICAgc3VibWl0Rm9ybTogc3VibWl0Rm9ybUNvbnRleHQoZm9ybVR5cGUpLCAvL0NoYW5nZSBpbiBuYW1lIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIGEgZnVuY3Rpb25cbiAgICAgICAgICAvLyBjYWxsZWQgc3VibWl0Rm9ybSwgYnV0IG5vIHJlYXNvbiBmb3IgdGhlIHVzZXIgdG8ga25vd1xuICAgICAgICAgIC8vIGFib3V0IHRoYXRcbiAgICAgICAgICBhZGRUb0RlbGV0ZWRWYWx1ZXM6IGFkZFRvRGVsZXRlZFZhbHVlcyxcbiAgICAgICAgICB1cGRhdGVDdXJyZW50VmFsdWVzOiB1cGRhdGVDdXJyZW50VmFsdWVzLFxuICAgICAgICAgIGdldERvY3VtZW50OiAoKSA9PiBjdXJyZW50RG9jdW1lbnQsXG4gICAgICAgICAgZ2V0TGFiZWw6IChmaWVsZE5hbWUsIGZpZWxkTG9jYWxlKSA9PlxuICAgICAgICAgICAgZ2V0TGFiZWwobW9kZWwsIGZsYXRTY2hlbWEsIGludGwsIGZpZWxkTmFtZSwgZmllbGRMb2NhbGUpLFxuICAgICAgICAgIGluaXRpYWxEb2N1bWVudDogaW5pdGlhbERvY3VtZW50LFxuICAgICAgICAgIC8vIFRPRE8gQkFEOiBjaGVjayB3aGVyZSB1c2VkXG4gICAgICAgICAgLy9zZXRGb3JtU3RhdGU6IHRoaXMuc2V0Rm9ybVN0YXRlLFxuICAgICAgICAgIGFkZFRvU3VibWl0Rm9ybSxcbiAgICAgICAgICBhZGRUb1N1Y2Nlc3NGb3JtLFxuICAgICAgICAgIGFkZFRvRmFpbHVyZUZvcm0sXG4gICAgICAgICAgY2xlYXJGb3JtQ2FsbGJhY2tzLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgICBjdXJyZW50VmFsdWVzLFxuICAgICAgICAgIGRlbGV0ZWRWYWx1ZXMsXG4gICAgICAgICAgY2xlYXJGaWVsZEVycm9ycyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1MYXlvdXQgey4uLmZvcm1MYXlvdXRQcm9wc30+XG4gICAgICAgICAge2dldEZpZWxkR3JvdXBzKFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgICBmbGF0U2NoZW1hLFxuICAgICAgICAgICAgICBvcmlnaW5hbFNjaGVtYSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRsLFxuICAgICAgICAgICAgbXV0YWJsZUZpZWxkcyxcbiAgICAgICAgICAgIGludGwuZm9ybWF0TWVzc2FnZVxuICAgICAgICAgICkubWFwKChncm91cCwgaSkgPT4gKFxuICAgICAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1Hcm91cCBrZXk9e2l9IHsuLi5mb3JtR3JvdXBQcm9wcyhncm91cCl9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUxheW91dD5cbiAgICAgIDwvRm9ybUNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9Gb3JtV2FyblVuc2F2ZWQ+XG4gICk7XG59O1xuXG4vLyBNdXRhdGlvbiB0aGF0IHlpZWxkIGEgc3VjY2VzcyByZXN1bHRcbnR5cGUgU3VjY2Vzc2Z1bE11dGF0aW9uUmVzdWx0PFREYXRhID0gT2JqZWN0PiA9IE11dGF0aW9uUmVzdWx0PFREYXRhPiAmIHtcbiAgZGF0YTogVERhdGE7XG59O1xuLyoqXG4gKiBUeXBlZ3VhcmVkIHRvIGFsbG93IGNvbnNpZGVyaW5nIHRoZSByZXF1ZXN0IGFzIHN1Y2Nlc3NmdWxcbiAqL1xuY29uc3QgaXNTdWNjZXNzZnVsID0gZnVuY3Rpb24gPFQgPSBhbnk+KFxuICByZXN1bHQ6IE11dGF0aW9uUmVzdWx0PFQ+IHwgdW5kZWZpbmVkXG4pOiByZXN1bHQgaXMgU3VjY2Vzc2Z1bE11dGF0aW9uUmVzdWx0PFQ+IHtcbiAgcmV0dXJuICEhcmVzdWx0Py5kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkB2dWxjYW5qcy9jb3JlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9jbG9uZURlZXBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2lzT2JqZWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL29taXRCeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvcGlja0J5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC91bnNldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdXBkYXRlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC93aXRob3V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc1BsYWluT2JqZWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9zaXplXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC90b1BhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2luaXRpYWxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ZwL2Zsb3dcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3Rha2VSaWdodFwiKTsiLCJpbXBvcnQgeyBmb3JtUHJvcGVydGllcyB9IGZyb20gXCIuLi9tb2R1bGVzL3NjaGVtYV91dGlsc1wiO1xuaW1wb3J0IHsgRmllbGRHcm91cCB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tIFwiLi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgRm9ybVByb3BzLCBGb3JtU3RhdGUgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5cbi8qKlxuICogRmllbGQgcmVsYXRlZCBmdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBWdWxjYW5TY2hlbWEgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHVuaXEgZnJvbSBcImxvZGFzaC91bmlxXCI7XG5pbXBvcnQgY29tcGFjdCBmcm9tIFwibG9kYXNoL2NvbXBhY3RcIjtcbmltcG9ydCBnZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCBwaWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuaW1wb3J0IHtcbiAgaXNJbnRsRmllbGQsXG4gIGZvcm1hdExhYmVsLFxuICBnZXRJbnRsS2V5cyxcbiAgZ2V0SW50bExhYmVsLFxuICBJbnRsUHJvdmlkZXJDb250ZXh0VmFsdWUsXG59IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuXG5pbXBvcnQgbWFwIGZyb20gXCJsb2Rhc2gvbWFwXCI7XG5pbXBvcnQgc29ydEJ5IGZyb20gXCJsb2Rhc2gvc29ydEJ5XCI7XG5pbXBvcnQgdW5pcUJ5IGZyb20gXCJsb2Rhc2gvdW5pcUJ5XCI7XG5pbXBvcnQgZGlmZmVyZW5jZSBmcm9tIFwibG9kYXNoL2RpZmZlcmVuY2VcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcImxvZGFzaC9yZWplY3RcIjtcbmltcG9ydCBpbnRlcnNlY3Rpb24gZnJvbSBcImxvZGFzaC9pbnRlcnNlY3Rpb25cIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCJsb2Rhc2gvZmlsdGVyXCI7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IHsgVnVsY2FuRmllbGRTY2hlbWEgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgVnVsY2FuTW9kZWwgfSBmcm9tIFwiQHZ1bGNhbmpzL21vZGVsXCI7XG5cbi8qXG5cbiAgR2V0IGEgZmllbGQncyBpbnRsIGtleXMgKHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuXG4gICovXG5jb25zdCBnZXRNb2RlbEludGxLZXlzID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGZsYXRTY2hlbWE6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGdldEludGxLZXlzKHtcbiAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBzY2hlbWE6IGZsYXRTY2hlbWEsXG4gIH0pO1xufTtcblxuLypcblxuICAgR2V0IGEgZmllbGQncyBsYWJlbFxuXG4gICAqL1xuZXhwb3J0IGNvbnN0IGdldExhYmVsID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGZsYXRTY2hlbWE6IGFueSxcbiAgY29udGV4dDogSW50bFByb3ZpZGVyQ29udGV4dFZhbHVlLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZmllbGRMb2NhbGU/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGFiZWwgPSBmb3JtYXRMYWJlbCh7XG4gICAgaW50bDogY29udGV4dCxcbiAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICBjb2xsZWN0aW9uTmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgc2NoZW1hOiBmbGF0U2NoZW1hLFxuICB9KTtcbiAgaWYgKGZpZWxkTG9jYWxlKSB7XG4gICAgY29uc3QgaW50bEZpZWxkTG9jYWxlID0gY29udGV4dC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgIGlkOiBgbG9jYWxlcy4ke2ZpZWxkTG9jYWxlfWAsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogZmllbGRMb2NhbGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGAke2xhYmVsfSAoJHtpbnRsRmllbGRMb2NhbGV9KWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG59O1xuXG4vKlxuXG4gICBHZXQgYSBmaWVsZCdzIGRlc2NyaXB0aW9uXG5cbiAgIChTYW1lIGFzIGdldExhYmVsIGJ1dCBwYXNzIGlzRGVzY3JpcHRpb246IHRydWUgKVxuICAgKi9cbmNvbnN0IGdldERlc2NyaXB0aW9uID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGZsYXRTY2hlbWE6IGFueSxcbiAgY29udGV4dDogYW55LFxuICBmaWVsZE5hbWU6IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGdldEludGxMYWJlbCh7XG4gICAgaW50bDogY29udGV4dCxcbiAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICBjb2xsZWN0aW9uTmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgc2NoZW1hOiBmbGF0U2NoZW1hLFxuICAgIGlzRGVzY3JpcHRpb246IHRydWUsXG4gIH0pO1xuICByZXR1cm4gZGVzY3JpcHRpb24gfHwgbnVsbDtcbn07XG5cbi8qXG5cbiAgR2V0IGEgZmllbGQgb3B0aW9uJ3MgbGFiZWxcblxuICAqL1xuY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAoXG4gIG1vZGVsOiBWdWxjYW5Nb2RlbCxcbiAgY29udGV4dDogeyBmb3JtYXRNZXNzYWdlOiBGdW5jdGlvbiB9LFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgb3B0aW9uOiB7IGludGxJZD86IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgdmFsdWU/OiBhbnkgfVxuKSA9PiB7XG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpbnRsSWQgPVxuICAgIG9wdGlvbi5pbnRsSWQgfHwgYCR7Y29sbGVjdGlvbk5hbWV9LiR7ZmllbGROYW1lfS4ke29wdGlvbi52YWx1ZX1gO1xuICByZXR1cm4gY29udGV4dC5mb3JtYXRNZXNzYWdlKHtcbiAgICBpZDogaW50bElkLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBvcHRpb24ubGFiZWwsXG4gIH0pO1xufTtcblxuLypcblxuICBHZXQgYSBsaXN0IG9mIHRoZSBmaWVsZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgZm9ybVxuXG4gIE5vdGU6IHdoZW4gc3VibWl0dGluZyB0aGUgZm9ybSAoZ2V0RGF0YSgpKSwgZG8gbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpZWxkcy5cblxuICAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkTmFtZXMgPSAoXG4gIHByb3BzOiBQaWNrPEZvcm1Qcm9wcywgXCJmaWVsZHNcIiB8IFwiYWRkRmllbGRzXCIgfCBcInJlbW92ZUZpZWxkc1wiPixcbiAgY3VycmVudERvY3VtZW50LFxuICBvcHRpb25zRnJvbUFyZ3M6IHtcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzPzogYm9vbGVhbjtcbiAgICBleGNsdWRlUmVtb3ZlZEZpZWxkcz86IGJvb2xlYW47XG4gICAgcmVwbGFjZUludGxGaWVsZHM/OiBib29sZWFuO1xuICAgIGFkZEV4dHJhRmllbGRzPzogYm9vbGVhbjtcbiAgICBzY2hlbWE/OiBWdWxjYW5TY2hlbWE7XG4gICAgbXV0YWJsZUZpZWxkcz86IEFycmF5PGFueT47XG4gIH1cbikgPT4ge1xuICBjb25zdCB7IGZpZWxkcywgYWRkRmllbGRzLCByZW1vdmVGaWVsZHMgfSA9IHByb3BzO1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzOiB0cnVlLFxuICAgIGV4Y2x1ZGVSZW1vdmVkRmllbGRzOiB0cnVlLFxuICAgIHJlcGxhY2VJbnRsRmllbGRzOiBmYWxzZSxcbiAgICBhZGRFeHRyYUZpZWxkczogZmFsc2UsXG4gIH07XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgLi4ub3B0aW9uc0Zyb21BcmdzLFxuICB9O1xuICBjb25zdCB7XG4gICAgc2NoZW1hLFxuICAgIG11dGFibGVGaWVsZHMsXG4gICAgZXhjbHVkZVJlbW92ZWRGaWVsZHMsXG4gICAgZXhjbHVkZUhpZGRlbkZpZWxkcyxcbiAgICBhZGRFeHRyYUZpZWxkcyxcbiAgICByZXBsYWNlSW50bEZpZWxkcyxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gZ2V0IGFsbCBlZGl0YWJsZS9pbnNlcnRhYmxlIGZpZWxkcyAoZGVwZW5kaW5nIG9uIGN1cnJlbnQgZm9ybSB0eXBlKVxuICBsZXQgcmVsZXZhbnRGaWVsZHMgPSBtdXRhYmxlRmllbGRzO1xuXG4gIC8vIGlmIFwiZmllbGRzXCIgcHJvcCBpcyBzcGVjaWZpZWQsIHJlc3RyaWN0IGxpc3Qgb2YgZmllbGRzIHRvIGl0XG4gIGlmICh0eXBlb2YgZmllbGRzICE9PSBcInVuZGVmaW5lZFwiICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSBpbnRlcnNlY3Rpb24ocmVsZXZhbnRGaWVsZHMsIGZpZWxkcyk7XG4gIH1cblxuICAvLyBpZiBcImhpZGVGaWVsZHNcIiBwcm9wIGlzIHNwZWNpZmllZCwgcmVtb3ZlIGl0cyBmaWVsZHNcbiAgaWYgKGV4Y2x1ZGVSZW1vdmVkRmllbGRzKSB7XG4gICAgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAvL2NvbnN0IHJlbW92ZUZpZWxkcyA9IHJlbW92ZUZpZWxkcyB8fCBoaWRlRmllbGRzO1xuICAgIGlmICh0eXBlb2YgcmVtb3ZlRmllbGRzICE9PSBcInVuZGVmaW5lZFwiICYmIHJlbW92ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZWxldmFudEZpZWxkcyA9IGRpZmZlcmVuY2UocmVsZXZhbnRGaWVsZHMsIHJlbW92ZUZpZWxkcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgXCJhZGRGaWVsZHNcIiBwcm9wIGlzIHNwZWNpZmllZCwgYWRkIGl0cyBmaWVsZHNcbiAgaWYgKFxuICAgIGFkZEV4dHJhRmllbGRzICYmXG4gICAgdHlwZW9mIGFkZEZpZWxkcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIGFkZEZpZWxkcy5sZW5ndGggPiAwXG4gICkge1xuICAgIHJlbGV2YW50RmllbGRzID0gcmVsZXZhbnRGaWVsZHM/LmNvbmNhdChhZGRGaWVsZHMpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFsbCBoaWRkZW4gZmllbGRzXG4gIGlmIChleGNsdWRlSGlkZGVuRmllbGRzKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQ7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSByZWplY3QocmVsZXZhbnRGaWVsZHMsIChmaWVsZE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHNjaGVtYT8uW2ZpZWxkTmFtZV0uaGlkZGVuO1xuICAgICAgcmV0dXJuIHR5cGVvZiBoaWRkZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGhpZGRlbih7IHByb3BzLCBkb2N1bWVudCB9KVxuICAgICAgICA6IGhpZGRlbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJlcGxhY2UgaW50bCBmaWVsZHNcbiAgaWYgKHJlcGxhY2VJbnRsRmllbGRzKSB7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSByZWxldmFudEZpZWxkcz8ubWFwKChmaWVsZE5hbWUpID0+XG4gICAgICBpc0ludGxGaWVsZChzY2hlbWE/LltmaWVsZE5hbWVdKSA/IGAke2ZpZWxkTmFtZX1faW50bGAgOiBmaWVsZE5hbWVcbiAgICApO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFueSBkdXBsaWNhdGVzXG4gIHJlbGV2YW50RmllbGRzID0gdW5pcShyZWxldmFudEZpZWxkcyk7XG5cbiAgcmV0dXJuIHJlbGV2YW50RmllbGRzO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5jb25zdCBpbml0RmllbGQgPSAoXG4gIHByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQsXG4gIGZpZWxkTmFtZSxcbiAgZmllbGRTY2hlbWFcbikgPT4ge1xuICBjb25zdCB7IG1vZGVsIH0gPSBwcm9wcztcbiAgY29uc3QgeyBjdXJyZW50RG9jdW1lbnQsIGZsYXRTY2hlbWEgfSA9IHN0YXRlO1xuICBjb25zdCBpc0FycmF5ID0gZ2V0KGZpZWxkU2NoZW1hLCBcInR5cGUuMC50eXBlXCIpID09PSBBcnJheTtcblxuICAvLyBpbnRpYWxpemUgcHJvcGVydGllc1xuICBsZXQgZmllbGQ6IFBhcnRpYWw8Rm9ybUZpZWxkPiA9IHtcbiAgICAuLi5waWNrKGZpZWxkU2NoZW1hLCBmb3JtUHJvcGVydGllcyksXG4gICAgbmFtZTogZmllbGROYW1lLFxuICAgIGRhdGF0eXBlOiBmaWVsZFNjaGVtYS50eXBlLFxuICAgIGxheW91dDogcHJvcHMubGF5b3V0LCAvLyBBIGxheW91dCBwcm9wZXJ0eSB1c2VkIHRvIGNvbnRyb2wgaG93IHRoZSBmb3JtIGZpZWxkcyBhcmUgZGlzcGxheWVkLiBEZWZhdWx0cyB0byBob3Jpem9udGFsLlxuICAgIGlucHV0OiBmaWVsZFNjaGVtYS5pbnB1dCB8fCBmaWVsZFNjaGVtYS5jb250cm9sLCAvLyBUT0RPXG4gIH07XG5cbiAgLy8gaWYgdGhpcyBpcyBhbiBhcnJheSBmaWVsZCBhbHNvIHN0b3JlIGl0cyBhcnJheSBpdGVtIHR5cGVcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBjb25zdCBpdGVtRmllbGRTY2hlbWEgPSBzdGF0ZS5vcmlnaW5hbFNjaGVtYVtgJHtmaWVsZE5hbWV9LiRgXTtcbiAgICBmaWVsZC5pdGVtRGF0YXR5cGUgPSBnZXQoaXRlbUZpZWxkU2NoZW1hLCBcInR5cGUuMC50eXBlXCIpO1xuICB9XG5cbiAgZmllbGQubGFiZWwgPSBnZXRMYWJlbChtb2RlbCwgZmxhdFNjaGVtYSwgY29udGV4dCwgZmllbGROYW1lKTtcbiAgZmllbGQuaW50bEtleXMgPSBnZXRJbnRsS2V5cyhmaWVsZE5hbWUpO1xuICAvLyAvLyByZXBsYWNlIHZhbHVlIGJ5IHByZWZpbGxlZCB2YWx1ZSBpZiB2YWx1ZSBpcyBlbXB0eVxuICAvLyBjb25zdCBwcmVmaWxsID0gZmllbGRTY2hlbWEucHJlZmlsbCB8fCAoZmllbGRTY2hlbWEuZm9ybSAmJiBmaWVsZFNjaGVtYS5mb3JtLnByZWZpbGwpO1xuICAvLyBpZiAocHJlZmlsbCkge1xuICAvLyAgIGNvbnN0IHByZWZpbGxlZFZhbHVlID0gdHlwZW9mIHByZWZpbGwgPT09ICdmdW5jdGlvbicgPyBwcmVmaWxsLmNhbGwoZmllbGRTY2hlbWEpIDogcHJlZmlsbDtcbiAgLy8gICBpZiAoISFwcmVmaWxsZWRWYWx1ZSAmJiAhZmllbGQudmFsdWUpIHtcbiAgLy8gICAgIGZpZWxkLnByZWZpbGxlZFZhbHVlID0gcHJlZmlsbGVkVmFsdWU7XG4gIC8vICAgICBmaWVsZC52YWx1ZSA9IHByZWZpbGxlZFZhbHVlO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGNvbnN0IGRvY3VtZW50ID0gY3VycmVudERvY3VtZW50O1xuICBmaWVsZC5kb2N1bWVudCA9IGRvY3VtZW50O1xuXG4gIC8vIGludGVybmF0aW9uYWxpemUgZmllbGQgb3B0aW9ucyBsYWJlbHNcbiAgaWYgKGZpZWxkLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5vcHRpb25zKSkge1xuICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgbGFiZWw6IGdldE9wdGlvbkxhYmVsKG1vZGVsLCBjb250ZXh0LCBmaWVsZE5hbWUsIG9wdGlvbiksXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBhbiBpbnRsJ2QgZmllbGQsIHVzZSBhIHNwZWNpYWwgaW50bElucHV0XG4gIGlmIChpc0ludGxGaWVsZChmaWVsZFNjaGVtYSkpIHtcbiAgICBmaWVsZC5pbnRsSW5wdXQgPSB0cnVlO1xuICB9XG5cbiAgLy8gYWRkIGFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbiBmaWVsZFNjaGVtYS5mb3JtIGFzIGV4dHJhIHByb3BzIHBhc3NlZCBvblxuICAvLyB0byB0aGUgZm9ybSBjb21wb25lbnQsIGNhbGxpbmcgdGhlbSBpZiB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgY29uc3QgaW5wdXRQcm9wZXJ0aWVzID0gZmllbGRTY2hlbWEuZm9ybSB8fCBmaWVsZFNjaGVtYS5pbnB1dFByb3BlcnRpZXMgfHwge307XG4gIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGlucHV0UHJvcGVydGllc1twcm9wXTtcbiAgICBmaWVsZFtwcm9wXSA9XG4gICAgICB0eXBlb2YgcHJvcGVydHkgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHByb3BlcnR5LmNhbGwoZmllbGRTY2hlbWEsIHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgICAgICBpbnRsOiBjb250ZXh0LFxuICAgICAgICAgIH0pXG4gICAgICAgIDogcHJvcGVydHk7XG4gIH1cblxuICAvLyBhZGQgZGVzY3JpcHRpb24gYXMgaGVscCBwcm9wXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24obW9kZWwsIGZsYXRTY2hlbWEsIGNvbnRleHQsIGZpZWxkTmFtZSk7XG4gIGlmIChkZXNjcmlwdGlvbikge1xuICAgIGZpZWxkLmhlbHAgPSBkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHJldHVybiBmaWVsZCBhcyBGb3JtRmllbGQ7XG59O1xuY29uc3QgaGFuZGxlRmllbGRQYXRoID0gKFxuICBmaWVsZDogRm9ybUZpZWxkLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgcGFyZW50UGF0aD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGZpZWxkUGF0aCA9IHBhcmVudFBhdGggPyBgJHtwYXJlbnRQYXRofS4ke2ZpZWxkTmFtZX1gIDogZmllbGROYW1lO1xuICBmaWVsZC5wYXRoID0gZmllbGRQYXRoO1xuICAvLyBUT0RPOiByZWludHJvZHVjZSB0aGlzIHNpZGUgZWZmZWN0IHRvIGNvcnJlY3RseSBzZXQgdGhlIGRlZmF1bHQgdmFsdWVzXG4gIC8vIChwcmV2aW91c2x5IHdhcyBpbiBGb3JtLnRzeClcbiAgLy8gTm90ZSBzdXJlIGlmIHRoaXMgaXMgYWN0dWFsbHkgbmVlZGVkXG4gIC8vIGlmIChmaWVsZC5kZWZhdWx0VmFsdWUpIHtcbiAgLy8gICBzZXQodGhpcy5kZWZhdWx0VmFsdWVzLCBmaWVsZFBhdGgsIGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gIC8vIH1cbiAgcmV0dXJuIGZpZWxkO1xufTtcbmNvbnN0IGhhbmRsZUZpZWxkUGFyZW50ID0gKGZpZWxkLCBwYXJlbnRGaWVsZE5hbWUpID0+IHtcbiAgLy8gaWYgZmllbGQgaGFzIGEgcGFyZW50IGZpZWxkLCBwYXNzIGl0IG9uXG4gIGlmIChwYXJlbnRGaWVsZE5hbWUpIHtcbiAgICBmaWVsZC5wYXJlbnRGaWVsZE5hbWUgPSBwYXJlbnRGaWVsZE5hbWU7XG4gIH1cblxuICByZXR1cm4gZmllbGQ7XG59O1xuY29uc3QgaGFuZGxlUGVybWlzc2lvbnMgPSAoZmllbGQsIGZpZWxkTmFtZSwgbXV0YWJsZUZpZWxkczogQXJyYXk8YW55PikgPT4ge1xuICAvLyBpZiBmaWVsZCBpcyBub3QgY3JlYXRhYmxlL3VwZGF0YWJsZSwgZGlzYWJsZSBpdFxuICBpZiAoIW11dGFibGVGaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKSkge1xuICAgIGZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmllbGQ7XG59O1xuY29uc3QgaGFuZGxlRmllbGRDaGlsZHJlbiA9IChcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCI+LFxuICBjb250ZXh0OiBhbnksXG4gIGZpZWxkLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZmllbGRTY2hlbWE6IGFueSwgLy8gVE9ETzogbm90IGEgVnVsY2FuRmllbGQsIG1vcmUgYSBGb3JtRmllbGRcbiAgc2NoZW1hOiBWdWxjYW5TY2hlbWEsXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PGFueT5cbikgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIC8vIGFycmF5IGZpZWxkXG4gIGlmIChmaWVsZFNjaGVtYS5hcnJheUZpZWxkU2NoZW1hKSB7XG4gICAgZmllbGQuYXJyYXlGaWVsZFNjaGVtYSA9IGZpZWxkU2NoZW1hLmFycmF5RmllbGRTY2hlbWE7XG4gICAgLy8gY3JlYXRlIGEgZmllbGQgdGhhdCBjYW4gYmUgZXhwbG9pdGVkIGJ5IHRoZSBmb3JtXG4gICAgZmllbGQuYXJyYXlGaWVsZCA9IGNyZWF0ZUFycmF5U3ViRmllbGQoXG4gICAgICBwcm9wcyxcbiAgICAgIHN0YXRlLFxuICAgICAgY29udGV4dCxcbiAgICAgIGZpZWxkTmFtZSxcbiAgICAgIGZpZWxkLmFycmF5RmllbGRTY2hlbWEsXG4gICAgICBzY2hlbWEsXG4gICAgICBtdXRhYmxlRmllbGRzXG4gICAgKTtcbiAgICAvL2ZpZWxkLm5lc3RlZElucHV0ID0gdHJ1ZVxuICB9XG4gIC8vIG5lc3RlZCBmaWVsZHM6IHNldCBpbnB1dCB0byBcIm5lc3RlZFwiXG4gIGlmIChmaWVsZFNjaGVtYS5zY2hlbWEpIHtcbiAgICBmaWVsZC5uZXN0ZWRTY2hlbWEgPSBmaWVsZFNjaGVtYS5zY2hlbWE7XG4gICAgZmllbGQubmVzdGVkSW5wdXQgPSB0cnVlO1xuXG4gICAgLy8gZ2V0IG5lc3RlZCBzY2hlbWFcbiAgICAvLyBmb3IgZWFjaCBuZXN0ZWQgZmllbGQsIGdldCBmaWVsZCBvYmplY3QgYnkgY2FsbGluZyBjcmVhdGVGaWVsZCByZWN1cnNpdmVseVxuICAgIGZpZWxkLm5lc3RlZEZpZWxkcyA9IGdldEZpZWxkTmFtZXMocHJvcHMsIGN1cnJlbnREb2N1bWVudCwge1xuICAgICAgc2NoZW1hOiBmaWVsZC5uZXN0ZWRTY2hlbWEsXG4gICAgICBhZGRFeHRyYUZpZWxkczogZmFsc2UsXG4gICAgfSkubWFwKChzdWJGaWVsZE5hbWUpID0+IHtcbiAgICAgIHJldHVybiBjcmVhdGVGaWVsZChcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBzdWJGaWVsZE5hbWUsXG4gICAgICAgIGZpZWxkLm5lc3RlZFNjaGVtYSxcbiAgICAgICAgbXV0YWJsZUZpZWxkcyxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBmaWVsZC5wYXRoXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBmaWVsZDtcbn07XG5cbi8qXG4gIEdpdmVuIGEgZmllbGQncyBuYW1lLCB0aGUgY29udGFpbmluZyBzY2hlbWEsIGFuZCBwYXJlbnQsIGNyZWF0ZSB0aGVcbiAgY29tcGxldGUgZmllbGQgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcG9uZW50XG5cbiAgKi9cbmNvbnN0IGNyZWF0ZUZpZWxkID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQ6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIHNjaGVtYTogYW55LFxuICBtdXRhYmxlRmllbGRzOiBBcnJheTxhbnk+LFxuICBwYXJlbnRGaWVsZE5hbWU/OiBzdHJpbmcsXG4gIHBhcmVudFBhdGg/OiBzdHJpbmdcbik6IEZvcm1GaWVsZCA9PiB7XG4gIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gIGxldCBmaWVsZCA9IGluaXRGaWVsZChwcm9wcywgc3RhdGUsIGNvbnRleHQsIGZpZWxkTmFtZSwgZmllbGRTY2hlbWEpO1xuICBmaWVsZCA9IGhhbmRsZUZpZWxkUGF0aChmaWVsZCwgZmllbGROYW1lLCBwYXJlbnRQYXRoKTtcbiAgZmllbGQgPSBoYW5kbGVGaWVsZFBhcmVudChmaWVsZCwgcGFyZW50RmllbGROYW1lKTtcbiAgZmllbGQgPSBoYW5kbGVQZXJtaXNzaW9ucyhmaWVsZCwgZmllbGROYW1lLCBtdXRhYmxlRmllbGRzKTtcbiAgZmllbGQgPSBoYW5kbGVGaWVsZENoaWxkcmVuKFxuICAgIHByb3BzLFxuICAgIHN0YXRlLFxuICAgIGNvbnRleHQsXG4gICAgZmllbGQsXG4gICAgZmllbGROYW1lLFxuICAgIGZpZWxkU2NoZW1hLFxuICAgIHNjaGVtYSxcbiAgICBtdXRhYmxlRmllbGRzXG4gICk7XG4gIHJldHVybiBmaWVsZDtcbn07XG5jb25zdCBjcmVhdGVBcnJheVN1YkZpZWxkID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQ6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIHN1YkZpZWxkU2NoZW1hOiBWdWxjYW5GaWVsZFNjaGVtYSxcbiAgc2NoZW1hOiBWdWxjYW5TY2hlbWEsXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PHN0cmluZz5cbikgPT4ge1xuICBjb25zdCBzdWJGaWVsZE5hbWUgPSBgJHtmaWVsZE5hbWV9LiRgO1xuICBsZXQgc3ViRmllbGQgPSBpbml0RmllbGQocHJvcHMsIHN0YXRlLCBjb250ZXh0LCBzdWJGaWVsZE5hbWUsIHN1YkZpZWxkU2NoZW1hKTtcbiAgLy8gYXJyYXkgc3ViZmllbGQgaGFzIHRoZSBzYW1lIHBhdGggYW5kIHBlcm1pc3Npb25zIGFzIGl0cyBwYXJlbnRcbiAgLy8gc28gd2UgdXNlIHBhcmVudCBuYW1lIChmaWVsZE5hbWUpIGFuZCBub3Qgc3ViZmllbGROYW1lXG4gIHN1YkZpZWxkID0gaGFuZGxlRmllbGRQYXRoKHN1YkZpZWxkLCBmaWVsZE5hbWUpO1xuICBzdWJGaWVsZCA9IGhhbmRsZVBlcm1pc3Npb25zKHN1YkZpZWxkLCBmaWVsZE5hbWUsIG11dGFibGVGaWVsZHMgLypzY2hlbWEqLyk7XG4gIC8vIHdlIGRvIG5vdCBhbGxvdyBuZXN0aW5nIHlldFxuICAvL3N1YkZpZWxkID0gdGhpcy5oYW5kbGVGaWVsZENoaWxkcmVuKGZpZWxkLCBmaWVsZFNjaGVtYSlcbiAgcmV0dXJuIHN1YkZpZWxkO1xufTtcblxuLy8gR3JvdXAgb2YgbXVsdGlwbGUgZmllbGRzIChvYnRhaW5lZCBieSBwYXJzaW5nIHRoZSB3aG9sZSBzY2hlbWEpXG5pbnRlcmZhY2UgR3JvdXBXaXRoRmllbGRzIGV4dGVuZHMgRmllbGRHcm91cCB7XG4gIGZpZWxkczogQXJyYXk8Rm9ybUZpZWxkPjtcbn1cblxudHlwZSBGb3JtU2NoZW1hU3RhdGUgPSBQaWNrPFxuICBGb3JtU3RhdGUsXG4gIFwiY3VycmVudERvY3VtZW50XCIgfCBcInNjaGVtYVwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCJcbj47XG5cbi8qXG5cbiAgR2V0IGFsbCBmaWVsZCBncm91cHNcblxuICAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkR3JvdXBzID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogRm9ybVNjaGVtYVN0YXRlLFxuICBjb250ZXh0OiBJbnRsUHJvdmlkZXJDb250ZXh0VmFsdWUsXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PHN0cmluZz4sXG4gIGZvcm1hdE1lc3NhZ2U6IEZ1bmN0aW9uXG4pID0+IHtcbiAgY29uc3QgeyBzY2hlbWEsIGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIC8vIGJ1aWxkIGZpZWxkcyBhcnJheSBieSBpdGVyYXRpbmcgb3ZlciB0aGUgbGlzdCBvZiBmaWVsZCBuYW1lc1xuICBsZXQgZmllbGRzID0gZ2V0RmllbGROYW1lcyhwcm9wcywgY3VycmVudERvY3VtZW50LCB7XG4gICAgbXV0YWJsZUZpZWxkcyxcbiAgICBzY2hlbWEsXG4gIH0pLm1hcCgoZmllbGROYW1lKSA9PiB7XG4gICAgLy8gZ2V0IHNjaGVtYSBmb3IgdGhlIGN1cnJlbnQgZmllbGRcbiAgICByZXR1cm4gY3JlYXRlRmllbGQocHJvcHMsIHN0YXRlLCBjb250ZXh0LCBmaWVsZE5hbWUsIHNjaGVtYSwgbXV0YWJsZUZpZWxkcyk7XG4gIH0pO1xuXG4gIGZpZWxkcyA9IHNvcnRCeShmaWVsZHMsIFwib3JkZXJcIik7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIHVuaXF1ZSBncm91cHMgKGJhc2VkIG9uIHRoZWlyIG5hbWUpIHVzZWQgaW4gY3VycmVudCBmaWVsZHMsIHJlbW92ZSBcImVtcHR5XCIgZ3JvdXBcbiAgbGV0IGdyb3VwcyA9IGNvbXBhY3QodW5pcUJ5KG1hcChmaWVsZHMsIFwiZ3JvdXBcIiksIChnKSA9PiAoZyA/IGcubmFtZSA6IFwiXCIpKSk7XG5cbiAgLy8gZm9yIGVhY2ggZ3JvdXAsIGFkZCByZWxldmFudCBmaWVsZHNcbiAgbGV0IGdyb3Vwc1dpdGhGaWVsZHMgPSBncm91cHMubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IGxhYmVsID1cbiAgICAgIGdyb3VwLmxhYmVsIHx8XG4gICAgICAvL3RoaXMuY29udGV4dC5mb3JtYXRNZXNzYWdlKHsgaWQ6IGdyb3VwLm5hbWUgfSkgfHxcbiAgICAgIGNhcGl0YWxpemUoZ3JvdXAubmFtZSk7XG4gICAgY29uc3QgZ3JvdXBGaWVsZHMgPSBfZmlsdGVyPEZvcm1GaWVsZD4oZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5ncm91cCAmJiBmaWVsZC5ncm91cC5uYW1lID09PSBncm91cC5uYW1lO1xuICAgIH0pO1xuICAgIGNvbnN0IGdyb3VwV2l0aEZpZWxkczogR3JvdXBXaXRoRmllbGRzID0ge1xuICAgICAgLi4uZ3JvdXAsXG4gICAgICBsYWJlbCxcbiAgICAgIGZpZWxkczogZ3JvdXBGaWVsZHMsXG4gICAgfTtcbiAgICByZXR1cm4gZ3JvdXBXaXRoRmllbGRzO1xuICB9KTtcblxuICAvLyBhZGQgZGVmYXVsdCBncm91cCBpZiBuZWNlc3NhcnlcbiAgY29uc3QgZGVmYXVsdEdyb3VwRmllbGRzID0gX2ZpbHRlcihmaWVsZHMsIChmaWVsZCkgPT4gIWZpZWxkLmdyb3VwKTtcbiAgaWYgKGRlZmF1bHRHcm91cEZpZWxkcy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZWZhdWx0R3JvdXA6IEdyb3VwV2l0aEZpZWxkcyA9IHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgICAgbGFiZWw6IFwiZGVmYXVsdFwiLFxuICAgICAgb3JkZXI6IDAsXG4gICAgICBmaWVsZHM6IGRlZmF1bHRHcm91cEZpZWxkcyxcbiAgICB9O1xuICAgIGdyb3Vwc1dpdGhGaWVsZHMgPSBbZGVmYXVsdEdyb3VwXS5jb25jYXQoZ3JvdXBzV2l0aEZpZWxkcyk7XG4gIH1cblxuICAvLyBzb3J0IGJ5IG9yZGVyXG4gIGdyb3Vwc1dpdGhGaWVsZHMgPSBzb3J0QnkoZ3JvdXBzV2l0aEZpZWxkcywgXCJvcmRlclwiKTtcblxuICAvLyBjb25zb2xlLmxvZyhncm91cHMpO1xuXG4gIHJldHVybiBncm91cHNXaXRoRmllbGRzO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tYXBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdW5pcUJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9kaWZmZXJlbmNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9yZWplY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKTsiLCJpbXBvcnQgZmluZCBmcm9tIFwibG9kYXNoL2ZpbmRcIjtcbmltcG9ydCBpc0VxdWFsV2l0aCBmcm9tIFwibG9kYXNoL2lzRXF1YWxXaXRoXCI7XG5leHBvcnQgY29uc3QgaXNOb3RTYW1lRG9jdW1lbnQgPSAoaW5pdGlhbERvY3VtZW50LCBjaGFuZ2VkRG9jdW1lbnQpID0+IHtcbiAgY29uc3QgY2hhbmdlZFZhbHVlID0gZmluZChjaGFuZ2VkRG9jdW1lbnQsICh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuICFpc0VxdWFsV2l0aCh2YWx1ZSwgaW5pdGlhbERvY3VtZW50W2tleV0sIChvYmpWYWx1ZSwgb3RoVmFsdWUpID0+IHtcbiAgICAgIGlmICghb2JqVmFsdWUgJiYgIW90aFZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0eXBlb2YgY2hhbmdlZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc0VxdWFsV2l0aFwiKTsiLCJleHBvcnQgKiBmcm9tIFwiLi91c2VXYXJuT25VbnNhdmVkXCI7XG4iLCJpbXBvcnQgeyB1c2VCbG9ja1RyYW5zaXRpb24gfSBmcm9tIFwiLi4vdXNlQmxvY2tUcmFuc2l0aW9uL3VzZUJsb2NrVHJhbnNpdGlvblwiO1xuaW1wb3J0IGRlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmNvbnN0IGRlYnVnVHJhbnNpdGlvbnMgPSBkZWJ1ZyhcInZuOnJvdXRlLXRyYW5zaXRpb25zXCIpO1xuXG4vKipcbiAqIENhbiB0cmlnZ2VyIGFuIGFsZXJ0IG9uIHVuc2F2ZWQgY2hhbmdlc1xuICpcbiAqIFRyaWdnZXJzIGV2ZW50IHNvIHlvdSBjYW4gYWxzbyBibG9jayBTUEEgdHJhbnNpdGlvbiAoaW1wbGVtZW50YXRpb24gaXMgTk9UIHByb3ZpZGVkIGJ5IHRoaXMgaG9vaywgeW91XG4gKiBuZWVkIGxpc3RlbmVycyB3aG9zZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHlvdXIgcm91dGVyIChSZWFjdCBSb3V0ZXIsIE5leHQgUm91dGVyLi4uKSwgc2VlIGJsb2NrLnRzKVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0VHJhaW5pbmcvaGlzdG9yeS9ibG9iL21hc3Rlci9kb2NzL2Jsb2NraW5nLXRyYW5zaXRpb25zLm1kXG4gKlxuICogQHBhcmFtIHBhcmFtMFxuICovXG5leHBvcnQgY29uc3QgdXNlV2Fybk9uVW5zYXZlZCA9ICh7XG4gIGlzQ2hhbmdlZCxcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzLFxufToge1xuICBpc0NoYW5nZWQ6IGJvb2xlYW47XG4gIHdhcm5VbnNhdmVkQ2hhbmdlcz86IGJvb2xlYW47XG59KSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VJbnRsQ29udGV4dCgpO1xuICAvKipcbiAgICogVG8gYmUgcGFzc2VkIHRvIG9uYmVmb3JldW5sb2FkIGV2ZW50LiBUaGUgcmV0dXJuZWQgbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZFxuICAgKiBieSB0aGUgcHJvbXB0LlxuICAgKlxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0V2ZW50SGFuZGxlcnMvb25iZWZvcmV1bmxvYWRcbiAgICogdGhlIG1lc3NhZ2UgcmV0dXJuZWQgaXMgYWN0dWFsbHkgaWdub3JlZCBieSBtb3N0IGJyb3dzZXJzIGFuZCBhIGRlZmF1bHQgbWVzc2FnZSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZT8gWW91IG1pZ2h0IGhhdmUgdW5zYXZlZCBjaGFuZ2VzJyBpcyBkaXNwbGF5ZWQuIFNlZSB0aGUgTm90ZXMgc2VjdGlvbiBvbiB0aGUgbW96aWxsYSBkb2NzIGFib3ZlXG4gICAqL1xuICBjb25zdCBnZXRCbG9ja2VkTWVzc2FnZSA9IChldmVudD86IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gICAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgaGFuZGxlUGFnZUxlYXZlXCIsIGV2ZW50KTtcbiAgICBjb25zdCBtZXNzYWdlID0gY29udGV4dC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgIGlkOiBcImZvcm1zLmNvbmZpcm1fZGlzY2FyZFwiLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6IFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRpc2NhcmQgeW91ciBjaGFuZ2VzP1wiLFxuICAgIH0pO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9O1xuICB1c2VCbG9ja1RyYW5zaXRpb24oe1xuICAgIHNob3VsZEJsb2NrOiAhISh3YXJuVW5zYXZlZENoYW5nZXMgJiYgaXNDaGFuZ2VkKSxcbiAgICBnZXRCbG9ja2VkTWVzc2FnZTogZ2V0QmxvY2tlZE1lc3NhZ2UsXG4gIH0pO1xufTtcbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBibG9jayB9IGZyb20gXCIuL2Jsb2NrXCI7XG5pbXBvcnQgZGVidWcgZnJvbSBcImRlYnVnXCI7XG5jb25zdCBkZWJ1Z1RyYW5zaXRpb25zID0gZGVidWcoXCJ2bjpyb3V0ZXItdHJhbnNpdGlvbnNcIik7XG5cbi8qKlxuICogQ2FuIHRyaWdnZXIgYW4gYWxlcnQgb24gdW5zYXZlZCBjaGFuZ2VzXG4gKlxuICogVHJpZ2dlcnMgZXZlbnQgc28geW91IGNhbiBhbHNvIGJsb2NrIFNQQSB0cmFuc2l0aW9uIChpbXBsZW1lbnRhdGlvbiBpcyBOT1QgcHJvdmlkZWQgYnkgdGhpcyBob29rLCB5b3VcbiAqIG5lZWQgbGlzdGVuZXJzIHdob3NlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24geW91ciByb3V0ZXIgKFJlYWN0IFJvdXRlciwgTmV4dCBSb3V0ZXIuLi4pLCBzZWUgYmxvY2sudHMpXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RUcmFpbmluZy9oaXN0b3J5L2Jsb2IvbWFzdGVyL2RvY3MvYmxvY2tpbmctdHJhbnNpdGlvbnMubWRcbiAqXG4gKiBAcGFyYW0gcGFyYW0wXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VCbG9ja1RyYW5zaXRpb24gPSAoe1xuICBzaG91bGRCbG9jayxcbiAgZ2V0QmxvY2tlZE1lc3NhZ2UsXG59OiB7XG4gIHNob3VsZEJsb2NrOiBib29sZWFuO1xuICBnZXRCbG9ja2VkTWVzc2FnZTogKGV2dD86IEJlZm9yZVVubG9hZEV2ZW50KSA9PiBzdHJpbmc7XG59KSA9PiB7XG4gIC8vIGZ1bmN0aW9uIHRvIHVuYmxvY2sgdGhlIGZvcm1cbiAgY29uc3QgdW5ibG9ja1JlZiA9IHVzZVJlZjxGdW5jdGlvbiB8IHVuZGVmaW5lZD4oKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGlzQmxvY2tpbmcgPSAhIXVuYmxvY2tSZWYuY3VycmVudDtcbiAgICBkZWJ1Z1RyYW5zaXRpb25zKFxuICAgICAgXCJydW5uaW5nIGVmZmVjdFwiLFxuICAgICAgXCJzaG91bGQgYmxvY2tcIixcbiAgICAgIHNob3VsZEJsb2NrLFxuICAgICAgXCJjdXJyZW50bHkgYmxvY2tlZFwiLFxuICAgICAgaXNCbG9ja2luZ1xuICAgICk7XG5cbiAgICBjb25zdCBvblVuYmxvY2sgPSAoKSA9PiB7XG4gICAgICBkZWJ1Z1RyYW5zaXRpb25zKFwicnVubmluZyB1bmJsb2NrIGZyb20gZWZmZWN0XCIpO1xuICAgICAgaWYgKCFzaG91bGRCbG9jaykge1xuICAgICAgICBpZiAodW5ibG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgdW5ibG9ja1JlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIGJsb2NrXG4gICAgY29uc3Qgb25CbG9ja2VkID0gKGV2dD86IEJlZm9yZVVubG9hZEV2ZW50KTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRCbG9ja2VkTWVzc2FnZShldnQpO1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcbiAgICAgICAgXCJ1c2VyIGlzIGJlaW5nIGJsb2NrZWQgYWZ0ZXIgdHJ5aW5nIHRvIGxlYXZlIHRoZSBwYWdlLCB3aXRoIG1lc3NhZ2U6IFwiICtcbiAgICAgICAgICBtZXNzYWdlXG4gICAgICApO1xuICAgICAgaWYgKGV2dCkge1xuICAgICAgICBldnQucmV0dXJuVmFsdWUgPSBtZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfTtcbiAgICBpZiAoc2hvdWxkQmxvY2spIHtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXG4gICAgICAgIFwic2hvdWxkIGJsb2NrIHRyYW5zaXRpb24sIHNldHRpbmcgdXAgcmVsZXZhbnQgZXZlbnQgbGlzdGVuZXJcIlxuICAgICAgKTtcbiAgICAgIHVuYmxvY2tSZWYuY3VycmVudCA9IGJsb2NrKG9uQmxvY2tlZCwgb25VbmJsb2NrKTtcbiAgICB9XG4gICAgLy8gdW5ibG9jayBpZiBub3QgYmxvY2tpbmcgYW55bW9yZSBhbmQgd2FzIGJsb2NraW5nIHByZXZpb3VzbHlcbiAgICBpZiAoIXNob3VsZEJsb2NrICYmIGlzQmxvY2tpbmcpIHtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJzaG91bGQgdW5ibG9jayAoc3RhdGUgaGFzIGJlZW4gcmVpbml0aWFsaXplZClcIik7XG4gICAgICBpZiAodW5ibG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICAgIHVuYmxvY2tSZWYuY3VycmVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB0cmlnZ2VyIHRoZSBwb3RlbnRpYWxseSByZWdpc3RlcmVkIHVuYmxvY2sgZnVuY3Rpb24gd2hlbiBjb21wb25lbnQgdW5tb3VudHNcbiAgICAvL3JldHVybiBvblVuYmxvY2s7XG4gIH0sIFtzaG91bGRCbG9ja10pO1xufTtcbiIsImltcG9ydCBkZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmNvbnN0IGRlYnVnVHJhbnNpdGlvbnMgPSBkZWJ1ZyhcInZuOnJvdXRlLXRyYW5zaXRpb25cIik7XG5jb25zdCBCZWZvcmVVbmxvYWRFdmVudFR5cGUgPSBcImJlZm9yZXVubG9hZFwiO1xuLyoqXG4gKiBFdmVudCB0cmlnZ2VyZWQgd2hlbiBhIHdhcm5pbmcgb24gdW5zYXZlZCBjaGFuZ2VzIGlzIG5lY2Vzc2FyeVxuICogVGhlIGFwcCBzaG91bGQgbGlzdGVuIGZvciB0aGlzIGV2ZW50IHRvIHNldHVwIHJlbGV2YW50IGJsb2NraW5nIG1ldGhvZHMgZGVwZW5kaW5nIG9uIHRoZSBmcmFtZXdvcmtcbiAqXG4gKiBGb3IgaW5zdGFuY2Ugd2l0aCBSZWFjdCBSb3V0ZXI6XG4gKlxuICogbGV0IHVuYmxvY2tcbiAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmxvY2t0cmFuc2l0aW9uXCIsICgpID0+IHtcbiAqICAgIHVuYmxvY2sgPSByb3V0ZXIuaGlzdG9yeS5ibG9jayguLi4pXG4gKiB9KVxuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmJsb2NrdHJhbnNpdGlvblwiLCAoKSA9PiB7XG4gKiAgICB1bmJsb2NrKClcbiAqIH0pXG4gKlxuICogRm9yIE5leHQuanMsIHlvdSB3b3VsZCBkbyBzb21ldGhpbmcgc2ltaWxhclxuICogQ2hlY2sgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC9uZXh0LmpzL2Rpc2N1c3Npb25zLzEyMzQ4XG4gKlxuICovXG5leHBvcnQgY29uc3QgQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFID0gXCJibG9ja3RyYW5zaXRpb25cIjtcbi8qKlxuICogQ2FsbGVkIHdoZW4gYmxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeSBhbnltb3JlOlxuICogLSB0aGVyZSBhcmUgbm8gdW5zYXZlZCBjaGFuZ2VzIGFueW1vcmVcbiAqIC0gdXNlciBoYXMgY29uZmlybWVkIHRoZXkgd2FudCB0byBsZWF2ZVxuICovXG5leHBvcnQgY29uc3QgVU5CTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUgPSBcInVuYmxvY2t0cmFuc2l0aW9uXCI7XG4vKipcbiAqIEludGVyY2VwdHMgdGhlIGJlZm9yZXVubG9hZCBldmVudFxuICpcbiAqIENvZGUgdGFrZW4gZnJvbSBSZWFjdCBSb3V0ZXIgaGlzdG9yeSBmZWF0dXJlXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdFRyYWluaW5nL2hpc3RvcnkvYmxvYi9tYXN0ZXIvZG9jcy9ibG9ja2luZy10cmFuc2l0aW9ucy5tZFxuICovXG5mdW5jdGlvbiBibG9ja0JlZm9yZVVubG9hZChldmVudDogQmVmb3JlVW5sb2FkRXZlbnQpIHtcbiAgLy8gQ2FuY2VsIHRoZSBldmVudC5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgLy8gQ2hyb21lIChhbmQgbGVnYWN5IElFKSByZXF1aXJlcyByZXR1cm5WYWx1ZSB0byBiZSBzZXQuXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn1cblxuLyoqXG4gKiBCbG9ja3MgdHJhbnNpdGlvblxuICpcbiAqIC8hXFwgSW4gb3JkZXIgdG8gY2F0Y2ggU1BBIHRyYW5zaXRpb24sIHlvdSBuZWVkIHRvIGltcGxlbWVudFxuICogYW4gZXZlbnQgbGlzdGVuZXIgaW4geW91ciBvd24gYXBwLlxuICpcbiAqXG4gKiBAcGFyYW0gb25VbmJsb2NrIENhbGxiYWNrIHRvIGNhbGwgb24gdW5ibG9jaywgZm9yIGN1c3RvbSBiZWhhdmlvdXJcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gdW5ibG9jayB0aGUgdHJhbnNpdGlvbiAoZWcgaWYgdGhlIGZvcm0gaXMgYmFjayB0b1xuICogaXRzIG9yaWdpbmFsIHN0YXRlKVxuICovXG5leHBvcnQgY29uc3QgYmxvY2sgPSAoXG4gIHNldENvbmZpcm1hdGlvbk1lc3NhZ2U6IChldmVudD86IEJlZm9yZVVubG9hZEV2ZW50KSA9PiBzdHJpbmcsXG4gIG9uVW5ibG9jaz86IEZ1bmN0aW9uXG4pID0+IHtcbiAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgYmxvY2sgZnVuY3Rpb25cIik7XG4gIC8vIHRyaWdnZXIgYSBibG9jayBldmVudCwgdG8gYmUgaGFuZGxlZCBhdCB0aGUgZnJhbWV3b3JrIGxldmVsXG4gIC8vIFRPRE86IHNldENvbmZpcm1hdGlvbk1lc3NhZ2Ugc2hvdWxkIGJlIHBhc3NlZCBhcyB3ZWxsXG4gIGNvbnN0IGJsb2NrRXZlbnQgPSBuZXcgRXZlbnQoQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFKTtcbiAgd2luZG93LmRpc3BhdGNoRXZlbnQoYmxvY2tFdmVudCk7XG4gIC8vIGJsb2NrIGF0IGJyb3dzZXIgbGV2ZWxcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoQmVmb3JlVW5sb2FkRXZlbnRUeXBlLCBibG9ja0JlZm9yZVVubG9hZCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEJlZm9yZVVubG9hZEV2ZW50VHlwZSwgc2V0Q29uZmlybWF0aW9uTWVzc2FnZSk7XG4gIC8vIHJldHVybiBhbiB1bmJsb2NrIGZ1bmN0aW9uIHRvIGNhbmNlbFxuICBjb25zdCB1bmJsb2NrID0gKCkgPT4ge1xuICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJydW5uaW5nIHVuYmxvY2sgZnVuY3Rpb25cIik7XG4gICAgaWYgKG9uVW5ibG9jaykge1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgdXNlciBkZWZpbmVkIGZ1bmN0aW9uXCIpO1xuICAgICAgb25VbmJsb2NrKCk7IC8vIGNhbGxiYWNrIGZyb20gdXNlciBsYW5kXG4gICAgfVxuICAgIC8vIHRyaWdnZXIgYW4gdW5ibG9jayBldmVudCwgdG8gYmUgaGFuZGxlZCBhdCB0aGUgZnJhbWV3b3JrIGxldmVsXG4gICAgY29uc3QgdW5ibG9ja0V2ZW50ID0gbmV3IEV2ZW50KFVOQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFKTtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudCh1bmJsb2NrRXZlbnQpO1xuICAgIC8vIHJlbW92ZSB0aGUgYnJvd3NlciBsZXZlbCBldmVudHNcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihCZWZvcmVVbmxvYWRFdmVudFR5cGUsIGJsb2NrQmVmb3JlVW5sb2FkKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihCZWZvcmVVbmxvYWRFdmVudFR5cGUsIHNldENvbmZpcm1hdGlvbk1lc3NhZ2UpO1xuICAgIC8vIHVuYmxvY2sgYnJvd3NlciBjaGFuZ2VcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gdW5kZWZpbmVkOyAvL3VuZGVmaW5lZCBpbnN0ZWFkIG9mIG51bGwgdG8gc3VwcG9ydCBJRVxuICB9O1xuICByZXR1cm4gdW5ibG9jaztcbn07XG4iLCIvKipcbiAqIE5PVEU6IEtFRVAgU0VQQVJBVEVEIEZST00gVEhFIEhPT0tTIFRPIENPTlNVTUUgVEhFIENPTlRFWFRcbiAqIG90aGVyd2lzZSB5b3UnbGwgZW5kIHVwIHdpdGggY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGJlY2F1c2Ugb2YgdGhlIGRlZmF1bHQgY29tcG9uZW50c1xuICovXG4vLyBUT0RPOiB3ZSBtaWdodCBuZWVkIHRvIGFkYXB0IHRoZSBwcm92aWRlciB0byBtZXJnZSBpdHMgdmFsdWUgd2l0aCBhIHBvdGVudGlhbGx5IGhpZ2hlciB1cCBjb250ZXh0XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IGRlZmF1bHRWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7IFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuXG4vLyBTbyB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgb25seSBzb21lIGNvbXBvbmVudHMgYnkgYWRkaW5nIGFuIGFkZGl0aW9uYWwgY29udGV4dCB3aGlsZSBrZWVwaW5nIHRoZSBkZWZhdWx0c1xuZXhwb3J0IGNvbnN0IFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlciA9ICh7XG4gIHZhbHVlLFxuICAuLi5wcm9wc1xufToge1xuICB2YWx1ZT86IFBhcnRpYWw8UG9zc2libGVWdWxjYW5Db21wb25lbnRzPjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IChcbiAgPFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0LlByb3ZpZGVyXG4gICAgdmFsdWU9e3sgLi4uZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMsIC4uLih2YWx1ZSB8fCB7fSkgfX0gLy8gbWVyZ2UgcHJvdmlkZWQgY29tcG9uZW50cyBzbyB0aGUgdXNlciBjYW4gcHJvdmlkZSBvbmx5IGEgcGFydGlhbCByZXBsYWNlbWVudFxuICAgIHsuLi5wcm9wc31cbiAgLz5cbik7XG4iLCJpbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5pbXBvcnQgeyBGb3JtRXJyb3IgfSBmcm9tIFwiLi4vRm9ybUVycm9yXCI7XG4vLyBUT0RPOiBjdXJyZW50bHkgd2UgbmVlZCB0aGUgZGVmYXVsdCBleHBvcnQgYmVjYXVzZSB3ZSBwYXNzIGNvbXBvbmVudHMgbWFudWFsbHlcbmltcG9ydCBGb3JtQ29tcG9uZW50IGZyb20gXCIuLi9Gb3JtQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50SW5uZXIgfSBmcm9tIFwiLi4vRm9ybUNvbXBvbmVudElubmVyXCI7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50TG9hZGVyIH0gZnJvbSBcIi4uL0Zvcm1Db21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL0Zvcm1FbGVtZW50XCI7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Hcm91cExheW91dCwgRm9ybUdyb3VwSGVhZGVyIH0gZnJvbSBcIi4uL0Zvcm1Hcm91cFwiO1xuaW1wb3J0IHsgRm9ybUludGwsIEZvcm1JbnRsSXRlbUxheW91dCwgRm9ybUludGxMYXlvdXQgfSBmcm9tIFwiLi4vRm9ybUludGxcIjtcbmltcG9ydCB7IEZvcm1FcnJvcnMgfSBmcm9tIFwiLi4vRm9ybUVycm9yc1wiO1xuaW1wb3J0IHsgRm9ybVN1Ym1pdCB9IGZyb20gXCIuLi9Gb3JtU3VibWl0XCI7XG5pbXBvcnQgeyBGb3JtTGF5b3V0IH0gZnJvbSBcIi4uL0Zvcm1MYXlvdXRcIjtcbmltcG9ydCB7XG4gIEZvcm1OZXN0ZWRBcnJheSxcbiAgRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQsXG4gIEljb25BZGQsXG4gIEljb25SZW1vdmUsXG59IGZyb20gXCIuLi9Gb3JtTmVzdGVkQXJyYXlcIjtcbmltcG9ydCB7IEZvcm1OZXN0ZWRBcnJheUxheW91dCB9IGZyb20gXCIuLi9Gb3JtTmVzdGVkQXJyYXlMYXlvdXRcIjtcbmltcG9ydCB7IEZvcm1OZXN0ZWRJdGVtLCBGb3JtTmVzdGVkSXRlbUxheW91dCB9IGZyb20gXCIuLi9Gb3JtTmVzdGVkSXRlbVwiO1xuaW1wb3J0IHsgRm9ybU5lc3RlZERpdmlkZXIgfSBmcm9tIFwiLi4vRm9ybU5lc3RlZERpdmlkZXJcIjtcbmltcG9ydCB7IEZpZWxkRXJyb3JzIH0gZnJvbSBcIi4uL0ZpZWxkRXJyb3JzXCI7XG5pbXBvcnQgeyBGb3JtTmVzdGVkT2JqZWN0LCBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0IH0gZnJvbSBcIi4uL0Zvcm1OZXN0ZWRPYmplY3RcIjtcbmltcG9ydCB7IEZvcm1PcHRpb25MYWJlbCB9IGZyb20gXCIuLi9Gb3JtT3B0aW9uTGFiZWxcIjtcbmltcG9ydCB7IEZvcm0gfSBmcm9tIFwiLi4vRm9ybVwiO1xuXG5pbXBvcnQge1xuICBGb3JtQ29tcG9uZW50RGVmYXVsdCxcbiAgRm9ybUNvbXBvbmVudFBhc3N3b3JkLFxuICBGb3JtQ29tcG9uZW50TnVtYmVyLFxuICBGb3JtQ29tcG9uZW50VXJsLFxuICBGb3JtQ29tcG9uZW50RW1haWwsXG4gIEZvcm1Db21wb25lbnRUZXh0YXJlYSxcbiAgRm9ybUNvbXBvbmVudENoZWNrYm94LFxuICBGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCxcbiAgRm9ybUNvbXBvbmVudFJhZGlvR3JvdXAsXG4gIEZvcm1Db21wb25lbnRTZWxlY3QsXG4gIEZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZSxcbiAgRm9ybUNvbXBvbmVudERhdGVUaW1lLFxuICBGb3JtQ29tcG9uZW50RGF0ZSxcbiAgRm9ybUNvbXBvbmVudFRpbWUsXG4gIEZvcm1Db21wb25lbnRTdGF0aWNUZXh0LFxuICBGb3JtQ29tcG9uZW50TGlrZXJ0LFxuICBGb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlLFxuICBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGUsXG59IGZyb20gXCIuLi9pbnB1dHMvQmFzaWNJbnB1dHNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCIuLi9jb3JlL0J1dHRvblwiO1xuaW1wb3J0IHsgTG9hZGluZyB9IGZyb20gXCIuLi9jb3JlL0xvYWRpbmdcIjtcbmltcG9ydCB7IFBvc3NpYmxlQ29yZUNvbXBvbmVudHMsIFBvc3NpYmxlRm9ybUNvbXBvbmVudHMgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5cbmNvbnN0IGRlZmF1bHRDb3JlQ29tcG9uZW50czogUG9zc2libGVDb3JlQ29tcG9uZW50cyA9IHtcbiAgTG9hZGluZyxcbiAgRm9ybWF0dGVkTWVzc2FnZSxcbiAgQWxlcnQ6ICgpID0+IG51bGwsXG4gIEJ1dHRvbixcbiAgSWNvbjogKCkgPT4gbnVsbCxcbn07XG5jb25zdCBkZWZhdWx0Rm9ybUNvbXBvbmVudHM6IFBvc3NpYmxlRm9ybUNvbXBvbmVudHMgPSB7XG4gIEZvcm1FcnJvciwgLy8gdXNlZCBieTogRmllbGRFcnJvcnNcbiAgLy8gVG8gYmUgZGVmaW5lZCBieSB0aGUgVUkgZnJhbWV3b3JrXG4gIC8vIFRPRE86IGFkZCBkZWZhdWx0cyBpbiBSZWFjdCBjb21wb25lbnRzXG4gIEZvcm1Db21wb25lbnREZWZhdWx0LFxuICBGb3JtQ29tcG9uZW50UGFzc3dvcmQsXG4gIEZvcm1Db21wb25lbnROdW1iZXIsXG4gIEZvcm1Db21wb25lbnRVcmwsXG4gIEZvcm1Db21wb25lbnRFbWFpbCxcbiAgRm9ybUNvbXBvbmVudFRleHRhcmVhLFxuICBGb3JtQ29tcG9uZW50Q2hlY2tib3gsXG4gIEZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwLFxuICBGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCxcbiAgRm9ybUNvbXBvbmVudFNlbGVjdCxcbiAgRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlLFxuICBGb3JtQ29tcG9uZW50RGF0ZVRpbWUsXG4gIEZvcm1Db21wb25lbnREYXRlLFxuICAvL0Zvcm1Db21wb25lbnREYXRlMixcbiAgRm9ybUNvbXBvbmVudFRpbWUsXG4gIEZvcm1Db21wb25lbnRTdGF0aWNUZXh0LFxuICBGb3JtQ29tcG9uZW50TGlrZXJ0LFxuICBGb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlLFxuICBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGUsXG4gIC8vIENvbXBvbmVudHMgZGVmaW5lZCBpbiBkZWZhdWx0IHZ1bGNhbi9mb3Jtc1xuICBGb3JtQ29tcG9uZW50LFxuICBGb3JtQ29tcG9uZW50SW5uZXIsXG4gIEZvcm1Db21wb25lbnRMb2FkZXIsXG4gIEZvcm1FbGVtZW50LFxuICBGb3JtR3JvdXAsXG4gIEZvcm1Hcm91cExheW91dCxcbiAgRm9ybUdyb3VwSGVhZGVyLFxuICBGb3JtSW50bCxcbiAgRm9ybUludGxJdGVtTGF5b3V0LFxuICBGb3JtSW50bExheW91dCxcblxuICAvLyBMYXlvdXRcbiAgRmllbGRFcnJvcnMsXG4gIEZvcm1FcnJvcnMsXG4gIEZvcm1TdWJtaXQsXG4gIEZvcm1MYXlvdXQsXG5cbiAgRm9ybU5lc3RlZEFycmF5LFxuICBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dCxcbiAgRm9ybU5lc3RlZEFycmF5TGF5b3V0LFxuICBGb3JtTmVzdGVkSXRlbSxcbiAgSWNvbkFkZCxcbiAgSWNvblJlbW92ZSxcbiAgRm9ybU5lc3RlZERpdmlkZXIsXG4gIC8vIG5lc3RlZCBpdGVtXG4gIEZvcm1OZXN0ZWRJdGVtTGF5b3V0LFxuICBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0LFxuICBGb3JtTmVzdGVkT2JqZWN0LFxuICBGb3JtT3B0aW9uTGFiZWwsXG4gIC8vXG4gIEZvcm0sXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHMgPSB7XG4gIC4uLmRlZmF1bHRDb3JlQ29tcG9uZW50cyxcbiAgLi4uZGVmYXVsdEZvcm1Db21wb25lbnRzLFxufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbi8vIGltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbi8vIGltcG9ydCBnZXRDb250ZXh0IGZyb20gJ3JlY29tcG9zZS9nZXRDb250ZXh0Jztcbi8vIGltcG9ydCB7IENvbXBvbmVudHMsIHJlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSAnbWV0ZW9yL3Z1bGNhbjpjb3JlJztcbmltcG9ydCBnZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtRXJyb3IgPSAoeyBlcnJvciwgZXJyb3JDb250ZXh0IH0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBnZXRMYWJlbCB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgLy8gdXNlIHRoZSBlcnJvciBvciBlcnJvciBtZXNzYWdlIGFzIGRlZmF1bHQgbWVzc2FnZVxuICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICBjb25zdCBpZCA9IGVycm9yLmlkIHx8IFwiYXBwLmRlZmF1bHRFcnJvclwiO1xuXG4gIC8vIGRlZmF1bHQgcHJvcHMgZm9yIGFsbCBlcnJvcnNcbiAgbGV0IG1lc3NhZ2VQcm9wcyA9IHtcbiAgICBpZCxcbiAgICBkZWZhdWx0TWVzc2FnZSxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIGVycm9yQ29udGV4dCxcbiAgICAgIGRlZmF1bHRNZXNzYWdlLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGVuaGFuY2UgdGhlIG1lc3NhZ2VcbiAgaWYgKGVycm9yLnByb3BlcnRpZXMpIHtcbiAgICAvLyBpbiBjYXNlIHRoaXMgaXMgYSBuZXN0ZWQgZmllbGRzLCBvbmx5IGtlZXAgbGFzdCBzZWdtZW50IG9mIHBhdGhcbiAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgZXJyb3IucHJvcGVydGllcy5uYW1lICYmIGVycm9yLnByb3BlcnRpZXMubmFtZS5zcGxpdChcIi5cIikuc2xpY2UoLTEpWzBdO1xuICAgIG1lc3NhZ2VQcm9wcy52YWx1ZXMgPSB7XG4gICAgICAuLi5tZXNzYWdlUHJvcHMudmFsdWVzLFxuICAgICAgLy8gaWYgdGhlIGVycm9yIGlzIHRyaWdnZXJlZCBieSBhIGZpZWxkLCBnZXQgdGhlIHJlbGV2YW50IGxhYmVsXG4gICAgICBsYWJlbDogZXJyb3JOYW1lICYmIGdldExhYmVsKGVycm9yTmFtZSwgZXJyb3IucHJvcGVydGllcy5sb2NhbGUpLFxuICAgICAgLi4uZXJyb3IucHJvcGVydGllcyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVycm9yLmRhdGEpIHtcbiAgICBtZXNzYWdlUHJvcHMudmFsdWVzID0ge1xuICAgICAgLi4ubWVzc2FnZVByb3BzLnZhbHVlcyxcbiAgICAgIC4uLmVycm9yLmRhdGEsIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGV4Y2VwdGlvbiA9IGdldChlcnJvciwgXCJleHRlbnNpb25zLmV4Y2VwdGlvblwiKTtcbiAgaWYgKGV4Y2VwdGlvbikge1xuICAgIG1lc3NhZ2VQcm9wcyA9IHtcbiAgICAgIC4uLm1lc3NhZ2VQcm9wcyxcbiAgICAgIGlkOiBleGNlcHRpb24uaWQsXG4gICAgICB2YWx1ZXM6IGV4Y2VwdGlvbi5kYXRhLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIDxWdWxjYW5Db21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2UgaHRtbD17dHJ1ZX0gey4uLm1lc3NhZ2VQcm9wc30gLz47XG59O1xuXG5Gb3JtRXJyb3IuZGVmYXVsdFByb3BzID0ge1xuICBlcnJvckNvbnRleHQ6IFwiXCIsIC8vIGRlZmF1bHQgY29udGV4dCBzbyBmb3JtYXQgbWVzc2FnZSBkb2VzIG5vdCBjb21wbGFpblxufTtcbiIsIi8qKlxuICogVE9ETzogcmVuYW1lIFwiRmllbGRDb21wb25lbnRcIiB0byBjbGFyaWZ5XG4gKiBDaGFuZ2UgY29tcGFyZWQgdG8gTWV0ZW9yOlxuICogLSBjdXN0b20gaW5wdXRzIGNhbm5vdCBiZSBhIHJlZmVyZW5jZSBhbnltb3JlLCB5b3UgbmVlZCB0byBwYXNzIHRoZSB3aG9sZSBjb21wb25lbnQgYW5kIG5vdCBqdXN0IHRoZSBuYW1lXG4gKiAtIEZvcm1Db21wb25lbnRzIGNvbnRleHQgaXMgbGltaXRlZCB0byBkZWZhdWx0IGNvbXBvbmVudC4gT3RoZXIgY29tcG9uZW50cyBtdXN0IGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBzY2hlbWEgaW5zdGVhZFxuICogKGl0IG1lYW5zIHlvdSBjYW4ndCBleHRlbmQgdGhlIFNtYXJ0Rm9ybSB3aXRoIG5ldyBpbnB1dFR5cGUsIGluc3RlYWQgdXNlIGEgZnVsbHkgY3VzdG9tIGlucHV0KVxuICovXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50VHlwZSwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IFNpbXBsZVNjaGVtYSBmcm9tIFwic2ltcGwtc2NoZW1hXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUsIGdldE51bGxWYWx1ZSB9IGZyb20gXCIuL21vZHVsZXMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgUG9zc2libGVGb3JtQ29tcG9uZW50cyxcbiAgUG9zc2libGVWdWxjYW5Db21wb25lbnRzLFxufSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL3R5cGluZ3NcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQge1xuICBWdWxjYW5GaWVsZFNjaGVtYSxcbiAgVnVsY2FuRmllbGRJbnB1dCxcbiAgVnVsY2FuRmllbGRUeXBlLFxufSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgZ2V0QXV0b0lucHV0RnJvbVR5cGUgfSBmcm9tIFwiLi9pbnB1dHMvY29uc3RzXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmNvbnN0IGdldENoYXJhY3RlckNvdW50cyA9ICh2YWx1ZTogYW55LCBtYXg6IG51bWJlcikgPT4ge1xuICBjb25zdCBjaGFyYWN0ZXJDb3VudDogbnVtYmVyID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID8gdmFsdWUubGVuZ3RoIDogMDtcbiAgcmV0dXJuIHsgY2hhcnNSZW1haW5pbmc6IG1heCAtIGNoYXJhY3RlckNvdW50LCBjaGFyc0NvdW50OiBjaGFyYWN0ZXJDb3VudCB9O1xufTtcblxuLyoqXG4gKiBHZXQgZmllbGQgcGF0aCwgdGFraW5nIGludGxJbnB1dCBmaWVsZHMgaW50byBhY2NvdW50XG4gKi9cbmNvbnN0IGdldFBhdGggPSAoe1xuICBpbnRsSW5wdXQsXG4gIHBhdGgsXG59OiB7XG4gIGludGxJbnB1dD86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbn0pID0+IHtcbiAgcmV0dXJuIGludGxJbnB1dCA/IGAke3BhdGh9X2ludGxgIDogcGF0aDtcbn07XG5cbmNvbnN0IGdldENoYXJhY3RlckNvdW50c0Zyb21Qcm9wcyA9ICh7XG4gIGRvY3VtZW50LFxuICBtYXgsXG4gIGludGxJbnB1dCxcbiAgcGF0aCxcbn06IFBpY2s8Rm9ybUNvbXBvbmVudFByb3BzLCBcImRvY3VtZW50XCIgfCBcIm1heFwiIHwgXCJpbnRsSW5wdXRcIiB8IFwicGF0aFwiPikgPT4ge1xuICBpZiAoIW1heCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGZpZWxkUGF0aCA9IGdldFBhdGgoeyBpbnRsSW5wdXQsIHBhdGggfSk7XG4gIGNvbnN0IGludGxPclJlZ3VsYXJWYWx1ZSA9IGRvY3VtZW50Py5bZmllbGRQYXRoXTtcbiAgY29uc3QgdmFsdWUgPVxuICAgIGludGxPclJlZ3VsYXJWYWx1ZSAmJiB0eXBlb2YgaW50bE9yUmVndWxhclZhbHVlID09PSBcIm9iamVjdFwiXG4gICAgICA/IGludGxPclJlZ3VsYXJWYWx1ZS52YWx1ZVxuICAgICAgOiBpbnRsT3JSZWd1bGFyVmFsdWU7XG4gIHJldHVybiBnZXRDaGFyYWN0ZXJDb3VudHModmFsdWUsIG1heCk7XG59O1xuXG4vLyBUT0RPOiBtb3ZlIHRvIHNjaGVtYSBoZWxwZXJzXG5jb25zdCBpc0FycmF5RmllbGQgPSAodHlwZTogVnVsY2FuRmllbGRTY2hlbWFbXCJ0eXBlXCJdKSA9PiB7XG4gIHJldHVybiB0eXBlID09PSBBcnJheTtcbn07XG5cbi8vIFRPRE86IG5vdCB1cCB0byBkYXRlXG5jb25zdCBpc09iamVjdEZpZWxkID0gKHR5cGU6IFZ1bGNhbkZpZWxkU2NoZW1hW1widHlwZVwiXSkgPT4ge1xuICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFNpbXBsZVNjaGVtYTtcbn07XG5cbi8qXG5cbiAgR2V0IGZvcm0gaW5wdXQgdHlwZSwgZWl0aGVyIGJhc2VkIG9uIGlucHV0IHByb3BzLCBvciBieSBndWVzc2luZyBiYXNlZCBvbiBmb3JtIGZpZWxkIHR5cGVcblxuICAqL1xuY29uc3QgZ2V0SW5wdXROYW1lID0gKGZpZWxkVHlwZTogVnVsY2FuRmllbGRUeXBlLCBpbnB1dD86IFZ1bGNhbkZpZWxkSW5wdXQpID0+IHtcbiAgaWYgKGlucHV0KSByZXR1cm4gaW5wdXQ7XG4gIHJldHVybiBnZXRBdXRvSW5wdXRGcm9tVHlwZShmaWVsZFR5cGUpO1xufTtcblxuLypcbiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgaW5wdXQgdHlwZSBpcyBhIGN1c3RvbVxuICBOT1RFOiBpdCBhbHNvIGFjY2VwdCBub24tc3RhbmRhcmQgbmFtZSwgaWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IHR5cGUgb2YgSW5wdXQgaW4gdGhlIGNvbnRleHRcbiAgKi9cbi8qXG5jb25zdCBpc0N1c3RvbUlucHV0ID0gKGlucHV0VHlwZTogVnVsY2FuRmllbGRJbnB1dCkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0VHlwZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGlzU3RhbmRhcmRJbnB1dCA9IGFsbFZ1bGNhbklucHV0cy5pbmNsdWRlcyhpbnB1dFR5cGUpO1xuICByZXR1cm4gIWlzU3RhbmRhcmRJbnB1dDtcbn07XG4qL1xuXG4vKlxuXG4gIEZ1bmN0aW9uIHBhc3NlZCB0byBGb3JtQ29tcG9uZW50SW5uZXIgdG8gaGVscCB3aXRoIHJlbmRlcmluZyB0aGUgY29tcG9uZW50XG5cbiAgKi9cbmNvbnN0IGdldEZvcm1JbnB1dCA9ICh7XG4gIHR5cGUsXG4gIGlucHV0LFxuICBGb3JtQ29tcG9uZW50cyxcbn06IHtcbiAgdHlwZTogVnVsY2FuRmllbGRUeXBlO1xuICBpbnB1dDogVnVsY2FuRmllbGRJbnB1dDtcbiAgRm9ybUNvbXBvbmVudHM6IFBvc3NpYmxlRm9ybUNvbXBvbmVudHM7XG59KTogLy8gVE9ETzogd2UgY291bGQgdHlwZSB0aGUgcHJvcHMgaGVyZSwgaXQncyBhbiBJbnB1dENvbXBvbmVudCB0byBiZSBtb3JlIHByZWNpc2VcbkNvbXBvbmVudFR5cGUgPT4ge1xuICAvLyBpZiBpbnB1dCBpcyBhIFJlYWN0IGNvbXBvbmVudCwgdXNlIGl0XG4gIC8vIE5PVEU6IGRvZXMgaXQgd29yayB3aXRoIGNsYXNzIGNvbXBvbmVudHM/XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IElucHV0Q29tcG9uZW50ID0gaW5wdXQ7XG4gICAgcmV0dXJuIElucHV0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlucHV0TmFtZSA9IGdldElucHV0TmFtZSh0eXBlLCBpbnB1dCk7XG4gICAgLy8gZWxzZSBwaWNrIGEgcHJlZGVmaW5lZCBjb21wb25lbnRcbiAgICBzd2l0Y2ggKGlucHV0TmFtZSkge1xuICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREZWZhdWx0O1xuXG4gICAgICBjYXNlIFwicGFzc3dvcmRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRQYXNzd29yZDtcblxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudE51bWJlcjtcblxuICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFVybDtcblxuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50RW1haWw7XG5cbiAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFRleHRhcmVhO1xuXG4gICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRDaGVja2JveDtcblxuICAgICAgY2FzZSBcImNoZWNrYm94Z3JvdXBcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwO1xuXG4gICAgICBjYXNlIFwicmFkaW9ncm91cFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFJhZGlvR3JvdXA7XG5cbiAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRTZWxlY3Q7XG5cbiAgICAgIGNhc2UgXCJzZWxlY3RtdWx0aXBsZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlO1xuXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREYXRlVGltZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREYXRlO1xuXG4gICAgICAvLyBjYXNlIFwiZGF0ZTJcIjpcbiAgICAgIC8vICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnREYXRlMjtcblxuICAgICAgY2FzZSBcInRpbWVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRUaW1lO1xuXG4gICAgICBjYXNlIFwic3RhdGljdGV4dFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFN0YXRpY1RleHQ7XG5cbiAgICAgIGNhc2UgXCJsaWtlcnRcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRMaWtlcnQ7XG5cbiAgICAgIGNhc2UgXCJhdXRvY29tcGxldGVcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRBdXRvY29tcGxldGU7XG5cbiAgICAgIGNhc2UgXCJtdWx0aWF1dG9jb21wbGV0ZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9WdWxjYW5KUy92dWxjYW4tbnBtL3B1bGwvMzEgZGlzY3Vzc2lvbnMgYWJvdXQgY3VzdG9tIGNvbXBvbmVudHMgc3VwcG9ydCBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5wdXQgbmFtZSBcIiR7aW5wdXROYW1lfVwiIGlzIG5vdCBhIHN0YW5kYXJkIFZ1bGNhbiBmb3JtIGlucHV0ICh0eXBlOiAke3R5cGV9LCBpbnB1dDogJHtpbnB1dH0pYFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufTtcblxudHlwZSBPcHRpb25zPFRGaWVsZCA9IGFueT4gPSBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBURmllbGQgfT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbXBvbmVudFByb3BzPFRGaWVsZCA9IGFueT4gZXh0ZW5kcyBGb3JtRmllbGQge1xuICBkb2N1bWVudDogYW55O1xuICBkYXRhdHlwZTogVnVsY2FuRmllbGRUeXBlOyAvLyBUT0RPOiB0eXBlIG9mIHRoZSBmaWVsZCwgcmVwbGFjZSB0aGlzIGJ5IGEgY2xlYW5lciB2YWx1ZSBsaWtlIHdlIGRvIGluIGdyYXBocWwgdG8gZ2V0IHRoZSBmaWVsZCB0eXBlXG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBlcnJvcnM6IEFycmF5PGFueT47XG4gIC8qKiBIZWxwIHRleHQgZm9yIHRoZSBmb3JtICovXG4gIGhlbHA/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIG9mIHRoZSBmaWVsZCBpZiBuZXN0ZWQgKi9cbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0VmFsdWU/OiBURmllbGQ7XG4gIG1heD86IG51bWJlcjtcbiAgbG9jYWxlPzogc3RyaW5nO1xuICAvKiogSW5wdXQgZm9yIHRoaXMgZmllbGQgKi9cbiAgaW5wdXQ/OiBWdWxjYW5GaWVsZElucHV0IHwgc3RyaW5nIHwgUmVhY3QuQ29tcG9uZW50O1xuICBmb3JtVHlwZTogXCJuZXdcIiB8IFwiZWRpdFwiOyAvLyBuZXcgb3IgZWRpdFxuICBpbnRsSW5wdXQ/OiBib29sZWFuO1xuICBuZXN0ZWRJbnB1dD86IGJvb2xlYW47XG4gIC8qKiBHcmFwaHFsIHF1ZXJ5IHlvdSBjYW4gcGFzcyB0byBmZXRjaCB0aGUgb3B0aW9ucyBhc3luY2hyb25vdXNseSAqL1xuICBxdWVyeT86IHN0cmluZztcbiAgb3B0aW9ucz86IE9wdGlvbnMgfCAoKGZjaVByb3BzPzogYW55KSA9PiBPcHRpb25zKTtcbiAgdnVsY2FuQ29tcG9uZW50cz86IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cztcbn1cbi8qKlxuICogQ29tcG9uZW50IGZvciB0aGUgZGlzcGxheSBvZiBhbnkgZmllbGQgb2YgdGhlIGZvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnQgPSAocHJvcHM6IEZvcm1Db21wb25lbnRQcm9wcykgPT4ge1xuICAvKlxuICBUT0RPOiByZXBsYWNlIHdpdGggYSB1c2VNZW1vXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIC8vIGFsbG93IGN1c3RvbSBjb250cm9scyB0byBkZXRlcm1pbmUgaWYgdGhleSBzaG91bGQgdXBkYXRlXG4gICAgaWYgKHRoaXMuaXNDdXN0b21JbnB1dCh0aGlzLmdldElucHV0VHlwZShuZXh0UHJvcHMpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkb2N1bWVudCwgZGVsZXRlZFZhbHVlcywgZXJyb3JzIH0gPSBuZXh0UHJvcHM7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgodGhpcy5wcm9wcyk7XG5cbiAgICAvLyB3aGVuIGNoZWNraW5nIGZvciBkZWxldGVkIHZhbHVlcywgYm90aCBjdXJyZW50IHBhdGggKCdmb28nKSBhbmQgY2hpbGQgcGF0aCAoJ2Zvby4wLmJhcicpIHNob3VsZCB0cmlnZ2VyIHVwZGF0ZXNcbiAgICBjb25zdCBpbmNsdWRlc1BhdGhPckNoaWxkcmVuID0gKGRlbGV0ZWRWYWx1ZXMpID0+XG4gICAgICBkZWxldGVkVmFsdWVzLnNvbWUoKGRlbGV0ZWRQYXRoKSA9PiBkZWxldGVkUGF0aC5pbmNsdWRlcyhwYXRoKSk7XG5cbiAgICBjb25zdCB2YWx1ZUNoYW5nZWQgPSAhaXNFcXVhbChcbiAgICAgIGdldChkb2N1bWVudCwgcGF0aCksXG4gICAgICBnZXQodGhpcy5wcm9wcy5kb2N1bWVudCwgcGF0aClcbiAgICApO1xuICAgIGNvbnN0IGVycm9yQ2hhbmdlZCA9ICFpc0VxdWFsKHRoaXMuZ2V0RXJyb3JzKGVycm9ycyksIHRoaXMuZ2V0RXJyb3JzKCkpO1xuICAgIGNvbnN0IGRlbGV0ZUNoYW5nZWQgPVxuICAgICAgaW5jbHVkZXNQYXRoT3JDaGlsZHJlbihkZWxldGVkVmFsdWVzKSAhPT1cbiAgICAgIGluY2x1ZGVzUGF0aE9yQ2hpbGRyZW4odGhpcy5wcm9wcy5kZWxldGVkVmFsdWVzKTtcbiAgICBjb25zdCBjaGFyc0NoYW5nZWQgPSBuZXh0U3RhdGUuY2hhcnNSZW1haW5pbmcgIT09IHRoaXMuc3RhdGUuY2hhcnNSZW1haW5pbmc7XG4gICAgY29uc3QgZGlzYWJsZWRDaGFuZ2VkID0gbmV4dFByb3BzLmRpc2FibGVkICE9PSB0aGlzLnByb3BzLmRpc2FibGVkO1xuICAgIGNvbnN0IGhlbHBDaGFuZ2VkID0gbmV4dFByb3BzLmhlbHAgIT09IHRoaXMucHJvcHMuaGVscDtcblxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9XG4gICAgICB2YWx1ZUNoYW5nZWQgfHxcbiAgICAgIGVycm9yQ2hhbmdlZCB8fFxuICAgICAgZGVsZXRlQ2hhbmdlZCB8fFxuICAgICAgY2hhcnNDaGFuZ2VkIHx8XG4gICAgICBkaXNhYmxlZENoYW5nZWQgfHxcbiAgICAgIGhlbHBDaGFuZ2VkO1xuXG4gICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbiAgfSovXG5cbiAgY29uc3Qge1xuICAgIGxvY2FsZSxcbiAgICBtYXgsXG4gICAgcGF0aCxcbiAgICAvL3R5cGUsXG4gICAgZGF0YXR5cGUsXG4gICAgaW5wdXQsXG4gICAgaW50bElucHV0LFxuICAgIG5lc3RlZElucHV0LFxuICAgIHF1ZXJ5LFxuICAgIG9wdGlvbnMsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyB1cGRhdGVDdXJyZW50VmFsdWVzLCBkZWxldGVkVmFsdWVzLCBjbGVhckZpZWxkRXJyb3JzIH0gPVxuICAgIHVzZUZvcm1Db250ZXh0KCk7XG5cbiAgY29uc3QgdHlwZSA9IGRhdGF0eXBlO1xuICBjb25zdCBjb3VudEZyb21Qcm9wcyA9IGdldENoYXJhY3RlckNvdW50c0Zyb21Qcm9wcyhwcm9wcyk7XG4gIC8vIGVxdWl2YWxlbnQgdG8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gIGNvbnN0IFtjaGFyc0NvdW50U3RhdGUsIHNldENoYXJhY3RlckNvdW50c10gPVxuICAgIHVzZVN0YXRlPHtcbiAgICAgIGNoYXJzQ291bnQ6IG51bWJlcjtcbiAgICAgIGNoYXJzUmVtYWluaW5nOiBudW1iZXI7XG4gICAgfSB8IG51bGw+KGNvdW50RnJvbVByb3BzKTtcblxuICAvLyBUT0RPOiBtb3ZlIHRoaXMgbG9naWMgc29tZXdoZXJlIGVsc2UsIGFzIGl0IGlzIHNwZWNpZmljIHRvIFN0cmluZyBjb21wb25lbnRzLlxuICAvLyBFZyB1c2luZyBhbiBpbnRlcm1lZGlhdGUgRm9ybUNvbXBvbmVudFRleHRcbiAgLypcbiAgVXBkYXRlcyB0aGUgc3RhdGUgb2YgY2hhcnNDb3VudCBhbmQgY2hhcnNSZW1haW5pbmcgYXMgdGhlIHVzZXJzIHR5cGVzXG4gICovXG4gIGNvbnN0IHVwZGF0ZUNoYXJhY3RlckNvdW50ID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKCFtYXgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHVwZGF0ZSBjaGFyYWN0ZXIgY291bnQgd2hlbiBubyBtYXggdmFsdWUgaXMgc2V0LlwiXG4gICAgICApO1xuICAgIHNldENoYXJhY3RlckNvdW50cyhnZXRDaGFyYWN0ZXJDb3VudHModmFsdWUsIG1heCkpO1xuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjb3VudEZyb21Qcm9wcykge1xuICAgICAgc2V0Q2hhcmFjdGVyQ291bnRzKGNvdW50RnJvbVByb3BzKTtcbiAgICB9XG4gIH0sIFtjb3VudEZyb21Qcm9wcz8uY2hhcnNDb3VudCwgY291bnRGcm9tUHJvcHM/LmNoYXJzUmVtYWluaW5nXSk7XG4gIC8qXG5cbiAgV2hldGhlciB0byBrZWVwIHRyYWNrIG9mIGFuZCBzaG93IHJlbWFpbmluZyBjaGFyc1xuXG4gICovXG4gIGxldCBzaG93Q2hhcnNSZW1haW5pbmcgPSBmYWxzZTtcbiAgbGV0IGlucHV0TmFtZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnB1dE5hbWUgPSBnZXRJbnB1dE5hbWUodHlwZSwgaW5wdXQpO1xuICAgIHNob3dDaGFyc1JlbWFpbmluZyA9ICEhKFxuICAgICAgdHlwZW9mIG1heCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgaW5wdXROYW1lICYmXG4gICAgICBbXCJ1cmxcIiwgXCJlbWFpbFwiLCBcInRleHRhcmVhXCIsIFwidGV4dFwiXS5pbmNsdWRlcyhpbnB1dE5hbWUpXG4gICAgKTtcbiAgfVxuICAvLyBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dE5hbWU7IC8vIFRPRE86IHJlbmFtZSBpbnB1dFR5cGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2hpbGQgY29tcG9uZW50c1xuXG4gIC8qXG4gIEZ1bmN0aW9uIHBhc3NlZCB0byBmb3JtIGNvbnRyb2xzIChhbHdheXMgY29udHJvbGxlZCkgdG8gdXBkYXRlIHRoZWlyIHZhbHVlXG4gIChOb3RlOiB3ZSBjb3VsZCB1c2UgdGhlIGNvbnRleHQgaW5zdGVhZD8pXG4gICovXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICh2YWx1ZSkgPT4ge1xuICAgIC8vIGlmIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZywgZGVsZXRlIHRoZSBmaWVsZFxuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICAvLyBpZiB0aGlzIGlzIGEgbnVtYmVyIGZpZWxkLCBjb252ZXJ0IHZhbHVlIGJlZm9yZSBzZW5kaW5nIGl0IHVwIHRvIEZvcm1cbiAgICBpZiAodHlwZSA9PT0gTnVtYmVyICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFNpbXBsZVNjaGVtYS5JbnRlZ2VyICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAhPT0gZ2V0VmFsdWUoKSkge1xuICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSBsb2NhbGUgPyB7IGxvY2FsZTogbG9jYWxlLCB2YWx1ZSB9IDogdmFsdWU7XG4gICAgICB1cGRhdGVDdXJyZW50VmFsdWVzKHsgW2dldFBhdGgocHJvcHMpXTogdXBkYXRlVmFsdWUgfSk7XG4gICAgICBjbGVhckZpZWxkRXJyb3JzKGdldFBhdGgocHJvcHMpKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgdGV4dCBmaWVsZHMsIHVwZGF0ZSBjaGFyYWN0ZXIgY291bnQgb24gY2hhbmdlXG4gICAgaWYgKHNob3dDaGFyc1JlbWFpbmluZykge1xuICAgICAgdXBkYXRlQ2hhcmFjdGVyQ291bnQodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICAvKlxuICBHZXQgdmFsdWUgZnJvbSBGb3JtIHN0YXRlIHRocm91Z2ggZG9jdW1lbnQgYW5kIGN1cnJlbnRWYWx1ZXMgcHJvcHNcbiAgICAvLyBUT0RPOiBnZXQgZG9jdW1lbnQgZnJvbSBjb250ZXh0XG4gICovXG4gIGNvbnN0IGdldFZhbHVlID0gKCkgPT4ge1xuICAgIC8vY29uc3QgYyA9IGNvbnRleHQgfHwgdGhpcy5jb250ZXh0O1xuICAgIGNvbnN0IHsgbG9jYWxlLCBkZWZhdWx0VmFsdWUsIGZvcm1UeXBlLCBkYXRhdHlwZSB9ID0gcHJvcHM7XG4gICAgY29uc3QgcGF0aCA9IGxvY2FsZSA/IGAke2dldFBhdGgocHJvcHMpfS52YWx1ZWAgOiBnZXRQYXRoKHByb3BzKTtcbiAgICBjb25zdCBjdXJyZW50RG9jdW1lbnQgPSBwcm9wcy5kb2N1bWVudDtcbiAgICBsZXQgdmFsdWUgPSBnZXQoY3VycmVudERvY3VtZW50LCBwYXRoKTtcbiAgICAvLyBub3RlOiBmb3JjZSBpbnRsIGZpZWxkcyB0byBiZSB0cmVhdGVkIGxpa2Ugc3RyaW5nc1xuICAgIGNvbnN0IG51bGxWYWx1ZSA9IGxvY2FsZSA/IFwiXCIgOiBnZXROdWxsVmFsdWUoZGF0YXR5cGUpO1xuXG4gICAgLy8gaGFuZGxlIGRlbGV0ZWQgJiBlbXB0eSB2YWx1ZVxuICAgIGlmIChkZWxldGVkVmFsdWVzLmluY2x1ZGVzKHBhdGgpKSB7XG4gICAgICB2YWx1ZSA9IG51bGxWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIHJlcGxhY2UgZW1wdHkgdmFsdWUgYnkgdGhlIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgc2NoZW1hIGlmIGl0IGV4aXN0cyDigJMgZm9yIG5ldyBmb3JtcyBvbmx5XG4gICAgICB2YWx1ZSA9IGZvcm1UeXBlID09PSBcIm5ld1wiICYmIGRlZmF1bHRWYWx1ZSA/IGRlZmF1bHRWYWx1ZSA6IG51bGxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIC8qXG5cbiAgR2V0IGVycm9ycyBmcm9tIEZvcm0gc3RhdGUgdGhyb3VnaCBjb250ZXh0XG5cbiAgTm90ZTogd2UgdXNlIGBpbmNsdWRlc2AgdG8gZ2V0IGFsbCBlcnJvcnMgZnJvbSBuZXN0ZWQgY29tcG9uZW50cywgd2hpY2ggaGF2ZSBsb25nZXIgcGF0aHNcblxuICAqL1xuICBjb25zdCBnZXRFcnJvcnMgPSAoZXJyb3JzPzogQXJyYXk8YW55PikgPT4ge1xuICAgIGVycm9ycyA9IGVycm9ycyB8fCBwcm9wcy5lcnJvcnMgfHwgW107XG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSBlcnJvcnMuZmlsdGVyKFxuICAgICAgKGVycm9yKSA9PiBlcnJvci5wYXRoICYmIGVycm9yLnBhdGguaW5jbHVkZXMocGF0aClcbiAgICApO1xuICAgIHJldHVybiBmaWVsZEVycm9ycztcbiAgfTtcblxuICAvKlxuXG4gIEZ1bmN0aW9uIHBhc3NlZCB0byBmb3JtIGNvbnRyb2xzIHRvIGNsZWFyIHRoZWlyIGNvbnRlbnRzIChzZXQgdGhlaXIgdmFsdWUgdG8gbnVsbClcblxuICAqL1xuICBjb25zdCBjbGVhckZpZWxkID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB1cGRhdGVDdXJyZW50VmFsdWVzKHsgW3BhdGhdOiBudWxsIH0pO1xuICAgIGlmIChzaG93Q2hhcnNSZW1haW5pbmcpIHtcbiAgICAgIHVwZGF0ZUNoYXJhY3RlckNvdW50KG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBpZiAoaW50bElucHV0KSB7XG4gICAgcmV0dXJuIDxGb3JtQ29tcG9uZW50cy5Gb3JtSW50bCB7Li4ucHJvcHN9IC8+O1xuICB9IGVsc2UgaWYgKCFpbnB1dCAmJiBuZXN0ZWRJbnB1dCkge1xuICAgIGlmIChpc0FycmF5RmllbGQodHlwZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlcbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgZm9ybUNvbXBvbmVudHM9e0Zvcm1Db21wb25lbnRzfVxuICAgICAgICAgIGVycm9ycz17Z2V0RXJyb3JzKCl9XG4gICAgICAgICAgdmFsdWU9e2dldFZhbHVlKCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RGaWVsZCh0eXBlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRPYmplY3RcbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgZm9ybUNvbXBvbmVudHM9e0Zvcm1Db21wb25lbnRzfVxuICAgICAgICAgIGVycm9ycz17Z2V0RXJyb3JzKCl9XG4gICAgICAgICAgdmFsdWU9e2dldFZhbHVlKCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZjaVByb3BzID0ge1xuICAgIC4uLnByb3BzLFxuICAgIC4uLihjaGFyc0NvdW50U3RhdGUgfHwge30pLFxuICAgIGlucHV0VHlwZTogZ2V0SW5wdXROYW1lKHR5cGUsIGlucHV0KSxcbiAgICB2YWx1ZTogZ2V0VmFsdWUoKSxcbiAgICBlcnJvcnM6IGdldEVycm9ycygpLFxuICAgIHNob3dDaGFyc1JlbWFpbmluZzogISFzaG93Q2hhcnNSZW1haW5pbmcsXG4gICAgaGFuZGxlQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgY2xlYXJGaWVsZDogY2xlYXJGaWVsZCxcbiAgICBmb3JtSW5wdXQ6IGdldEZvcm1JbnB1dCh7IEZvcm1Db21wb25lbnRzLCBpbnB1dCwgdHlwZSB9KSxcbiAgfTtcblxuICAvLyBpZiB0aGVyZSBpcyBubyBxdWVyeSwgaGFuZGxlIG9wdGlvbnMgaGVyZTsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBGb3JtQ29tcG9uZW50TG9hZGVyIGNvbXBvbmVudFxuICBpZiAoIXF1ZXJ5ICYmIHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmY2lQcm9wcy5vcHRpb25zID0gb3B0aW9ucyhmY2lQcm9wcyk7XG4gIH1cblxuICBjb25zdCBmY2kgPSA8Rm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudElubmVyIHsuLi5mY2lQcm9wc30gLz47XG5cbiAgcmV0dXJuIHF1ZXJ5ID8gKFxuICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50TG9hZGVyIHsuLi5mY2lQcm9wc30+XG4gICAgICB7ZmNpfVxuICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudExvYWRlcj5cbiAgKSA6IChcbiAgICBmY2lcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtQ29tcG9uZW50c0RlcGVuZGVuY2llcyA9IFtcbiAgXCJGb3JtQ29tcG9uZW50RGVmYXVsdFwiLFxuICBcIkZvcm1Db21wb25lbnRQYXNzd29yZFwiLFxuICBcIkZvcm1Db21wb25lbnROdW1iZXJcIixcbiAgXCJGb3JtQ29tcG9uZW50VXJsXCIsXG4gIFwiRm9ybUNvbXBvbmVudEVtYWlsXCIsXG4gIFwiRm9ybUNvbXBvbmVudFRleHRhcmVhXCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94XCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50UmFkaW9Hcm91cFwiLFxuICBcIkZvcm1Db21wb25lbnRTZWxlY3RcIixcbiAgXCJGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGVcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZVRpbWVcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZVwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlMlwiLFxuICBcIkZvcm1Db21wb25lbnRUaW1lXCIsXG4gIFwiRm9ybUNvbXBvbmVudFN0YXRpY1RleHRcIixcbiAgXCJGb3JtQ29tcG9uZW50TGlrZXJ0XCIsXG4gIFwiRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZVwiLFxuICBcIkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZVwiLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybUNvbXBvbmVudDtcbiIsImltcG9ydCBSZWFjdCwgeyBNb3VzZUV2ZW50SGFuZGxlciB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmltcG9ydCB7IHdoaXRlbGlzdElucHV0UHJvcHMgfSBmcm9tIFwiLi91aV91dGlsc1wiO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudFByb3BzIH0gZnJvbSBcIi4vRm9ybUNvbXBvbmVudFwiO1xuLypcbmltcG9ydCB7XG4gIGluc3RhbnRpYXRlQ29tcG9uZW50LFxuICB3aGl0ZWxpc3RJbnB1dFByb3BzLFxufSBmcm9tIFwibWV0ZW9yL3Z1bGNhbjpjb3JlXCI7XG4qL1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7IFZ1bGNhbkNvcmVJbnB1dCB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL3R5cGluZ3NcIjtcbmltcG9ydCB7IGNsZWFyYWJsZUlucHV0cyB9IGZyb20gXCIuL2lucHV0cy9jb25zdHNcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbXBvbmVudElubmVyUHJvcHMgZXh0ZW5kcyBGb3JtQ29tcG9uZW50UHJvcHMge1xuICBpbnB1dFR5cGU6IFZ1bGNhbkNvcmVJbnB1dDtcbiAgLy9kaXNhYmxlZD86IGJvb2xlYW47XG4gIC8vIGhlbHA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBjbGlja2luZyBvbiB0aGUgXCJjbGVhciBpbnB1dFwiIGJ1dHRvblxuICAgKi9cbiAgY2xlYXJGaWVsZD86IE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgLyoqXG4gICAqIFRPRE86IG5vdCBzdXJlIGlmIGl0IHNob3VsZCBiZSBtYW5kYXRvcnkgb3Igbm90IChlZyBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHM/KVxuICAgKi9cbiAgaGFuZGxlQ2hhbmdlPzogRnVuY3Rpb247XG4gIGl0ZW1Qcm9wZXJ0aWVzPzogYW55O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIHN1Ym1pdEZvcm06IGFueTtcbiAgZm9ybUNvbXBvbmVudHM6IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cztcbiAgaW50bEtleXM/OiBhbnk7XG4gIGlucHV0Q2xhc3NOYW1lOiBhbnk7XG4gIG5hbWU6IGFueTtcbiAgaW5wdXQ6IGFueTtcbiAgYmVmb3JlQ29tcG9uZW50OiBhbnk7XG4gIGFmdGVyQ29tcG9uZW50OiBhbnk7XG4gIGVycm9yczogYW55O1xuICBzaG93Q2hhcnNSZW1haW5pbmc6IGFueTtcbiAgY2hhcnNSZW1haW5pbmc6IGFueTtcbiAgcmVuZGVyQ29tcG9uZW50OiBhbnk7XG4gIGZvcm1JbnB1dDogYW55O1xufVxuXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudElubmVyID0gKHByb3BzOiBGb3JtQ29tcG9uZW50SW5uZXJQcm9wcykgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bENvbnRleHQoKTtcbiAgY29uc3QgeyBpbnB1dFR5cGUsIGRpc2FibGVkLCBjbGVhckZpZWxkIH0gPSBwcm9wcztcblxuICBjb25zdCByZW5kZXJDbGVhciA9ICgpID0+IHtcbiAgICBpZiAoY2xlYXJhYmxlSW5wdXRzLmluY2x1ZGVzKGlucHV0VHlwZSkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAvKlxuICAgICAgRnJvbSBib290c3RyYXA6XG4gICAgICAgIDxDb21wb25lbnRzLlRvb2x0aXBUcmlnZ2VyXG4gICAgICAgICAgdHJpZ2dlcj17XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWNsZWFyXCJcbiAgICAgICAgICAgICAgdGl0bGU9e3RoaXMuY29udGV4dC5pbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBcImZvcm1zLmNsZWFyX2ZpZWxkXCIsXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmNsZWFyRmllbGR9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuPuKclTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIDxDb21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2UgaWQ9XCJmb3Jtcy5jbGVhcl9maWVsZFwiIC8+XG4gICAgICAgIDwvQ29tcG9uZW50cy5Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNvbXBvbmVudC1jbGVhclwiXG4gICAgICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZDogXCJmb3Jtcy5jbGVhcl9maWVsZFwiLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIG9uQ2xpY2s9e2NsZWFyRmllbGR9XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj7inJU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0UHJvcGVydGllcyA9ICgpOiBGb3JtSW5wdXRQcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgaGFuZGxlQ2hhbmdlLFxuICAgICAgaW5wdXRUeXBlLFxuICAgICAgaXRlbVByb3BlcnRpZXMsXG4gICAgICBoZWxwLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBsb2FkaW5nLFxuICAgICAgc3VibWl0Rm9ybSxcbiAgICAgIGZvcm1Db21wb25lbnRzLFxuICAgICAgaW50bEtleXMsXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGlucHV0UHJvcGVydGllczoge1xuICAgICAgICAuLi53aGl0ZWxpc3RJbnB1dFByb3BzKHByb3BzKSxcbiAgICAgICAgb25DaGFuZ2U6IChldmVudCkgPT4ge1xuICAgICAgICAgIC8vIEZvcm1Db21wb25lbnQncyBoYW5kbGVDaGFuZ2UgZXhwZWN0cyB2YWx1ZSBhcyBhcmd1bWVudDsgbG9vayBpbiB0YXJnZXQuY2hlY2tlZCBvciB0YXJnZXQudmFsdWVcbiAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlID1cbiAgICAgICAgICAgIGlucHV0VHlwZSA9PT0gXCJjaGVja2JveFwiXG4gICAgICAgICAgICAgID8gLy8gVE9ETzogbm90IHN1cmUgd2h5IHdlIG5lZWQgYW4gaWdub3JlIHRoZXJlXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkXG4gICAgICAgICAgICAgIDogLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgICBpZiAoaGFuZGxlQ2hhbmdlKSB7XG4gICAgICAgICAgICBoYW5kbGVDaGFuZ2UoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKlxuICAgICAgICBUT0RPOiBjaGVjayBpZiB0aGlzIGNyZWF0ZXMgcmVncmVzc2lvblxuICAgICAgICBvbktleVByZXNzOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgaW5wdXRUeXBlICE9PSBcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgIHN1Ym1pdEZvcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICovXG4gICAgICB9LFxuXG4gICAgICBpdGVtUHJvcGVydGllczoge1xuICAgICAgICAuLi5pdGVtUHJvcGVydGllcyxcbiAgICAgICAgaW50bEtleXMsXG4gICAgICAgIENvbXBvbmVudHM6IGZvcm1Db21wb25lbnRzLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfHwgaGVscCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcGVydGllcztcbiAgfTtcblxuICBjb25zdCB7XG4gICAgaW5wdXRDbGFzc05hbWUsXG4gICAgbmFtZSxcbiAgICBpbnB1dCxcbiAgICAvL2lucHV0VHlwZSxcbiAgICBiZWZvcmVDb21wb25lbnQsXG4gICAgYWZ0ZXJDb21wb25lbnQsXG4gICAgZXJyb3JzLFxuICAgIHNob3dDaGFyc1JlbWFpbmluZyxcbiAgICBjaGFyc1JlbWFpbmluZyxcbiAgICByZW5kZXJDb21wb25lbnQsXG4gICAgZm9ybUlucHV0LFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgRm9ybUNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIC8vY29uc3QgRm9ybUNvbXBvbmVudHMgPSBmb3JtQ29tcG9uZW50cztcblxuICBjb25zdCBoYXNFcnJvcnMgPSBlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aDtcblxuICBjb25zdCBpbnB1dE5hbWUgPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IGlucHV0Lm5hbWUgOiBpbnB1dFR5cGU7XG4gIGNvbnN0IGlucHV0Q2xhc3MgPSBjbGFzc05hbWVzKFxuICAgIFwiZm9ybS1pbnB1dFwiLFxuICAgIGlucHV0Q2xhc3NOYW1lLFxuICAgIGBpbnB1dC0ke25hbWV9YCxcbiAgICBgZm9ybS1jb21wb25lbnQtJHtpbnB1dE5hbWUgfHwgXCJkZWZhdWx0XCJ9YCxcbiAgICB7XG4gICAgICBcImlucHV0LWVycm9yXCI6IGhhc0Vycm9ycyxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKCk7XG5cbiAgY29uc3QgRm9ybUlucHV0ID0gZm9ybUlucHV0O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2lucHV0Q2xhc3N9PlxuICAgICAgey8qaW5zdGFudGlhdGVDb21wb25lbnQoYmVmb3JlQ29tcG9uZW50LCBwcm9wZXJ0aWVzKSovfVxuICAgICAgPEZvcm1JbnB1dCB7Li4ucHJvcGVydGllc30gLz5cbiAgICAgIHtoYXNFcnJvcnMgPyA8Rm9ybUNvbXBvbmVudHMuRmllbGRFcnJvcnMgZXJyb3JzPXtlcnJvcnN9IC8+IDogbnVsbH1cbiAgICAgIHtyZW5kZXJDbGVhcigpfVxuICAgICAge3Nob3dDaGFyc1JlbWFpbmluZyAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJmb3JtLWNvbnRyb2wtbGltaXRcIiwge1xuICAgICAgICAgICAgZGFuZ2VyOiBjaGFyc1JlbWFpbmluZyA8IDEwLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAge2NoYXJzUmVtYWluaW5nfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICB7LyppbnN0YW50aWF0ZUNvbXBvbmVudChhZnRlckNvbXBvbmVudCwgcHJvcGVydGllcykqL31cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUlucHV0UHJvcHMgZXh0ZW5kcyBGb3JtQ29tcG9uZW50SW5uZXJQcm9wcyB7XG4gIC8vIFRPRE86IG5vdGUgc3VyZSBhYm91dCB0aGlzLCB0aGVyZSBhbHNvIHNlZW1zIHRvIGJlIGxhYmVsIGFuZCBvdGhlciBwcm9wcyB0aGF0IGFyZSBub3QgSFRNTElucHV0IHByb3BzIHBlciBzZVxuICAvLyBJdCBtYXkgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIGlucHV0IGFzIHdlbGwsIG1heWJlIHRoZSB0eXBlIGlzIG1vcmUgYW4gdW5pb25cbiAgaW5wdXRQcm9wZXJ0aWVzOiBSZWFjdC5IVE1MUHJvcHM8SFRNTElucHV0RWxlbWVudD47XG4gIGl0ZW1Qcm9wZXJ0aWVzOiBhbnk7IC8vIFRPRE9cbn1cbiIsImltcG9ydCBwaWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuXG4vKipcbiAqIEV4dHJhY3QgaW5wdXQgcHJvcHMgZm9yIHRoZSBGb3JtQ29tcG9uZW50SW5uZXJcbiAqIEBwYXJhbSB7Kn0gcHJvcHMgQWxsIGNvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgSW5pdGlhbCBwcm9wcyArIHByb3BzIHNwZWNpZmljIHRvIHRoZSBIVE1MIGlucHV0IGluIGFuIGlucHV0UHJvcGVydGllcyBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEh0bWxJbnB1dFByb3BzID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgbmFtZSwgcGF0aCwgb3B0aW9ucywgbGFiZWwsIG9uQ2hhbmdlLCBvbkJsdXIsIHZhbHVlLCBkaXNhYmxlZCB9ID1cbiAgICBwcm9wcztcblxuICAvLyB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB3aGl0ZWxpc3RlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgdG8gdGhlIGFjdHVhbCBmb3JtIGlucHV0XG4gIC8vIGFuZCBhdm9pZCBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC93YXJuaW5ncy91bmtub3duLXByb3AuaHRtbCB3YXJuaW5nc1xuICBjb25zdCBpbnB1dFByb3BlcnRpZXMgPSB7XG4gICAgLi4ucHJvcHMuaW5wdXRQcm9wZXJ0aWVzLFxuICAgIG5hbWUsXG4gICAgcGF0aCxcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uQmx1cixcbiAgICB2YWx1ZSxcbiAgICBkaXNhYmxlZCxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnByb3BzLFxuICAgIGlucHV0UHJvcGVydGllcyxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCBpbnB1dCBwcm9wcyBmb3IgdGhlIEZvcm1Db21wb25lbnRJbm5lclxuICogQHBhcmFtIHsqfSBwcm9wcyBBbGwgY29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBJbml0aWFsIHByb3BzICsgcHJvcHMgc3BlY2lmaWMgdG8gdGhlIEhUTUwgaW5wdXQgaW4gYW4gaW5wdXRQcm9wZXJ0aWVzIG9iamVjdFxuICovXG5leHBvcnQgY29uc3Qgd2hpdGVsaXN0SW5wdXRQcm9wcyA9IChcbiAgcHJvcHM6IGFueVxuKTogUmVhY3QuSFRNTFByb3BzPEhUTUxJbnB1dEVsZW1lbnQ+ID0+IHtcbiAgY29uc3Qgd2hpdGVsaXN0ID0gW1xuICAgIFwibmFtZVwiLFxuICAgIFwicGF0aFwiLFxuICAgIFwib3B0aW9uc1wiLFxuICAgIFwibGFiZWxcIixcbiAgICBcIm9uQ2hhbmdlXCIsXG4gICAgXCJvbkJsdXJcIixcbiAgICBcInZhbHVlXCIsXG4gICAgXCJkaXNhYmxlZFwiLFxuICAgIFwicGxhY2Vob2xkZXJcIixcbiAgXTtcbiAgcmV0dXJuIHBpY2socHJvcHMsIHdoaXRlbGlzdCk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTsiLCIvKipcbiAqIENoYW5nZXMgZnJvbSBWdWxjYW4gTWV0ZW9yOlxuICogLSBxdWVyeSBpcyBub3QgZXhwYW5kZWQ6IHlvdSBuZWVkIHRvIHBhc3MgdGhlIGZ1bGwgcXVlcnkgd2l0aCBmcmFnbWVudHMgYWxyZWFkeVxuICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG4vL8KgQHNlZSBwYWNrYWdlcy92dWxjYW4tbGliL2xpYi9tb2R1bGVzL2ZyYWdtZW50cy5qcyBpbiBWdWxjYW5cbi8vIHNob3VsZCB3ZSByZWVuYWJsZSB0aGlzP1xuLy8gaW1wb3J0IHsgZXhwYW5kUXVlcnlGcmFnbWVudHMgfSBmcm9tIFwibWV0ZW9yL3Z1bGNhbjpjb3JlXCI7XG5pbXBvcnQgeyB1c2VMYXp5UXVlcnksIGdxbCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db21wb25lbnRMb2FkZXJQcm9wcyB7XG4gIHF1ZXJ5OiBzdHJpbmcgfCAoKHsgdmFsdWU6IGFueSB9KSA9PiBzdHJpbmcpO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBvcHRpb25zOiBhbnk7XG4gIHZhbHVlOiBhbnk7XG4gIC8qKiBSdW4gdGhlIHF1ZXJ5IG9ubHkgd2hlbiB2YWx1ZSBpcyBub3QgZW1wdHkgKi9cbiAgcXVlcnlXYWl0c0ZvclZhbHVlPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TG9hZGVyID0gKHByb3BzOiBGb3JtQ29tcG9uZW50TG9hZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBxdWVyeSwgY2hpbGRyZW4sIG9wdGlvbnMsIHZhbHVlLCBxdWVyeVdhaXRzRm9yVmFsdWUgfSA9IHByb3BzO1xuXG4gIC8vIGlmIHF1ZXJ5IGlzIGEgZnVuY3Rpb24sIGV4ZWN1dGUgaXRcbiAgY29uc3QgcXVlcnlUZXh0ID0gdHlwZW9mIHF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBxdWVyeSh7IHZhbHVlIH0pIDogcXVlcnk7XG5cbiAgY29uc3QgW2xvYWRGaWVsZFF1ZXJ5LCB7IGxvYWRpbmcsIGVycm9yLCBkYXRhIH1dID0gdXNlTGF6eVF1ZXJ5KFxuICAgIGdxbChxdWVyeVRleHQpXG4gICAgLy8gZ3FsKGV4cGFuZFF1ZXJ5RnJhZ21lbnRzKHF1ZXJ5VGV4dCkpXG4gICk7XG5cbiAgY29uc3QgdmFsdWVJc0VtcHR5ID1cbiAgICBpc0VtcHR5KHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA9PT0gMDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChxdWVyeVdhaXRzRm9yVmFsdWUgJiYgdmFsdWVJc0VtcHR5KSB7XG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHJ1biB0aGlzIHF1ZXJ5IHVudGlsIHdlIGhhdmUgYSB2YWx1ZSB0byBwYXNzIHRvIGl0XG4gICAgICAvLyBzbyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRGaWVsZFF1ZXJ5KHtcbiAgICAgICAgdmFyaWFibGVzOiB7IHZhbHVlIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFt2YWx1ZUlzRW1wdHksIHZhbHVlLCBxdWVyeVdhaXRzRm9yVmFsdWVdKTtcblxuICBpZiAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWxvYWRlclwiPlxuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Mb2FkaW5nIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgLy8gcGFzcyBuZXdseSBsb2FkZWQgZGF0YSAoYW5kIG9wdGlvbnMgaWYgbmVlZGVkKSB0byBjaGlsZCBjb21wb25lbnRcbiAgY29uc3QgZXh0cmFQcm9wczoge1xuICAgIGRhdGE6IGFueTtcbiAgICBxdWVyeURhdGE6IGFueTtcbiAgICBxdWVyeUVycm9yOiBhbnk7XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICBvcHRpb25zRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgICBvcHRpb25zPzogQXJyYXk8YW55PjtcbiAgfSA9IHsgZGF0YSwgcXVlcnlEYXRhOiBkYXRhLCBxdWVyeUVycm9yOiBlcnJvciwgbG9hZGluZyB9O1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV4dHJhUHJvcHMub3B0aW9uc0Z1bmN0aW9uID0gb3B0aW9ucztcbiAgICBleHRyYVByb3BzLm9wdGlvbnMgPSBvcHRpb25zLmNhbGwoe30sIHsgLi4ucHJvcHMsIGRhdGEgfSk7XG4gIH1cbiAgaWYgKCFSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkNoaWxkcmVuIG9mIEZvcm1Db21wb25lbnRMb2FkZXIgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGdvdCBcIiArIGNoaWxkcmVuXG4gICAgKTtcbiAgfVxuICBjb25zdCBmY2kgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIGV4dHJhUHJvcHMpO1xuXG4gIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWxvYWRlclwiPntmY2l9PC9kaXY+O1xufTtcblxuRm9ybUNvbXBvbmVudExvYWRlci5wcm9wVHlwZXMgPSB7fTtcbiIsImltcG9ydCBSZWFjdCwgeyBIVE1MQXR0cmlidXRlcywgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IHR5cGUgRm9ybUVsZW1lbnRQcm9wcyA9IEhUTUxBdHRyaWJ1dGVzPEhUTUxGb3JtRWxlbWVudD47XG4vKipcbiAqIFRoZSBhY3R1YWwgd3JhcHBlciBvZiB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3QgRm9ybUVsZW1lbnQgPSBSZWFjdC5mb3J3YXJkUmVmPEhUTUxGb3JtRWxlbWVudD4oXG4gICh7IGNoaWxkcmVuLCAuLi5vdGhlclByb3BzIH06IFByb3BzV2l0aENoaWxkcmVuPEZvcm1FbGVtZW50UHJvcHM+LCByZWYpID0+IHtcbiAgICBjb25zdCB7IHN1Ym1pdEZvcm0gfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmb3JtIHsuLi5vdGhlclByb3BzfSBvblN1Ym1pdD17c3VibWl0Rm9ybX0gcmVmPXtyZWZ9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L2Zvcm0+XG4gICAgKTtcbiAgfVxuKTtcbiIsImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IF9zb21lIGZyb20gXCJsb2Rhc2gvc29tZVwiO1xuaW1wb3J0IHsgVXNlciwgaXNBZG1pbiB9IGZyb20gXCJAdnVsY2FuanMvcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IEZpZWxkR3JvdXAgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgRm9ybUZpZWxkIH0gZnJvbSBcIi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBQcm9wcyB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZ3JvdXA6IEZpZWxkR3JvdXAgLyp7XG4gICAgYWRtaW5zT25seT86IGJvb2xlYW47XG4gICAgYmVmb3JlQ29tcG9uZW50PzogYW55O1xuICB9OyovO1xuICBmaWVsZHM6IEFycmF5PEZvcm1GaWVsZD47XG4gIGhpZGRlbj86IGJvb2xlYW4gfCBGdW5jdGlvbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBkb2N1bWVudDogYW55O1xuICBjdXJyZW50VXNlcj86IFVzZXI7XG4gIGl0ZW1Qcm9wZXJ0aWVzOiBhbnk7XG4gIGZvcm1UeXBlOiBhbnk7XG4gIHByZWZpbGxlZFByb3BzOiBhbnk7XG59XG5cbi8qKlxuICogVE9ETzogdGFrZSB1bnVzZWQgcHJvcHMgaW50byBhY2NvdW50XG4gKiBAcGFyYW0gcGFyYW0wXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwTGF5b3V0ID0gKHtcbiAgYW5jaG9yTmFtZSxcbiAgY29sbGFwc2VkLFxuICBoYXNFcnJvcnMsXG4gIGdyb3VwLFxuICBkb2N1bWVudCxcbiAgdG9nZ2xlLFxuICAuLi5wcm9wc1xufSkgPT4ge1xuICByZXR1cm4gPGZpZWxkc2V0IHsuLi5wcm9wc30gLz47XG59O1xuXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwSGVhZGVyID0gKHByb3BzKSA9PiA8aDIgey4uLnByb3BzfSAvPjtcblxuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cCAvKjxGb3JtR3JvdXBQcm9wcywgRm9ybUdyb3VwU3RhdGU+Ki8gPSAoXG4gIHByb3BzOiBGb3JtR3JvdXBQcm9wc1xuKSA9PiB7XG4gIC8vIFRPRE86IGdldCB2YWx1ZS91cGRhdGUgbWV0aG9kcyBmcm9tIGNvbnRleHQgaW5zdGVhZFxuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBncm91cCxcbiAgICBmaWVsZHMsXG4gICAgaGlkZGVuLFxuICAgIGRvY3VtZW50LFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIGRpc2FibGVkLFxuICAgIGl0ZW1Qcm9wZXJ0aWVzLFxuICAgIHByZWZpbGxlZFByb3BzLFxuICAgIGZvcm1UeXBlLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgZXJyb3JzLCBjbGVhckZpZWxkRXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICBjb25zdCBbY29sbGFwc2VkLCBzZXRDb2xsYXBzZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oXG4gICAgZ3JvdXAuc3RhcnRDb2xsYXBzZWQgfHwgZmFsc2VcbiAgKTtcbiAgY29uc3QgdG9nZ2xlID0gKCkgPT4gc2V0Q29sbGFwc2VkKChjb2xsYXBzZWQpID0+ICFjb2xsYXBzZWQpO1xuICAvLyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZ3JvdXAgaGFzIGFuIGVycm9yLCB0aGUgZ3JvdXAgYXMgYSB3aG9sZSBoYXMgYW4gZXJyb3JcbiAgY29uc3QgaGFzRXJyb3JzID0gX3NvbWUoZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICByZXR1cm4gISFlcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGF0aCA9PT0gZmllbGQucGF0aCkubGVuZ3RoO1xuICB9KTtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBjb25zdCBpc0hpZGRlbiA9XG4gICAgdHlwZW9mIGhpZGRlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGhpZGRlbih7IC4uLnByb3BzLCBkb2N1bWVudCB9KVxuICAgICAgOiBoaWRkZW4gfHwgZmFsc2U7XG4gIC8qXG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBvcmRlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBoaWRkZW46IFByb3BUeXBlcy5mdW5jLFxuICAgIGZpZWxkczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgZ3JvdXA6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBlcnJvcnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICAgIHRocm93RXJyb3I6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgY3VycmVudFZhbHVlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZGVsZXRlZFZhbHVlczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgYWRkVG9EZWxldGVkVmFsdWVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNsZWFyRmllbGRFcnJvcnM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZm9ybVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBjdXJyZW50VXNlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBwcmVmaWxsZWRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgfTsqL1xuXG4gIGNvbnN0IGhlYWRpbmcgPSAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUdyb3VwSGVhZGVyXG4gICAgICB0b2dnbGU9e3RvZ2dsZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGNvbGxhcHNlZD17Y29sbGFwc2VkfVxuICAgICAgaGlkZGVuPXtpc0hpZGRlbn1cbiAgICAgIGdyb3VwPXtncm91cH1cbiAgICAvPlxuICApO1xuXG4gIGlmIChncm91cC5hZG1pbnNPbmx5ICYmICFpc0FkbWluKGN1cnJlbnRVc2VyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGFuY2hvck5hbWUgPSBuYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxID8gbmFtZS5zcGxpdChcIi5cIilbMV0gOiBuYW1lO1xuXG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUdyb3VwTGF5b3V0XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBhbmNob3JOYW1lPXthbmNob3JOYW1lfVxuICAgICAgdG9nZ2xlPXt0b2dnbGV9XG4gICAgICBjb2xsYXBzZWQ9e2NvbGxhcHNlZH1cbiAgICAgIGhpZGRlbj17aXNIaWRkZW59XG4gICAgICBncm91cD17Z3JvdXB9XG4gICAgICBoZWFkaW5nPXtuYW1lID09PSBcImRlZmF1bHRcIiA/IG51bGwgOiBoZWFkaW5nfVxuICAgICAgaGFzRXJyb3JzPXtoYXNFcnJvcnN9XG4gICAgICBkb2N1bWVudD17ZG9jdW1lbnR9XG4gICAgPlxuICAgICAgey8qIFRPRE86IGNyZWF0ZSBUUyBlcnJvciBhdCB0aGUgbW9tZW50OiBncm91cC5iZWZvcmVDb21wb25lbnQgJiYgPGdyb3VwLmJlZm9yZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+Ki99XG4gICAgICB7LyoqIFRPRE86IHdlIHBhc3MgYWxsIHRoZSBmdW5jdGlvbnMgYXMgcHJvcHMgdG8gdGhlIEZvcm1Db21wb25lbnQsXG4gICAgICAgKiBidXQgaXQgc2hvdWxkIHJlbHkgb24gdGhlIGNvbnRleHQgaW5zdGVhZCBmb3IgbWV0aG9kc1xuICAgICAgICovfVxuXG4gICAgICB7ZmllbGRzLm1hcCgoZmllbGQpID0+IChcbiAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFxuICAgICAgICAgIGtleT17ZmllbGQubmFtZX1cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgIGRvY3VtZW50PXtkb2N1bWVudH1cbiAgICAgICAgICBpdGVtUHJvcGVydGllcz17e1xuICAgICAgICAgICAgLi4uaXRlbVByb3BlcnRpZXMsXG4gICAgICAgICAgICAuLi5maWVsZC5pdGVtUHJvcGVydGllcyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsZWFyRmllbGRFcnJvcnM9e2NsZWFyRmllbGRFcnJvcnN9XG4gICAgICAgICAgZm9ybVR5cGU9e2Zvcm1UeXBlfVxuICAgICAgICAgIGN1cnJlbnRVc2VyPXtjdXJyZW50VXNlcn1cbiAgICAgICAgICBwcmVmaWxsZWRQcm9wcz17cHJlZmlsbGVkUHJvcHN9XG4gICAgICAgIC8+XG4gICAgICApKX1cblxuICAgICAgey8qIFRPRE86IGNyZWF0ZSBUUyBlcnJvciBhdCB0aGUgbW9tZW50OiBncm91cC5hZnRlckNvbXBvbmVudCAmJiA8Z3JvdXAuYWZ0ZXJDb21wb25lbnQgey4uLnByb3BzfSAvPiovfVxuICAgIDwvVnVsY2FuQ29tcG9uZW50cy5Gb3JtR3JvdXBMYXlvdXQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtR3JvdXA7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc29tZVwiKTsiLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmNvbnN0IExvY2FsZXM6IEFycmF5PHsgaWQ6IHN0cmluZyB9PiA9IFtdOyAvLyA/PyBtaWdodCBuZWVkIHRvIGdldCB0aGlzIGZyb20gY29udGV4dFxuZXhwb3J0IGNvbnN0IEZvcm1JbnRsTGF5b3V0ID0gKHsgY2hpbGRyZW4gfSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0taW50bFwiPntjaGlsZHJlbn08L2Rpdj5cbik7XG5leHBvcnQgY29uc3QgRm9ybUludGxJdGVtTGF5b3V0ID0gKHsgbG9jYWxlLCBjaGlsZHJlbiB9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPXtgZm9ybS1pbnRsLSR7bG9jYWxlLmlkfWB9PntjaGlsZHJlbn08L2Rpdj5cbik7XG5cbmludGVyZmFjZSBGb3JtSW50bFByb3BzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtSW50bCA9IChwcm9wczogRm9ybUludGxQcm9wcykgPT4ge1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBnZXRMYWJlbCB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgLypcbiAgTm90ZTogaWRlYWxseSB3ZSdkIHRyeSB0byBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZSByaWdodCBwYXRoIG5vIG1hdHRlclxuICB0aGUgb3JkZXIgdHJhbnNsYXRpb25zIGFyZSBzdG9yZWQgaW4sIGJ1dCBpbiBwcmFjdGljZSB3ZSBjYW4ndCBndWFyYW50ZWUgaXRcbiAgc28gd2UganVzdCB1c2UgdGhlIG9yZGVyIG9mIHRoZSBMb2NhbGVzIGFycmF5LlxuXG4gICovXG4gIGNvbnN0IGdldExvY2FsZVBhdGggPSAoZGVmYXVsdEluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGAke3Byb3BzLnBhdGh9X2ludGwuJHtkZWZhdWx0SW5kZXh9YDtcbiAgfTtcblxuICBjb25zdCB7IG5hbWUgfSA9IHByb3BzO1xuXG4gIC8vIGRvIG5vdCBwYXNzIEZvcm1JbnRsJ3Mgb3duIHZhbHVlLCBpbnB1dFByb3BlcnRpZXMsIGFuZCBpbnRsSW5wdXQgcHJvcHMgZG93blxuICBjb25zdCBwcm9wZXJ0aWVzID0gb21pdChcbiAgICBwcm9wcyxcbiAgICBcInZhbHVlXCIsXG4gICAgXCJpbnB1dFByb3BlcnRpZXNcIixcbiAgICBcImludGxJbnB1dFwiLFxuICAgIFwibmVzdGVkSW5wdXRcIlxuICApO1xuICByZXR1cm4gKFxuICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtSW50bExheW91dD5cbiAgICAgIHtMb2NhbGVzLm1hcCgobG9jYWxlLCBpKSA9PiAoXG4gICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtSW50bEl0ZW1MYXlvdXQga2V5PXtsb2NhbGUuaWR9IGxvY2FsZT17bG9jYWxlfT5cbiAgICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFxuICAgICAgICAgICAgey4uLnByb3BlcnRpZXN9XG4gICAgICAgICAgICBsYWJlbD17Z2V0TGFiZWwobmFtZSwgbG9jYWxlLmlkKX1cbiAgICAgICAgICAgIHBhdGg9e2dldExvY2FsZVBhdGgoaSl9XG4gICAgICAgICAgICBsb2NhbGU9e2xvY2FsZS5pZH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Zvcm1Db21wb25lbnRzLkZvcm1JbnRsSXRlbUxheW91dD5cbiAgICAgICkpfVxuICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUludGxMYXlvdXQ+XG4gICk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuLyoqXG4gKiBEaXNwbGF5IGVycm9ycyBmb3IgdGhlIGN1cnJlbnQgZm9ybSwgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcm1FcnJvcnMgPSAoKSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgZXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWVycm9yc1wiPlxuICAgICAgeyEhZXJyb3JzLmxlbmd0aCAmJiAoXG4gICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkFsZXJ0IGNsYXNzTmFtZT1cImZsYXNoLW1lc3NhZ2VcIiB2YXJpYW50PVwiZGFuZ2VyXCI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAge2Vycm9ycy5tYXAoKGVycm9yLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVycm9yIGVycm9yPXtlcnJvcn0gZXJyb3JDb250ZXh0PVwiZm9ybVwiIC8+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQWxlcnQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuLy8gLypcblxuLy8gICBSZW5kZXIgZXJyb3JzXG5cbi8vICAgKi9cbi8vICByZW5kZXJFcnJvcnMgPSAoKSA9PiB7XG4vLyAgIHJldHVybiAoXG4vLyAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWVycm9yc1wiPlxuLy8gICAgICAge3RoaXMuc3RhdGUuZXJyb3JzLm1hcCgoZXJyb3IsIGluZGV4KSA9PiB7XG4vLyAgICAgICAgIGxldCBtZXNzYWdlO1xuXG4vLyAgICAgICAgIGlmIChlcnJvci5kYXRhICYmIGVycm9yLmRhdGEuZXJyb3JzKSB7XG4vLyAgICAgICAgICAgLy8gdGhpcyBlcnJvciBpcyBhIFwibXVsdGktZXJyb3JcIiB3aXRoIG11bHRpcGxlIHN1Yi1lcnJvcnNcblxuLy8gICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5kYXRhLmVycm9ycy5tYXAoZXJyb3IgPT4ge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHtcbi8vICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLFxuLy8gICAgICAgICAgICAgICBkYXRhOiBlcnJvci5kYXRhLFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAvLyB0aGlzIGlzIGEgcmVndWxhciBlcnJvclxuXG4vLyAgICAgICAgICAgbWVzc2FnZSA9IHtcbi8vICAgICAgICAgICAgIGNvbnRlbnQ6XG4vLyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgfHxcbi8vICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmludGwuZm9ybWF0TWVzc2FnZSh7IGlkOiBlcnJvci5pZCwgZGVmYXVsdE1lc3NhZ2U6IGVycm9yLmlkIH0sIGVycm9yLmRhdGEpLFxuLy8gICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICByZXR1cm4gPENvbXBvbmVudHMuRm9ybUZsYXNoIGtleT17aW5kZXh9IG1lc3NhZ2U9e21lc3NhZ2V9IHR5cGU9XCJlcnJvclwiIC8+O1xuLy8gICAgICAgfSl9XG4vLyAgICAgPC9kaXY+XG4vLyAgICk7XG4vLyB9O1xuIiwiLyoqXG4gKiBDaGFuZ2UgY29tcGFyZWQgdG8gVnVsY2FuOlxuICogLSB1c2luZyBhIG1vZGVsIGluc3RlYWQgb2YgYSBjb2xsZWN0aW9uTmFtZVxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBjYW5EZWxldGVEb2N1bWVudCB9IGZyb20gXCJAdnVsY2FuanMvcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVN1Ym1pdFByb3BzIHtcbiAgc3VibWl0TGFiZWw6IGFueTtcbiAgY2FuY2VsTGFiZWw6IGFueTtcbiAgY2FuY2VsQ2FsbGJhY2s6IGFueTtcbiAgcmV2ZXJ0TGFiZWw6IGFueTtcbiAgcmV2ZXJ0Q2FsbGJhY2s6IGFueTtcbiAgZG9jdW1lbnQ6IGFueTtcbiAgZGVsZXRlRG9jdW1lbnQ6IGFueTtcbiAgbW9kZWw6IGFueTtcbiAgLy8gY2xhc3NlczogYW55LFxuICBjdXJyZW50VXNlcjogYW55O1xufVxuZXhwb3J0IGNvbnN0IEZvcm1TdWJtaXQgPSAoe1xuICBzdWJtaXRMYWJlbCxcbiAgY2FuY2VsTGFiZWwsXG4gIGNhbmNlbENhbGxiYWNrLFxuICByZXZlcnRMYWJlbCxcbiAgcmV2ZXJ0Q2FsbGJhY2ssXG4gIGRvY3VtZW50LFxuICBkZWxldGVEb2N1bWVudCxcbiAgbW9kZWwsXG4gIC8vIGNsYXNzZXMsXG4gIGN1cnJlbnRVc2VyLFxufSkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IGNsZWFyRm9ybSB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tc3VibWl0XCI+XG4gICAgICA8VnVsY2FuQ29tcG9uZW50cy5CdXR0b24gdHlwZT1cInN1Ym1pdFwiIHZhcmlhbnQ9XCJwcmltYXJ5XCI+XG4gICAgICAgIHtzdWJtaXRMYWJlbCA/IChcbiAgICAgICAgICBzdWJtaXRMYWJlbFxuICAgICAgICApIDogKFxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgIGlkPVwiZm9ybXMuc3VibWl0XCJcbiAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPVwiU3VibWl0XCJcbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9WdWxjYW5Db21wb25lbnRzLkJ1dHRvbj5cblxuICAgICAge2NhbmNlbENhbGxiYWNrID8gKFxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY2FuY2VsXCJcbiAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY2FuY2VsQ2FsbGJhY2soZG9jdW1lbnQpO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7Y2FuY2VsTGFiZWwgPyAoXG4gICAgICAgICAgICBjYW5jZWxMYWJlbFxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgIGlkPVwiZm9ybXMuY2FuY2VsXCJcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9XCJDYW5jZWxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2E+XG4gICAgICApIDogbnVsbH1cblxuICAgICAge3JldmVydENhbGxiYWNrID8gKFxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY2FuY2VsXCJcbiAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY2xlYXJGb3JtKCk7XG4gICAgICAgICAgICByZXZlcnRDYWxsYmFjayhkb2N1bWVudCk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtyZXZlcnRMYWJlbCA/IChcbiAgICAgICAgICAgIHJldmVydExhYmVsXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9XCJmb3Jtcy5yZXZlcnRcIlxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT1cIlJldmVydFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvYT5cbiAgICAgICkgOiBudWxsfVxuXG4gICAgICB7ZGVsZXRlRG9jdW1lbnQgJiZcbiAgICAgIGNhbkRlbGV0ZURvY3VtZW50KHtcbiAgICAgICAgdXNlcjogY3VycmVudFVzZXIsXG4gICAgICAgIGRvY3VtZW50LFxuICAgICAgICBtb2RlbCxcbiAgICAgIH0pID8gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxociAvPlxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImxpbmtcIlxuICAgICAgICAgICAgb25DbGljaz17ZGVsZXRlRG9jdW1lbnR9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2BkZWxldGUtbGluayAke21vZGVsLm5hbWV9LWRlbGV0ZS1saW5rYH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5JY29uIG5hbWU9XCJjbG9zZVwiIC8+e1wiIFwifVxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD1cImZvcm1zLmRlbGV0ZVwiXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPVwiRGVsZXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9WdWxjYW5Db21wb25lbnRzLkJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbkZvcm1TdWJtaXQucHJvcFR5cGVzID0ge1xuICBzdWJtaXRMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGNhbmNlbExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgY2FuY2VsQ2FsbGJhY2s6IFByb3BUeXBlcy5mdW5jLFxuICByZXZlcnRMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIHJldmVydENhbGxiYWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgZG9jdW1lbnQ6IFByb3BUeXBlcy5vYmplY3QsXG4gIGRlbGV0ZURvY3VtZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgY29sbGVjdGlvbk5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTGF5b3V0UHJvcHMge1xuICBjb21tb25Qcm9wczogYW55O1xuICBmb3JtUHJvcHM6IGFueTtcbiAgc3VibWl0UHJvcHM6IGFueTtcbiAgcmVwZWF0RXJyb3JzPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBjb25zdCBGb3JtTGF5b3V0OiBSZWFjdC5GQzxGb3JtTGF5b3V0UHJvcHM+ID0gKHtcbiAgY29tbW9uUHJvcHMsXG4gIGZvcm1Qcm9wcyxcbiAgcmVwZWF0RXJyb3JzLFxuICBzdWJtaXRQcm9wcyxcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVsZW1lbnQgey4uLmZvcm1Qcm9wc30+XG4gICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRXJyb3JzIHsuLi5jb21tb25Qcm9wc30gLz5cblxuICAgICAge2NoaWxkcmVufVxuXG4gICAgICB7cmVwZWF0RXJyb3JzICYmIDxWdWxjYW5Db21wb25lbnRzLkZvcm1FcnJvcnMgey4uLmNvbW1vblByb3BzfSAvPn1cblxuICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybVN1Ym1pdCB7Li4uY29tbW9uUHJvcHN9IHsuLi5zdWJtaXRQcm9wc30gLz5cbiAgICA8L1Z1bGNhbkNvbXBvbmVudHMuRm9ybUVsZW1lbnQ+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybUNvbXBvbmVudHNEZXBlbmRlbmNpZXMgPSBbXG4gIFwiRm9ybUVycm9yc1wiLFxuICBcIkZvcm1TdWJtaXRcIixcbiAgXCJGb3JtRWxlbWVudFwiLFxuXTtcbiIsIi8qKlxuICogQ2hhbmdlIGNvbXBhcmVkIHRvIFZ1bGNhbiBNZXRlb3I6XG4gKiBhZnRlci9iZWZvcmUgPT4gQWZ0ZXIsIEJlZm9yZSB3aXRoIHRpdGxlY2FzZVxuICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgX29taXQgZnJvbSBcImxvZGFzaC9vbWl0XCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuLy8gV3JhcHMgdGhlIEZvcm1OZXN0ZWRJdGVtLCByZXBlYXRlZCBmb3IgZWFjaCBvYmplY3Rcbi8vIEFsbG93IGZvciBleGFtcGxlIHRvIGhhdmUgYSBsYWJlbCBwZXIgb2JqZWN0XG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBsYWJlbCwgY2hpbGRyZW4sIGFkZEl0ZW0sIEJlZm9yZUNvbXBvbmVudCwgQWZ0ZXJDb21wb25lbnQgfSA9IHByb3BzO1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWFycmF5LWlubmVyLWxheW91dFwiPlxuICAgICAgPEJlZm9yZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZERpdmlkZXIgbGFiZWw9e2xhYmVsfSBhZGRJdGVtPXthZGRJdGVtfSAvPlxuICAgICAgPEFmdGVyQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU5lc3RlZEFycmF5UHJvcHM8VFZhbHVlID0gYW55PiB7XG4gIHZhbHVlOiBUVmFsdWU7XG4gIC8qKiBQYXRoIGZvciB0aGUgbmVzdGVkIG9iamVjdCAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIGl0ZW1Qcm9wZXJ0aWVzOiBhbnk7XG4gIG1pbkNvdW50PzogbnVtYmVyO1xuICBtYXhDb3VudD86IG51bWJlcjtcbiAgYXJyYXlGaWVsZD86IGJvb2xlYW47XG4gIG5lc3RlZEFycmF5RXJyb3JzOiBhbnk7XG4gIGhhc0Vycm9ycz86IGJvb2xlYW47XG4gIC8vIFRPRE86IGdldCBmcm9tIGNvbnRleHRcbiAgcHJlZmlsbGVkUHJvcHM/OiBhbnk7XG4gIGFkZEl0ZW06IEZ1bmN0aW9uIHwgbnVsbDtcbn1cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkQXJyYXkgPSAocHJvcHM6IEZvcm1OZXN0ZWRBcnJheVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdXBkYXRlQ3VycmVudFZhbHVlcywgZGVsZXRlZFZhbHVlcywgZXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvKnN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgaXRlbVByb3BlcnRpZXM6IHt9LFxuICB9OyovXG4gIGNvbnN0IHZhbHVlID0gcHJvcHMudmFsdWUgfHwgW107XG5cbiAgY29uc3QgYWRkSXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCB7IHByZWZpbGxlZFByb3BzLCBwYXRoIH0gPSBwcm9wcztcbiAgICB1cGRhdGVDdXJyZW50VmFsdWVzKFxuICAgICAgeyBbYCR7cGF0aH0uJHt2YWx1ZS5sZW5ndGh9YF06IF9nZXQocHJlZmlsbGVkUHJvcHMsIGAke3BhdGh9LiRgKSB8fCB7fSB9LFxuICAgICAgeyBtb2RlOiBcIm1lcmdlXCIgfVxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlSXRlbSA9IChpbmRleCkgPT4ge1xuICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXMoeyBbYCR7cHJvcHMucGF0aH0uJHtpbmRleH1gXTogbnVsbCB9KTtcbiAgfTtcblxuICAvKlxuXG4gIEdvIHRocm91Z2ggdGhpcy5jb250ZXh0LmRlbGV0ZWRWYWx1ZXMgYW5kIHNlZSBpZiBhbnkgdmFsdWUgbWF0Y2hlcyBib3RoIHRoZSBjdXJyZW50IGZpZWxkXG4gIGFuZCB0aGUgZ2l2ZW4gaW5kZXggKGV4OiBpZiB3ZSB3YW50IHRvIGtub3cgaWYgdGhlIHNlY29uZCBhZGRyZXNzIGlzIGRlbGV0ZWQsIHdlXG4gIGxvb2sgZm9yIHRoZSBwcmVzZW5jZSBvZiAnYWRkcmVzc2VzLjEnKVxuICAqL1xuICBjb25zdCBpc0RlbGV0ZWQgPSAoaW5kZXgpID0+IHtcbiAgICByZXR1cm4gZGVsZXRlZFZhbHVlcy5pbmNsdWRlcyhgJHtwcm9wcy5wYXRofS4ke2luZGV4fWApO1xuICB9O1xuXG4gIGNvbnN0IGNvbXB1dGVWaXNpYmxlSW5kZXggPSAodmFsdWVzKSA9PiB7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgY29uc3QgdmlzaWJsZUluZGV4ZXMgPSB2YWx1ZXMubWFwKChzdWJEb2N1bWVudCwgc3ViRG9jdW1lbnRJbmR4KSA9PiB7XG4gICAgICBpZiAoaXNEZWxldGVkKHN1YkRvY3VtZW50SW5keCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2aXNpYmxlSW5kZXhlcztcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwcm9wcy5pdGVtUHJvcGVydGllcy5vcGVuTmVzdGVkKSBhZGRJdGVtKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCB2aXNpYmxlSXRlbUluZGV4ZXMgPSBjb21wdXRlVmlzaWJsZUluZGV4KHZhbHVlKTtcbiAgLy8gZG8gbm90IHBhc3MgRm9ybU5lc3RlZCdzIG93biB2YWx1ZSwgaW5wdXQgYW5kIGlucHV0UHJvcGVydGllcyBwcm9wcyBkb3duXG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgLi4uX29taXQoXG4gICAgICBwcm9wcyxcbiAgICAgIFwidmFsdWVcIixcbiAgICAgIFwiaW5wdXRcIixcbiAgICAgIFwiaW5wdXRQcm9wZXJ0aWVzXCIsXG4gICAgICBcIm5lc3RlZElucHV0XCIsXG4gICAgICBcImJlZm9yZUNvbXBvbmVudFwiLFxuICAgICAgXCJhZnRlckNvbXBvbmVudFwiXG4gICAgKSxcbiAgfTtcbiAgY29uc3QgeyBwYXRoLCBtaW5Db3VudCwgbWF4Q291bnQsIGFycmF5RmllbGQgfSA9IHByb3BzO1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICAvL2ZpbHRlciBvdXQgbnVsbCB2YWx1ZXMgdG8gY2FsY3VsYXRlIGFycmF5IGxlbmd0aFxuICBsZXQgYXJyYXlMZW5ndGggPSB2YWx1ZS5maWx0ZXIoKHNpbmdsZVZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBzaW5nbGVWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzaW5nbGVWYWx1ZSAhPT0gbnVsbDtcbiAgfSkubGVuZ3RoO1xuICBwcm9wZXJ0aWVzLmFkZEl0ZW0gPSAhbWF4Q291bnQgfHwgYXJyYXlMZW5ndGggPCBtYXhDb3VudCA/IGFkZEl0ZW0gOiBudWxsO1xuXG4gIC8vIG9ubHkga2VlcCBlcnJvcnMgc3BlY2lmaWMgdG8gdGhlIG5lc3RlZCBhcnJheSAoYW5kIG5vdCBpdHMgc3ViZmllbGRzKVxuICBwcm9wZXJ0aWVzLm5lc3RlZEFycmF5RXJyb3JzID0gZXJyb3JzLmZpbHRlcihcbiAgICAoZXJyb3IpID0+IGVycm9yLnBhdGggJiYgZXJyb3IucGF0aCA9PT0gcGF0aFxuICApO1xuICBwcm9wZXJ0aWVzLmhhc0Vycm9ycyA9ICEhKFxuICAgIHByb3BlcnRpZXMubmVzdGVkQXJyYXlFcnJvcnMgJiYgcHJvcGVydGllcy5uZXN0ZWRBcnJheUVycm9ycy5sZW5ndGhcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlMYXlvdXQgey4uLnByb3BlcnRpZXN9PlxuICAgICAge3ZhbHVlLm1hcCgoc3ViRG9jdW1lbnQsIGkpID0+IHtcbiAgICAgICAgaWYgKGlzRGVsZXRlZChpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhdGggPSBgJHtwcm9wcy5wYXRofS4ke2l9YDtcbiAgICAgICAgY29uc3QgdmlzaWJsZUl0ZW1JbmRleCA9IHZpc2libGVJdGVtSW5kZXhlc1tpXTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXRcbiAgICAgICAgICAgIHsuLi5hcnJheUZpZWxkfVxuICAgICAgICAgICAga2V5PXtwYXRofVxuICAgICAgICAgICAgYWRkSXRlbT17YWRkSXRlbX1cbiAgICAgICAgICAgIGl0ZW1JbmRleD17aX1cbiAgICAgICAgICAgIHZpc2libGVJdGVtSW5kZXg9e3Zpc2libGVJdGVtSW5kZXh9XG4gICAgICAgICAgICBwYXRoPXtwYXRofVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkSXRlbVxuICAgICAgICAgICAgICB7Li4ucHJvcGVydGllc31cbiAgICAgICAgICAgICAgaXRlbUluZGV4PXtpfVxuICAgICAgICAgICAgICB2aXNpYmxlSXRlbUluZGV4PXt2aXNpYmxlSXRlbUluZGV4fVxuICAgICAgICAgICAgICBwYXRoPXtwYXRofVxuICAgICAgICAgICAgICByZW1vdmVJdGVtPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbShpKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgaGlkZVJlbW92ZT17ISFtaW5Db3VudCAmJiBhcnJheUxlbmd0aCA8PSBtaW5Db3VudH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dD5cbiAgICAgICAgKTtcbiAgICAgIH0pfVxuICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZEFycmF5TGF5b3V0PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzID0gW1xuICBcIkZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0XCIsXG4gIFwiRm9ybU5lc3RlZEFycmF5TGF5b3V0XCIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtTmVzdGVkQXJyYXk7XG5cbmV4cG9ydCBjb25zdCBJY29uQWRkID0gKHsgd2lkdGggPSAyNCwgaGVpZ2h0ID0gMjQgfSkgPT4gKFxuICA8c3ZnXG4gICAgd2lkdGg9e3dpZHRofVxuICAgIGhlaWdodD17aGVpZ2h0fVxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiXG4gID5cbiAgICA8cGF0aFxuICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICBkPVwiTTQ0OCAyOTQuMnYtNzYuNGMwLTEzLjMtMTAuNy0yNC0yNC0yNEgyODYuMlY1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNGgtNzYuNGMtMTMuMyAwLTI0IDEwLjctMjQgMjR2MTM3LjhIMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0djc2LjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMTM3LjhWNDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0aDc2LjRjMTMuMyAwIDI0LTEwLjcgMjQtMjRWMzE4LjJINDI0YzEzLjMgMCAyNC0xMC43IDI0LTI0elwiXG4gICAgLz5cbiAgPC9zdmc+XG4pO1xuXG5leHBvcnQgY29uc3QgSWNvblJlbW92ZSA9ICh7IHdpZHRoID0gMjQsIGhlaWdodCA9IDI0IH0pID0+IChcbiAgPHN2Z1xuICAgIHdpZHRoPXt3aWR0aH1cbiAgICBoZWlnaHQ9e2hlaWdodH1cbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIlxuICA+XG4gICAgPHBhdGhcbiAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgZD1cIk00MjQgMzE4LjJjMTMuMyAwIDI0LTEwLjcgMjQtMjR2LTc2LjRjMC0xMy4zLTEwLjctMjQtMjQtMjRIMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0djc2LjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRoNDAwelwiXG4gICAgLz5cbiAgPC9zdmc+XG4pO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuLy8gUmVwbGFjZWFibGUgbGF5b3V0LCBkZWZhdWx0IGltcGxlbWVudGF0aW9uXG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZEFycmF5TGF5b3V0ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBoYXNFcnJvcnMsXG4gICAgbmVzdGVkQXJyYXlFcnJvcnMsXG4gICAgbGFiZWwsXG4gICAgYWRkSXRlbSxcbiAgICBCZWZvcmVDb21wb25lbnQsXG4gICAgQWZ0ZXJDb21wb25lbnQsXG4gICAgY2hpbGRyZW4sXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17YGZvcm0tZ3JvdXAgcm93IGZvcm0tbmVzdGVkICR7aGFzRXJyb3JzID8gXCJpbnB1dC1lcnJvclwiIDogXCJcIn1gfVxuICAgID5cbiAgICAgIHtCZWZvcmVDb21wb25lbnQgJiYgPEJlZm9yZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+fVxuXG4gICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY29udHJvbC1sYWJlbCBjb2wtc20tM1wiPntsYWJlbH08L2xhYmVsPlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS05XCI+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAge2FkZEl0ZW0gJiYgKFxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtYnV0dG9uIGZvcm0tbmVzdGVkLWFkZFwiXG4gICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgdmFyaWFudD1cInN1Y2Nlc3NcIlxuICAgICAgICAgICAgb25DbGljaz17YWRkSXRlbX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5JY29uQWRkIGhlaWdodD17MTJ9IHdpZHRoPXsxMn0gLz5cbiAgICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaGFzRXJyb3JzID8gKFxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZpZWxkRXJyb3JzXG4gICAgICAgICAgICBrZXk9XCJmb3JtLW5lc3RlZC1lcnJvcnNcIlxuICAgICAgICAgICAgZXJyb3JzPXtuZXN0ZWRBcnJheUVycm9yc31cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7QWZ0ZXJDb21wb25lbnQgJiYgPEFmdGVyQ29tcG9uZW50IHsuLi5wcm9wc30gLz59XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5Gb3JtTmVzdGVkQXJyYXlMYXlvdXQucHJvcFR5cGVzID0ge1xuICBoYXNFcnJvcnM6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIG5lc3RlZEFycmF5RXJyb3JzOiBQcm9wVHlwZXMuYXJyYXksXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgaGlkZUxhYmVsOiBQcm9wVHlwZXMuYm9vbCxcbiAgYWRkSXRlbTogUHJvcFR5cGVzLmZ1bmMsXG4gIGJlZm9yZUNvbXBvbmVudDogUHJvcFR5cGVzLm5vZGUsXG4gIGFmdGVyQ29tcG9uZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgZm9ybUNvbXBvbmVudHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1OZXN0ZWRBcnJheUxheW91dDtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IGludGxTaGFwZSB9IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUludGxDb250ZXh0IH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkSXRlbUxheW91dCA9ICh7IGNvbnRlbnQsIHJlbW92ZUJ1dHRvbiB9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbVwiPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1pbm5lclwiPntjb250ZW50fTwvZGl2PlxuICAgIHtyZW1vdmVCdXR0b24gJiYgW1xuICAgICAgPGRpdiBrZXk9XCJyZW1vdmUtYnV0dG9uXCIgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1yZW1vdmVcIj5cbiAgICAgICAge3JlbW92ZUJ1dHRvbn1cbiAgICAgIDwvZGl2PixcbiAgICAgIDxkaXZcbiAgICAgICAga2V5PVwicmVtb3ZlLWJ1dHRvbi1vdmVybGF5XCJcbiAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1kZWxldGVkLW92ZXJsYXlcIlxuICAgICAgLz4sXG4gICAgXX1cbiAgPC9kaXY+XG4pO1xuRm9ybU5lc3RlZEl0ZW1MYXlvdXQucHJvcFR5cGVzID0ge1xuICBjb250ZW50OiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICByZW1vdmVCdXR0b246IFByb3BUeXBlcy5ub2RlLFxufTtcblxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRJdGVtID0gKHtcbiAgbmVzdGVkRmllbGRzLFxuICBuYW1lLFxuICBwYXRoLFxuICByZW1vdmVJdGVtLFxuICBpdGVtSW5kZXgsXG4gIGZvcm1Db21wb25lbnRzLFxuICBoaWRlUmVtb3ZlLFxuICBsYWJlbCxcbiAgLi4ucHJvcHNcbn0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgaW50bCA9IHVzZUludGxDb250ZXh0KCk7XG4gIGNvbnN0IGlzQXJyYXkgPSB0eXBlb2YgaXRlbUluZGV4ICE9PSBcInVuZGVmaW5lZFwiO1xuICByZXR1cm4gKFxuICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1OZXN0ZWRJdGVtTGF5b3V0XG4gICAgICBjb250ZW50PXtuZXN0ZWRGaWVsZHMubWFwKChmaWVsZCwgaSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1Db21wb25lbnRcbiAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgIHsuLi5maWVsZH1cbiAgICAgICAgICAgIHBhdGg9e2Ake3BhdGh9LiR7ZmllbGQubmFtZX1gfVxuICAgICAgICAgICAgaXRlbUluZGV4PXtpdGVtSW5kZXh9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgIH0pfVxuICAgICAgcmVtb3ZlQnV0dG9uPXtcbiAgICAgICAgaXNBcnJheSAmJlxuICAgICAgICAhaGlkZVJlbW92ZSAmJiBbXG4gICAgICAgICAgPGRpdiBrZXk9XCJyZW1vdmUtYnV0dG9uXCIgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1yZW1vdmVcIj5cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1idXR0b25cIlxuICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgaWNvbkJ1dHRvblxuICAgICAgICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtKG5hbWUpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgeyBpZDogXCJmb3Jtcy5kZWxldGVfbmVzdGVkX2ZpZWxkXCIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBsYWJlbCB9XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkljb25SZW1vdmUgaGVpZ2h0PXsxMn0gd2lkdGg9ezEyfSAvPlxuICAgICAgICAgICAgPC9WdWxjYW5Db21wb25lbnRzLkJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PVwicmVtb3ZlLWJ1dHRvbi1vdmVybGF5XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWl0ZW0tZGVsZXRlZC1vdmVybGF5XCJcbiAgICAgICAgICAvPixcbiAgICAgICAgXVxuICAgICAgfVxuICAgIC8+XG4gICk7XG59O1xuXG5Gb3JtTmVzdGVkSXRlbS5wcm9wVHlwZXMgPSB7XG4gIHBhdGg6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgaXRlbUluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgaGlkZVJlbW92ZTogUHJvcFR5cGVzLmJvb2wsXG59O1xuXG5Gb3JtTmVzdGVkSXRlbS5jb250ZXh0VHlwZXMgPSB7XG4gIGVycm9yczogUHJvcFR5cGVzLmFycmF5LFxuICBpbnRsOiBpbnRsU2hhcGUsXG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZERpdmlkZXIgPSAoeyBsYWJlbCwgYWRkSXRlbSB9KSA9PiA8ZGl2IC8+O1xuXG5Gb3JtTmVzdGVkRGl2aWRlci5wcm9wVHlwZXMgPSB7XG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGRJdGVtOiBQcm9wVHlwZXMuZnVuYyxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vLyBUcmFjayBkZXBlbmRlbmNpZXMsIG5vdCB1c2VkIHlldFxuZXhwb3J0IGNvbnN0IGZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzID0gW1wiRm9ybUVycm9yXCJdO1xuXG4vKipcbiAqIEVycm9ycyBmb3Igb25lIHNwZWNpZiBmaWVsZHNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBGaWVsZEVycm9ycyA9ICh7XG4gIGVycm9ycyxcbn06IHtcbiAgLyoqXG4gICAqIEVycm9ycyBmb3IgdGhpcyBzcGVjaWZpYyBmaWVsZCBvbmx5XG4gICAqL1xuICBlcnJvcnM6IEFycmF5PGFueT47XG59KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiAoXG4gICAgPHVsIGNsYXNzTmFtZT1cImZvcm0taW5wdXQtZXJyb3JzXCI+XG4gICAgICB7ZXJyb3JzLm1hcCgoZXJyb3IsIGluZGV4KSA9PiAoXG4gICAgICAgIDxsaSBrZXk9e2luZGV4fT5cbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRXJyb3IgZXJyb3I9e2Vycm9yfSBlcnJvckNvbnRleHQ9XCJmaWVsZFwiIC8+XG4gICAgICAgIDwvbGk+XG4gICAgICApKX1cbiAgICA8L3VsPlxuICApO1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBfb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5cbi8vIFJlcGxhY2VhYmxlIGxheW91dFxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRPYmplY3RMYXlvdXQgPSAoeyBoYXNFcnJvcnMsIGxhYmVsLCBjb250ZW50IH0pID0+IChcbiAgPGRpdlxuICAgIGNsYXNzTmFtZT17YGZvcm0tZ3JvdXAgcm93IGZvcm0tbmVzdGVkICR7aGFzRXJyb3JzID8gXCJpbnB1dC1lcnJvclwiIDogXCJcIn1gfVxuICA+XG4gICAgPGxhYmVsIGNsYXNzTmFtZT1cImNvbnRyb2wtbGFiZWwgY29sLXNtLTNcIj57bGFiZWx9PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS05XCI+e2NvbnRlbnR9PC9kaXY+XG4gIDwvZGl2PlxuKTtcbkZvcm1OZXN0ZWRPYmplY3RMYXlvdXQucHJvcFR5cGVzID0ge1xuICBoYXNFcnJvcnM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5ib29sXSksXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgY29udGVudDogUHJvcFR5cGVzLm5vZGUsXG59O1xuXG5pbnRlcmZhY2UgRm9ybU5lc3RlZE9iamVjdFByb3BzIHtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGlucHV0OiBhbnk7XG4gIGlucHV0UHJvcGVydGllczogYW55O1xuICBuZXN0ZWRJbnB1dDogYW55O1xuICBlcnJvcnM6IEFycmF5PGFueT47XG4gIHBhdGg6IHN0cmluZztcbn1cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkT2JqZWN0ID0gKHByb3BzOiBGb3JtTmVzdGVkT2JqZWN0UHJvcHMpID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgLy9jb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q3VycmVudFZhbHVlKClcbiAgLy8gZG8gbm90IHBhc3MgRm9ybU5lc3RlZCdzIG93biB2YWx1ZSwgaW5wdXQgYW5kIGlucHV0UHJvcGVydGllcyBwcm9wcyBkb3duXG4gIGNvbnN0IHByb3BlcnRpZXMgPSBfb21pdChcbiAgICBwcm9wcyxcbiAgICBcInZhbHVlXCIsXG4gICAgXCJpbnB1dFwiLFxuICAgIFwiaW5wdXRQcm9wZXJ0aWVzXCIsXG4gICAgXCJuZXN0ZWRJbnB1dFwiXG4gICk7XG4gIGNvbnN0IHsgZXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvLyBvbmx5IGtlZXAgZXJyb3JzIHNwZWNpZmljIHRvIHRoZSBuZXN0ZWQgYXJyYXkgKGFuZCBub3QgaXRzIHN1YmZpZWxkcylcbiAgY29uc3QgbmVzdGVkT2JqZWN0RXJyb3JzID0gZXJyb3JzLmZpbHRlcihcbiAgICAoZXJyb3IpID0+IGVycm9yLnBhdGggJiYgZXJyb3IucGF0aCA9PT0gcHJvcHMucGF0aFxuICApO1xuICBjb25zdCBoYXNFcnJvcnMgPSBuZXN0ZWRPYmplY3RFcnJvcnMgJiYgbmVzdGVkT2JqZWN0RXJyb3JzLmxlbmd0aDtcbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtTmVzdGVkT2JqZWN0TGF5b3V0XG4gICAgICBoYXNFcnJvcnM9e2hhc0Vycm9yc31cbiAgICAgIGxhYmVsPXtwcm9wcy5sYWJlbH1cbiAgICAgIGNvbnRlbnQ9e1tcbiAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybU5lc3RlZEl0ZW1cbiAgICAgICAgICBrZXk9XCJmb3JtLW5lc3RlZC1pdGVtXCJcbiAgICAgICAgICB7Li4ucHJvcGVydGllc31cbiAgICAgICAgICBwYXRoPXtgJHtwcm9wcy5wYXRofWB9XG4gICAgICAgIC8+LFxuICAgICAgICBoYXNFcnJvcnMgPyAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRmllbGRFcnJvcnNcbiAgICAgICAgICAgIGtleT1cImZvcm0tbmVzdGVkLWVycm9yc1wiXG4gICAgICAgICAgICBlcnJvcnM9e25lc3RlZE9iamVjdEVycm9yc31cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbCxcbiAgICAgIF19XG4gICAgLz5cbiAgKTtcbn07XG5cbkZvcm1OZXN0ZWRPYmplY3QucHJvcFR5cGVzID0ge1xuICBjdXJyZW50VmFsdWVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBwYXRoOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZXJyb3JzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgZm9ybUNvbXBvbmVudHM6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtTmVzdGVkT2JqZWN0O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgY29uc3QgRm9ybU9wdGlvbkxhYmVsID0gKHsgb3B0aW9uIH0pID0+IHtcbiAgY29uc3QgeyBsYWJlbCB9ID0gb3B0aW9uO1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwiZm9ybS1vcHRpb24tbGFiZWxcIj57bGFiZWx9PC9zcGFuPjtcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBGb3JtSW5wdXRQcm9wcyB9IGZyb20gXCIuLi9Gb3JtQ29tcG9uZW50SW5uZXJcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vKipcbiAqIENvbnZlcnRzIHByb3BzIHBhc3NlZCBieSBWdWxjYW4gdG8gYW4gSFRNTCBJbnB1dFxuICogQHNlZSBwYWNrYWdlcy92dWxjYW4tdWktYm9vdHN0cmFwL2xpYi9jb21wb25lbnRzL2Zvcm1zL0Zvcm1JdGVtLmpzeCBpbiBWdWxjYW5cbiAqIEBwYXJhbSBwYXJhbTBcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IEhUTUxJbnB1dEFkYXB0ZXIgPSAocHJvcHM6IEZvcm1JbnB1dFByb3BzICYgeyB0eXBlOiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCB7IGlucHV0UHJvcGVydGllcyB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgbGFiZWwsIG5hbWUsIC4uLm90aGVySW5wdXRQcm9wZXJ0aWVzIH0gPSBpbnB1dFByb3BlcnRpZXM7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsIGh0bWxGb3I9e25hbWV9PntsYWJlbH08L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIHsuLi5vdGhlcklucHV0UHJvcGVydGllc31cbiAgICAgICAgaWQ9e25hbWV9IC8vIG5lZWRlZCBmb3IgYWNjZXNzaWJpbGl0eS4gTk9URTogd2UgbWlnaHQgbmVlZCB0byB1c2UgXCJjb250ZXh0XCIgYXMgYSBwcmVmaXggd2hlbiBoYXZpbmdcbiAgICAgICAgLy8gbXVsdGlwbGUgZm9ybXMgZm9yIHRoZSBzYW1lIGtpbmQgb2YgZGF0YVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB0eXBlPXtwcm9wcy50eXBlfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07IC8vIFRPRE86IG1pZ2h0IG5lZWQgc29tZSBzYW5pdGl6YXRpb25cblxuY29uc3QgSFRNTFNlbGVjdEFkYXB0ZXIgPSAocHJvcHM6IEZvcm1JbnB1dFByb3BzKSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRQcm9wZXJ0aWVzLCBvcHRpb25zID0gW10gfSA9IHByb3BzO1xuICBjb25zdCB7IGxhYmVsLCBuYW1lIH0gPSBpbnB1dFByb3BlcnRpZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJIVE1MU2VsZWN0QWRhcGF0ZXIgbm90IHlldCBzdXBwb3J0aW5nIGZ1bmN0aW9uYWwgb3B0aW9uc1wiKTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsIGh0bWxGb3I9e25hbWV9PntsYWJlbH08L2xhYmVsPlxuICAgICAgey8qKiBUT0RPOiB3aGl0ZWxpc3RpbmcgZmVhdHVyZSBzaG91bGQgYmUgc21hcnRlciB0byBkaWZmZXJlbnRpYXRlIHNlbGVjdCBhbmQgaW5wdXQgKi99XG4gICAgICA8c2VsZWN0XG4gICAgICAgIHsuLi4oaW5wdXRQcm9wZXJ0aWVzIGFzIHVua25vd24gYXMgUmVhY3QuSFRNTFByb3BzPEhUTUxTZWxlY3RFbGVtZW50Pil9XG4gICAgICA+XG4gICAgICAgIHtvcHRpb25zLm1hcCgoeyBsYWJlbCwgdmFsdWUgfSkgPT4gKFxuICAgICAgICAgIDxvcHRpb24ga2V5PXt2YWx1ZX0gbGFiZWw9e2xhYmVsfSB2YWx1ZT17dmFsdWV9Pjwvb3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvc2VsZWN0PlxuICAgIDwvZGl2PlxuICApO1xufTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50RGVmYXVsdCA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwidGV4dFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFBhc3N3b3JkID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJwYXNzd29yZFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudE51bWJlciA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwibnVtYmVyXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50VXJsID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJ1cmxcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRFbWFpbCA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwiZW1haWxcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRUZXh0YXJlYSA9IChwcm9wcykgPT4gPHRleHRhcmVhIHsuLi5wcm9wc30gLz47XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudENoZWNrYm94ID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJjaGVja2JveFwiIHsuLi5wcm9wc30gLz5cbik7XG4vLyBUT0RPXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXAgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgey4uLnByb3BzfSAvPlxuKTtcbi8vIFRPRE9cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRTZWxlY3QgPSAocHJvcHM6IEZvcm1JbnB1dFByb3BzKSA9PiAoXG4gIDxIVE1MU2VsZWN0QWRhcHRlciB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZSA9IChwcm9wcykgPT4ge1xuICBjb25zdCBDb21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICByZXR1cm4gPENvbXBvbmVudHMuRm9ybUNvbXBvbmVudFNlbGVjdCBtdWx0aXBsZSB7Li4ucHJvcHN9IC8+O1xufTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50RGF0ZSA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwiZGF0ZVwiIHsuLi5wcm9wc30gLz5cbik7XG4vKlxuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREYXRlMiA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB7Li4ucHJvcHN9IC8+XG4pO1xuKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50RGF0ZVRpbWUgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50VGltZSA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwidGltZVwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQgPSAocHJvcHMpID0+IDxpbnB1dCBkaXNhYmxlZCB7Li4ucHJvcHN9IC8+O1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRMaWtlcnQgPSAocHJvcHMpID0+XG4gIFwiTGlrZXJ0IGNvbXBvbmVudCBub3QgeWV0IGltcGxlbWVudGVkXCI7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZSA9IChwcm9wcykgPT5cbiAgXCJBdXRvY29tcGxldGUgY29tcG9uZW50IG5vdCB5ZXQgaW1wbGVtZW50ZWRcIjtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGUgPSAocHJvcHMpID0+XG4gIFwiTXVsdGlBdXRvY29tcGxldGUgY29tcG9uZW50IG5vdCB5ZXQgaW1wbGVtZW50ZWRcIjtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuLy8gVE9ETzogd2hpdGVsaXN0IEhUTUxCdXR0b24gcHJvcHNcbmV4cG9ydCBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKHsgY2hpbGRyZW4sIC4uLnByb3BzIH0pID0+IChcbiAgPGJ1dHRvbiB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2J1dHRvbj5cbik7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG4vLyBAc2VlIGh0dHBzOi8vZG9ja3lhcmQuY29tL2Jsb2cvMjAyMC8wMy8wMi9hY2Nlc3NpYmxlLWxvYWRpbmctaW5kaWNhdG9yc3dpdGgtbm8tZXh0cmEtZWxlbWVudHNcbmV4cG9ydCBjb25zdCBMb2FkaW5nID0gKCkgPT4gKFxuICA8c3BhbiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWJ1c3k9XCJ0cnVlXCI+XG4gICAgTG9hZGluZy4uLlxuICA8L3NwYW4+XG4pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
5
+ `:e.mutationFragment),!C||!_){const e=u.default({formType:v,model:t,fields:c,addFields:p});C=C||e.queryFragment,O=e.queryFragmentName,_=_||e.mutationFragment,j=e.mutationFragmentName}t.name,s.capitalize(v);const E={formType:v,schema:y},x={model:t,fragment:_,fragmentName:j},P={model:t,fragment:C,fragmentName:O,input:{id:o,enableCache:!1},queryOptions:{fetchPolicy:"network-only",pollInterval:0,skip:"new"===v}},{data:D,document:N,loading:I,refetch:M}=i.useSingle(P);"new"!==v&&f("useSingle result","data",D,"document",N,"loading",I);const[w]=i.useCreate(x),[S]=i.useUpdate(x),[k]=i.useDelete(x),{currentUser:V,loading:L}=d.useVulcanCurrentUser(),T=void 0!==b,A=T?b:V,q=T?h:L;return F&&I?a.default.createElement(g.Loading,null):a.default.createElement(g.Form,Object.assign({document:N,loading:I||q,createDocument:e=>r(void 0,void 0,void 0,(function*(){const t=yield w(e),{errors:o,document:r}=t;return{document:r,errors:o}})),updateDocument:e=>r(void 0,void 0,void 0,(function*(){const t=yield S(e),{errors:o,document:r}=t;return{document:r,errors:o}})),deleteDocument:e=>r(void 0,void 0,void 0,(function*(){yield k(e)})),refetch:M,currentUser:A},E,e))},t.SmartForm=t.FormContainer,t.default=t.FormContainer},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=r(o(15)),a=r(o(16)),l=o(8),u=o(32),s=o(33),i=o(4),m=r(o(9)),c=(e,t,o)=>[t,e,"form",o,"fragment"].map(i.capitalize).join(""),d=({schema:e,options:t})=>"new"===t.formType?u.getCreateableFields(e):u.getUpdateableFields(e),f=({readableFieldNames:e,queryFieldNames:t})=>n.default(t.concat(e)),p=({schema:e,fragmentName:t,options:o,fieldNames:r})=>{const n=r||(o.isMutation?f({queryFieldNames:d({schema:e,options:o}),readableFieldNames:u.getFragmentFieldNames({schema:e,options:{onlyViewable:!0}})}):d({schema:e,options:o})),a=n.length&&n.map(t=>s.getFieldFragment({schema:e,fieldName:t,options:o,getObjectFragment:p})).filter(e=>!!e);return a.length?`${t} { ${a.join("\n")} }`:null};t.default=({formType:e="new",model:t,fields:o,addFields:r})=>{const{schema:s,name:i,graphql:b}=t,{typeName:h,multiTypeName:y}=b;let F=d({schema:s,options:{formType:e}}),v=f({queryFieldNames:F,readableFieldNames:u.getFragmentFieldNames({schema:s,options:{onlyViewable:!0}})});if(o&&(null==o?void 0:o.length)>0){const e=o.map(e=>e+"_intl"),t=[...o,...e];F=a.default(F,t),v=a.default(v,t)}if((null==r?void 0:r.length)&&(F=F.concat(r),v=v.concat(r)),s.userId&&(F.unshift("userId"),v.unshift("userId")),s._id&&(F.unshift("_id"),v.unshift("_id")),F=n.default(F),v=n.default(v),0===F.length)throw new Error(`Model "${t.name}" has no queryable fields, cannot create a form for it. Please add readable/createable/updateable fields to the model schema.`);if(0===v.length)throw new Error(`Model "${t.name}" has no mutable fields, cannot create a form for it. Please add createable/updateable fields to model schema.`);const g=c(e,y,"query"),C=p({schema:s,fragmentName:`fragment ${g} on ${h}`,options:{formType:e,isMutation:!1},fieldNames:F});if(!C)throw new Error(`Model ${t.name} with fields ${F} yield an empty query fragment.`);const _=l.gql(C),O=c(e,y,"mutation"),j=p({schema:s,fragmentName:`fragment ${O} on ${h}`,options:{formType:e,isMutation:!0},fieldNames:v});if(!j)throw new Error(`Model ${t.name} with fields ${v} yield an empty mutation fragment.`);return{queryFragment:_,mutationFragment:l.gql(j),queryFragmentName:g,mutationFragmentName:O,extraQueries:m.default(d({schema:s,options:{formType:e}}).map(e=>s[e].query))}}},function(e,t){e.exports=require("@vulcanjs/schema")},function(e,t){e.exports=require("@vulcanjs/graphql")},function(e,t){e.exports=require("@vulcanjs/react-hooks")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Dummy=void 0;const n=r(o(0));t.Dummy=()=>n.default.createElement("span",null,"You have not setup VulcanComponentsProvider. Please add following code in your app:"," ",n.default.createElement("code",null,'import { VulcanComponentsProvider } from "@vulcanjs/react-ui"; const YourApp = <VulcanComponentsProvider>{/* your app */}</VulcanComponentsProvider>;}'))},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},l=this&&this.__awaiter||function(e,t,o,r){return new(o||(o=Promise))((function(n,a){function l(e){try{s(r.next(e))}catch(e){a(e)}}function u(e){try{s(r.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(l,u)}s((r=r.apply(e,t||[])).next())}))},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Form=void 0;const s=a(o(0)),i=o(37),m=o(3),c=o(4),d=u(o(38)),f=u(o(9)),p=u(o(5)),b=u(o(39)),h=u(o(40)),y=u(o(20)),F=u(o(7)),v=u(o(41)),g=u(o(11)),C=u(o(42)),_=u(o(21)),O=u(o(43)),j=u(o(44)),E=u(o(45)),x=u(o(22)),P=o(23),D=o(13),N=o(25),I=o(2),M=o(52),w=o(59),S=o(61),k=o(1),V=e=>{const t=e.schema||e.model.schema,o=P.convertSchema(t),r="new"===(e.document?"edit":"new")?(e=>C.default(h.default(e,e=>e.defaultValue),e=>e))(o):{},n=y.default({},r,e.prefilledProps,(a=e.document,v.default(a,e=>null==e)));var a;return Object.keys(o).forEach(e=>{let t=o[e].minCount;if(t)for(n[e]=n[e]||[];n[e].length<t;)n[e].push({})}),c.removeProperty(n,"__typename"),{disabled:e.disabled,errors:[],deletedValues:[],currentValues:{},originalSchema:P.convertSchema(t,{removeArrays:!1}),schema:o,flatSchema:P.convertSchema(t,{flatten:!0}),initialDocument:n,currentDocument:n}},L=({isChanged:e,warnUnsavedChanges:t,children:o})=>(S.useWarnOnUnsaved({isChanged:e,warnUnsavedChanges:t}),s.default.createElement(s.default.Fragment,null,o)),T=(e,t,o,{submitFormCallbacks:r,form:n})=>{const{currentDocument:a}=o,{model:l,prefilledProps:u}=t;let s=u||{};s=v.default(s,(e,t)=>t.endsWith(".$"));const m=Object.assign({schema:l.schema,excludeRemovedFields:!1,excludeHiddenFields:!1,replaceIntlFields:!0,addExtraFields:!1},e),c=M.getFieldNames(t,a,m);return s=Object.assign(Object.assign({},s),g.default(a,...c)),o.deletedValues.forEach(e=>{e.includes(".")&&((e,t)=>{const o=N.getParentPath(t);j.default(e,o,e=>Array.isArray(e)?f.default(e):e)})(s,e)}),s=i.runCallbacks({callbacks:r,iterator:s,args:[{}]}),s};t.Form=e=>{const{initCallback:t,createDocument:o,updateDocument:r,deleteDocument:n}=e,a=V(e),{schema:u,originalSchema:c,flatSchema:f,initialDocument:h}=a,v=s.useRef(!0);s.useEffect(()=>{v.current?v.current=!1:t&&t(a.currentDocument)},[t]);Object.assign(Object.assign({},{layout:"horizontal",prefilledProps:{},repeatErrors:!1,showRemove:!0,showDelete:!0}),e);const g=[],C=[],j=[],N=m.useIntlContext(),[S,A]=s.useState([]),q=e=>{let t=i.getErrors(e);console.log(t),A(e=>[...e,...t])},[B,R]=s.useState([]),[$,U]=s.useState({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]}),[G,H]=s.useState({}),[W,z]=s.useState(h),K=()=>{e.refetch&&e.refetch()},[Y,Q]=s.useState(!1),[J,X]=s.useState(!1),Z=(t={})=>{const{document:o}=t,r=o?y.default({},e.prefilledProps,o):null;A([]),H({}),R([]),z(r||h),Q(!1)},ee=s.useRef(null),te=function(t,o){Q(!1),X(!0),"new"===o&&K();let{document:r}=t;ee.current&&Z({document:"edit"===o?r:void 0}),r=i.runCallbacks({callbacks:C,iterator:r,args:[{form:ee.current}]}),e.successCallback&&e.successCallback(r,{form:this})},oe=(t,o)=>{Q(!1),console.error("// graphQL Error"),console.error(o),i.runCallbacks({callbacks:j,iterator:o,args:[{error:o,form:ee.current}]}),x.default(o)||q(o),e.errorCallback&&e.errorCallback(t,o,{form:this})},re=t=>n=>l(void 0,void 0,void 0,(function*(){var a,l;n&&n.preventDefault(),n&&n.stopPropagation();const{contextName:u}=e;if(Y)return;A([]),Q(!0);let s=T({replaceIntlFields:!0,addExtraFields:!1,mutableFields:ce},e,{currentDocument:W,deletedValues:B},{form:ee.current,submitFormCallbacks:g});if(e.submitCallback&&(s=e.submitCallback(s)||s),"new"===t)try{const e=yield o({input:{data:s,contextName:u}});(null===(a=e.errors)||void 0===a?void 0:a.length)?oe(ae,e.errors[0]):function(e){te(e,"new")}(e)}catch(e){oe(ae,e)}else try{const e=W._id,t=yield r({input:{id:e,data:s,contextName:u}});(null===(l=t.errors)||void 0===l?void 0:l.length)?oe(ae,t.errors[0]):function(e){te(e,"edit")}(t)}catch(e){oe(ae,e)}})),{successComponent:ne,document:ae,currentUser:le,model:ue,warnUnsavedChanges:se}=e,ie=k.useVulcanComponents(),me=ae?"edit":"new",ce="edit"===me?P.getEditableFields(u,le,h):P.getInsertableFields(u,le),{formLayoutProps:de,formGroupProps:fe}=((e,t,o,r)=>{const{currentUser:n,repeatErrors:a,submitLabel:l,cancelLabel:u,revertLabel:s,cancelCallback:i,revertCallback:m,id:c,model:d,prefilledProps:f,itemProperties:p,contextName:b,showRemove:h,showDelete:y}=e,{disabled:v,currentDocument:g}=t,{formType:C}=o,{deleteDocument:_}=r,O={document:g,formType:C,currentUser:n,disabled:v,prefilledProps:f,itemProperties:p,contextName:b},j="document-"+C,E=d.name.toLowerCase(),x={model:d,currentUser:n,submitLabel:l,cancelLabel:u,revertLabel:s,cancelCallback:i,revertCallback:m,document:g,deleteDocument:"edit"===C&&h&&y&&_||null};return{commonProps:O,formSubmitProps:x,formGroupProps:e=>Object.assign(Object.assign(Object.assign({key:e.name},e),{group:F.default(e,["fields"])}),O),formLayoutProps:{formProps:{className:`${j} ${j}-${E}`,id:c},repeatErrors:a,submitProps:x,commonProps:O}}})(e,{disabled:Y,currentDocument:W},{formType:me},{deleteDocument:()=>{const t=W,o=e.document._id,r=t.title||t.name||"",a=N.formatMessage({id:"forms.delete_confirm"},{title:r});"42".confirm(a)&&n({input:{id:o}}).then(t=>{e.removeSuccessCallback&&e.removeSuccessCallback({documentId:o,documentTitle:r}),K()}).catch(e=>{console.log(e)})}}),pe=w.isNotSameDocument(h,W);return J&&ne?ne:s.default.createElement(L,{isChanged:pe,warnUnsavedChanges:se},s.default.createElement(I.FormContext.Provider,{value:{throwError:q,clearForm:Z,refetchForm:K,isChanged:pe,submitForm:(e=>t=>{re(e)(t)})(me),addToDeletedValues:e=>{R(t=>[...t,e])},updateCurrentValues:(t,o={})=>{const{mode:r="overwrite"}=o,{changeCallback:n}=e,a={currentValues:d.default(G),currentDocument:d.default(W),deletedValues:d.default(B)};Object.keys(t).forEach(e=>{const o=e;let n=t[e];if(D.isEmptyValue(n))O.default(a.currentValues,o),_.default(a.currentDocument,o,null),a.deletedValues=[...a.deletedValues,o];else{if(_.default(a.currentValues,o,n),"merge"===r&&(Array.isArray(n)||b.default(n))){const e=p.default(a.currentDocument,o);_.default(a.currentDocument,o,y.default(e,n))}else _.default(a.currentDocument,o,n);a.deletedValues=E.default(a.deletedValues,o)}}),n&&n(a.currentDocument),H(a.currentValues),z(a.currentDocument),R(a.deletedValues)},getDocument:()=>W,getLabel:(e,t)=>M.getLabel(ue,f,N,e,t),initialDocument:h,addToSubmitForm:e=>{U(t=>Object.assign(Object.assign({},t),{submitFormCallbacks:[...t.submitFormCallbacks,e]}))},addToSuccessForm:e=>{U(t=>Object.assign(Object.assign({},t),{successFormCallbacks:[...t.successFormCallbacks,e]}))},addToFailureForm:e=>{U(t=>Object.assign(Object.assign({},t),{failureFormCallbacks:[...t.failureFormCallbacks,e]}))},clearFormCallbacks:()=>{U({submitFormCallbacks:[],successFormCallbacks:[],failureFormCallbacks:[]})},errors:S,currentValues:G,deletedValues:B,clearFieldErrors:e=>{A(t=>t.filter(t=>t.path!==e))}}},s.default.createElement(ie.FormLayout,Object.assign({},de),M.getFieldGroups(e,{currentDocument:W,schema:u,flatSchema:f,originalSchema:c},N,ce,N.formatMessage).map((e,t)=>s.default.createElement(ie.FormGroup,Object.assign({key:t},fe(e)))))))};t.default=t.Form},function(e,t){e.exports=require("@vulcanjs/core")},function(e,t){e.exports=require("lodash/cloneDeep")},function(e,t){e.exports=require("lodash/isObject")},function(e,t){e.exports=require("lodash/mapValues")},function(e,t){e.exports=require("lodash/omitBy")},function(e,t){e.exports=require("lodash/pickBy")},function(e,t){e.exports=require("lodash/unset")},function(e,t){e.exports=require("lodash/update")},function(e,t){e.exports=require("lodash/without")},function(e,t){e.exports=require("lodash/isPlainObject")},function(e,t){e.exports=require("lodash/size")},function(e,t){e.exports=require("lodash/toPath")},function(e,t){e.exports=require("lodash/initial")},function(e,t){e.exports=require("lodash/fp/flow")},function(e,t){e.exports=require("lodash/takeRight")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getFieldGroups=t.getFieldNames=t.getLabel=void 0;const n=o(23),a=r(o(15)),l=r(o(9)),u=r(o(5)),s=r(o(11)),i=o(3),m=r(o(53)),c=r(o(54)),d=r(o(55)),f=r(o(56)),p=r(o(57)),b=r(o(16)),h=r(o(58)),y=o(4);t.getLabel=(e,t,o,r,n)=>{const a=e.name.toLowerCase(),l=i.formatLabel({intl:o,fieldName:r,collectionName:a,schema:t});if(n){return`${l} (${o.formatMessage({id:"locales."+n,defaultMessage:n})})`}return l};const F=(e,t,o,r)=>{const n=e.name.toLowerCase(),a=r.intlId||`${n}.${o}.${r.value}`;return t.formatMessage({id:a,defaultMessage:r.label})};t.getFieldNames=(e,t,o)=>{const{fields:r,addFields:n,removeFields:l}=e,u=Object.assign(Object.assign({},{excludeHiddenFields:!0,excludeRemovedFields:!0,replaceIntlFields:!1,addExtraFields:!1}),o),{schema:s,mutableFields:m,excludeRemovedFields:c,excludeHiddenFields:d,addExtraFields:h,replaceIntlFields:y}=u;let F=m;if(void 0!==r&&r.length>0&&(F=b.default(F,r)),c&&void 0!==l&&l.length>0&&(F=f.default(F,l)),h&&void 0!==n&&n.length>0&&(F=null==F?void 0:F.concat(n)),d){const o=t;F=p.default(F,t=>{const r=null==s?void 0:s[t].hidden;return"function"==typeof r?r({props:e,document:o}):r})}return y&&(F=null==F?void 0:F.map(e=>i.isIntlField(null==s?void 0:s[e])?e+"_intl":e)),F=a.default(F),F};const v=(e,o,r,a,l)=>{const{model:m}=e,{currentDocument:c,flatSchema:d}=o,f=u.default(l,"type.0.type")===Array;let p=Object.assign(Object.assign({},s.default(l,n.formProperties)),{name:a,datatype:l.type,layout:e.layout,input:l.input||l.control});if(f){const e=o.originalSchema[a+".$"];p.itemDatatype=u.default(e,"type.0.type")}p.label=t.getLabel(m,d,r,a),p.intlKeys=i.getIntlKeys(a);const b=c;p.document=b,p.options&&Array.isArray(p.options)&&(p.options=p.options.map(e=>Object.assign(Object.assign({},e),{label:F(m,r,a,e)}))),i.isIntlField(l)&&(p.intlInput=!0);const h=l.form||l.inputProperties||{};for(const t in h){const o=h[t];p[t]="function"==typeof o?o.call(l,Object.assign(Object.assign({},e),{fieldName:a,document:b,intl:r})):o}const y=((e,t,o,r)=>{const n=e.name.toLowerCase();return i.getIntlLabel({intl:o,fieldName:r,collectionName:n,schema:t,isDescription:!0})||null})(m,d,r,a);return y&&(p.help=y),p},g=(e,t,o)=>{const r=o?`${o}.${t}`:t;return e.path=r,e},C=(e,t,o)=>(o.includes(t)||(e.disabled=!0),e),_=(e,o,r,n,a,l,u,s)=>{const i=a[n];let m=v(e,o,r,n,i);return m=g(m,n,s),m=((e,t)=>(t&&(e.parentFieldName=t),e))(m,u),m=C(m,n,l),m=((e,o,r,n,a,l,u,s)=>{const{currentDocument:i}=o;return l.arrayFieldSchema&&(n.arrayFieldSchema=l.arrayFieldSchema,n.arrayField=O(e,o,r,a,n.arrayFieldSchema,u,s)),l.schema&&(n.nestedSchema=l.schema,n.nestedInput=!0,n.nestedFields=t.getFieldNames(e,i,{schema:n.nestedSchema,addExtraFields:!1}).map(t=>_(e,o,r,t,n.nestedSchema,s,a,n.path))),n})(e,o,r,m,n,i,a,l),m},O=(e,t,o,r,n,a,l)=>{let u=v(e,t,o,r+".$",n);return u=g(u,r),u=C(u,r,l),u};t.getFieldGroups=(e,o,r,n,a)=>{const{schema:u,currentDocument:s}=o;let i=t.getFieldNames(e,s,{mutableFields:n,schema:u}).map(t=>_(e,o,r,t,u,n));i=c.default(i,"order");let f=l.default(d.default(m.default(i,"group"),e=>e?e.name:"")).map(e=>{const t=e.label||y.capitalize(e.name),o=h.default(i,t=>t.group&&t.group.name===e.name);return Object.assign(Object.assign({},e),{label:t,fields:o})});const p=h.default(i,e=>!e.group);if(p.length){f=[{name:"default",label:"default",order:0,fields:p}].concat(f)}return f=c.default(f,"order"),f}},function(e,t){e.exports=require("lodash/map")},function(e,t){e.exports=require("lodash/sortBy")},function(e,t){e.exports=require("lodash/uniqBy")},function(e,t){e.exports=require("lodash/difference")},function(e,t){e.exports=require("lodash/reject")},function(e,t){e.exports=require("lodash/filter")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isNotSameDocument=void 0;const n=r(o(24)),a=r(o(60));t.isNotSameDocument=(e,t)=>void 0!==n.default(t,(t,o,r)=>!a.default(t,e[o],(e,t)=>{if(!e&&!t)return!0}))},function(e,t){e.exports=require("lodash/isEqualWith")},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__exportStar||function(e,t){for(var o in e)"default"===o||Object.prototype.hasOwnProperty.call(t,o)||r(t,e,o)};Object.defineProperty(t,"__esModule",{value:!0}),n(o(62),t)},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useWarnOnUnsaved=void 0;const n=o(63),a=r(o(14)),l=o(3),u=a.default("vn:route-transitions");t.useWarnOnUnsaved=({isChanged:e,warnUnsavedChanges:t})=>{const o=l.useIntlContext();n.useBlockTransition({shouldBlock:!(!t||!e),getBlockedMessage:e=>{u("running handlePageLeave",e);return o.formatMessage({id:"forms.confirm_discard",defaultMessage:"Are you sure you want to discard your changes?"})}})}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useBlockTransition=void 0;const n=o(0),a=o(64),l=r(o(14)).default("vn:router-transitions");t.useBlockTransition=({shouldBlock:e,getBlockedMessage:t})=>{const o=n.useRef();n.useEffect(()=>{const r=!!o.current;l("running effect","should block",e,"currently blocked",r);const n=()=>{l("running unblock from effect"),e||o.current&&o.current()},u=e=>{const o=t(e);return l("user is being blocked after trying to leave the page, with message: "+o),e&&(e.returnValue=o),o};e&&(l("should block transition, setting up relevant event listener"),o.current=a.block(u,n)),!e&&r&&(l("should unblock (state has been reinitialized)"),o.current&&o.current())},[e])}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.block=t.UNBLOCK_TRANSITION_EVENT_TYPE=t.BLOCK_TRANSITION_EVENT_TYPE=void 0;const n=r(o(14)).default("vn:route-transition");function a(e){e.preventDefault(),e.returnValue=""}t.BLOCK_TRANSITION_EVENT_TYPE="blocktransition",t.UNBLOCK_TRANSITION_EVENT_TYPE="unblocktransition";t.block=(e,o)=>{n("running block function");const r=new Event(t.BLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(r),"42".addEventListener("beforeunload",a),"42".addEventListener("beforeunload",e);return()=>{n("running unblock function"),o&&(n("running user defined function"),o());const r=new Event(t.UNBLOCK_TRANSITION_EVENT_TYPE);"42".dispatchEvent(r),"42".removeEventListener("beforeunload",a),"42".removeEventListener("beforeunload",e),"42".onbeforeunload=void 0}}},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,o){"use strict";var r=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanComponentsProvider=void 0;const a=n(o(0)),l=o(67),u=o(10);t.VulcanComponentsProvider=e=>{var{value:t}=e,o=r(e,["value"]);return a.default.createElement(u.VulcanComponentsContext.Provider,Object.assign({value:Object.assign(Object.assign({},l.defaultVulcanComponents),t||{})},o))}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.defaultVulcanComponents=void 0;const n=o(3),a=o(68),l=r(o(69)),u=o(70),s=o(73),i=o(74),m=o(75),c=o(77),d=o(78),f=o(79),p=o(80),b=o(81),h=o(82),y=o(83),F=o(84),v=o(85),g=o(86),C=o(87),_=o(19),O=o(88),j=o(89),E={Loading:o(90).Loading,FormattedMessage:n.FormattedMessage,Alert:()=>null,Button:j.Button,Icon:()=>null},x={FormError:a.FormError,FormComponentDefault:O.FormComponentDefault,FormComponentPassword:O.FormComponentPassword,FormComponentNumber:O.FormComponentNumber,FormComponentUrl:O.FormComponentUrl,FormComponentEmail:O.FormComponentEmail,FormComponentTextarea:O.FormComponentTextarea,FormComponentCheckbox:O.FormComponentCheckbox,FormComponentCheckboxGroup:O.FormComponentCheckboxGroup,FormComponentRadioGroup:O.FormComponentRadioGroup,FormComponentSelect:O.FormComponentSelect,FormComponentSelectMultiple:O.FormComponentSelectMultiple,FormComponentDateTime:O.FormComponentDateTime,FormComponentDate:O.FormComponentDate,FormComponentTime:O.FormComponentTime,FormComponentStaticText:O.FormComponentStaticText,FormComponentLikert:O.FormComponentLikert,FormComponentAutocomplete:O.FormComponentAutocomplete,FormComponentMultiAutocomplete:O.FormComponentMultiAutocomplete,FormComponent:l.default,FormComponentInner:u.FormComponentInner,FormComponentLoader:s.FormComponentLoader,FormElement:i.FormElement,FormGroup:m.FormGroup,FormGroupLayout:m.FormGroupLayout,FormGroupHeader:m.FormGroupHeader,FormIntl:c.FormIntl,FormIntlItemLayout:c.FormIntlItemLayout,FormIntlLayout:c.FormIntlLayout,FieldErrors:v.FieldErrors,FormErrors:d.FormErrors,FormSubmit:f.FormSubmit,FormLayout:p.FormLayout,FormNestedArray:b.FormNestedArray,FormNestedArrayInnerLayout:b.FormNestedArrayInnerLayout,FormNestedArrayLayout:h.FormNestedArrayLayout,FormNestedItem:y.FormNestedItem,IconAdd:b.IconAdd,IconRemove:b.IconRemove,FormNestedDivider:F.FormNestedDivider,FormNestedItemLayout:y.FormNestedItemLayout,FormNestedObjectLayout:g.FormNestedObjectLayout,FormNestedObject:g.FormNestedObject,FormOptionLabel:C.FormOptionLabel,Form:_.Form};t.defaultVulcanComponents=Object.assign(Object.assign({},E),x)},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormError=void 0;const n=r(o(0)),a=r(o(5)),l=o(1),u=o(2);t.FormError=({error:e,errorContext:t})=>{const o=l.useVulcanComponents(),{getLabel:r}=u.useFormContext(),s=JSON.stringify(e.message||e);let i={id:e.id||"app.defaultError",defaultMessage:s,values:{errorContext:t,defaultMessage:s}};if(e.properties){const t=e.properties.name&&e.properties.name.split(".").slice(-1)[0];i.values=Object.assign(Object.assign(Object.assign({},i.values),{label:t&&r(t,e.properties.locale)}),e.properties)}e.data&&(i.values=Object.assign(Object.assign({},i.values),e.data));const m=a.default(e,"extensions.exception");return m&&(i=Object.assign(Object.assign({},i),{id:m.id,values:m.data})),n.default.createElement(o.FormattedMessage,Object.assign({html:!0},i))},t.FormError.defaultProps={errorContext:""}},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormComponent=void 0;const u=a(o(0)),s=l(o(5)),i=l(o(26)),m=o(13),c=o(1),d=o(27),f=o(2),p=(e,t)=>{const o=e&&e.length?e.length:0;return{charsRemaining:t-o,charsCount:o}},b=({intlInput:e,path:t})=>e?t+"_intl":t,h=(e,t)=>t||d.getAutoInputFromType(e),y=({type:e,input:t,FormComponents:o})=>{if("function"==typeof t){return t}{const r=h(e,t);switch(r){case"text":return o.FormComponentDefault;case"password":return o.FormComponentPassword;case"number":return o.FormComponentNumber;case"url":return o.FormComponentUrl;case"email":return o.FormComponentEmail;case"textarea":return o.FormComponentTextarea;case"checkbox":return o.FormComponentCheckbox;case"checkboxgroup":return o.FormComponentCheckboxGroup;case"radiogroup":return o.FormComponentRadioGroup;case"select":return o.FormComponentSelect;case"selectmultiple":return o.FormComponentSelectMultiple;case"datetime":return o.FormComponentDateTime;case"date":return o.FormComponentDate;case"time":return o.FormComponentTime;case"statictext":return o.FormComponentStaticText;case"likert":return o.FormComponentLikert;case"autocomplete":return o.FormComponentAutocomplete;case"multiautocomplete":return o.FormComponentMultiAutocomplete;default:throw new Error(`Input name "${r}" is not a standard Vulcan form input (type: ${e}, input: ${t})`)}}};t.FormComponent=e=>{const{locale:t,max:o,path:r,datatype:n,input:a,intlInput:l,nestedInput:d,query:F,options:v}=e,{updateCurrentValues:g,deletedValues:C,clearFieldErrors:_}=f.useFormContext(),O=n,j=(({document:e,max:t,intlInput:o,path:r})=>{if(!t)return null;const n=b({intlInput:o,path:r}),a=null==e?void 0:e[n],l=a&&"object"==typeof a?a.value:a;return p(l,t)})(e),[E,x]=u.useState(j),P=e=>{if(!o)throw new Error("Cannot update character count when no max value is set.");x(p(e,o))};u.useEffect(()=>{j&&x(j)},[null==j?void 0:j.charsCount,null==j?void 0:j.charsRemaining]);let D=!1,N=null;"string"==typeof a&&(N=h(O,a),D=!(void 0===o||!N||!["url","email","textarea","text"].includes(N)));const I=()=>{const{locale:t,defaultValue:o,formType:r,datatype:n}=e,a=t?b(e)+".value":b(e),l=e.document;let u=s.default(l,a);const i=t?"":m.getNullValue(n);return C.includes(a)?u=i:m.isEmptyValue(u)&&(u="new"===r&&o?o:i),u},M=t=>(t=t||e.errors||[]).filter(e=>e.path&&e.path.includes(r)),w=c.useVulcanComponents();if(l)return u.default.createElement(w.FormIntl,Object.assign({},e));if(!a&&d){if((e=>e===Array)(O))return u.default.createElement(w.FormNestedArray,Object.assign({},e,{formComponents:w,errors:M(),value:I()}));if((e=>e instanceof i.default)(O))return u.default.createElement(w.FormNestedObject,Object.assign({},e,{formComponents:w,errors:M(),value:I()}))}const S=Object.assign(Object.assign(Object.assign({},e),E||{}),{inputType:h(O,a),value:I(),errors:M(),showCharsRemaining:!!D,handleChange:o=>{if(""===o&&(o=null),O===Number&&null!=o?o=Number(o):O===i.default.Integer&&null!=o&&(o=parseInt(o)),o!==I()){const r=t?{locale:t,value:o}:o;g({[b(e)]:r}),_(b(e))}D&&P(o)},clearField:e=>{e.preventDefault(),e.stopPropagation(),g({[r]:null}),D&&P(null)},formInput:y({FormComponents:w,input:a,type:O})});F||"function"!=typeof v||(S.options=v(S));const k=u.default.createElement(w.FormComponentInner,Object.assign({},S));return F?u.default.createElement(w.FormComponentLoader,Object.assign({},S),k):k},t.formComponentsDependencies=["FormComponentDefault","FormComponentPassword","FormComponentNumber","FormComponentUrl","FormComponentEmail","FormComponentTextarea","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentDateTime","FormComponentDate","FormComponentDate2","FormComponentTime","FormComponentStaticText","FormComponentLikert","FormComponentAutocomplete","FormComponentMultiAutocomplete"],t.default=t.FormComponent},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentInner=void 0;const n=r(o(0)),a=o(3),l=o(71),u=r(o(72)),s=o(27),i=o(1);t.FormComponentInner=e=>{const t=a.useIntlContext(),{inputType:o,disabled:r,clearField:m}=e,{inputClassName:c,name:d,input:f,beforeComponent:p,afterComponent:b,errors:h,showCharsRemaining:y,charsRemaining:F,renderComponent:v,formInput:g}=e,C=i.useVulcanComponents(),_=h&&h.length,O="function"==typeof f?f.name:o,j=u.default("form-input",c,"input-"+d,"form-component-"+(O||"default"),{"input-error":_}),E=(()=>{const{handleChange:t,inputType:o,itemProperties:r,help:n,description:a,loading:u,submitForm:s,formComponents:i,intlKeys:m}=e;return Object.assign(Object.assign({},e),{inputProperties:Object.assign(Object.assign({},l.whitelistInputProps(e)),{onChange:e=>{const r="checkbox"===o?e.target.checked:e.target.value;t&&t(r)}}),itemProperties:Object.assign(Object.assign({},r),{intlKeys:m,Components:i,description:a||n,loading:u})})})(),x=g;return n.default.createElement("div",{className:j},n.default.createElement(x,Object.assign({},E)),_?n.default.createElement(C.FieldErrors,{errors:h}):null,(()=>{if(s.clearableInputs.includes(o)&&!r)return n.default.createElement("button",{className:"form-component-clear",title:t.formatMessage({id:"forms.clear_field"}),onClick:m},n.default.createElement("span",null,"✕"))})(),y&&n.default.createElement("div",{className:u.default("form-control-limit",{danger:F<10})},F))}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.whitelistInputProps=t.getHtmlInputProps=void 0;const n=r(o(11));t.getHtmlInputProps=e=>{const{name:t,path:o,options:r,label:n,onChange:a,onBlur:l,value:u,disabled:s}=e,i=Object.assign(Object.assign({},e.inputProperties),{name:t,path:o,options:r,label:n,onChange:a,onBlur:l,value:u,disabled:s});return Object.assign(Object.assign({},e),{inputProperties:i})};t.whitelistInputProps=e=>n.default(e,["name","path","options","label","onChange","onBlur","value","disabled","placeholder"])},function(e,t){e.exports=require("classnames")},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentLoader=void 0;const u=a(o(0)),s=o(8),i=l(o(22)),m=o(1);t.FormComponentLoader=e=>{const t=m.useVulcanComponents(),{query:o,children:r,options:n,value:a,queryWaitsForValue:l}=e,c="function"==typeof o?o({value:a}):o,[d,{loading:f,error:p,data:b}]=s.useLazyQuery(s.gql(c)),h=i.default(a)||0===(Array.isArray(a)&&a.length);if(u.useEffect(()=>{l&&h||d({variables:{value:a}})},[h,a,l]),p)throw new Error(p.toString());if(f)return u.default.createElement("div",{className:"form-component-loader"},u.default.createElement(t.Loading,null));const y={data:b,queryData:b,queryError:p,loading:f};if("function"==typeof n&&(y.optionsFunction=n,y.options=n.call({},Object.assign(Object.assign({},e),{data:b}))),!u.default.isValidElement(r))throw new Error("Children of FormComponentLoader must be a React element, got "+r);const F=u.default.cloneElement(r,y);return u.default.createElement("div",{className:"form-component-loader"},F)},t.FormComponentLoader.propTypes={}},function(e,t,o){"use strict";var r=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormElement=void 0;const a=n(o(0)),l=o(2);t.FormElement=a.default.forwardRef((e,t)=>{var{children:o}=e,n=r(e,["children"]);const{submitForm:u}=l.useFormContext();return a.default.createElement("form",Object.assign({},n,{onSubmit:u,ref:t}),o)})},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},l=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormGroup=t.FormGroupHeader=t.FormGroupLayout=void 0;const s=a(o(0)),i=u(o(76)),m=o(12),c=o(1),d=o(2);t.FormGroupLayout=e=>{var{anchorName:t,collapsed:o,hasErrors:r,group:n,document:a,toggle:u}=e,i=l(e,["anchorName","collapsed","hasErrors","group","document","toggle"]);return s.default.createElement("fieldset",Object.assign({},i))};t.FormGroupHeader=e=>s.default.createElement("h2",Object.assign({},e));t.FormGroup=e=>{const{name:t,label:o,group:r,fields:n,hidden:a,document:l,currentUser:u,disabled:f,itemProperties:p,prefilledProps:b,formType:h}=e,{errors:y,clearFieldErrors:F}=d.useFormContext(),[v,g]=s.useState(r.startCollapsed||!1),C=()=>g(e=>!e),_=i.default(n,e=>!!y.filter(t=>t.path===e.path).length),O=c.useVulcanComponents(),j="function"==typeof a?a(Object.assign(Object.assign({},e),{document:l})):a||!1,E=s.default.createElement(O.FormGroupHeader,{toggle:C,label:o,collapsed:v,hidden:j,group:r});if(r.adminsOnly&&!m.isAdmin(u))return null;const x=t.split(".").length>1?t.split(".")[1]:t;return s.default.createElement(O.FormGroupLayout,{label:o,anchorName:x,toggle:C,collapsed:v,hidden:j,group:r,heading:"default"===t?null:E,hasErrors:_,document:l},n.map(e=>s.default.createElement(O.FormComponent,Object.assign({key:e.name,disabled:f},e,{document:l,itemProperties:Object.assign(Object.assign({},p),e.itemProperties),clearFieldErrors:F,formType:h,currentUser:u,prefilledProps:b}))))},t.default=t.FormGroup},function(e,t){e.exports=require("lodash/some")},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormIntl=t.FormIntlItemLayout=t.FormIntlLayout=void 0;const n=r(o(0)),a=r(o(7)),l=o(1),u=o(2),s=[];t.FormIntlLayout=({children:e})=>n.default.createElement("div",{className:"form-intl"},e);t.FormIntlItemLayout=({locale:e,children:t})=>n.default.createElement("div",{className:"form-intl-"+e.id},t);t.FormIntl=e=>{const t=l.useVulcanComponents(),{getLabel:o}=u.useFormContext(),{name:r}=e,i=a.default(e,"value","inputProperties","intlInput","nestedInput");return n.default.createElement(t.FormIntlLayout,null,s.map((a,l)=>{return n.default.createElement(t.FormIntlItemLayout,{key:a.id,locale:a},n.default.createElement(t.FormComponent,Object.assign({},i,{label:o(r,a.id),path:(u=l,`${e.path}_intl.${u}`),locale:a.id})));var u}))}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormErrors=void 0;const n=r(o(0)),a=o(2),l=o(1);t.FormErrors=()=>{const e=l.useVulcanComponents(),{errors:t}=a.useFormContext();return n.default.createElement("div",{className:"form-errors"},!!t.length&&n.default.createElement(e.Alert,{className:"flash-message",variant:"danger"},n.default.createElement("ul",null,t.map((t,o)=>n.default.createElement("li",{key:o},n.default.createElement(e.FormError,{error:t,errorContext:"form"}))))))}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormSubmit=void 0;const n=r(o(0)),a=r(o(6)),l=o(12),u=o(1),s=o(2);t.FormSubmit=({submitLabel:e,cancelLabel:t,cancelCallback:o,revertLabel:r,revertCallback:a,document:i,deleteDocument:m,model:c,currentUser:d})=>{const f=u.useVulcanComponents(),{clearForm:p}=s.useFormContext();return n.default.createElement("div",{className:"form-submit"},n.default.createElement(f.Button,{type:"submit",variant:"primary"},e||n.default.createElement(f.FormattedMessage,{id:"forms.submit",defaultMessage:"Submit"})),o?n.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),o(i)}},t||n.default.createElement(f.FormattedMessage,{id:"forms.cancel",defaultMessage:"Cancel"})):null,a?n.default.createElement("a",{className:"form-cancel",onClick:e=>{e.preventDefault(),p(),a(i)}},r||n.default.createElement(f.FormattedMessage,{id:"forms.revert",defaultMessage:"Revert"})):null,m&&l.canDeleteDocument({user:d,document:i,model:c})?n.default.createElement("div",null,n.default.createElement("hr",null),n.default.createElement(f.Button,{variant:"link",onClick:m,className:`delete-link ${c.name}-delete-link`},n.default.createElement(f.Icon,{name:"close"})," ",n.default.createElement(f.FormattedMessage,{id:"forms.delete",defaultMessage:"Delete"}))):null)},t.FormSubmit.propTypes={submitLabel:a.default.node,cancelLabel:a.default.node,cancelCallback:a.default.func,revertLabel:a.default.node,revertCallback:a.default.func,document:a.default.object,deleteDocument:a.default.func,collectionName:a.default.string,classes:a.default.object}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.formComponentsDependencies=t.FormLayout=void 0;const n=r(o(0)),a=o(1);t.FormLayout=({commonProps:e,formProps:t,repeatErrors:o,submitProps:r,children:l})=>{const u=a.useVulcanComponents();return n.default.createElement(u.FormElement,Object.assign({},t),n.default.createElement(u.FormErrors,Object.assign({},e)),l,o&&n.default.createElement(u.FormErrors,Object.assign({},e)),n.default.createElement(u.FormSubmit,Object.assign({},e,r)))},t.formComponentsDependencies=["FormErrors","FormSubmit","FormElement"]},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.IconRemove=t.IconAdd=t.formComponentsDependencies=t.FormNestedArray=t.FormNestedArrayInnerLayout=void 0;const u=a(o(0)),s=l(o(7)),i=l(o(5)),m=o(2),c=o(1);t.FormNestedArrayInnerLayout=e=>{const{label:t,children:o,addItem:r,BeforeComponent:n,AfterComponent:a}=e,l=c.useVulcanComponents();return u.default.createElement("div",{className:"form-nested-array-inner-layout"},u.default.createElement(n,Object.assign({},e)),o,u.default.createElement(l.FormNestedDivider,{label:t,addItem:r}),u.default.createElement(a,Object.assign({},e)))};t.FormNestedArray=e=>{const{updateCurrentValues:t,deletedValues:o,errors:r}=m.useFormContext(),n=e.value||[],a=()=>{const{prefilledProps:o,path:r}=e;t({[`${r}.${n.length}`]:i.default(o,r+".$")||{}},{mode:"merge"})},l=t=>o.includes(`${e.path}.${t}`);u.useEffect(()=>{e.itemProperties.openNested&&a()},[]);const d=(e=>{let t=0;return e.map((e,o)=>l(o)?0:(t+=1,t))})(n),f=Object.assign({},s.default(e,"value","input","inputProperties","nestedInput","beforeComponent","afterComponent")),{path:p,minCount:b,maxCount:h,arrayField:y}=e,F=c.useVulcanComponents();let v=n.filter(e=>null!=e).length;return f.addItem=!h||v<h?a:null,f.nestedArrayErrors=r.filter(e=>e.path&&e.path===p),f.hasErrors=!(!f.nestedArrayErrors||!f.nestedArrayErrors.length),u.default.createElement(F.FormNestedArrayLayout,Object.assign({},f),n.map((o,r)=>{if(l(r))return null;const n=`${e.path}.${r}`,s=d[r];return u.default.createElement(F.FormNestedArrayInnerLayout,Object.assign({},y,{key:n,addItem:a,itemIndex:r,visibleItemIndex:s,path:n}),u.default.createElement(F.FormNestedItem,Object.assign({},f,{itemIndex:r,visibleItemIndex:s,path:n,removeItem:()=>{var o;o=r,t({[`${e.path}.${o}`]:null})},hideRemove:!!b&&v<=b})))}))},t.formComponentsDependencies=["FormNestedArrayInnerLayout","FormNestedArrayLayout"],t.default=t.FormNestedArray;t.IconAdd=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M448 294.2v-76.4c0-13.3-10.7-24-24-24H286.2V56c0-13.3-10.7-24-24-24h-76.4c-13.3 0-24 10.7-24 24v137.8H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h137.8V456c0 13.3 10.7 24 24 24h76.4c13.3 0 24-10.7 24-24V318.2H424c13.3 0 24-10.7 24-24z"}));t.IconRemove=({width:e=24,height:t=24})=>u.default.createElement("svg",{width:e,height:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},u.default.createElement("path",{fill:"currentColor",d:"M424 318.2c13.3 0 24-10.7 24-24v-76.4c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v76.4c0 13.3 10.7 24 24 24h400z"}))},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedArrayLayout=void 0;const n=r(o(6)),a=r(o(0)),l=o(1);t.FormNestedArrayLayout=e=>{const{hasErrors:t,nestedArrayErrors:o,label:r,addItem:n,BeforeComponent:u,AfterComponent:s,children:i}=e,m=l.useVulcanComponents();return a.default.createElement("div",{className:"form-group row form-nested "+(t?"input-error":"")},u&&a.default.createElement(u,Object.assign({},e)),a.default.createElement("label",{className:"control-label col-sm-3"},r),a.default.createElement("div",{className:"col-sm-9"},i,n&&a.default.createElement(m.Button,{className:"form-nested-button form-nested-add",size:"sm",variant:"success",onClick:n},a.default.createElement(m.IconAdd,{height:12,width:12})),e.hasErrors?a.default.createElement(m.FieldErrors,{key:"form-nested-errors",errors:o}):null),s&&a.default.createElement(s,Object.assign({},e)))},t.FormNestedArrayLayout.propTypes={hasErrors:n.default.bool.isRequired,nestedArrayErrors:n.default.array,label:n.default.node,hideLabel:n.default.bool,addItem:n.default.func,beforeComponent:n.default.node,afterComponent:n.default.node,formComponents:n.default.object,children:n.default.node},t.default=t.FormNestedArrayLayout},function(e,t,o){"use strict";var r=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedItem=t.FormNestedItemLayout=void 0;const a=n(o(0)),l=n(o(6)),u=o(3),s=o(1),i=o(3);t.FormNestedItemLayout=({content:e,removeButton:t})=>a.default.createElement("div",{className:"form-nested-item"},a.default.createElement("div",{className:"form-nested-item-inner"},e),t&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},t),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]),t.FormNestedItemLayout.propTypes={content:l.default.node.isRequired,removeButton:l.default.node};t.FormNestedItem=e=>{var{nestedFields:t,name:o,path:n,removeItem:l,itemIndex:u,formComponents:m,hideRemove:c,label:d}=e,f=r(e,["nestedFields","name","path","removeItem","itemIndex","formComponents","hideRemove","label"]);const p=s.useVulcanComponents(),b=i.useIntlContext(),h=void 0!==u;return a.default.createElement(p.FormNestedItemLayout,{content:t.map((e,t)=>a.default.createElement(p.FormComponent,Object.assign({key:t},f,e,{path:`${n}.${e.name}`,itemIndex:u}))),removeButton:h&&!c&&[a.default.createElement("div",{key:"remove-button",className:"form-nested-item-remove"},a.default.createElement(p.Button,{className:"form-nested-button",variant:"danger",size:"sm",iconButton:!0,tabIndex:-1,onClick:()=>{l(o)},"aria-label":b.formatMessage({id:"forms.delete_nested_field"},{label:d})},a.default.createElement(p.IconRemove,{height:12,width:12}))),a.default.createElement("div",{key:"remove-button-overlay",className:"form-nested-item-deleted-overlay"})]})},t.FormNestedItem.propTypes={path:l.default.string.isRequired,itemIndex:l.default.number,formComponents:l.default.object,hideRemove:l.default.bool},t.FormNestedItem.contextTypes={errors:l.default.array,intl:u.intlShape}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedDivider=void 0;const n=r(o(0)),a=r(o(6));t.FormNestedDivider=({label:e,addItem:t})=>n.default.createElement("div",null),t.FormNestedDivider.propTypes={label:a.default.string,addItem:a.default.func}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FieldErrors=t.formComponentsDependencies=void 0;const n=r(o(0)),a=o(1);t.formComponentsDependencies=["FormError"];t.FieldErrors=({errors:e})=>{const t=a.useVulcanComponents();return n.default.createElement("ul",{className:"form-input-errors"},e.map((e,o)=>n.default.createElement("li",{key:o},n.default.createElement(t.FormError,{error:e,errorContext:"field"}))))}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormNestedObject=t.FormNestedObjectLayout=void 0;const n=r(o(0)),a=r(o(6)),l=r(o(7)),u=o(1),s=o(2);t.FormNestedObjectLayout=({hasErrors:e,label:t,content:o})=>n.default.createElement("div",{className:"form-group row form-nested "+(e?"input-error":"")},n.default.createElement("label",{className:"control-label col-sm-3"},t),n.default.createElement("div",{className:"col-sm-9"},o)),t.FormNestedObjectLayout.propTypes={hasErrors:a.default.oneOfType([a.default.number,a.default.bool]),label:a.default.node,content:a.default.node};t.FormNestedObject=e=>{const t=u.useVulcanComponents(),o=l.default(e,"value","input","inputProperties","nestedInput"),{errors:r}=s.useFormContext(),a=r.filter(t=>t.path&&t.path===e.path),i=a&&a.length;return n.default.createElement(t.FormNestedObjectLayout,{hasErrors:i,label:e.label,content:[n.default.createElement(t.FormNestedItem,Object.assign({key:"form-nested-item"},o,{path:""+e.path})),i?n.default.createElement(t.FieldErrors,{key:"form-nested-errors",errors:a}):null]})},t.FormNestedObject.propTypes={currentValues:a.default.object,path:a.default.string,label:a.default.string,errors:a.default.array.isRequired,formComponents:a.default.object},t.default=t.FormNestedObject},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormOptionLabel=void 0;const n=r(o(0));t.FormOptionLabel=({option:e})=>{const{label:t}=e;return n.default.createElement("span",{className:"form-option-label"},t)}},function(e,t,o){"use strict";var r=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.FormComponentMultiAutocomplete=t.FormComponentAutocomplete=t.FormComponentLikert=t.FormComponentStaticText=t.FormComponentTime=t.FormComponentDateTime=t.FormComponentDate=t.FormComponentSelectMultiple=t.FormComponentSelect=t.FormComponentRadioGroup=t.FormComponentCheckboxGroup=t.FormComponentCheckbox=t.FormComponentTextarea=t.FormComponentEmail=t.FormComponentUrl=t.FormComponentNumber=t.FormComponentPassword=t.FormComponentDefault=void 0;const a=n(o(0)),l=o(1),u=e=>{const{inputProperties:t}=e,{label:o,name:n}=t,l=r(t,["label","name"]);return a.default.createElement("div",null,a.default.createElement("label",{htmlFor:n},o),a.default.createElement("input",Object.assign({},l,{id:n,name:n,type:e.type})))},s=e=>{const{inputProperties:t,options:o=[]}=e,{label:r,name:n}=t;if(!Array.isArray(o))throw new Error("HTMLSelectAdapater not yet supporting functional options");return a.default.createElement("div",null,a.default.createElement("label",{htmlFor:n},r),a.default.createElement("select",Object.assign({},t),o.map(({label:e,value:t})=>a.default.createElement("option",{key:t,label:e,value:t}))))};t.FormComponentDefault=e=>a.default.createElement(u,Object.assign({type:"text"},e));t.FormComponentPassword=e=>a.default.createElement(u,Object.assign({type:"password"},e));t.FormComponentNumber=e=>a.default.createElement(u,Object.assign({type:"number"},e));t.FormComponentUrl=e=>a.default.createElement(u,Object.assign({type:"url"},e));t.FormComponentEmail=e=>a.default.createElement(u,Object.assign({type:"email"},e));t.FormComponentTextarea=e=>a.default.createElement("textarea",Object.assign({},e));t.FormComponentCheckbox=e=>a.default.createElement(u,Object.assign({type:"checkbox"},e));t.FormComponentCheckboxGroup=e=>a.default.createElement(u,Object.assign({},e));t.FormComponentRadioGroup=e=>a.default.createElement(u,Object.assign({},e));t.FormComponentSelect=e=>a.default.createElement(s,Object.assign({},e));t.FormComponentSelectMultiple=e=>{const t=l.useVulcanComponents();return a.default.createElement(t.FormComponentSelect,Object.assign({multiple:!0},e))};t.FormComponentDate=e=>a.default.createElement(u,Object.assign({type:"date"},e));t.FormComponentDateTime=e=>a.default.createElement(u,Object.assign({type:"datetime-local"},e));t.FormComponentTime=e=>a.default.createElement(u,Object.assign({type:"time"},e));t.FormComponentStaticText=e=>a.default.createElement("input",Object.assign({disabled:!0},e));t.FormComponentLikert=e=>"Likert component not yet implemented";t.FormComponentAutocomplete=e=>"Autocomplete component not yet implemented";t.FormComponentMultiAutocomplete=e=>"MultiAutocomplete component not yet implemented"},function(e,t,o){"use strict";var r=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Button=void 0;const a=n(o(0));t.Button=e=>{var{children:t}=e,o=r(e,["children"]);return a.default.createElement("button",Object.assign({},o),t)}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Loading=void 0;const n=r(o(0));t.Loading=()=>n.default.createElement("span",{"aria-live":"polite","aria-busy":"true"},"Loading...")},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,o){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__exportStar||function(e,t){for(var o in e)"default"===o||Object.prototype.hasOwnProperty.call(t,o)||r(t,e,o)};Object.defineProperty(t,"__esModule",{value:!0}),n(o(17),t),n(o(93),t)},function(e,t,o){"use strict";var r=this&&this.__rest||function(e,t){var o={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(o[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(o[r[n]]=e[r[n]])}return o},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.VulcanCurrentUserProvider=void 0;const a=n(o(0)),l=o(18);t.VulcanCurrentUserProvider=e=>{var{value:t}=e,o=r(e,["value"]);return a.default.createElement(l.VulcanCurrentUserContext.Provider,Object.assign({value:t},o))}},function(e,t,o){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.mergeWithComponents=t.delayedComponent=t.instantiateComponent=t.getRawComponent=t.componentExists=t.coreComponents=t.ComponentsTable=t.Components=void 0;const n=r(o(0));t.Components={},t.ComponentsTable={},t.coreComponents=["Alert","Button","Modal","ModalTrigger","Table","FormComponentCheckbox","FormComponentCheckboxGroup","FormComponentDate","FormComponentDate2","FormComponentDateTime","FormComponentDefault","FormComponentText","FormComponentEmail","FormComponentNumber","FormComponentRadioGroup","FormComponentSelect","FormComponentSelectMultiple","FormComponentStaticText","FormComponentTextarea","FormComponentTime","FormComponentUrl","FormComponentInner","FormControl","FormElement"];t.componentExists=e=>!!t.ComponentsTable[e];t.getRawComponent=e=>t.ComponentsTable[e].rawComponent;t.instantiateComponent=(e,t)=>{if(e){if(n.default.isValidElement(e))return n.default.cloneElement(e,t);if("function"==typeof e&&e.prototype&&e.prototype.isReactComponent){const o=e;return n.default.createElement(o,Object.assign({},t))}if("function"==typeof e)return e(t);if("object"==typeof e&&e.$$typeof&&e.render){const o=e;return n.default.createElement(o,Object.assign({},t))}return e}return null};t.delayedComponent=e=>o=>{const r=t.Components[e]||null;return r&&n.default.createElement(r,Object.assign({},o))};t.mergeWithComponents=e=>e?Object.assign(Object.assign({},t.Components),e):t.Components}]);
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1Db250ZXh0LnRzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAdnVsY2FuanMvaTE4blwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy91dGlsc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9nZXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwcm9wLXR5cGVzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL29taXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAYXBvbGxvL2NsaWVudFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9jb21wYWN0XCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL1Z1bGNhbkNvbXBvbmVudHMvQ29udGV4dC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvcGlja1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL3V0aWxzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImRlYnVnXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VuaXFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaW50ZXJzZWN0aW9uXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9WdWxjYW5DdXJyZW50VXNlci9Db25zdW1lci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9WdWxjYW5DdXJyZW50VXNlci9Db250ZXh0LnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtL2luZGV4LnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9tZXJnZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9zZXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaXNFbXB0eVwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL3NjaGVtYV91dGlscy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvZmluZFwiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9tb2R1bGVzL3BhdGhfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwic2ltcGwtc2NoZW1hXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2lucHV0cy9jb25zdHMudHMiLCJ3ZWJwYWNrOi8vLy4vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2luZGV4LnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29udGFpbmVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vbW9kdWxlcy9mb3JtRnJhZ21lbnRzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9zY2hlbWFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAdnVsY2FuanMvZ3JhcGhxbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIkB2dWxjYW5qcy9yZWFjdC1ob29rc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9WdWxjYW5Db21wb25lbnRzL0R1bW15LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybS9Gb3JtLnRzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJAdnVsY2FuanMvY29yZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9jbG9uZURlZXBcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaXNPYmplY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvbWFwVmFsdWVzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL29taXRCeVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9waWNrQnlcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvdW5zZXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvdXBkYXRlXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3dpdGhvdXRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaXNQbGFpbk9iamVjdFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9zaXplXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3RvUGF0aFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9pbml0aWFsXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL2ZwL2Zsb3dcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvdGFrZVJpZ2h0XCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm0vZmllbGRzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9tYXBcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvc29ydEJ5XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3VuaXFCeVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9kaWZmZXJlbmNlXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibG9kYXNoL3JlamVjdFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9maWx0ZXJcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybS91dGlscy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2gvaXNFcXVhbFdpdGhcIiIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdXNlV2Fybk9uVW5zYXZlZC9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdXNlV2Fybk9uVW5zYXZlZC91c2VXYXJuT25VbnNhdmVkLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS91c2VCbG9ja1RyYW5zaXRpb24vdXNlQmxvY2tUcmFuc2l0aW9uLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS91c2VCbG9ja1RyYW5zaXRpb24vYmxvY2sudHMiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL1Z1bGNhbkNvbXBvbmVudHMvUHJvdmlkZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9WdWxjYW5Db21wb25lbnRzL2RlZmF1bHRWdWxjYW5Db21wb25lbnRzLnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtRXJyb3IudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUNvbXBvbmVudElubmVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vdWlfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2xhc3NuYW1lc1wiIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtQ29tcG9uZW50TG9hZGVyLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUVsZW1lbnQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtR3JvdXAudHN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcImxvZGFzaC9zb21lXCIiLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1JbnRsLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybUVycm9ycy50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1TdWJtaXQudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTGF5b3V0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEFycmF5LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEFycmF5TGF5b3V0LnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZEl0ZW0udHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvZm9ybS9Gb3JtTmVzdGVkRGl2aWRlci50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0ZpZWxkRXJyb3JzLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vRm9ybU5lc3RlZE9iamVjdC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL0Zvcm1PcHRpb25MYWJlbC50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2lucHV0cy9CYXNpY0lucHV0cy50c3giLCJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9mb3JtL2NvcmUvQnV0dG9uLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL2Zvcm0vY29yZS9Mb2FkaW5nLnRzeCIsIndlYnBhY2s6Ly8vLi9jb21wb25lbnRzL1Z1bGNhbkN1cnJlbnRVc2VyL2luZGV4LnRzIiwid2VicGFjazovLy8uL2NvbXBvbmVudHMvVnVsY2FuQ3VycmVudFVzZXIvUHJvdmlkZXIudHN4Iiwid2VicGFjazovLy8uL2NvbXBvbmVudHNIZWxwZXJzLnRzeCJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsInJlcXVpcmUiLCJWdWxjYW5Db21wb25lbnRzQ29uc3VtZXIiLCJWdWxjYW5Db21wb25lbnRzQ29udGV4dCIsIkNvbnN1bWVyIiwidXNlVnVsY2FuQ29tcG9uZW50cyIsInVzZUNvbnRleHQiLCJ3aXRoVnVsY2FuQ29tcG9uZW50cyIsIkMiLCJwcm9wcyIsInZ1bGNhbkNvbXBvbmVudHMiLCJkZXByZWNhdGUiLCJGb3JtQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJ1bmRlZmluZWQiLCJ1c2VGb3JtQ29udGV4dCIsImZvcm1Db250ZXh0IiwiRXJyb3IiLCJBbGVydCIsIkR1bW15IiwiQnV0dG9uIiwiRmllbGRFcnJvcnMiLCJGb3JtIiwiRm9ybUNvbXBvbmVudCIsIkZvcm1Db21wb25lbnRBdXRvY29tcGxldGUiLCJGb3JtQ29tcG9uZW50Q2hlY2tib3giLCJGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCIsIkZvcm1Db21wb25lbnREYXRlIiwiRm9ybUNvbXBvbmVudERhdGVUaW1lIiwiRm9ybUNvbXBvbmVudERlZmF1bHQiLCJGb3JtQ29tcG9uZW50RW1haWwiLCJGb3JtQ29tcG9uZW50SW5uZXIiLCJGb3JtQ29tcG9uZW50TGlrZXJ0IiwiRm9ybUNvbXBvbmVudExvYWRlciIsIkZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSIsIkZvcm1Db21wb25lbnROdW1iZXIiLCJGb3JtQ29tcG9uZW50UGFzc3dvcmQiLCJGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCIsIkZvcm1Db21wb25lbnRTZWxlY3QiLCJGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUiLCJGb3JtQ29tcG9uZW50U3RhdGljVGV4dCIsIkZvcm1Db21wb25lbnRUZXh0YXJlYSIsIkZvcm1Db21wb25lbnRUaW1lIiwiRm9ybUNvbXBvbmVudFVybCIsIkZvcm1FbGVtZW50IiwiRm9ybUVycm9yIiwiRm9ybUVycm9ycyIsIkZvcm1Hcm91cCIsIkZvcm1Hcm91cEhlYWRlciIsIkZvcm1Hcm91cExheW91dCIsIkZvcm1JbnRsIiwiRm9ybUludGxJdGVtTGF5b3V0IiwiRm9ybUludGxMYXlvdXQiLCJGb3JtTGF5b3V0IiwiRm9ybU5lc3RlZEFycmF5IiwiRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXQiLCJGb3JtTmVzdGVkQXJyYXlMYXlvdXQiLCJGb3JtTmVzdGVkRGl2aWRlciIsIkZvcm1OZXN0ZWRJdGVtIiwiRm9ybU5lc3RlZEl0ZW1MYXlvdXQiLCJGb3JtTmVzdGVkT2JqZWN0IiwiRm9ybU5lc3RlZE9iamVjdExheW91dCIsIkZvcm1PcHRpb25MYWJlbCIsIkZvcm1TdWJtaXQiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiSWNvbiIsIkljb25BZGQiLCJJY29uUmVtb3ZlIiwiTG9hZGluZyIsImRlZXBWYWx1ZSIsIm9iaiIsInBhdGgiLCJwYXRoQXJyYXkiLCJzcGxpdCIsImxlbmd0aCIsImZsYXR0ZW4iLCJkYXRhIiwicmVzdWx0IiwicmVjdXJzZSIsImN1ciIsInByb3AiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImlzRW1wdHkiLCJpc0VtcHR5VmFsdWUiLCJtZXJnZVZhbHVlIiwiY3VycmVudFZhbHVlIiwiZG9jdW1lbnRWYWx1ZSIsImRlbGV0ZWRWYWx1ZXMiLCJkZWxldGVkRmllbGRzIiwibG9jYWxlIiwiZGF0YXR5cGUiLCJnZXROZXN0ZWREZWxldGVkVmFsdWVzIiwiaGFzRGVsZXRlZFZhbHVlcyIsImdldERlbGV0ZWRWYWx1ZXMiLCJhY2N1bXVsYXRvciIsInJlZHVjZSIsInByZWZpeCIsInJlbW92ZVByZWZpeCIsImZpbHRlclBhdGhzQnlQcmVmaXgiLCJnZXRGaWVsZFR5cGUiLCJmaWVsZFNjaGVtYSIsInR5cGUiLCJnZXROdWxsVmFsdWUiLCJmaWVsZFR5cGUiLCJCb29sZWFuIiwiU3RyaW5nIiwiTnVtYmVyIiwiVnVsY2FuQ3VycmVudFVzZXJDb25zdW1lciIsIlZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dCIsInVzZVZ1bGNhbkN1cnJlbnRVc2VyIiwiY3VycmVudFVzZXIiLCJsb2FkaW5nIiwiZ2V0VmFsaWRGaWVsZHMiLCJzY2hlbWEiLCJrZXlzIiwiZmlsdGVyIiwiZmllbGROYW1lIiwiaW5jbHVkZXMiLCJnZXRSZWFkYWJsZUZpZWxkcyIsImNhblJlYWQiLCJ2aWV3YWJsZUJ5IiwiZ2V0SW5zZXJ0YWJsZUZpZWxkcyIsInVzZXIiLCJmaWVsZCIsImNhbkNyZWF0ZUZpZWxkIiwiZ2V0RWRpdGFibGVGaWVsZHMiLCJkb2N1bWVudCIsImNhblVwZGF0ZUZpZWxkIiwiY29udmVydFNjaGVtYSIsIm9wdGlvbnMiLCJyZW1vdmVBcnJheXMiLCJqc29uU2NoZW1hIiwiZm9yRWFjaCIsImdldEZpZWxkU2NoZW1hIiwic3ViU2NoZW1hT3JUeXBlIiwiZ2V0TmVzdGVkRmllbGRTY2hlbWFPclR5cGUiLCJhcnJheUZpZWxkU2NoZW1hIiwiaXNOZXN0ZWRTY2hlbWEiLCJjb252ZXJ0ZWRTdWJTY2hlbWEiLCJpc1NpbXBsZUFycmF5RmllbGQiLCJzY2hlbWFQcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZSIsImdldFNjaGVtYVR5cGUiLCJnZXRPYmplY3ROZXN0ZWRTY2hlbWEiLCJpc05lc3RlZFNjaGVtYUZpZWxkIiwiYXJyYXlJdGVtU2NoZW1hIiwiZ2V0QXJyYXlOZXN0ZWRTY2hlbWEiLCJvYmplY3RJdGVtU2NoZW1hIiwiZm9ybVByb3BlcnRpZXMiLCJzcGxpdFBhdGgiLCJzdHJpbmciLCJqb2luUGF0aCIsImFycmF5IiwiaXRlbSIsImlzTmFOIiwiZ2V0UGFyZW50UGF0aCIsInBhdGhzIiwiZXhwbG9kZWRQcmVmaXgiLCJtYXAiLCJleHBsb2RlZFBhdGgiLCJleHBsb2RlZFN1ZmZpeCIsInN0YXJ0c1dpdGgiLCJzdGFuZGFyZElucHV0cyIsImNsZWFyYWJsZUlucHV0cyIsImFkdmFuY2VkSW5wdXRzIiwiZGVyaXZlZElucHV0cyIsImFsbFZ1bGNhbklucHV0cyIsImdldEF1dG9JbnB1dEZyb21UeXBlIiwiSW50ZWdlciIsIkRhdGUiLCJkZWJ1Z0Zvcm0iLCJkZWJ1Z1Z1bGNhbiIsIkZvcm1Db250YWluZXIiLCJtb2RlbCIsImRvY3VtZW50SWQiLCJzbHVnIiwiZmllbGRzIiwiYWRkRmllbGRzIiwiY3VycmVudFVzZXJGcm9tUHJvcHMiLCJsb2FkaW5nQ3VycmVudFVzZXIiLCJsb2FkaW5nQ3VycmVudFVzZXJGcm9tUHJvcHMiLCJpc0VkaXQiLCJmb3JtVHlwZSIsIlZ1bGNhbkNvbXBvbmVudHMiLCJxdWVyeUZyYWdtZW50IiwibXV0YXRpb25GcmFnbWVudCIsInF1ZXJ5RnJhZ21lbnROYW1lIiwibXV0YXRpb25GcmFnbWVudE5hbWUiLCJncWwiLCJhdXRvRm9ybUZyYWdtZW50cyIsImNhcGl0YWxpemUiLCJjaGlsZFByb3BzIiwibXV0YXRpb25PcHRpb25zIiwiZnJhZ21lbnQiLCJmcmFnbWVudE5hbWUiLCJxdWVyeU9wdGlvbnMiLCJpbnB1dCIsImlkIiwiZW5hYmxlQ2FjaGUiLCJmZXRjaFBvbGljeSIsInBvbGxJbnRlcnZhbCIsInNraXAiLCJyZWZldGNoIiwidXNlU2luZ2xlIiwiY3JlYXRlRG9jdW1lbnQiLCJ1c2VDcmVhdGUiLCJ1cGRhdGVEb2N1bWVudCIsInVzZVVwZGF0ZSIsImRlbGV0ZURvY3VtZW50IiwidXNlRGVsZXRlIiwiY3VycmVudFVzZXJGcm9tQ29udGV4dCIsImxvYWRpbmdDdXJyZW50VXNlckZyb21Db250ZXh0Iiwic2hvdWxkR2V0Q3VycmVudFVzZXJGcm9tUHJvcHMiLCJ2YXJpYWJsZXMiLCJlcnJvcnMiLCJTbWFydEZvcm0iLCJnZXRGcmFnbWVudE5hbWUiLCJtdWx0aVR5cGVOYW1lIiwiZnJhZ21lbnRUeXBlIiwiam9pbiIsImdldFF1ZXJ5RmllbGROYW1lcyIsImdldENyZWF0ZWFibGVGaWVsZHMiLCJnZXRVcGRhdGVhYmxlRmllbGRzIiwiZ2V0TXV0YXRpb25GaWVsZE5hbWVzIiwicmVhZGFibGVGaWVsZE5hbWVzIiwicXVlcnlGaWVsZE5hbWVzIiwiY29uY2F0IiwiZ2V0U2NoZW1hRnJhZ21lbnQiLCJmaWVsZE5hbWVzIiwicHJvdmlkZWRGaWVsZE5hbWVzIiwiaXNNdXRhdGlvbiIsImdldEZyYWdtZW50RmllbGROYW1lcyIsIm9ubHlWaWV3YWJsZSIsImNoaWxkRnJhZ21lbnRzIiwiZ2V0RmllbGRGcmFnbWVudCIsImdldE9iamVjdEZyYWdtZW50IiwiZiIsImdyYXBocWwiLCJ0eXBlTmFtZSIsIm11dGF0aW9uRmllbGROYW1lcyIsImZpZWxkc1dpdGhJbnRsU3VmZml4IiwiYWxsRmllbGRzIiwidXNlcklkIiwidW5zaGlmdCIsIl9pZCIsInF1ZXJ5RnJhZ21lbnRUZXh0IiwiZ2VuZXJhdGVkUXVlcnlGcmFnbWVudCIsIm11dGF0aW9uRnJhZ21lbnRUZXh0IiwiZXh0cmFRdWVyaWVzIiwicXVlcnkiLCJnZXRJbml0aWFsU3RhdGVGcm9tUHJvcHMiLCJuZXh0UHJvcHMiLCJjb252ZXJ0ZWRTY2hlbWEiLCJkZWZhdWx0VmFsdWVzIiwiZGVmYXVsdFZhbHVlIiwiZ2V0RGVmYXVsdFZhbHVlcyIsImluaXRpYWxEb2N1bWVudCIsInByZWZpbGxlZFByb3BzIiwibWluQ291bnQiLCJwdXNoIiwicmVtb3ZlUHJvcGVydHkiLCJkaXNhYmxlZCIsImN1cnJlbnRWYWx1ZXMiLCJvcmlnaW5hbFNjaGVtYSIsImZsYXRTY2hlbWEiLCJjdXJyZW50RG9jdW1lbnQiLCJGb3JtV2FyblVuc2F2ZWQiLCJpc0NoYW5nZWQiLCJ3YXJuVW5zYXZlZENoYW5nZXMiLCJjaGlsZHJlbiIsInVzZVdhcm5PblVuc2F2ZWQiLCJnZXREYXRhIiwiY3VzdG9tQXJncyIsInN0YXRlIiwic3VibWl0Rm9ybUNhbGxiYWNrcyIsImZvcm0iLCJlbmRzV2l0aCIsImFyZ3MiLCJleGNsdWRlUmVtb3ZlZEZpZWxkcyIsImV4Y2x1ZGVIaWRkZW5GaWVsZHMiLCJyZXBsYWNlSW50bEZpZWxkcyIsImFkZEV4dHJhRmllbGRzIiwiZ2V0RmllbGROYW1lcyIsInBhcmVudFBhdGgiLCJ4IiwiY29tcGFjdFBhcmVudCIsInJ1bkNhbGxiYWNrcyIsImNhbGxiYWNrcyIsIml0ZXJhdG9yIiwiaW5pdENhbGxiYWNrIiwiaW5pdGlhbFN0YXRlIiwiaXNGaXJzdFJlbmRlciIsInVzZVJlZiIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJsYXlvdXQiLCJyZXBlYXRFcnJvcnMiLCJzaG93UmVtb3ZlIiwic2hvd0RlbGV0ZSIsInN1Y2Nlc3NGb3JtQ2FsbGJhY2tzIiwiZmFpbHVyZUZvcm1DYWxsYmFja3MiLCJpbnRsIiwidXNlSW50bENvbnRleHQiLCJzZXRFcnJvcnMiLCJ1c2VTdGF0ZSIsInRocm93RXJyb3IiLCJlcnJvciIsImZvcm1FcnJvcnMiLCJnZXRFcnJvcnMiLCJjb25zb2xlIiwibG9nIiwicHJldkVycm9ycyIsInNldERlbGV0ZWRWYWx1ZXMiLCJzZXRDYWxsYmFja3MiLCJzZXRDdXJyZW50VmFsdWVzIiwic2V0Q3VycmVudERvY3VtZW50IiwicmVmZXRjaEZvcm0iLCJzZXREaXNhYmxlZCIsInN1Y2Nlc3MiLCJzZXRTdWNjZXNzIiwiY2xlYXJGb3JtIiwib3B0aW9uc0RvY3VtZW50IiwiZm9ybVJlZiIsIm11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrIiwibXV0YXRpb25UeXBlIiwic3VjY2Vzc0NhbGxiYWNrIiwidGhpcyIsIm11dGF0aW9uRXJyb3JDYWxsYmFjayIsImVycm9yQ2FsbGJhY2siLCJzdWJtaXRGb3JtIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImNvbnRleHROYW1lIiwibXV0YWJsZUZpZWxkcyIsInN1Ym1pdENhbGxiYWNrIiwibmV3TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2siLCJlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2siLCJzdWNjZXNzQ29tcG9uZW50IiwiRm9ybUNvbXBvbmVudHMiLCJmb3JtTGF5b3V0UHJvcHMiLCJmb3JtR3JvdXBQcm9wcyIsInN1Ym1pdExhYmVsIiwiY2FuY2VsTGFiZWwiLCJyZXZlcnRMYWJlbCIsImNhbmNlbENhbGxiYWNrIiwicmV2ZXJ0Q2FsbGJhY2siLCJpdGVtUHJvcGVydGllcyIsImNvbW1vblByb3BzIiwiZG9jQ2xhc3NOYW1lIiwibW9kZWxOYW1lIiwidG9Mb3dlckNhc2UiLCJmb3JtU3VibWl0UHJvcHMiLCJncm91cCIsImZvcm1Qcm9wcyIsImNsYXNzTmFtZSIsInN1Ym1pdFByb3BzIiwiZ2V0Q2hpbGRyZW5Qcm9wcyIsImRvY3VtZW50VGl0bGUiLCJ0aXRsZSIsImRlbGV0ZURvY3VtZW50Q29uZmlybSIsImZvcm1hdE1lc3NhZ2UiLCJjb25maXJtIiwidGhlbiIsIm11dGF0aW9uUmVzdWx0IiwicmVtb3ZlU3VjY2Vzc0NhbGxiYWNrIiwiY2F0Y2giLCJpc05vdFNhbWVEb2N1bWVudCIsIlByb3ZpZGVyIiwic3VibWl0Rm9ybUNvbnRleHQiLCJhZGRUb0RlbGV0ZWRWYWx1ZXMiLCJwcmV2RGVsZXRlZFZhbHVlcyIsInVwZGF0ZUN1cnJlbnRWYWx1ZXMiLCJuZXdWYWx1ZXMiLCJjaGFuZ2VDYWxsYmFjayIsIm5ld1N0YXRlIiwib2xkVmFsdWUiLCJnZXREb2N1bWVudCIsImdldExhYmVsIiwiZmllbGRMb2NhbGUiLCJhZGRUb1N1Ym1pdEZvcm0iLCJjYWxsYmFjayIsImNicyIsImFkZFRvU3VjY2Vzc0Zvcm0iLCJhZGRUb0ZhaWx1cmVGb3JtIiwiY2xlYXJGb3JtQ2FsbGJhY2tzIiwiY2xlYXJGaWVsZEVycm9ycyIsImdldEZpZWxkR3JvdXBzIiwiY29udGV4dCIsImNvbGxlY3Rpb25OYW1lIiwibGFiZWwiLCJmb3JtYXRMYWJlbCIsImRlZmF1bHRNZXNzYWdlIiwiZ2V0T3B0aW9uTGFiZWwiLCJvcHRpb24iLCJpbnRsSWQiLCJvcHRpb25zRnJvbUFyZ3MiLCJyZW1vdmVGaWVsZHMiLCJyZWxldmFudEZpZWxkcyIsImhpZGRlbiIsImlzSW50bEZpZWxkIiwiaW5pdEZpZWxkIiwiY29udHJvbCIsIml0ZW1GaWVsZFNjaGVtYSIsIml0ZW1EYXRhdHlwZSIsImludGxLZXlzIiwiZ2V0SW50bEtleXMiLCJpbnRsSW5wdXQiLCJpbnB1dFByb3BlcnRpZXMiLCJkZXNjcmlwdGlvbiIsImdldEludGxMYWJlbCIsImlzRGVzY3JpcHRpb24iLCJnZXREZXNjcmlwdGlvbiIsImhlbHAiLCJoYW5kbGVGaWVsZFBhdGgiLCJmaWVsZFBhdGgiLCJoYW5kbGVQZXJtaXNzaW9ucyIsImNyZWF0ZUZpZWxkIiwicGFyZW50RmllbGROYW1lIiwiaGFuZGxlRmllbGRQYXJlbnQiLCJhcnJheUZpZWxkIiwiY3JlYXRlQXJyYXlTdWJGaWVsZCIsIm5lc3RlZFNjaGVtYSIsIm5lc3RlZElucHV0IiwibmVzdGVkRmllbGRzIiwic3ViRmllbGROYW1lIiwiaGFuZGxlRmllbGRDaGlsZHJlbiIsInN1YkZpZWxkU2NoZW1hIiwic3ViRmllbGQiLCJncm91cHNXaXRoRmllbGRzIiwiZyIsImdyb3VwRmllbGRzIiwiZGVmYXVsdEdyb3VwRmllbGRzIiwib3JkZXIiLCJjaGFuZ2VkRG9jdW1lbnQiLCJjb2xsZWN0aW9uIiwib2JqVmFsdWUiLCJvdGhWYWx1ZSIsImRlYnVnVHJhbnNpdGlvbnMiLCJ1c2VCbG9ja1RyYW5zaXRpb24iLCJzaG91bGRCbG9jayIsImdldEJsb2NrZWRNZXNzYWdlIiwidW5ibG9ja1JlZiIsImlzQmxvY2tpbmciLCJvblVuYmxvY2siLCJvbkJsb2NrZWQiLCJldnQiLCJtZXNzYWdlIiwicmV0dXJuVmFsdWUiLCJibG9jayIsImJsb2NrQmVmb3JlVW5sb2FkIiwiQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFIiwiVU5CTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUiLCJzZXRDb25maXJtYXRpb25NZXNzYWdlIiwiYmxvY2tFdmVudCIsIkV2ZW50IiwiZGlzcGF0Y2hFdmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1bmJsb2NrRXZlbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25iZWZvcmV1bmxvYWQiLCJWdWxjYW5Db21wb25lbnRzUHJvdmlkZXIiLCJkZWZhdWx0VnVsY2FuQ29tcG9uZW50cyIsImRlZmF1bHRDb3JlQ29tcG9uZW50cyIsImRlZmF1bHRGb3JtQ29tcG9uZW50cyIsImVycm9yQ29udGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtZXNzYWdlUHJvcHMiLCJ2YWx1ZXMiLCJwcm9wZXJ0aWVzIiwiZXJyb3JOYW1lIiwic2xpY2UiLCJleGNlcHRpb24iLCJodG1sIiwiZGVmYXVsdFByb3BzIiwiZ2V0Q2hhcmFjdGVyQ291bnRzIiwibWF4IiwiY2hhcmFjdGVyQ291bnQiLCJjaGFyc1JlbWFpbmluZyIsImNoYXJzQ291bnQiLCJnZXRQYXRoIiwiZ2V0SW5wdXROYW1lIiwiZ2V0Rm9ybUlucHV0IiwiaW5wdXROYW1lIiwiY291bnRGcm9tUHJvcHMiLCJpbnRsT3JSZWd1bGFyVmFsdWUiLCJnZXRDaGFyYWN0ZXJDb3VudHNGcm9tUHJvcHMiLCJjaGFyc0NvdW50U3RhdGUiLCJzZXRDaGFyYWN0ZXJDb3VudHMiLCJ1cGRhdGVDaGFyYWN0ZXJDb3VudCIsInNob3dDaGFyc1JlbWFpbmluZyIsImdldFZhbHVlIiwibnVsbFZhbHVlIiwiaXNBcnJheUZpZWxkIiwiZm9ybUNvbXBvbmVudHMiLCJpc09iamVjdEZpZWxkIiwiZmNpUHJvcHMiLCJpbnB1dFR5cGUiLCJoYW5kbGVDaGFuZ2UiLCJwYXJzZUludCIsInVwZGF0ZVZhbHVlIiwiY2xlYXJGaWVsZCIsImZvcm1JbnB1dCIsImZjaSIsImZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzIiwiaW5wdXRDbGFzc05hbWUiLCJiZWZvcmVDb21wb25lbnQiLCJhZnRlckNvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudCIsImhhc0Vycm9ycyIsImlucHV0Q2xhc3MiLCJ3aGl0ZWxpc3RJbnB1dFByb3BzIiwib25DaGFuZ2UiLCJpbnB1dFZhbHVlIiwidGFyZ2V0IiwiY2hlY2tlZCIsIkNvbXBvbmVudHMiLCJnZXRQcm9wZXJ0aWVzIiwiRm9ybUlucHV0Iiwib25DbGljayIsInJlbmRlckNsZWFyIiwiZGFuZ2VyIiwiZ2V0SHRtbElucHV0UHJvcHMiLCJvbkJsdXIiLCJxdWVyeVdhaXRzRm9yVmFsdWUiLCJxdWVyeVRleHQiLCJsb2FkRmllbGRRdWVyeSIsInVzZUxhenlRdWVyeSIsInZhbHVlSXNFbXB0eSIsImV4dHJhUHJvcHMiLCJxdWVyeURhdGEiLCJxdWVyeUVycm9yIiwib3B0aW9uc0Z1bmN0aW9uIiwiaXNWYWxpZEVsZW1lbnQiLCJjbG9uZUVsZW1lbnQiLCJwcm9wVHlwZXMiLCJmb3J3YXJkUmVmIiwicmVmIiwib3RoZXJQcm9wcyIsIm9uU3VibWl0IiwiYW5jaG9yTmFtZSIsImNvbGxhcHNlZCIsInRvZ2dsZSIsInNldENvbGxhcHNlZCIsInN0YXJ0Q29sbGFwc2VkIiwiaXNIaWRkZW4iLCJoZWFkaW5nIiwiYWRtaW5zT25seSIsImlzQWRtaW4iLCJMb2NhbGVzIiwiZGVmYXVsdEluZGV4IiwidmFyaWFudCIsImluZGV4IiwiZSIsImNhbkRlbGV0ZURvY3VtZW50Iiwibm9kZSIsImZ1bmMiLCJjbGFzc2VzIiwiYWRkSXRlbSIsIkJlZm9yZUNvbXBvbmVudCIsIkFmdGVyQ29tcG9uZW50IiwiaXNEZWxldGVkIiwib3Blbk5lc3RlZCIsInZpc2libGVJdGVtSW5kZXhlcyIsImN1cnJlbnRJbmRleCIsInN1YkRvY3VtZW50Iiwic3ViRG9jdW1lbnRJbmR4IiwiY29tcHV0ZVZpc2libGVJbmRleCIsIm1heENvdW50IiwiYXJyYXlMZW5ndGgiLCJzaW5nbGVWYWx1ZSIsIm5lc3RlZEFycmF5RXJyb3JzIiwidmlzaWJsZUl0ZW1JbmRleCIsIml0ZW1JbmRleCIsInJlbW92ZUl0ZW0iLCJoaWRlUmVtb3ZlIiwid2lkdGgiLCJoZWlnaHQiLCJ4bWxucyIsInZpZXdCb3giLCJmaWxsIiwic2l6ZSIsImJvb2wiLCJpc1JlcXVpcmVkIiwiaGlkZUxhYmVsIiwiY29udGVudCIsInJlbW92ZUJ1dHRvbiIsImljb25CdXR0b24iLCJ0YWJJbmRleCIsIm51bWJlciIsImNvbnRleHRUeXBlcyIsImludGxTaGFwZSIsIm9uZU9mVHlwZSIsIm5lc3RlZE9iamVjdEVycm9ycyIsIkhUTUxJbnB1dEFkYXB0ZXIiLCJvdGhlcklucHV0UHJvcGVydGllcyIsImh0bWxGb3IiLCJIVE1MU2VsZWN0QWRhcHRlciIsIm11bHRpcGxlIiwiVnVsY2FuQ3VycmVudFVzZXJQcm92aWRlciIsIkNvbXBvbmVudHNUYWJsZSIsImNvcmVDb21wb25lbnRzIiwiY29tcG9uZW50RXhpc3RzIiwiZ2V0UmF3Q29tcG9uZW50IiwicmF3Q29tcG9uZW50IiwiaW5zdGFudGlhdGVDb21wb25lbnQiLCJjb21wb25lbnQiLCJpc1JlYWN0Q29tcG9uZW50IiwiQ29tcG9uZW50IiwiJCR0eXBlb2YiLCJyZW5kZXIiLCJkZWxheWVkQ29tcG9uZW50IiwibWVyZ2VXaXRoQ29tcG9uZW50cyIsIm15Q29tcG9uZW50cyJdLCJtYXBwaW5ncyI6IjJCQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQTBEZixPQXJEQUYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFP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bkIsZ0JBQWdCbm5CLEdBNkV2QixFQUFBc25CLGdCQUFtQnRuQixHQUN2QixFQUFBbW5CLGdCQUFnQm5uQixHQUFNdW5CLGFBMERsQixFQUFBQyxxQkFBdUIsQ0FDbENDLEVBQ0F4bEIsS0FFQSxHQUFLd2xCLEVBS0ssSUFBSSxVQUFNekUsZUFBZXlFLEdBQ2pDLE9BQU8sVUFBTXhFLGFBQWF3RSxFQUFXeGxCLEdBQ2hDLEdBQ2dCLG1CQUFkd2xCLEdBQ1BBLEVBQVVwbUIsV0FDVm9tQixFQUFVcG1CLFVBQVVxbUIsaUJBQ3BCLENBQ0EsTUFBTUMsRUFBWUYsRUFDbEIsT0FBTyx3QkFBQ0UsRUFBUyxpQkFBSzFsQixJQUNqQixHQUF5QixtQkFBZHdsQixFQUNoQixPQUFPQSxFQUFVeGxCLEdBQ1osR0FDZ0IsaUJBQWR3bEIsR0FDUEEsRUFBVUcsVUFDVkgsRUFBVUksT0FDVixDQUNBLE1BQU1GLEVBQVlGLEVBQ2xCLE9BQU8sd0JBQUNFLEVBQVMsaUJBQUsxbEIsSUFFdEIsT0FBT3dsQixFQXZCUCxPQUFPLE1Ba0RFLEVBQUFLLGlCQUFvQjluQixHQUN2QmlDLElBQ04sTUFBTTBsQixFQUFZLEVBQUE1RixXQUFXL2hCLElBQVMsS0FDdEMsT0FBTzJuQixHQUFhLHdCQUFDQSxFQUFTLGlCQUFLMWxCLEtBYzFCLEVBQUE4bEIsb0JBQXVCQyxHQUNsQ0EsRUFBYywrQkFBTSxFQUFBakcsWUFBZWlHLEdBQWlCLEVBQUFqRyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyOCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCJpbXBvcnQgeyBkZXByZWNhdGUgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgVnVsY2FuQ29tcG9uZW50c0NvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5cbmV4cG9ydCBjb25zdCBWdWxjYW5Db21wb25lbnRzQ29uc3VtZXIgPSBWdWxjYW5Db21wb25lbnRzQ29udGV4dC5Db25zdW1lcjtcblxuZXhwb3J0IGNvbnN0IHVzZVZ1bGNhbkNvbXBvbmVudHMgPSAoKSA9PiB1c2VDb250ZXh0KFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHdpdGhWdWxjYW5Db21wb25lbnRzID0gKEMpID0+IChwcm9wcykgPT4ge1xuICBjb25zdCB2dWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBkZXByZWNhdGUoXG4gICAgXCIwLjAuMFwiLFxuICAgIFwiVXNpbmcgd2l0aFZ1bGNhbkNvbXBvbmVudHMgSE9DID0+IHByZWZlciB1c2VWdWxjYW5Db21wb25lbnRzIHdpdGggaG9va3NcIlxuICApO1xuICByZXR1cm4gPEMgdnVsY2FuQ29tcG9uZW50cz17dnVsY2FuQ29tcG9uZW50c30gey4uLnByb3BzfSAvPjtcbn07XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbnRlcmZhY2UgRm9ybUNvbnRleHRWYWx1ZSB7XG4gIGFkZFRvRGVsZXRlZFZhbHVlczogRnVuY3Rpb247XG4gIGFkZFRvRmFpbHVyZUZvcm06IEZ1bmN0aW9uO1xuICBhZGRUb1N1Ym1pdEZvcm06IEZ1bmN0aW9uO1xuICBhZGRUb1N1Y2Nlc3NGb3JtOiBGdW5jdGlvbjtcbiAgY2xlYXJGb3JtOiBGdW5jdGlvbjtcbiAgY2xlYXJGb3JtQ2FsbGJhY2tzOiBGdW5jdGlvbjtcbiAgY2xlYXJGaWVsZEVycm9yczogRnVuY3Rpb247XG4gIGN1cnJlbnRWYWx1ZXM6IG9iamVjdDtcbiAgZGVsZXRlZFZhbHVlczogQXJyYXk8YW55PjtcbiAgZXJyb3JzOiBBcnJheTxhbnk+O1xuICBnZXREb2N1bWVudDogRnVuY3Rpb247XG4gIGdldExhYmVsOiAoZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkTG9jYWxlPzogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIGluaXRpYWxEb2N1bWVudDogb2JqZWN0O1xuICBpc0NoYW5nZWQ6IGJvb2xlYW47XG4gIHJlZmV0Y2hGb3JtOiBGdW5jdGlvbjtcbiAgLy8gVE9ETzogd2UgZGVwcmVjYXRlIHRoaXMsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBhbGxvdyBhIGNoaWxkIHRvIHNldFN0YXRlIHRoaXMgd2F5XG4gIC8vIHNldEZvcm1TdGF0ZTogRnVuY3Rpb247XG4gIHN1Ym1pdEZvcm06IFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxGb3JtRWxlbWVudD5bXCJvblN1Ym1pdFwiXTtcbiAgdGhyb3dFcnJvcjogRnVuY3Rpb247XG4gIHVwZGF0ZUN1cnJlbnRWYWx1ZXM6IEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgRm9ybUNvbnRleHQgPVxuICBSZWFjdC5jcmVhdGVDb250ZXh0PEZvcm1Db250ZXh0VmFsdWUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBjb25zdCB1c2VGb3JtQ29udGV4dCA9ICgpID0+IHtcbiAgY29uc3QgZm9ybUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgaWYgKCFmb3JtQ29udGV4dClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkEgY29tcG9uZW50IGlzIHRyeWluZyB0byBhY2Nlc3MgZm9ybSBjb250ZXh0IGJ1dCBpdCBpcyB1bmRlZmluZWQuIFBsZWFzZSB3cmFwIHlvdXIgY29tcG9uZW50IHdpdGggYSA8Rm9ybT4uXCJcbiAgICApO1xuICByZXR1cm4gZm9ybUNvbnRleHQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL2kxOG5cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL3V0aWxzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9nZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvcC10eXBlc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvb21pdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXBvbGxvL2NsaWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvY29tcGFjdFwiKTsiLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7IER1bW15IH0gZnJvbSBcIi4vRHVtbXlcIjtcblxuLy8gV2UgbmVlZCB0aGlzIHRvIHNodXQgVHlwZVNjcmlwdCB1cFxuLy8gWW91IHNob3VsZCB1c2UgdGhlIFByb3ZpZGVyIHRvIGdldCB0aGUgcmlnaHQgZGVmYXVsdCB2YWx1ZXNcbmV4cG9ydCBjb25zdCBWdWxjYW5Db21wb25lbnRzQ29udGV4dCA9XG4gIFJlYWN0LmNyZWF0ZUNvbnRleHQ8UG9zc2libGVWdWxjYW5Db21wb25lbnRzPih7XG4gICAgQWxlcnQ6IER1bW15LFxuICAgIEJ1dHRvbjogRHVtbXksXG4gICAgRmllbGRFcnJvcnM6IER1bW15LFxuICAgIEZvcm06IER1bW15LFxuICAgIEZvcm1Db21wb25lbnQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRBdXRvY29tcGxldGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRDaGVja2JveDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXA6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnREYXRlOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50RGF0ZVRpbWU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnREZWZhdWx0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50RW1haWw6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRJbm5lcjogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudExpa2VydDogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudExvYWRlcjogRHVtbXksXG4gICAgRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50TnVtYmVyOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50UGFzc3dvcmQ6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRSYWRpb0dyb3VwOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50U2VsZWN0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGU6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRTdGF0aWNUZXh0OiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50VGV4dGFyZWE6IER1bW15LFxuICAgIEZvcm1Db21wb25lbnRUaW1lOiBEdW1teSxcbiAgICBGb3JtQ29tcG9uZW50VXJsOiBEdW1teSxcbiAgICBGb3JtRWxlbWVudDogRHVtbXksXG4gICAgRm9ybUVycm9yOiBEdW1teSxcbiAgICBGb3JtRXJyb3JzOiBEdW1teSxcbiAgICBGb3JtR3JvdXA6IER1bW15LFxuICAgIEZvcm1Hcm91cEhlYWRlcjogRHVtbXksXG4gICAgRm9ybUdyb3VwTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtSW50bDogRHVtbXksXG4gICAgRm9ybUludGxJdGVtTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtSW50bExheW91dDogRHVtbXksXG4gICAgRm9ybUxheW91dDogRHVtbXksXG4gICAgRm9ybU5lc3RlZEFycmF5OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dDogRHVtbXksXG4gICAgRm9ybU5lc3RlZEFycmF5TGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkRGl2aWRlcjogRHVtbXksXG4gICAgRm9ybU5lc3RlZEl0ZW06IER1bW15LFxuICAgIEZvcm1OZXN0ZWRJdGVtTGF5b3V0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkT2JqZWN0OiBEdW1teSxcbiAgICBGb3JtTmVzdGVkT2JqZWN0TGF5b3V0OiBEdW1teSxcbiAgICBGb3JtT3B0aW9uTGFiZWw6IER1bW15LFxuICAgIEZvcm1TdWJtaXQ6IER1bW15LFxuICAgIEZvcm1hdHRlZE1lc3NhZ2U6IER1bW15LFxuICAgIEljb246IER1bW15LFxuICAgIEljb25BZGQ6IER1bW15LFxuICAgIEljb25SZW1vdmU6IER1bW15LFxuICAgIExvYWRpbmc6IER1bW15LFxuICB9KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9waWNrXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiKTsiLCJpbXBvcnQgbWVyZ2UgZnJvbSBcImxvZGFzaC9tZXJnZVwiO1xuaW1wb3J0IGZpbmQgZnJvbSBcImxvZGFzaC9maW5kXCI7XG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIjtcbmltcG9ydCBzZXQgZnJvbSBcImxvZGFzaC9zZXRcIjtcbmltcG9ydCBzaXplIGZyb20gXCJsb2Rhc2gvc2l6ZVwiO1xuXG5pbXBvcnQgeyByZW1vdmVQcmVmaXgsIGZpbHRlclBhdGhzQnlQcmVmaXggfSBmcm9tIFwiLi9wYXRoX3V0aWxzXCI7XG5pbXBvcnQgeyBWdWxjYW5GaWVsZFNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5cbi8vIGFkZCBzdXBwb3J0IGZvciBuZXN0ZWQgcHJvcGVydGllc1xuZXhwb3J0IGNvbnN0IGRlZXBWYWx1ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgY29uc3QgcGF0aEFycmF5ID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBvYmogPSBvYmpbcGF0aEFycmF5W2ldXTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG4vLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTA5ODc5Ny9mYXN0ZXN0LXdheS10by1mbGF0dGVuLXVuLWZsYXR0ZW4tbmVzdGVkLWpzb24tb2JqZWN0c1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VyLCBwcm9wKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjdXIpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyBcIltcIiArIGkgKyBcIl1cIik7XG4gICAgICBpZiAobCA9PSAwKSByZXN1bHRbcHJvcF0gPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlO1xuICAgICAgZm9yICh2YXIgcCBpbiBjdXIpIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyBcIi5cIiArIHAgOiBwKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHJlc3VsdFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgfVxuICByZWN1cnNlKGRhdGEsIFwiXCIpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRW1wdHlWYWx1ZSA9ICh2YWx1ZSkgPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiIHx8XG4gIHZhbHVlID09PSBudWxsIHx8XG4gIHZhbHVlID09PSBcIlwiIHx8XG4gIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApO1xuXG4vKipcbiAqIE1lcmdlcyB2YWx1ZXMuIEl0IHRha2VzIGludG8gYWNjb3VudCB0aGUgY3VycmVudCwgb3JpZ2luYWwgYW5kIGRlbGV0ZWQgdmFsdWVzLFxuICogYW5kIHRoZSBtZXJnZSBwcm9kdWNlcyB0aGUgcHJvcGVyIHR5cGUgZm9yIHNpbXBsZSBvYmplY3RzIG9yIGFycmF5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqICBGb3JtIGNvbXBvbmVudCBwcm9wcy4gT25seSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciB0aGlzIGZ1bmN0aW9uIGFyZSBkb2N1bWVudGVkLlxuICogQHBhcmFtIHsqfSBwcm9wcy5jdXJyZW50VmFsdWVcbiAqICBDdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZFxuICogQHBhcmFtIHsqfSBwcm9wcy5kb2N1bWVudFZhbHVlXG4gKiAgT3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkXG4gKiBAcmV0dXJuIHsqfHVuZGVmaW5lZH1cbiAqICBNZXJnZWQgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG5vIG1lcmdlIHdhcyBwZXJmb3JtZWRcbiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlVmFsdWUgPSAoe1xuICBjdXJyZW50VmFsdWUsXG4gIGRvY3VtZW50VmFsdWUsXG4gIGRlbGV0ZWRWYWx1ZXM6IGRlbGV0ZWRGaWVsZHMsXG4gIHBhdGgsXG4gIGxvY2FsZSxcbiAgZGF0YXR5cGUsXG59KSA9PiB7XG4gIGlmIChsb2NhbGUpIHtcbiAgICAvLyBub3RlOiBpbnRsIGZpZWxkcyBhcmUgb2YgdHlwZSBPYmplY3QgYnV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIFN0cmluZ3NcbiAgICByZXR1cm4gY3VycmVudFZhbHVlIHx8IGRvY3VtZW50VmFsdWUgfHwgXCJcIjtcbiAgfVxuXG4gIC8vIG5vdGU6IHJldHJpZXZlIG5lc3RlZCBkZWxldGVkIHZhbHVlcyBpcyBwZXJmb3JtZWQgaGVyZSB0byBhdm9pZCBza2lwcGluZ1xuICAvLyB0aGUgbWVyZ2UgaW4gY2FzZSB0aGUgY3VycmVudCBmaWVsZCBpcyBub3QgaW4gYGN1cnJlbnRWYWx1ZXNgIGJ1dCBhIG5lc3RlZFxuICAvLyBwcm9wZXJ0eSBoYXMgYmVlbiByZW1vdmVkIGRpcmVjdGx5IGJ5IHBhdGhcbiAgY29uc3QgZGVsZXRlZFZhbHVlcyA9IGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMocGF0aCwgZGVsZXRlZEZpZWxkcyk7XG4gIGNvbnN0IGhhc0RlbGV0ZWRWYWx1ZXMgPSAhIXNpemUoZGVsZXRlZFZhbHVlcyk7XG4gIGlmIChcbiAgICAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpIHx8IGhhc0RlbGV0ZWRWYWx1ZXMpICYmXG4gICAgZmluZChkYXRhdHlwZSwgW1widHlwZVwiLCBBcnJheV0pXG4gICkge1xuICAgIHJldHVybiBtZXJnZShbXSwgZG9jdW1lbnRWYWx1ZSwgY3VycmVudFZhbHVlLCBkZWxldGVkVmFsdWVzKTtcbiAgfSBlbHNlIGlmIChcbiAgICAoaXNQbGFpbk9iamVjdChjdXJyZW50VmFsdWUpIHx8IGhhc0RlbGV0ZWRWYWx1ZXMpICYmXG4gICAgZmluZChkYXRhdHlwZSwgW1widHlwZVwiLCBPYmplY3RdKVxuICApIHtcbiAgICByZXR1cm4gbWVyZ2Uoe30sIGRvY3VtZW50VmFsdWUsIGN1cnJlbnRWYWx1ZSwgZGVsZXRlZFZhbHVlcyk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBsaXN0IG9mIGZpZWxkIG5hbWVzIHRvIGFuIG9iamVjdCBvZiBkZWxldGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfE9iamVjdC48c3RyaW5nfHN0cmluZz59IGRlbGV0ZWRGaWVsZHNcbiAqICBMaXN0IG9mIGRlbGV0ZWQgZmllbGQgbmFtZXMgb3IgcGF0aHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5PX0gYWNjdW11bGF0b3I9e31cbiAqICBWYWx1ZSB0byByZWR1Y2UgdGhlIHZhbHVlcyB0b1xuICogQHJldHVybiB7T2JqZWN0fEFycmF5fVxuICogIERlbGV0ZWQgdmFsdWVzLCB3aXRoIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lZCBieSB0YWtpbmcgdGhlIHJlY2VpdmVkIGRlbGV0ZWRcbiAqICBmaWVsZHMgYXMgcGF0aHNcbiAqIEBleGFtcGxlXG4gKiAgY29uc3QgZGVsZXRlZEZpZWxkcyA9IFtcbiAqICAgICdmaWVsZC5zdWJGaWVsZCcsXG4gKiAgICAnZmllbGQuc3ViRmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVsyXS5uYW1lJyxcbiAqICBdO1xuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoZGVsZXRlZEZpZWxkcyk7XG4gKiAgLy8gPT4geyAnZmllbGQnOiB7ICdzdWJGaWVsZCc6IG51bGwsICdzdWJGaWVsZEFycmF5JzogW251bGxdIH0sICdmaWVsZEFycmF5JzogW251bGwsIHVuZGVmaW5lZCwgeyBuYW1lOiBudWxsIH0gfVxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlZFZhbHVlcyA9IChkZWxldGVkRmllbGRzLCBhY2N1bXVsYXRvciA9IHt9KSA9PlxuICBkZWxldGVkRmllbGRzLnJlZHVjZShcbiAgICAoZGVsZXRlZFZhbHVlcywgcGF0aCkgPT4gc2V0KGRlbGV0ZWRWYWx1ZXMsIHBhdGgsIG51bGwpLFxuICAgIGFjY3VtdWxhdG9yXG4gICk7XG5cbi8qKlxuICogRmlsdGVycyB0aGUgZ2l2ZW4gZmllbGQgbmFtZXMgYnkgcHJlZml4LCByZW1vdmVzIGl0IGZyb20gZWFjaCBvbmUgb2YgdGhlbVxuICogYW5kIGNvbnZlcnQgdGhlIGxpc3QgdG8gYW4gb2JqZWN0IG9mIGRlbGV0ZWQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcHJlZml4XG4gKiAgUHJlZml4IHRvIGZpbHRlciBhbmQgcmVtb3ZlIGZyb20gZGVsZXRlZCBmaWVsZHNcbiAqIEBwYXJhbSB7c3RyaW5nW118T2JqZWN0LjxzdHJpbmd8c3RyaW5nPn0gZGVsZXRlZEZpZWxkc1xuICogIExpc3Qgb2YgZGVsZXRlZCBmaWVsZCBuYW1lcyBvciBwYXRoc1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXk9fSBhY2N1bXVsYXRvcj17fVxuICogIFZhbHVlIHRvIHJlZHVjZSB0aGUgdmFsdWVzIHRvXG4gKiBAcmV0dXJuIHtPYmplY3QuPHN0cmluZywgbnVsbD59XG4gKiAgT2JqZWN0IGtleWVkIHdpdGggdGhlIGdpdmVuIGRlbGV0ZWQgZmllbGRzLCB2YWx1ZWQgd2l0aCBgbnVsbGBcbiAqIEBleGFtcGxlXG4gKiAgY29uc3QgZGVsZXRlZEZpZWxkcyA9IFtcbiAqICAgICdmaWVsZC5zdWJGaWVsZCcsXG4gKiAgICAnZmllbGQuc3ViRmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVswXScsXG4gKiAgICAnZmllbGRBcnJheVsyXS5uYW1lJyxcbiAqICBdO1xuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoJ2ZpZWxkJywgZGVsZXRlZEZpZWxkcyk7XG4gKiAgLy8gPT4geyAnc3ViRmllbGQnOiBudWxsLCAnc3ViRmllbGRBcnJheSc6IFtudWxsXSB9XG4gKiAgZ2V0TmVzdGVkRGVsZXRlZFZhbHVlcygnZmllbGRBcnJheScsIGRlbGV0ZWRGaWVsZHMpO1xuICogIC8vID0+IHsgJzAnOiBudWxsLCAnMic6IHsgJ25hbWUnOiBudWxsIH0gfVxuICogIGdldE5lc3RlZERlbGV0ZWRWYWx1ZXMoJ2ZpZWxkQXJyYXknLCBkZWxldGVkRmllbGRzLCBbXSk7XG4gKiAgLy8gPT4gW251bGwsIHVuZGVmaW5lZCwgeyAnbmFtZSc6IG51bGwgfSBdXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROZXN0ZWREZWxldGVkVmFsdWVzID0gKFxuICBwcmVmaXgsXG4gIGRlbGV0ZWRGaWVsZHMsXG4gIGFjY3VtdWxhdG9yID0ge31cbikgPT5cbiAgZ2V0RGVsZXRlZFZhbHVlcyhcbiAgICByZW1vdmVQcmVmaXgocHJlZml4LCBmaWx0ZXJQYXRoc0J5UHJlZml4KHByZWZpeCwgZGVsZXRlZEZpZWxkcykpLFxuICAgIGFjY3VtdWxhdG9yXG4gICk7XG5cbi8vVE9ETzogY2hlY2sgaWYgaXQgc3RpbGwgd29ya3MgYXMgZXhwZWN0ZWRcbi8vIHByZXZpb3VzbHkgd2FzIGRhdGFUeXBlWzBdLnR5cGVcbmV4cG9ydCBjb25zdCBnZXRGaWVsZFR5cGUgPSAoZmllbGRTY2hlbWE6IFZ1bGNhbkZpZWxkU2NoZW1hKSA9PlxuICBmaWVsZFNjaGVtYS50eXBlO1xuLyoqXG4gKiBHZXQgYXBwcm9wcmlhdGUgbnVsbCB2YWx1ZSBmb3IgdmFyaW91cyBmaWVsZCB0eXBlc1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGF0eXBlXG4gKiBGaWVsZCdzIGRhdGF0eXBlIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBjb25zdCBnZXROdWxsVmFsdWUgPSAoZGF0YXR5cGUpID0+IHtcbiAgY29uc3QgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlKGRhdGF0eXBlKTtcbiAgaWYgKGZpZWxkVHlwZSA9PT0gQXJyYXkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSBCb29sZWFuKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PT0gU3RyaW5nKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSBOdW1iZXIpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfSBlbHNlIHtcbiAgICAvLyBub3JtYWxpemUgdG8gbnVsbFxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZGVidWdcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3VuaXFcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ludGVyc2VjdGlvblwiKTsiLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWdWxjYW5DdXJyZW50VXNlckNvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5cbmV4cG9ydCBjb25zdCBWdWxjYW5DdXJyZW50VXNlckNvbnN1bWVyID0gVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0LkNvbnN1bWVyO1xuXG5leHBvcnQgY29uc3QgdXNlVnVsY2FuQ3VycmVudFVzZXIgPSAoKSA9PiB1c2VDb250ZXh0KFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dCk7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFZ1bGNhblVzZXIgfSBmcm9tIFwiQHZ1bGNhbmpzL3Blcm1pc3Npb25zXCI7XG5cbmV4cG9ydCB0eXBlIFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dFR5cGUgPVxuICB8IHsgY3VycmVudFVzZXI6IFZ1bGNhblVzZXIgfCBudWxsOyBsb2FkaW5nOiBmYWxzZSB9XG4gIHwgeyBsb2FkaW5nOiB0cnVlOyBjdXJyZW50VXNlcjogYW55IH07XG4vLyBXZSBuZWVkIHRoaXMgdG8gc2h1dCBUeXBlU2NyaXB0IHVwXG4vLyBZb3Ugc2hvdWxkIHVzZSB0aGUgUHJvdmlkZXIgdG8gZ2V0IHRoZSByaWdodCBkZWZhdWx0IHZhbHVlc1xuZXhwb3J0IGNvbnN0IFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dCA9XG4gIFJlYWN0LmNyZWF0ZUNvbnRleHQ8VnVsY2FuQ3VycmVudFVzZXJDb250ZXh0VHlwZT4oe1xuICAgIGN1cnJlbnRVc2VyOiBudWxsLFxuICAgIGxvYWRpbmc6IGZhbHNlLFxuICB9KTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGluZ3NcIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tZXJnZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvc2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc0VtcHR5XCIpOyIsIi8qXG4gKiBTY2hlbWEgY29udmVydGVyL2dldHRlcnNcbiAqL1xuaW1wb3J0IHsgY2FuQ3JlYXRlRmllbGQsIGNhblVwZGF0ZUZpZWxkIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgVnVsY2FuRmllbGRTY2hlbWEsIFZ1bGNhblNjaGVtYSB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFR5cGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKiBnZXR0ZXJzICovXG4vLyBmaWx0ZXIgb3V0IGZpZWxkcyB3aXRoIFwiLlwiIG9yIFwiJFwiXG5leHBvcnQgY29uc3QgZ2V0VmFsaWRGaWVsZHMgPSAoc2NoZW1hKSA9PiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihcbiAgICAoZmllbGROYW1lKSA9PiAhZmllbGROYW1lLmluY2x1ZGVzKFwiJFwiKSAmJiAhZmllbGROYW1lLmluY2x1ZGVzKFwiLlwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlYWRhYmxlRmllbGRzID0gKHNjaGVtYSkgPT4ge1xuICAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICByZXR1cm4gZ2V0VmFsaWRGaWVsZHMoc2NoZW1hKS5maWx0ZXIoXG4gICAgKGZpZWxkTmFtZSkgPT4gc2NoZW1hW2ZpZWxkTmFtZV0uY2FuUmVhZCB8fCBzY2hlbWFbZmllbGROYW1lXS52aWV3YWJsZUJ5XG4gICk7XG59O1xuXG4vKlxuXG5Db252ZXJ0IGEgbmVzdGVkIFNpbXBsZVNjaGVtYSBzY2hlbWEgaW50byBhIEpTT04gb2JqZWN0XG5JZiBmbGF0dGVuID0gdHJ1ZSwgd2lsbCBjcmVhdGUgYSBmbGF0IG9iamVjdCBpbnN0ZWFkIG9mIG5lc3RlZCB0cmVlXG5cbi8qIHBlcm1pc3Npb25zICovXG5cbi8qKlxuICogQG1ldGhvZCBNb25nby5Db2xsZWN0aW9uLmdldEluc2VydGFibGVGaWVsZHNcbiAqIEdldCBhbiBhcnJheSBvZiBhbGwgZmllbGRzIGVkaXRhYmxlIGJ5IGEgc3BlY2lmaWMgdXNlciBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gdXNlciDigJMgdGhlIHVzZXIgZm9yIHdoaWNoIHRvIGNoZWNrIGZpZWxkIHBlcm1pc3Npb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbnNlcnRhYmxlRmllbGRzID0gZnVuY3Rpb24gKHNjaGVtYSwgdXNlcikge1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihmdW5jdGlvbiAoZmllbGROYW1lKSB7XG4gICAgdmFyIGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgcmV0dXJuIGNhbkNyZWF0ZUZpZWxkKHVzZXIsIGZpZWxkKTtcbiAgfSk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgTW9uZ28uQ29sbGVjdGlvbi5nZXRFZGl0YWJsZUZpZWxkc1xuICogR2V0IGFuIGFycmF5IG9mIGFsbCBmaWVsZHMgZWRpdGFibGUgYnkgYSBzcGVjaWZpYyB1c2VyIGZvciBhIGdpdmVuIGNvbGxlY3Rpb24gKGFuZCBvcHRpb25hbGx5IGRvY3VtZW50KVxuICogQHBhcmFtIHtPYmplY3R9IHVzZXIg4oCTIHRoZSB1c2VyIGZvciB3aGljaCB0byBjaGVjayBmaWVsZCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVGaWVsZHMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1c2VyLCBkb2N1bWVudCkge1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihmdW5jdGlvbiAoZmllbGROYW1lKSB7XG4gICAgdmFyIGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgcmV0dXJuIGNhblVwZGF0ZUZpZWxkKHVzZXIsIGZpZWxkLCBkb2N1bWVudCk7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzO1xufTtcblxuY29uc3QgaXNOZXN0ZWRTY2hlbWEgPSAoc2NoZW1hOiBhbnkpOiBzY2hlbWEgaXMgVnVsY2FuU2NoZW1hID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCI7XG59O1xuXG4vKipcbiAqIFZ1bGNhbiBTY2hlbWEgPT4gRm9ybSBTY2hlbWFcbiAqIFRPRE86IHR5cGUgdGhpcyBiZXR0ZXJcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgY29udmVydFNjaGVtYSA9IChcbiAgc2NoZW1hOiBWdWxjYW5TY2hlbWEsXG4gIG9wdGlvbnM6IHsgZmxhdHRlbj86IGJvb2xlYW47IHJlbW92ZUFycmF5cz86IGJvb2xlYW4gfSA9IHt9XG4pID0+IHtcbiAgY29uc3QgeyBmbGF0dGVuID0gZmFsc2UsIHJlbW92ZUFycmF5cyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IGpzb25TY2hlbWEgPSB7fTtcblxuICBPYmplY3Qua2V5cyhzY2hlbWEpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xuICAgIC8vIGV4Y2x1ZGUgYXJyYXkgZmllbGRzXG4gICAgaWYgKHJlbW92ZUFycmF5cyAmJiBmaWVsZE5hbWUuaW5jbHVkZXMoXCIkXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXh0cmFjdCBzY2hlbWFcbiAgICBqc29uU2NoZW1hW2ZpZWxkTmFtZV0gPSBnZXRGaWVsZFNjaGVtYShmaWVsZE5hbWUsIHNjaGVtYSk7XG5cbiAgICAvLyBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIG5lc3RlZCBmaWVsZFxuICAgIC8vIGFuZCBnZXQgaXRzIHNjaGVtYSBpZiBwb3NzaWJsZSBvciBpdHMgdHlwZSBvdGhlcndpc2VcbiAgICBjb25zdCBzdWJTY2hlbWFPclR5cGUgPSBnZXROZXN0ZWRGaWVsZFNjaGVtYU9yVHlwZShmaWVsZE5hbWUsIHNjaGVtYSk7XG4gICAgaWYgKHN1YlNjaGVtYU9yVHlwZSkge1xuICAgICAgLy8gcmVtZW1iZXIgdGhlIHN1YnNjaGVtYSBpZiBpdCBleGlzdHMsIGFsbG93IHRvIGN1c3RvbWl6ZSBsYWJlbHMgZm9yIGVhY2ggZ3JvdXAgb2YgaXRlbXMgZm9yIGFycmF5cyBvZiBvYmplY3RzXG4gICAgICBqc29uU2NoZW1hW2ZpZWxkTmFtZV0uYXJyYXlGaWVsZFNjaGVtYSA9IGdldEZpZWxkU2NoZW1hKFxuICAgICAgICBgJHtmaWVsZE5hbWV9LiRgLFxuICAgICAgICBzY2hlbWFcbiAgICAgICk7XG5cbiAgICAgIC8vIG5lc3RlZCBzY2hlbWEgY2FuIGJlIGEgZmllbGQgc2NoZW1hICh7dHlwZSwgY2FuUmVhZCwgZXRjLn0pIChjb252ZXJ0ZWRTY2hlbWEgd2lsbCBiZSBudWxsKVxuICAgICAgLy8gb3IgYSBzY2hlbWEgb24gaXRzIG93biB3aXRoIHN1YmZpZWxkcyAoY29udmVydGVkU2NoZW1hIHdpbGwgcmV0dXJuIHNtdGgpXG4gICAgICBpZiAoaXNOZXN0ZWRTY2hlbWEoc3ViU2NoZW1hT3JUeXBlKSkge1xuICAgICAgICAvLyBjYWxsIGNvbnZlcnRTY2hlbWEgcmVjdXJzaXZlbHkgb24gdGhlIHN1YlNjaGVtYVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRTdWJTY2hlbWEgPSBjb252ZXJ0U2NoZW1hKHN1YlNjaGVtYU9yVHlwZSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIHN1YlNjaGVtYSBpcyBhIGZ1bGwgc2NoZW1hIHdpdGggbXVsdGlwbGUgZmllbGRzIChlZyBhcnJheSBvZiBvYmplY3RzKVxuICAgICAgICBpZiAoZmxhdHRlbikge1xuICAgICAgICAgIGpzb25TY2hlbWEgPSB7IC4uLmpzb25TY2hlbWEsIC4uLmNvbnZlcnRlZFN1YlNjaGVtYSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25TY2hlbWFbZmllbGROYW1lXS5zY2hlbWEgPSBjb252ZXJ0ZWRTdWJTY2hlbWE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1YlNjaGVtYSBpcyBhIHNpbXBsZSBmaWVsZCBpbiB0aGlzIGNhc2UgKGVnIGFycmF5IG9mIG51bWJlcnMpXG4gICAgICAgIGpzb25TY2hlbWFbZmllbGROYW1lXS5pc1NpbXBsZUFycmF5RmllbGQgPSB0cnVlOyAvL2dldEZpZWxkU2NoZW1hKGAke2ZpZWxkTmFtZX0uJGAsIHNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGpzb25TY2hlbWE7XG59O1xuXG4vKlxuXG5HZXQgYSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWVsZCdzIHNjaGVtYVxuXG4qL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkU2NoZW1hID0gKGZpZWxkTmFtZTogc3RyaW5nLCBzY2hlbWE6IFZ1bGNhblNjaGVtYSkgPT4ge1xuICBsZXQgZmllbGRTY2hlbWEgPSB7fTtcbiAgc2NoZW1hUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBzY2hlbWFbZmllbGROYW1lXT8uW3Byb3BlcnR5XTtcbiAgICBpZiAocHJvcGVydHlWYWx1ZSkge1xuICAgICAgZmllbGRTY2hlbWFbcHJvcGVydHldID0gcHJvcGVydHlWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmllbGRTY2hlbWE7XG59O1xuXG4vLyB0eXBlIGlzIGFuIGFycmF5IGR1ZSB0byB0aGUgcG9zc2liaWxpdHkgb2YgdXNpbmcgU2ltcGxlU2NoZW1hLm9uZU9mXG4vLyByaWdodCBub3cgd2Ugc3VwcG9ydCBvbmx5IGZpZWxkcyB3aXRoIG9uZSB0eXBlXG5leHBvcnQgY29uc3QgZ2V0U2NoZW1hVHlwZSA9IChmaWVsZFNjaGVtYTogVnVsY2FuRmllbGRTY2hlbWEpID0+XG4gIGdldEZpZWxkVHlwZShmaWVsZFNjaGVtYSk7XG5cbmNvbnN0IGdldEFycmF5TmVzdGVkU2NoZW1hID0gKGZpZWxkTmFtZTogc3RyaW5nLCBzY2hlbWE6IFZ1bGNhblNjaGVtYSkgPT4ge1xuICBjb25zdCBhcnJheUl0ZW1TY2hlbWEgPSBzY2hlbWFbYCR7ZmllbGROYW1lfS4kYF07XG4gIGNvbnN0IG5lc3RlZFNjaGVtYSA9IGFycmF5SXRlbVNjaGVtYSAmJiBnZXRTY2hlbWFUeXBlKGFycmF5SXRlbVNjaGVtYSk7XG4gIHJldHVybiBuZXN0ZWRTY2hlbWE7XG59O1xuXG4vLyBUT0RPOiBub3QgMTAwJSBpdCdzIHZhbGlkIHdpdGggY3VycmVudCBpbXBsZW1lbnRhdGlvblxuY29uc3QgaXNOZXN0ZWRTY2hlbWFGaWVsZCA9IChmaWVsZFNjaGVtYTogVnVsY2FuRmllbGRTY2hlbWEpID0+IHtcbiAgY29uc3QgZmllbGRUeXBlID0gZ2V0U2NoZW1hVHlwZShmaWVsZFNjaGVtYSk7XG4gIHJldHVybiBmaWVsZFR5cGUgJiYgdHlwZW9mIGZpZWxkVHlwZSA9PT0gXCJvYmplY3RcIjtcbn07XG5jb25zdCBnZXRPYmplY3ROZXN0ZWRTY2hlbWEgPSAoZmllbGROYW1lOiBzdHJpbmcsIHNjaGVtYTogVnVsY2FuU2NoZW1hKSA9PiB7XG4gIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gIGlmICghaXNOZXN0ZWRTY2hlbWFGaWVsZChmaWVsZFNjaGVtYSkpIHJldHVybiBudWxsO1xuICBjb25zdCBuZXN0ZWRTY2hlbWEgPSBmaWVsZFNjaGVtYSAmJiBnZXRTY2hlbWFUeXBlKGZpZWxkU2NoZW1hKTtcbiAgcmV0dXJuIG5lc3RlZFNjaGVtYTtcbn07XG4vKlxuXG5HaXZlbiBhbiBhcnJheSBmaWVsZCwgZ2V0IGl0cyBuZXN0ZWQgc2NoZW1hXG5JZiB0aGUgZmllbGQgaXMgbm90IGFuIG9iamVjdCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3ViZmllbGQgdHlwZSBpbnN0ZWFkXG4qL1xuZXhwb3J0IGNvbnN0IGdldE5lc3RlZEZpZWxkU2NoZW1hT3JUeXBlID0gKGZpZWxkTmFtZSwgc2NoZW1hKSA9PiB7XG4gIGNvbnN0IGFycmF5SXRlbVNjaGVtYSA9IGdldEFycmF5TmVzdGVkU2NoZW1hKGZpZWxkTmFtZSwgc2NoZW1hKTtcbiAgaWYgKCFhcnJheUl0ZW1TY2hlbWEpIHtcbiAgICAvLyBsb29rIGZvciBhbiBvYmplY3Qgc2NoZW1hXG4gICAgY29uc3Qgb2JqZWN0SXRlbVNjaGVtYSA9IGdldE9iamVjdE5lc3RlZFNjaGVtYShmaWVsZE5hbWUsIHNjaGVtYSk7XG4gICAgLy8gbm8gc2NoZW1hIHdhcyBmb3VuZFxuICAgIGlmICghb2JqZWN0SXRlbVNjaGVtYSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG9iamVjdEl0ZW1TY2hlbWE7XG4gIH1cbiAgcmV0dXJuIGFycmF5SXRlbVNjaGVtYTtcbn07XG5cbmV4cG9ydCBjb25zdCBzY2hlbWFQcm9wZXJ0aWVzID0gW1xuICBcInR5cGVcIixcbiAgXCJsYWJlbFwiLFxuICBcIm9wdGlvbmFsXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJtaW5cIixcbiAgXCJtYXhcIixcbiAgXCJleGNsdXNpdmVNaW5cIixcbiAgXCJleGNsdXNpdmVNYXhcIixcbiAgXCJtaW5Db3VudFwiLFxuICBcIm1heENvdW50XCIsXG4gIFwiYWxsb3dlZFZhbHVlc1wiLFxuICBcInJlZ0V4XCIsXG4gIFwiYmxhY2tib3hcIixcbiAgXCJ0cmltXCIsXG4gIFwiY3VzdG9tXCIsXG4gIFwiZGVmYXVsdFZhbHVlXCIsXG4gIFwiYXV0b1ZhbHVlXCIsXG4gIFwiaGlkZGVuXCIsIC8vIGhpZGRlbjogdHJ1ZSBtZWFucyB0aGUgZmllbGQgaXMgbmV2ZXIgc2hvd24gaW4gYSBmb3JtIG5vIG1hdHRlciB3aGF0XG4gIFwibXVzdENvbXBsZXRlXCIsIC8vIG11c3RDb21wbGV0ZTogdHJ1ZSBtZWFucyB0aGUgZmllbGQgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbXBsZXRlIHByb2ZpbGVcbiAgXCJmb3JtXCIsIC8vIGZvcm0gcGxhY2Vob2xkZXJcbiAgXCJpbnB1dFByb3BlcnRpZXNcIiwgLy8gZm9ybSBwbGFjZWhvbGRlclxuICBcIml0ZW1Qcm9wZXJ0aWVzXCIsXG4gIFwiY29udHJvbFwiLCAvLyBTbWFydEZvcm0gY29udHJvbCAoU3RyaW5nIG9yIFJlYWN0IGNvbXBvbmVudClcbiAgXCJpbnB1dFwiLCAvLyBTbWFydEZvcm0gY29udHJvbCAoU3RyaW5nIG9yIFJlYWN0IGNvbXBvbmVudClcbiAgXCJhdXRvZm9ybVwiLCAvLyBsZWdhY3kgZm9ybSBwbGFjZWhvbGRlcjsgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAobm90IHVzZWQgYW55bW9yZSlcbiAgXCJvcmRlclwiLCAvLyBwb3NpdGlvbiBpbiB0aGUgZm9ybVxuICBcImdyb3VwXCIsIC8vIGZvcm0gZmllbGRzZXQgZ3JvdXBcbiAgXCJvbkNyZWF0ZVwiLCAvLyBmaWVsZCBpbnNlcnQgY2FsbGJhY2tcbiAgXCJvblVwZGF0ZVwiLCAvLyBmaWVsZCBlZGl0IGNhbGxiYWNrXG4gIFwib25EZWxldGVcIiwgLy8gZmllbGQgcmVtb3ZlIGNhbGxiYWNrXG4gIFwib25JbnNlcnRcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJvbkVkaXRcIiwgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgXCJvblJlbW92ZVwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcImNhblJlYWRcIixcbiAgXCJjYW5DcmVhdGVcIixcbiAgXCJjYW5VcGRhdGVcIixcbiAgXCJ2aWV3YWJsZUJ5XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwiaW5zZXJ0YWJsZUJ5XCIsIC8vIE9wZW5DUlVEIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIFwiZWRpdGFibGVCeVwiLCAvLyBPcGVuQ1JVRCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBcInJlc29sdmVBc1wiLFxuICBcInNlYXJjaGFibGVcIixcbiAgXCJkZXNjcmlwdGlvblwiLFxuICBcImJlZm9yZUNvbXBvbmVudFwiLFxuICBcImFmdGVyQ29tcG9uZW50XCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJvcHRpb25zXCIsXG4gIFwicXVlcnlcIixcbiAgXCJxdWVyeVdhaXRzRm9yVmFsdWVcIixcbiAgXCJhdXRvY29tcGxldGVRdWVyeVwiLFxuICBcImZpZWxkUHJvcGVydGllc1wiLFxuICBcImludGxcIixcbiAgXCJpbnRsSWRcIixcbl07XG5cbmV4cG9ydCBjb25zdCBmb3JtUHJvcGVydGllcyA9IFtcbiAgXCJvcHRpb25hbFwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwibWluXCIsXG4gIFwibWF4XCIsXG4gIFwiZXhjbHVzaXZlTWluXCIsXG4gIFwiZXhjbHVzaXZlTWF4XCIsXG4gIFwibWluQ291bnRcIixcbiAgXCJtYXhDb3VudFwiLFxuICBcImFsbG93ZWRWYWx1ZXNcIixcbiAgXCJyZWdFeFwiLFxuICBcImJsYWNrYm94XCIsXG4gIFwidHJpbVwiLFxuICBcImN1c3RvbVwiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImF1dG9WYWx1ZVwiLFxuICBcIm11c3RDb21wbGV0ZVwiLCAvLyBtdXN0Q29tcGxldGU6IHRydWUgbWVhbnMgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBjb21wbGV0ZSBwcm9maWxlXG4gIFwiZm9ybVwiLCAvLyBmb3JtIHBsYWNlaG9sZGVyXG4gIFwiaW5wdXRQcm9wZXJ0aWVzXCIsIC8vIGZvcm0gcGxhY2Vob2xkZXJcbiAgXCJpdGVtUHJvcGVydGllc1wiLFxuICBcImNvbnRyb2xcIiwgLy8gU21hcnRGb3JtIGNvbnRyb2wgKFN0cmluZyBvciBSZWFjdCBjb21wb25lbnQpXG4gIFwiaW5wdXRcIiwgLy8gU21hcnRGb3JtIGNvbnRyb2wgKFN0cmluZyBvciBSZWFjdCBjb21wb25lbnQpXG4gIFwib3JkZXJcIiwgLy8gcG9zaXRpb24gaW4gdGhlIGZvcm1cbiAgXCJncm91cFwiLCAvLyBmb3JtIGZpZWxkc2V0IGdyb3VwXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJiZWZvcmVDb21wb25lbnRcIixcbiAgXCJhZnRlckNvbXBvbmVudFwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwib3B0aW9uc1wiLFxuICBcInF1ZXJ5XCIsXG4gIFwicXVlcnlXYWl0c0ZvclZhbHVlXCIsXG4gIFwiYXV0b2NvbXBsZXRlUXVlcnlcIixcbiAgXCJmaWVsZFByb3BlcnRpZXNcIixcbl07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvZmluZFwiKTsiLCJpbXBvcnQgdG9QYXRoIGZyb20gXCJsb2Rhc2gvdG9QYXRoXCI7XG5pbXBvcnQgaW5pdGlhbCBmcm9tIFwibG9kYXNoL2luaXRpYWxcIjtcbmltcG9ydCBmbG93IGZyb20gXCJsb2Rhc2gvZnAvZmxvd1wiO1xuaW1wb3J0IHRha2VSaWdodCBmcm9tIFwibG9kYXNoL3Rha2VSaWdodFwiO1xuXG4vKipcbiAqIFNwbGl0cyBhIHBhdGggaW4gc3RyaW5nIGZvcm1hdCBpbnRvIGFuIGFycmF5LlxuICovXG5leHBvcnQgY29uc3Qgc3BsaXRQYXRoID0gKHN0cmluZzogc3RyaW5nKSA9PiB0b1BhdGgoc3RyaW5nKTtcblxuLyoqXG4gKiBKb2lucyBhIHBhdGggaW4gYXJyYXkgZm9ybWF0IGludG8gYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBqb2luUGF0aCA9IChhcnJheTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPik6IHN0cmluZyA9PlxuICBhcnJheS5yZWR1Y2U8c3RyaW5nPihcbiAgICAoc3RyaW5nLCBpdGVtKSA9PlxuICAgICAgc3RyaW5nICtcbiAgICAgIChOdW1iZXIuaXNOYU4oTnVtYmVyKGl0ZW0pKVxuICAgICAgICA/IGAke3N0cmluZyA9PT0gXCJcIiA/IFwiXCIgOiBcIi5cIn0ke2l0ZW19YFxuICAgICAgICA6IGBbJHtpdGVtfV1gKSxcbiAgICBcIlwiXG4gICk7XG5cbi8qKlxuICogUmV0cmlldmVzIHBhcmVudCBwYXRoIGZyb20gdGhlIGdpdmVuIG9uZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiAgUGF0aCBpbiBzdHJpbmcgZm9ybWF0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQYXJlbnRQYXRoID0gZmxvdyhzcGxpdFBhdGgsIGluaXRpYWwsIGpvaW5QYXRoKTtcblxuLyoqXG4gKiBSZW1vdmVzIHByZWZpeCBmcm9tIHRoZSBnaXZlbiBwYXRocy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBwYXRoc1xuICogQHJldHVybiB7U3RyaW5nW119XG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQcmVmaXggPSAoXG4gIHByZWZpeDogc3RyaW5nLFxuICBwYXRoczogQXJyYXk8c3RyaW5nPlxuKTogQXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGV4cGxvZGVkUHJlZml4ID0gc3BsaXRQYXRoKHByZWZpeCk7XG4gIHJldHVybiBwYXRocy5tYXAoKHBhdGgpID0+IHtcbiAgICBpZiAocGF0aCA9PT0gcHJlZml4KSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgY29uc3QgZXhwbG9kZWRQYXRoID0gc3BsaXRQYXRoKHBhdGgpO1xuICAgIGNvbnN0IGV4cGxvZGVkU3VmZml4ID0gdGFrZVJpZ2h0KFxuICAgICAgZXhwbG9kZWRQYXRoLFxuICAgICAgZXhwbG9kZWRQYXRoLmxlbmd0aCAtIGV4cGxvZGVkUHJlZml4Lmxlbmd0aFxuICAgICk7XG4gICAgcmV0dXJuIGpvaW5QYXRoKGV4cGxvZGVkU3VmZml4KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEZpbHRlcnMgcGF0aHMgdGhhdCBoYXZlIHRoZSBnaXZlbiBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtTdHJpbmdbXX0gcGF0aHNcbiAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICovXG5leHBvcnQgY29uc3QgZmlsdGVyUGF0aHNCeVByZWZpeCA9IChwcmVmaXg6IHN0cmluZywgcGF0aHM6IEFycmF5PHN0cmluZz4pID0+XG4gIHBhdGhzLmZpbHRlcihcbiAgICAocGF0aCkgPT5cbiAgICAgIHBhdGggPT09IHByZWZpeCB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKGAke3ByZWZpeH0uYCkgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChgJHtwcmVmaXh9W2ApXG4gICk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzaW1wbC1zY2hlbWFcIik7IiwiaW1wb3J0IHtcbiAgVnVsY2FuRmllbGRUeXBlLFxuICBWdWxjYW5Db3JlSW5wdXQsXG4gIFZ1bGNhbkZpZWxkSW5wdXQsXG59IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgU2ltcGxlU2NoZW1hIGZyb20gXCJzaW1wbC1zY2hlbWFcIjtcblxuZXhwb3J0IGNvbnN0IHN0YW5kYXJkSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQ+ID0gW1xuICBcIm51bWJlclwiLFxuICBcInVybFwiLFxuICBcImVtYWlsXCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJjaGVja2JveFwiLFxuICBcImNoZWNrYm94Z3JvdXBcIixcbiAgXCJyYWRpb2dyb3VwXCIsXG4gIFwic2VsZWN0XCIsXG4gIFwic2VsZWN0bXVsdGlwbGVcIixcbiAgXCJkYXRldGltZVwiLFxuICBcImRhdGVcIixcbiAgXCJ0aW1lXCIsXG4gIFwidGV4dFwiLFxuICBcInBhc3N3b3JkXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgY2xlYXJhYmxlSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQ+ID0gW1xuICBcImRhdGVcIixcbiAgLy8gIFwiZGF0ZTJcIixcbiAgXCJkYXRldGltZVwiLFxuICBcInRpbWVcIixcbiAgXCJzZWxlY3RcIixcbiAgXCJyYWRpb2dyb3VwXCIsXG5dO1xuZXhwb3J0IGNvbnN0IGFkdmFuY2VkSW5wdXRzOiBBcnJheTxWdWxjYW5Db3JlSW5wdXQ+ID0gW1xuICBcImxpa2VydFwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcIm11bHRpYXV0b2NvbXBsZXRlXCIsXG5dO1xuZXhwb3J0IHR5cGUgRGVyaXZlZElucHV0ID0gXCJuZXN0ZWRcIjtcbmV4cG9ydCBjb25zdCBkZXJpdmVkSW5wdXRzOiBBcnJheTxEZXJpdmVkSW5wdXQ+ID0gW1wibmVzdGVkXCJdO1xuZXhwb3J0IGNvbnN0IGFsbFZ1bGNhbklucHV0czogQXJyYXk8VnVsY2FuQ29yZUlucHV0IHwgRGVyaXZlZElucHV0PiA9IFtcbiAgLi4uc3RhbmRhcmRJbnB1dHMsXG4gIC4uLmFkdmFuY2VkSW5wdXRzLFxuICAvLyBkZXJpdmVkIGlucHV0cyBhcmUgc3BlY2lmaWMgdG8gdGhlIEZvcm0gaW50ZXJuYWwgY29tcHV0YXRpb25zXG4gIC8vIGl0IGNhbid0IGJlIHNldCBieSB0aGUgdXNlclxuICAuLi5kZXJpdmVkSW5wdXRzLFxuXTtcblxuZXhwb3J0IGNvbnN0IGdldEF1dG9JbnB1dEZyb21UeXBlID0gKFxuICBmaWVsZFR5cGU6IFZ1bGNhbkZpZWxkVHlwZVxuKTogVnVsY2FuQ29yZUlucHV0ID0+IHtcbiAgY29uc3QgYXV0b1R5cGUgPVxuICAgIGZpZWxkVHlwZSA9PT0gTnVtYmVyIHx8IGZpZWxkVHlwZSA9PT0gU2ltcGxlU2NoZW1hLkludGVnZXJcbiAgICAgID8gXCJudW1iZXJcIlxuICAgICAgOiBmaWVsZFR5cGUgPT09IEJvb2xlYW5cbiAgICAgID8gXCJjaGVja2JveFwiXG4gICAgICA6IGZpZWxkVHlwZSA9PT0gRGF0ZVxuICAgICAgPyBcImRhdGVcIlxuICAgICAgOiBcInRleHRcIjtcbiAgcmV0dXJuIGF1dG9UeXBlO1xufTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHMvZm9ybVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9WdWxjYW5DdXJyZW50VXNlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50c0hlbHBlcnNcIjtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0Zvcm1Db250YWluZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvUHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy90eXBpbmdzXCI7XG4iLCIvKlxuXG5Gb3JtQ29udGFpbmVyIGFrYSBTbWFydEZvcm1cblxuQ2hhbmdlcyBjb21wYXJlZCB0byBWdWxjYW4gTWV0ZW9yOlxuXG4tIHByZXZpb3VzbHkgd2FzIG5hbWVkIEZvcm1XcmFwcGVyXG4tIGFjY2VwdHMgYSBtb2RlbCBpbnN0ZWFkIG9mIGNvbGxlY3Rpb25cbi0gbm8gcXVlcnlGcmFnbWVudE5hbWUgKHJlc3AuIG11dGF0aW9uIG5hbWUpLCBpbnN0ZWFkIHlvdSBuZWVkIHRvIHBhc3MgdGhlIGZyYWdtZW50IGV4cGxpY2l0ZWx5XG5cblRlY2huaWNhbGx5LCB0aGlzIGlzIGEgR3JhcGhxbFNtYXJ0Rm9ybSwgd2hpbGUgRm9ybS50c3ggaXMgdGhlIG1vcmVcbmdlbmVyaWMgU21hcnRGb3JtLCBvciBhIFwiTW9kZWxGb3JtXCIuXG5cblxuLS0tXG5cbkdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudCBmb3IgdGhlIGN1cnJlbnQgZm9ybSwgdGhlblxud3JhcCB0aGUgbWFpbiBGb3JtIGNvbXBvbmVudCB3aXRoIHRoZSBuZWNlc3NhcnkgSG9DcyB3aGlsZSBwYXNzaW5nXG50aGVtIHRoZSBmcmFnbWVudC5cblxuVGhpcyBjb21wb25lbnQgaXMgaXRzZWxmIHdyYXBwZWQgd2l0aDpcblxuLSB3aXRoQ3VycmVudFVzZXJcbi0gd2l0aEFwb2xsbyAodXNlZCB0byBhY2Nlc3MgdGhlIEFwb2xsbyBjbGllbnQgZm9yIGZvcm0gcHJlLXBvcHVsYXRpb24pXG5cbkFuZCB3cmFwcyB0aGUgRm9ybSBjb21wb25lbnQgd2l0aDpcblxuLSB3aXRoTmV3XG5cbk9yOlxuXG4tIHdpdGhTaW5nbGVcbi0gd2l0aFVwZGF0ZVxuLSB3aXRoRGVsZXRlXG5cbihXaGVuIHdyYXBwaW5nIHdpdGggd2l0aFNpbmdsZSwgd2l0aFVwZGF0ZSwgYW5kIHdpdGhEZWxldGUsIGEgc3BlY2lhbCBMb2FkZXJcbmNvbXBvbmVudCBpcyBhbHNvIGFkZGVkIHRvIHdhaXQgZm9yIHdpdGhTaW5nbGUncyBsb2FkaW5nIHByb3AgdG8gYmUgZmFsc2UpXG5cbiovXG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgLy8gd2l0aEN1cnJlbnRVc2VyLFxuLy8gVXRpbHMsXG4vLyBnZXRGcmFnbWVudCxcbi8vXCJtZXRlb3IvdnVsY2FuOmNvcmVcIjtcbmltcG9ydCB7IGdxbCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuXG5pbXBvcnQgZ2V0Rm9ybUZyYWdtZW50cyBmcm9tIFwiLi9tb2R1bGVzL2Zvcm1GcmFnbWVudHNcIjtcbi8vIGltcG9ydCB7IFZ1bGNhbk1vZGVsIH0gZnJvbSBcIkB2dWxjYW5qcy9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgVnVsY2FuR3JhcGhxbE1vZGVsLFxuICBDcmVhdGVWYXJpYWJsZXMsXG4gIFVwZGF0ZVZhcmlhYmxlcyxcbiAgRGVsZXRlVmFyaWFibGVzLFxufSBmcm9tIFwiQHZ1bGNhbmpzL2dyYXBocWxcIjtcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tIFwiQHZ1bGNhbmpzL3V0aWxzXCI7XG5pbXBvcnQge1xuICB1c2VTaW5nbGUsXG4gIHVzZUNyZWF0ZSxcbiAgdXNlVXBkYXRlLFxuICB1c2VEZWxldGUsXG4gIFVzZVNpbmdsZU9wdGlvbnMsXG59IGZyb20gXCJAdnVsY2FuanMvcmVhY3QtaG9va3NcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyBGZXRjaFJlc3VsdCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuLy8gaW1wb3J0IHsgRm9ybVR5cGUgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBkZWJ1Z1Z1bGNhbiB9IGZyb20gXCJAdnVsY2FuanMvdXRpbHNcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkN1cnJlbnRVc2VyIH0gZnJvbSBcIi4uL1Z1bGNhbkN1cnJlbnRVc2VyL0NvbnN1bWVyXCI7XG5pbXBvcnQgeyBWdWxjYW5Vc2VyIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuY29uc3QgZGVidWdGb3JtID0gZGVidWdWdWxjYW4oXCJmb3JtXCIpO1xuXG4vLyBNdXRhdGlvbiB0aGF0IHlpZWxkIGEgc3VjY2VzcyByZXN1bHRcbnR5cGUgU3VjY2Vzc2Z1bEZldGNoUmVzdWx0PFREYXRhID0gT2JqZWN0PiA9IEZldGNoUmVzdWx0PFREYXRhPiAmIHtcbiAgZGF0YTogVERhdGE7XG59O1xuLyoqXG4gKiBUeXBlZ3VhcmVkIHRvIGFsbG93IGNvbnNpZGVyaW5nIHRoZSByZXF1ZXN0IGFzIHN1Y2Nlc3NmdWxcbiAqL1xuY29uc3QgaXNTdWNjZXNzZnVsID0gZnVuY3Rpb24gPFQgPSBhbnk+KFxuICByZXN1bHQ6IEZldGNoUmVzdWx0PFQ+IHwgdW5kZWZpbmVkXG4pOiByZXN1bHQgaXMgU3VjY2Vzc2Z1bEZldGNoUmVzdWx0PFQ+IHtcbiAgcmV0dXJuICEhcmVzdWx0Py5kYXRhO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29udGFpbmVyUHJvcHMge1xuICBtb2RlbDogVnVsY2FuR3JhcGhxbE1vZGVsO1xuICAvKiogRG9jdW1lbnQgaWQgZm9yIGVkaXRpb24gbW9kZSwgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSBkb2N1bWVudCAqL1xuICBkb2N1bWVudElkPzogc3RyaW5nO1xuICAvKiogU2x1ZyAoPSBodW1hbiByZWFkYWJsZSB1bmlxdWUgaWQpIGZvciBlZGl0aW9uIG1vZGUsIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgZG9jdW1lbnQgKi9cbiAgc2x1Zz86IHN0cmluZztcbiAgLyoqXG4gICAqIExpc3Qgb25seSB0aG9zZSBmaWVsZHMgaW4gdGhlIGZvcm1cbiAgICovXG4gIGZpZWxkcz86IEFycmF5PHN0cmluZz47XG4gIC8qKlxuICAgKiBMaXN0IGRlZmF1bHQgZmllbGRzICsgdGhvc2UgYWRkaXRpb25hbCBmaWVsZHMgYXMgd2VsbFxuICAgKi9cbiAgYWRkRmllbGRzPzogQXJyYXk8c3RyaW5nPjtcbiAgLyoqIEZvcmNlIGEgcXVlcnkgZnJhZ21lbnQgKi9cbiAgcXVlcnlGcmFnbWVudD86IHN0cmluZztcbiAgLyoqIEZvcmNlIGEgbXV0YXRpb24gZnJhZ21lbnQgKi9cbiAgbXV0YXRpb25GcmFnbWVudD86IHN0cmluZztcbiAgLyoqIEZvcmNlIGEgcXVlcnkgZnJhZ21lbnQgKi9cbiAgcXVlcnlGcmFnbWVudE5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGb3JjZSBhIG11dGF0aW9uIGZyYWdtZW50ICovXG4gIG11dGF0aW9uRnJhZ21lbnROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogRm9yY2UgYSBjdXJyZW50VXNlciwgb3ZlcnJpZGluZyB0aGUgY3VycmVudFVzZXIgb2J0YWluZWRcbiAgICogdmlhIENvbnRleHRcbiAgICpcbiAgICogSWYgeW91IHVzZSBtYW55IGZvcm1zIGluIHlvdXIgYXBwLFxuICAgKiBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gc2V0IFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dFxuICAgKiBhdCB0aGUgdG9wLWxldmVsIG9mIHlvdXIgYXBwXG4gICAqIChlZyBpbiBcInBhZ2VzL19hcHAuanNcIiBmb3IgTmV4dC5qcylcbiAgICovXG4gIGN1cnJlbnRVc2VyPzogVnVsY2FuVXNlciB8IG51bGw7XG4gIGxvYWRpbmdDdXJyZW50VXNlcj86IGJvb2xlYW47XG59XG5leHBvcnQgdHlwZSBTbWFydEZvcm1Qcm9wcyA9IEZvcm1Db250YWluZXJQcm9wcztcblxuLy8gRm9uY3Rpb25uYWwgdmVyc2lvbiB0byBiZSBhYmxlIHRvIHVzZSBob29rc1xuZXhwb3J0IGNvbnN0IEZvcm1Db250YWluZXIgPSAocHJvcHM6IEZvcm1Db250YWluZXJQcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgbW9kZWwsXG4gICAgZG9jdW1lbnRJZCxcbiAgICBzbHVnLFxuICAgIGZpZWxkcyxcbiAgICBhZGRGaWVsZHMsXG4gICAgY3VycmVudFVzZXI6IGN1cnJlbnRVc2VyRnJvbVByb3BzLFxuICAgIGxvYWRpbmdDdXJyZW50VXNlcjogbG9hZGluZ0N1cnJlbnRVc2VyRnJvbVByb3BzLFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgc2NoZW1hIH0gPSBtb2RlbDtcbiAgLy8gaWYgYSBkb2N1bWVudCBpcyBiZWluZyBwYXNzZWQsIHRoaXMgaXMgYW4gZWRpdCBmb3JtXG4gIGNvbnN0IGlzRWRpdCA9IGRvY3VtZW50SWQgfHwgc2x1ZztcbiAgY29uc3Qgc2VsZWN0b3IgPSB7XG4gICAgZG9jdW1lbnRJZCxcbiAgICBzbHVnLFxuICB9O1xuICBjb25zdCBmb3JtVHlwZSA9IGlzRWRpdCA/IFwiZWRpdFwiIDogXCJuZXdcIjtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICAvLyBnZXQgZnJhZ21lbnQgdXNlZCB0byBkZWNpZGUgd2hhdCBkYXRhIHRvIGxvYWQgZnJvbSB0aGUgc2VydmVyIHRvIHBvcHVsYXRlIHRoZSBmb3JtLFxuICAvLyBhcyB3ZWxsIGFzIHdoYXQgZGF0YSB0byBhc2sgZm9yIGFzIHJldHVybiB2YWx1ZSBmb3IgdGhlIG11dGF0aW9uXG4gIC8vIFRPRE86IG1vdmUgb3V0IG9mIHRoZSBjb21wb25lbnRcbiAgLy9jb25zdCBnZXRGcmFnbWVudHMgPSAoKSA9PiB7XG4gIGxldCBxdWVyeUZyYWdtZW50O1xuICBsZXQgcXVlcnlGcmFnbWVudE5hbWUgPSBwcm9wcy5xdWVyeUZyYWdtZW50TmFtZTtcbiAgbGV0IG11dGF0aW9uRnJhZ21lbnQ7XG4gIGxldCBtdXRhdGlvbkZyYWdtZW50TmFtZSA9IHByb3BzLm11dGF0aW9uRnJhZ21lbnROYW1lO1xuXG4gIC8vIGlmIHF1ZXJ5RnJhZ21lbnQgb3IgbXV0YXRpb25GcmFnbWVudCBwcm9wcyBhcmUgc3BlY2lmaWVkLCBhY2NlcHQgZWl0aGVyIGZyYWdtZW50IG9iamVjdCBvciBmcmFnbWVudCBzdHJpbmdcbiAgLy8gVE9ETzogbm90IHN1cmUgd2UgYWN0dWFsbHkgbmVlZCB0aGF0LCBnQXBvbGxvIGFjY2VwdHMgZnJhZ21lbnRzIG9yIHN0cmluZyBub3JtYWxseVxuICBpZiAocHJvcHMucXVlcnlGcmFnbWVudCkge1xuICAgIHF1ZXJ5RnJhZ21lbnQgPVxuICAgICAgdHlwZW9mIHByb3BzLnF1ZXJ5RnJhZ21lbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBncWxgXG4gICAgICAgICAgICAke3Byb3BzLnF1ZXJ5RnJhZ21lbnR9XG4gICAgICAgICAgYFxuICAgICAgICA6IHByb3BzLnF1ZXJ5RnJhZ21lbnQ7XG4gIH1cbiAgaWYgKHByb3BzLm11dGF0aW9uRnJhZ21lbnQpIHtcbiAgICBtdXRhdGlvbkZyYWdtZW50ID1cbiAgICAgIHR5cGVvZiBwcm9wcy5tdXRhdGlvbkZyYWdtZW50ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZ3FsYFxuICAgICAgICAgICAgJHtwcm9wcy5tdXRhdGlvbkZyYWdtZW50fVxuICAgICAgICAgIGBcbiAgICAgICAgOiBwcm9wcy5tdXRhdGlvbkZyYWdtZW50O1xuICB9XG5cbiAgLy8gc2FtZSB3aXRoIHF1ZXJ5RnJhZ21lbnROYW1lIGFuZCBtdXRhdGlvbkZyYWdtZW50TmFtZVxuICAvKlxuICAgICBpZiAodGhpcy5wcm9wcy5xdWVyeUZyYWdtZW50TmFtZSkge1xuICAgICAgIHF1ZXJ5RnJhZ21lbnQgPSBnZXRGcmFnbWVudCh0aGlzLnByb3BzLnF1ZXJ5RnJhZ21lbnROYW1lKTtcbiAgICAgfVxuICAgICBpZiAodGhpcy5wcm9wcy5tdXRhdGlvbkZyYWdtZW50TmFtZSkge1xuICAgICAgIG11dGF0aW9uRnJhZ21lbnQgPSBnZXRGcmFnbWVudCh0aGlzLnByb3BzLm11dGF0aW9uRnJhZ21lbnROYW1lKTtcbiAgICAgfVxuICAgICAqL1xuXG4gIGlmICghcXVlcnlGcmFnbWVudCB8fCAhbXV0YXRpb25GcmFnbWVudCkge1xuICAgIC8vIGF1dG9nZW5lcmF0ZWQgZnJhZ21lbnRzXG4gICAgY29uc3QgYXV0b0Zvcm1GcmFnbWVudHMgPSBnZXRGb3JtRnJhZ21lbnRzKHtcbiAgICAgIGZvcm1UeXBlLFxuICAgICAgbW9kZWwsXG4gICAgICBmaWVsZHMsXG4gICAgICBhZGRGaWVsZHMsXG4gICAgfSk7XG5cbiAgICBxdWVyeUZyYWdtZW50ID0gcXVlcnlGcmFnbWVudCB8fCBhdXRvRm9ybUZyYWdtZW50cy5xdWVyeUZyYWdtZW50O1xuICAgIHF1ZXJ5RnJhZ21lbnROYW1lID0gYXV0b0Zvcm1GcmFnbWVudHMucXVlcnlGcmFnbWVudE5hbWU7XG4gICAgbXV0YXRpb25GcmFnbWVudCA9IG11dGF0aW9uRnJhZ21lbnQgfHwgYXV0b0Zvcm1GcmFnbWVudHMubXV0YXRpb25GcmFnbWVudDtcbiAgICBtdXRhdGlvbkZyYWdtZW50TmFtZSA9IGF1dG9Gb3JtRnJhZ21lbnRzLm11dGF0aW9uRnJhZ21lbnROYW1lO1xuICB9XG5cbiAgLy8gZ2V0IHF1ZXJ5ICYgbXV0YXRpb24gZnJhZ21lbnRzIGZyb20gcHJvcHMgb3IgZWxzZSBkZWZhdWx0IHRvIHNhbWUgYXMgZ2VuZXJhdGVkRnJhZ21lbnRcbiAgLy9yZXR1cm4ge1xuICAvLyAgcXVlcnlGcmFnbWVudCxcbiAgLy8gIG11dGF0aW9uRnJhZ21lbnQsXG4gIC8vfTtcbiAgLy99XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7bW9kZWwubmFtZX0ke2NhcGl0YWxpemUoZm9ybVR5cGUpfWA7XG4gIC8vIHByb3BzIHRvIHBhc3Mgb24gdG8gY2hpbGQgY29tcG9uZW50IChpLmUuIDxGb3JtIC8+KVxuICBjb25zdCBjaGlsZFByb3BzID0ge1xuICAgIGZvcm1UeXBlLFxuICAgIHNjaGVtYSxcbiAgfTtcblxuICAvLyBvcHRpb25zIGZvciB1c2VDcmVhdGUsIHVzZVVwZGF0ZSBhbmQgdXNlRGVsZXRlXG4gIGNvbnN0IG11dGF0aW9uT3B0aW9ucyA9IHtcbiAgICBtb2RlbCxcbiAgICAvLyBjb2xsZWN0aW9uOiB0aGlzLnByb3BzLmNvbGxlY3Rpb24sXG4gICAgZnJhZ21lbnQ6IG11dGF0aW9uRnJhZ21lbnQsXG4gICAgZnJhZ21lbnROYW1lOiBtdXRhdGlvbkZyYWdtZW50TmFtZSxcbiAgfTtcblxuICBjb25zdCBxdWVyeU9wdGlvbnM6IFVzZVNpbmdsZU9wdGlvbnM8YW55PiA9IHtcbiAgICBtb2RlbCxcbiAgICAvLyBUT0RPOiB3aGF0IHRoaXMgb3B0aW9uIGRvZXM/XG4gICAgLy8gcXVlcnlOYW1lOiBgJHtwcmVmaXh9Rm9ybVF1ZXJ5YCxcbiAgICBmcmFnbWVudDogcXVlcnlGcmFnbWVudCxcbiAgICBmcmFnbWVudE5hbWU6IHF1ZXJ5RnJhZ21lbnROYW1lLFxuICAgIC8vIGZyYWdtZW50TmFtZT9cbiAgICBpbnB1dDoge1xuICAgICAgaWQ6IGRvY3VtZW50SWQsXG4gICAgICBlbmFibGVDYWNoZTogZmFsc2UsXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IHNsdWdcbiAgICB9LFxuICAgIHF1ZXJ5T3B0aW9uczoge1xuICAgICAgLy8gd2UgYWx3YXlzIHdhbnQgdG8gbG9hZCBhIGZyZXNoIGNvcHkgb2YgdGhlIGRvY3VtZW50XG4gICAgICBmZXRjaFBvbGljeTogXCJuZXR3b3JrLW9ubHlcIiBhcyBcIm5ldHdvcmstb25seVwiLCAvLyBjYXN0IGlzIGZvciBmaXhpbmcgYW5ub3lpbmcgVFMgaXNzdWUuLi4gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1hcG9sbG8vaXNzdWVzLzkzNlxuICAgICAgcG9sbEludGVydmFsOiAwLCAvLyBubyBwb2xsaW5nLCBvbmx5IGxvYWQgZGF0YSBvbmNlXG4gICAgICBza2lwOiBmb3JtVHlwZSA9PT0gXCJuZXdcIixcbiAgICB9LFxuICB9O1xuICAvKiBkZWJ1Z1xuICBjb25zb2xlLmxvZyhcbiAgICBcIk1VVFwiLFxuICAgIChtdXRhdGlvbkZyYWdtZW50IGFzIGFueSkubG9jLnNvdXJjZS5ib2R5LFxuICAgIG11dGF0aW9uRnJhZ21lbnROYW1lXG4gICk7XG4gIGNvbnNvbGUubG9nKFxuICAgIFwiUVVFUllcIixcbiAgICAocXVlcnlGcmFnbWVudCBhcyBhbnkpLmxvYy5zb3VyY2UuYm9keSxcbiAgICBxdWVyeUZyYWdtZW50TmFtZVxuICApOyovXG4gIGNvbnN0IHsgZGF0YSwgZG9jdW1lbnQsIGxvYWRpbmcsIHJlZmV0Y2ggfSA9IHVzZVNpbmdsZShxdWVyeU9wdGlvbnMpO1xuICBpZiAoZm9ybVR5cGUgIT09IFwibmV3XCIpIHtcbiAgICBkZWJ1Z0Zvcm0oXG4gICAgICBcInVzZVNpbmdsZSByZXN1bHRcIixcbiAgICAgIFwiZGF0YVwiLFxuICAgICAgZGF0YSxcbiAgICAgIFwiZG9jdW1lbnRcIixcbiAgICAgIGRvY3VtZW50LFxuICAgICAgXCJsb2FkaW5nXCIsXG4gICAgICBsb2FkaW5nXG4gICAgKTtcbiAgfVxuICAvLyBUT0RPOiBwYXNzIHRoZSBjcmVhdGlvbiBmdW5jdGlvbnMgZG93biB0byB0aGUgRm9ybVxuICBjb25zdCBbY3JlYXRlRG9jdW1lbnRdID0gdXNlQ3JlYXRlKG11dGF0aW9uT3B0aW9ucyk7XG4gIGNvbnN0IFt1cGRhdGVEb2N1bWVudF0gPSB1c2VVcGRhdGUobXV0YXRpb25PcHRpb25zKTtcbiAgY29uc3QgW2RlbGV0ZURvY3VtZW50XSA9IHVzZURlbGV0ZShtdXRhdGlvbk9wdGlvbnMpO1xuXG4gIGNvbnN0IHtcbiAgICBjdXJyZW50VXNlcjogY3VycmVudFVzZXJGcm9tQ29udGV4dCxcbiAgICBsb2FkaW5nOiBsb2FkaW5nQ3VycmVudFVzZXJGcm9tQ29udGV4dCxcbiAgfSA9IHVzZVZ1bGNhbkN1cnJlbnRVc2VyKCk7XG4gIGNvbnN0IHNob3VsZEdldEN1cnJlbnRVc2VyRnJvbVByb3BzID1cbiAgICB0eXBlb2YgY3VycmVudFVzZXJGcm9tUHJvcHMgIT09IFwidW5kZWZpbmVkXCI7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gc2hvdWxkR2V0Q3VycmVudFVzZXJGcm9tUHJvcHNcbiAgICA/IGN1cnJlbnRVc2VyRnJvbVByb3BzXG4gICAgOiBjdXJyZW50VXNlckZyb21Db250ZXh0O1xuICBjb25zdCBsb2FkaW5nQ3VycmVudFVzZXIgPSBzaG91bGRHZXRDdXJyZW50VXNlckZyb21Qcm9wc1xuICAgID8gbG9hZGluZ0N1cnJlbnRVc2VyRnJvbVByb3BzXG4gICAgOiBsb2FkaW5nQ3VycmVudFVzZXJGcm9tQ29udGV4dDtcblxuICAvLyBjYWxsYmFja3NcbiAgLypcbiAgY29uc3QgZm9ybVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbmV3TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VERhdGEgPSBPYmplY3Q+KFxuICAgIHJlc3VsdDogU3VjY2Vzc2Z1bEZldGNoUmVzdWx0PFREYXRhPlxuICApIHtcbiAgICBnZXREb2N1bWVudEZyb21SZXN1bHQocmVzdWx0LCBcIm5ld1wiKTtcbiAgfTtcbiAgY29uc3QgZWRpdE11dGF0aW9uU3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gPFREYXRhID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IFN1Y2Nlc3NmdWxGZXRjaFJlc3VsdDxURGF0YT5cbiAgKSB7XG4gICAgZ2V0RG9jdW1lbnRGcm9tUmVzdWx0KHJlc3VsdCwgXCJlZGl0XCIpO1xuICB9O1xuICAqL1xuXG4gIC8qXG4gIFRoZSBjcmVhdGUgaG9vayBhbHJlYWR5IGNyZWF0ZXMgYSBkb2N1bWVudCBwcm9wIGluIGEgbW9yZSBzdGFibGUgd2F5XG4gIGNvbnN0IGdldERvY3VtZW50RnJvbVJlc3VsdCA9IGZ1bmN0aW9uIDxURGF0YSA9IE9iamVjdD4oXG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgb25seSBvbiB2YWxpZCByZXN1bHRzXG4gICAgcmVzdWx0OiBTdWNjZXNzZnVsRmV0Y2hSZXN1bHQ8VERhdGE+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIFRPRE86IHF1aXRlIHJpc2t5Li4uIHdlIHNob3VsZCBoYXZlIGEgYmV0dGVyIHdheSB0byBnZXQgdGhlIGRvY3VtZW50XG4gICAgbGV0IGRvY3VtZW50ID0gcmVzdWx0LmRhdGFbT2JqZWN0LmtleXMocmVzdWx0LmRhdGEpWzBdXS5kYXRhOyAvLyBkb2N1bWVudCBpcyBhbHdheXMgb24gZmlyc3QgcHJvcGVydHlcblxuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfTsqL1xuICAvLyBmb3IgbmV3IG11dGF0aW9uLCBydW4gcmVmZXRjaCBmdW5jdGlvbiBpZiBpdCBleGlzdHNcbiAgLypcbiAgaWYgKG11dGF0aW9uVHlwZSA9PT0gXCJuZXdcIiAmJiByZWZldGNoKSByZWZldGNoKCk7XG4gICovXG5cbiAgY29uc3QgY3JlYXRlQW5kUmV0dXJuRG9jdW1lbnQgPSBhc3luYyAodmFyaWFibGVzOiBDcmVhdGVWYXJpYWJsZXMpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVEb2N1bWVudCh2YXJpYWJsZXMpO1xuICAgIGNvbnN0IHsgZXJyb3JzLCBkb2N1bWVudCB9ID0gcmVzdWx0O1xuICAgIHJldHVybiB7XG4gICAgICBkb2N1bWVudCxcbiAgICAgIGVycm9ycyxcbiAgICB9O1xuICB9O1xuICBjb25zdCB1cGRhdGVBbmRSZXR1cm5Eb2N1bWVudCA9IGFzeW5jICh2YXJpYWJsZXM6IFVwZGF0ZVZhcmlhYmxlcykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZURvY3VtZW50KHZhcmlhYmxlcyk7XG4gICAgY29uc3QgeyBlcnJvcnMsIGRvY3VtZW50IH0gPSByZXN1bHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvY3VtZW50LFxuICAgICAgZXJyb3JzLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlRG9jdW1lbnRBbmRSZWZldGNoID0gYXN5bmMgKHZhcmlhYmxlczogRGVsZXRlVmFyaWFibGVzKSA9PiB7XG4gICAgYXdhaXQgZGVsZXRlRG9jdW1lbnQodmFyaWFibGVzIGFzIGFueSk7XG4gIH07XG5cbiAgaWYgKGlzRWRpdCAmJiBsb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxWdWxjYW5Db21wb25lbnRzLkxvYWRpbmcgLz47XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtXG4gICAgICBkb2N1bWVudD17ZG9jdW1lbnR9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nIHx8IGxvYWRpbmdDdXJyZW50VXNlcn1cbiAgICAgIGNyZWF0ZURvY3VtZW50PXtjcmVhdGVBbmRSZXR1cm5Eb2N1bWVudCAvKmNyZWF0ZURvY3VtZW50Ki99XG4gICAgICB1cGRhdGVEb2N1bWVudD17dXBkYXRlQW5kUmV0dXJuRG9jdW1lbnR9XG4gICAgICBkZWxldGVEb2N1bWVudD17ZGVsZXRlRG9jdW1lbnRBbmRSZWZldGNofVxuICAgICAgcmVmZXRjaD17cmVmZXRjaH1cbiAgICAgIGN1cnJlbnRVc2VyPXtjdXJyZW50VXNlcn1cbiAgICAgIHsuLi5jaGlsZFByb3BzfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKlxuRm9ybUNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIC8vIG1haW4gb3B0aW9uc1xuICBkb2N1bWVudElkOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBpZiBhIGRvY3VtZW50IGlzIHBhc3NlZCwgdGhpcyB3aWxsIGJlIGFuIGVkaXQgZm9ybVxuICBtdXRhdGlvbkZyYWdtZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICBtdXRhdGlvbkZyYWdtZW50TmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvLyBncmFwaFFMXG4gIC8vIGNyZWF0ZUZvbywgZGVsZXRlRm9vLCB1cGRhdGVGb29cbiAgLy8gbmV3TXV0YXRpb246IFByb3BUeXBlcy5mdW5jLCAvLyB0aGUgbmV3IG11dGF0aW9uXG4gIC8vIGVkaXRNdXRhdGlvbjogUHJvcFR5cGVzLmZ1bmMsIC8vIHRoZSBlZGl0IG11dGF0aW9uXG4gIC8vIHJlbW92ZU11dGF0aW9uOiBQcm9wVHlwZXMuZnVuYywgLy8gdGhlIHJlbW92ZSBtdXRhdGlvblxuXG4gIC8vIGZvcm1cbiAgcHJlZmlsbGVkUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGxheW91dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZmllbGRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgaGlkZUZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIGFkZEZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIHNob3dSZW1vdmU6IFByb3BUeXBlcy5ib29sLFxuICBzdWJtaXRMYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGNhbmNlbExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgcmV2ZXJ0TGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICByZXBlYXRFcnJvcnM6IFByb3BUeXBlcy5ib29sLFxuICB3YXJuVW5zYXZlZENoYW5nZXM6IFByb3BUeXBlcy5ib29sLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICBpdGVtUHJvcGVydGllczogUHJvcFR5cGVzLm9iamVjdCxcbiAgc3VjY2Vzc0NvbXBvbmVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmVsZW1lbnRdKSxcbiAgY29udGV4dE5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLy8gY2FsbGJhY2tzXG4gIC4uLmNhbGxiYWNrUHJvcHMsXG5cbiAgY3VycmVudFVzZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsaWVudDogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbkZvcm1Db250YWluZXIuZGVmYXVsdFByb3BzID0ge1xuICBsYXlvdXQ6IFwiaG9yaXpvbnRhbFwiLFxufTtcbiovXG5cbi8qXG5yZWdpc3RlckNvbXBvbmVudCh7XG4gIG5hbWU6ICdTbWFydEZvcm0nLFxuICBjb21wb25lbnQ6IEZvcm1Db250YWluZXIsXG4gIGhvY3M6IFt3aXRoQ3VycmVudFVzZXIsIHdpdGhBcG9sbG8sIHdpdGhSb3V0ZXIsIHdpdGhDb2xsZWN0aW9uUHJvcHNdLFxufSk7XG4qL1xuXG5leHBvcnQgY29uc3QgU21hcnRGb3JtID0gRm9ybUNvbnRhaW5lcjtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybUNvbnRhaW5lcjtcbiIsIi8qKlxuICogR2VuZXJhdGUgbXV0YXRpb24gYW5kIHF1ZXJ5IGZyYWdtZW50cyBmb3IgYSBmb3JtIGJhc2VkIG9uIHRoZSBzY2hlbWFcbiAqIFRPRE86IHJlZmFjdG9yIHRvIG11dHVhbGl6ZSBtb3JlIGNvZGUgd2l0aCB2dWxjYW4tY29yZSBkZWZhdWx0RnJhZ21lbnQgZnVuY3Rpb25zXG4gKiBUT0RPOiBtb3ZlIHRvIGxpYiB3aGVuIHJlZmFjdG9yZWRcbiAqL1xuaW1wb3J0IF91bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IF9pbnRlcnNlY3Rpb24gZnJvbSBcImxvZGFzaC9pbnRlcnNlY3Rpb25cIjtcbmltcG9ydCB7IGdxbCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0Q3JlYXRlYWJsZUZpZWxkcyxcbiAgZ2V0VXBkYXRlYWJsZUZpZWxkcyxcbiAgZ2V0RnJhZ21lbnRGaWVsZE5hbWVzLFxuICAvL2lzQmxhY2tib3gsXG59IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQge1xuICBnZXRGaWVsZEZyYWdtZW50LFxuICBWdWxjYW5HcmFwaHFsTW9kZWwsXG4gIC8vaXNCbGFja2JveCxcbn0gZnJvbSBcIkB2dWxjYW5qcy9ncmFwaHFsXCI7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBGb3JtVHlwZSB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5pbXBvcnQgY29tcGFjdCBmcm9tIFwibG9kYXNoL2NvbXBhY3RcIjtcbi8vICBnZXRGaWVsZEZyYWdtZW50LFxuY29uc3QgaW50bFN1ZmZpeCA9IFwiX2ludGxcIjtcblxuLy8gUG9zdHNFZGl0Rm9ybVF1ZXJ5RnJhZ21lbnQvUG9zdHNOZXdGb3JtTXV0YXRpb25GcmFnbWVudC9ldGMuXG5jb25zdCBnZXRGcmFnbWVudE5hbWUgPSAoXG4gIGZvcm1UeXBlOiBGb3JtVHlwZSxcbiAgbXVsdGlUeXBlTmFtZTogc3RyaW5nLFxuICBmcmFnbWVudFR5cGU6IFwibXV0YXRpb25cIiB8IFwicXVlcnlcIlxuKSA9PlxuICBbbXVsdGlUeXBlTmFtZSwgZm9ybVR5cGUsIFwiZm9ybVwiLCBmcmFnbWVudFR5cGUsIFwiZnJhZ21lbnRcIl1cbiAgICAubWFwKGNhcGl0YWxpemUpXG4gICAgLmpvaW4oXCJcIik7XG5cbi8vIGdldCBtb2RpZmlhYmxlIGZpZWxkcyBpbiB0aGUgcXVlcnkgZWl0aGVyIGZvciB1cGRhdGUgb3IgY3JlYXRlIG9wZXJhdGlvbnNcbmNvbnN0IGdldFF1ZXJ5RmllbGROYW1lcyA9ICh7IHNjaGVtYSwgb3B0aW9ucyB9KSA9PiB7XG4gIGNvbnN0IHF1ZXJ5RmllbGRzID1cbiAgICBvcHRpb25zLmZvcm1UeXBlID09PSBcIm5ld1wiXG4gICAgICA/IGdldENyZWF0ZWFibGVGaWVsZHMoc2NoZW1hKVxuICAgICAgOiBnZXRVcGRhdGVhYmxlRmllbGRzKHNjaGVtYSk7XG4gIHJldHVybiBxdWVyeUZpZWxkcztcbn07XG4vLyBhZGQgcmVhZGFibGUgZmllbGRzIHRvIG11dGF0aW9uIGZpZWxkc1xuY29uc3QgZ2V0TXV0YXRpb25GaWVsZE5hbWVzID0gKHsgcmVhZGFibGVGaWVsZE5hbWVzLCBxdWVyeUZpZWxkTmFtZXMgfSkgPT4ge1xuICByZXR1cm4gX3VuaXEocXVlcnlGaWVsZE5hbWVzLmNvbmNhdChyZWFkYWJsZUZpZWxkTmFtZXMpKTtcbn07XG5cbi8qXG5jb25zdCBnZXRGaWVsZEZyYWdtZW50ID0gKHsgc2NoZW1hLCBmaWVsZE5hbWUsIG9wdGlvbnMgfSkgPT4ge1xuICAgIGxldCBmaWVsZEZyYWdtZW50ID0gZmllbGROYW1lO1xuICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gICAgaWYgKCEoZmllbGQgJiYgZmllbGQudHlwZSkpIHJldHVybiBmaWVsZE5hbWU7XG4gICAgY29uc3QgZmllbGRUeXBlID0gZmllbGQudHlwZS5zaW5nbGVUeXBlO1xuICAgIGNvbnN0IGZpZWxkVHlwZU5hbWUgPVxuICAgICAgICB0eXBlb2YgZmllbGRUeXBlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgPyAnT2JqZWN0J1xuICAgICAgICAgICAgOiB0eXBlb2YgZmllbGRUeXBlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgPyBmaWVsZFR5cGUubmFtZVxuICAgICAgICAgICAgICAgIDogZmllbGRUeXBlO1xuXG4gICAgaWYgKGZpZWxkTmFtZS5zbGljZSgtNSkgPT09IGludGxTdWZmaXgpIHtcbiAgICAgICAgZmllbGRGcmFnbWVudCA9IGAke2ZpZWxkTmFtZX17IGxvY2FsZSB2YWx1ZSB9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBjYWxsIGZvciBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzXG4gICAgICAgICAgICBjYXNlICdPYmplY3QnOlxuICAgICAgICAgICAgICAgIGlmICghaXNCbGFja2JveChmaWVsZCkgJiYgZmllbGRUeXBlLl9zY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRGcmFnbWVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBmaWVsZFR5cGUuX3NjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJheSc6XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVtRmllbGROYW1lID0gYCR7ZmllbGROYW1lfS4kYDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUl0ZW1GaWVsZCA9IHNjaGVtYVthcnJheUl0ZW1GaWVsZE5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIG5vdGU6IG1ha2Ugc3VyZSBmaWVsZCBoYXMgYW4gYXNzb2NpYXRlZCBhcnJheSBpdGVtIGZpZWxkXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5SXRlbUZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkIHdpbGwgZWl0aGVyIGJlIG5hdGl2ZSB2YWx1ZSBvciBhIGFuIG9iamVjdCAoZmlyc3QgY2FzZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVtRmllbGRUeXBlID0gYXJyYXlJdGVtRmllbGQudHlwZS5zaW5nbGVUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5SXRlbUZpZWxkLmJsYWNrYm94ICYmIGFycmF5SXRlbUZpZWxkVHlwZS5fc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZyYWdtZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50TmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IGFycmF5SXRlbUZpZWxkVHlwZS5fc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpbnRsIG9yIHJldHVybiBmaWVsZE5hbWVcbiAgICAgICAgICAgICAgICBmaWVsZEZyYWdtZW50ID0gZmllbGROYW1lO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWVsZEZyYWdtZW50O1xufTtcbiovXG5cbi8vIGdldCBmcmFnbWVudCBmb3IgYSB3aG9sZSBzY2hlbWEgKHJvb3Qgc2NoZW1hIG9yIG5lc3RlZCBzY2hlbWEgb2YgYW4gb2JqZWN0IG9yIGFuIGFycmF5KVxuY29uc3QgZ2V0U2NoZW1hRnJhZ21lbnQgPSAoe1xuICBzY2hlbWEsXG4gIGZyYWdtZW50TmFtZSxcbiAgb3B0aW9ucyxcbiAgZmllbGROYW1lczogcHJvdmlkZWRGaWVsZE5hbWVzLFxufSkgPT4ge1xuICAvLyBkaWZmZXJlbnRpYXRlIG11dGF0aW9uL3F1ZXJ5IGFuZCBjcmVhdGUvdXBkYXRlIGNhc2VzXG4gIC8vIHJlc3BlY3QgcHJvdmlkZWQgZmllbGROYW1lcyBpZiBhbnkgKG5lZWRlZCBmb3IgdGhlIHJvb3Qgc2NoZW1hKVxuICBjb25zdCBmaWVsZE5hbWVzID1cbiAgICBwcm92aWRlZEZpZWxkTmFtZXMgfHxcbiAgICAob3B0aW9ucy5pc011dGF0aW9uXG4gICAgICA/IGdldE11dGF0aW9uRmllbGROYW1lcyh7XG4gICAgICAgICAgcXVlcnlGaWVsZE5hbWVzOiBnZXRRdWVyeUZpZWxkTmFtZXMoeyBzY2hlbWEsIG9wdGlvbnMgfSksXG4gICAgICAgICAgcmVhZGFibGVGaWVsZE5hbWVzOiBnZXRGcmFnbWVudEZpZWxkTmFtZXMoe1xuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgb3B0aW9uczogeyBvbmx5Vmlld2FibGU6IHRydWUgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgIDogZ2V0UXVlcnlGaWVsZE5hbWVzKHsgc2NoZW1hLCBvcHRpb25zIH0pKTtcblxuICBjb25zdCBjaGlsZEZyYWdtZW50cyA9XG4gICAgZmllbGROYW1lcy5sZW5ndGggJiZcbiAgICBmaWVsZE5hbWVzXG4gICAgICAubWFwKChmaWVsZE5hbWUpID0+XG4gICAgICAgIGdldEZpZWxkRnJhZ21lbnQoe1xuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBnZXRPYmplY3RGcmFnbWVudDogZ2V0U2NoZW1hRnJhZ21lbnQsIC8vIGFsbG93IHRvIHJldXNlIHRoZSBjb2RlIGZyb20gZGVmYXVsdEZyYWdtZW50IHdpdGggYW5vdGhlciBiZWhhdmlvdXJcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC8vIHJlbW92ZSBlbXB0eSB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+ICEhZik7XG4gIGlmIChjaGlsZEZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYCR7ZnJhZ21lbnROYW1lfSB7ICR7Y2hpbGRGcmFnbWVudHMuam9pbihcIlxcblwiKX0gfWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIHF1ZXJ5IGFuZCBtdXRhdGlvbiBmcmFnbWVudHMgZm9yIGZvcm1zLCBkeW5hbWljYWxseSAgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGZpZWxkc1xuICovXG5jb25zdCBnZXRGb3JtRnJhZ21lbnRzID0gKHtcbiAgZm9ybVR5cGUgPSBcIm5ld1wiLFxuICBtb2RlbCxcbiAgZmllbGRzLCAvLyByZXN0cmljdCBvbiBjZXJ0YWluIGZpZWxkc1xuICBhZGRGaWVsZHMsIC8vIGFkZCBhZGRpdGlvbmFsIGZpZWxkcyAoZWcgdG8gZGlzcGxheSBzdGF0aWMgZmllbGRzKVxufToge1xuICBtb2RlbDogVnVsY2FuR3JhcGhxbE1vZGVsO1xuICBmb3JtVHlwZTogRm9ybVR5cGU7XG4gIGZpZWxkcz86IEFycmF5PHN0cmluZz47IC8vIHJlc3RyaWN0IG9uIGNlcnRhaW4gZmllbGRzXG4gIGFkZEZpZWxkcz86IEFycmF5PHN0cmluZz47IC8vIGFkZCBhZGRpdGlvbmFsIGZpZWxkcyAoZWcgdG8gZGlzcGxheSBzdGF0aWMgZmllbGRzKVxufSkgPT4ge1xuICBjb25zdCB7IHNjaGVtYSwgbmFtZSwgZ3JhcGhxbCB9ID0gbW9kZWw7XG4gIGNvbnN0IHsgdHlwZU5hbWUsIG11bHRpVHlwZU5hbWUgfSA9IGdyYXBocWw7XG4gIC8vIGdldCB0aGUgcm9vdCBzY2hlbWEgZmllbGROYW1lc1xuICBsZXQgcXVlcnlGaWVsZE5hbWVzID0gZ2V0UXVlcnlGaWVsZE5hbWVzKHsgc2NoZW1hLCBvcHRpb25zOiB7IGZvcm1UeXBlIH0gfSk7XG4gIGxldCBtdXRhdGlvbkZpZWxkTmFtZXMgPSBnZXRNdXRhdGlvbkZpZWxkTmFtZXMoe1xuICAgIHF1ZXJ5RmllbGROYW1lcyxcbiAgICByZWFkYWJsZUZpZWxkTmFtZXM6IGdldEZyYWdtZW50RmllbGROYW1lcyh7XG4gICAgICBzY2hlbWEsXG4gICAgICBvcHRpb25zOiB7IG9ubHlWaWV3YWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICB9KTtcblxuICAvLyBpZiBcImZpZWxkc1wiIHByb3AgaXMgc3BlY2lmaWVkLCByZXN0cmljdCBsaXN0IG9mIGZpZWxkcyB0byBpdFxuICBpZiAoZmllbGRzICYmIGZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgIC8vIGFkZCBcIl9pbnRsXCIgc3VmZml4IHRvIGFsbCBmaWVsZHMgaW4gY2FzZSBzb21lIG9mIHRoZW0gYXJlIGludGwgZmllbGRzXG4gICAgY29uc3QgZmllbGRzV2l0aEludGxTdWZmaXggPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7ZmllbGR9JHtpbnRsU3VmZml4fWApO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IFsuLi5maWVsZHMsIC4uLmZpZWxkc1dpdGhJbnRsU3VmZml4XTtcbiAgICBxdWVyeUZpZWxkTmFtZXMgPSBfaW50ZXJzZWN0aW9uKHF1ZXJ5RmllbGROYW1lcywgYWxsRmllbGRzKTtcbiAgICBtdXRhdGlvbkZpZWxkTmFtZXMgPSBfaW50ZXJzZWN0aW9uKG11dGF0aW9uRmllbGROYW1lcywgYWxsRmllbGRzKTtcbiAgfVxuXG4gIC8vIGFkZCBcImFkZEZpZWxkc1wiIHByb3AgY29udGVudHMgdG8gbGlzdCBvZiBmaWVsZHNcbiAgaWYgKGFkZEZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgcXVlcnlGaWVsZE5hbWVzID0gcXVlcnlGaWVsZE5hbWVzLmNvbmNhdChhZGRGaWVsZHMpO1xuICAgIG11dGF0aW9uRmllbGROYW1lcyA9IG11dGF0aW9uRmllbGROYW1lcy5jb25jYXQoYWRkRmllbGRzKTtcbiAgfVxuXG4gIC8vIHVzZXJJZCBpcyB1c2VkIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9ucywgc28gYWRkIGl0IHRvIGZyYWdtZW50cyBpZiBwb3NzaWJsZVxuICBpZiAoc2NoZW1hLnVzZXJJZCkge1xuICAgIHF1ZXJ5RmllbGROYW1lcy51bnNoaWZ0KFwidXNlcklkXCIpO1xuICAgIG11dGF0aW9uRmllbGROYW1lcy51bnNoaWZ0KFwidXNlcklkXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5faWQpIHtcbiAgICBxdWVyeUZpZWxkTmFtZXMudW5zaGlmdChcIl9pZFwiKTtcbiAgICBtdXRhdGlvbkZpZWxkTmFtZXMudW5zaGlmdChcIl9pZFwiKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHVuaWNpdHkgKF9pZCBjYW4gYmUgYWRkZWQgdHdpY2UpXG4gIHF1ZXJ5RmllbGROYW1lcyA9IF91bmlxKHF1ZXJ5RmllbGROYW1lcyk7XG4gIG11dGF0aW9uRmllbGROYW1lcyA9IF91bmlxKG11dGF0aW9uRmllbGROYW1lcyk7XG5cbiAgaWYgKHF1ZXJ5RmllbGROYW1lcy5sZW5ndGggPT09IDApXG4gICAgLy8gTk9URTogaW4gdGhlb3J5LCB5b3UgY291bGQgaGF2ZSBubyBxdWVyaWFibGUgZmllbGRzLCBidXQgbXV0YWJsZSBmaWVsZHMgPT5cbiAgICAvLyBhIGZvcm0gZm9yIGRhdGEgdGhhdCB5b3UgY2FuIGNyZWF0ZSBidXQgY2FuIG5ldmVyIHNlZS4uLlxuICAgIC8vIFNpbmNlIHRoYXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UsIHdlIHRocm93IGFuIGVycm9yIHRvIHNlY3VyZSB0aGUgZW5kIHVzZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kZWwgXCIke21vZGVsLm5hbWV9XCIgaGFzIG5vIHF1ZXJ5YWJsZSBmaWVsZHMsIGNhbm5vdCBjcmVhdGUgYSBmb3JtIGZvciBpdC4gUGxlYXNlIGFkZCByZWFkYWJsZS9jcmVhdGVhYmxlL3VwZGF0ZWFibGUgZmllbGRzIHRvIHRoZSBtb2RlbCBzY2hlbWEuYFxuICAgICk7XG4gIGlmIChtdXRhdGlvbkZpZWxkTmFtZXMubGVuZ3RoID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2RlbCBcIiR7bW9kZWwubmFtZX1cIiBoYXMgbm8gbXV0YWJsZSBmaWVsZHMsIGNhbm5vdCBjcmVhdGUgYSBmb3JtIGZvciBpdC4gUGxlYXNlIGFkZCBjcmVhdGVhYmxlL3VwZGF0ZWFibGUgZmllbGRzIHRvIG1vZGVsIHNjaGVtYS5gXG4gICAgKTtcblxuICBjb25zdCBxdWVyeUZyYWdtZW50TmFtZSA9IGdldEZyYWdtZW50TmFtZShcbiAgICBmb3JtVHlwZSxcbiAgICBtdWx0aVR5cGVOYW1lLCAvLyBwcmV2aW91c2x5IGNvbGxlY3Rpb25OYW1lIC8vbmFtZSxcbiAgICBcInF1ZXJ5XCJcbiAgKTtcbiAgLy8gZ2VuZXJhdGUgcXVlcnkgZnJhZ21lbnQgYmFzZWQgb24gdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSBlZGl0ZWQuIE5vdGU6IGFsd2F5cyBhZGQgX2lkLCBhbmQgdXNlcklkIGlmIHBvc3NpYmxlLlxuICAvLyBUT0RPOiBzdXBwb3J0IG5lc3RpbmdcbiAgY29uc3QgcXVlcnlGcmFnbWVudFRleHQgPSBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgc2NoZW1hLFxuICAgIGZyYWdtZW50TmFtZTogYGZyYWdtZW50ICR7cXVlcnlGcmFnbWVudE5hbWV9IG9uICR7dHlwZU5hbWV9YCxcbiAgICBvcHRpb25zOiB7IGZvcm1UeXBlLCBpc011dGF0aW9uOiBmYWxzZSB9LFxuICAgIGZpZWxkTmFtZXM6IHF1ZXJ5RmllbGROYW1lcyxcbiAgfSk7XG4gIGlmICghcXVlcnlGcmFnbWVudFRleHQpIHtcbiAgICAvLyBOT1RFOiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbXB0eSBhcnJheSBmb3IgZmllbGQgbmFtZXNcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5uYW1lfSB3aXRoIGZpZWxkcyAke3F1ZXJ5RmllbGROYW1lc30geWllbGQgYW4gZW1wdHkgcXVlcnkgZnJhZ21lbnQuYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuZXJhdGVkUXVlcnlGcmFnbWVudCA9IGdxbChxdWVyeUZyYWdtZW50VGV4dCk7XG5cbiAgY29uc3QgbXV0YXRpb25GcmFnbWVudE5hbWUgPSBnZXRGcmFnbWVudE5hbWUoXG4gICAgZm9ybVR5cGUsXG4gICAgbXVsdGlUeXBlTmFtZSwgLy8gcHJldmlvdXNseSBjb2xsZWN0aW9uTmFtZSxcbiAgICBcIm11dGF0aW9uXCJcbiAgKTtcbiAgY29uc3QgbXV0YXRpb25GcmFnbWVudFRleHQgPSBnZXRTY2hlbWFGcmFnbWVudCh7XG4gICAgc2NoZW1hLFxuICAgIGZyYWdtZW50TmFtZTogYGZyYWdtZW50ICR7bXV0YXRpb25GcmFnbWVudE5hbWV9IG9uICR7dHlwZU5hbWV9YCxcbiAgICBvcHRpb25zOiB7IGZvcm1UeXBlLCBpc011dGF0aW9uOiB0cnVlIH0sXG4gICAgZmllbGROYW1lczogbXV0YXRpb25GaWVsZE5hbWVzLFxuICB9KTtcbiAgaWYgKCFtdXRhdGlvbkZyYWdtZW50VGV4dCkge1xuICAgIC8vIE5PVEU6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB3ZSBkb24ndCBoYXZlIGFuIGVtcHR5IGFycmF5IGZvciBmaWVsZCBuYW1lc1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2RlbCAke21vZGVsLm5hbWV9IHdpdGggZmllbGRzICR7bXV0YXRpb25GaWVsZE5hbWVzfSB5aWVsZCBhbiBlbXB0eSBtdXRhdGlvbiBmcmFnbWVudC5gXG4gICAgKTtcbiAgfVxuICAvLyBnZW5lcmF0ZSBtdXRhdGlvbiBmcmFnbWVudCBiYXNlZCBvbiB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIGVkaXRlZCBhbmQvb3Igdmlld2VkLiBOb3RlOiBhbHdheXMgYWRkIF9pZCwgYW5kIHVzZXJJZCBpZiBwb3NzaWJsZS5cbiAgLy8gVE9ETzogc3VwcG9ydCBuZXN0aW5nXG4gIGNvbnN0IGdlbmVyYXRlZE11dGF0aW9uRnJhZ21lbnQgPSBncWwobXV0YXRpb25GcmFnbWVudFRleHQpO1xuXG4gIC8vIGlmIGFueSBmaWVsZCBzcGVjaWZpZXMgZXh0cmEgcXVlcmllcywgYWRkIHRoZW1cbiAgY29uc3QgZXh0cmFRdWVyaWVzID0gY29tcGFjdChcbiAgICBnZXRRdWVyeUZpZWxkTmFtZXMoeyBzY2hlbWEsIG9wdGlvbnM6IHsgZm9ybVR5cGUgfSB9KS5tYXAoKGZpZWxkTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWFbZmllbGROYW1lXTtcbiAgICAgIHJldHVybiBmaWVsZC5xdWVyeTtcbiAgICB9KVxuICApO1xuICAvLyBnZXQgcXVlcnkgJiBtdXRhdGlvbiBmcmFnbWVudHMgZnJvbSBwcm9wcyBvciBlbHNlIGRlZmF1bHQgdG8gc2FtZSBhcyBnZW5lcmF0ZWRGcmFnbWVudFxuICByZXR1cm4ge1xuICAgIHF1ZXJ5RnJhZ21lbnQ6IGdlbmVyYXRlZFF1ZXJ5RnJhZ21lbnQsXG4gICAgbXV0YXRpb25GcmFnbWVudDogZ2VuZXJhdGVkTXV0YXRpb25GcmFnbWVudCxcbiAgICBxdWVyeUZyYWdtZW50TmFtZSxcbiAgICBtdXRhdGlvbkZyYWdtZW50TmFtZSxcbiAgICBleHRyYVF1ZXJpZXMsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRGb3JtRnJhZ21lbnRzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHZ1bGNhbmpzL3NjaGVtYVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvZ3JhcGhxbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAdnVsY2FuanMvcmVhY3QtaG9va3NcIik7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZXhwb3J0IGludGVyZmFjZSBEdW1teVByb3BzIHt9XG5cbmV4cG9ydCBjb25zdCBEdW1teSA9ICgpID0+IChcbiAgPHNwYW4+XG4gICAgWW91IGhhdmUgbm90IHNldHVwIFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlci4gUGxlYXNlIGFkZCBmb2xsb3dpbmcgY29kZSBpblxuICAgIHlvdXIgYXBwOntcIiBcIn1cbiAgICA8Y29kZT57YGltcG9ydCB7IFZ1bGNhbkNvbXBvbmVudHNQcm92aWRlciB9IGZyb20gXCJAdnVsY2FuanMvcmVhY3QtdWlcIjsgY29uc3QgWW91ckFwcCA9IDxWdWxjYW5Db21wb25lbnRzUHJvdmlkZXI+ey8qIHlvdXIgYXBwICovfTwvVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyPjt9YH08L2NvZGU+XG4gIDwvc3Bhbj5cbik7XG4iLCIvKlxuXG5NYWluIGZvcm0gY29tcG9uZW50LlxuXG5UaGlzIGNvbXBvbmVudCBleHBlY3RzOlxuXG4jIyMgQWxsIEZvcm1zOlxuXG4tIGNvbGxlY3Rpb25cbi0gY3VycmVudFVzZXJcbi0gY2xpZW50IChBcG9sbG8gY2xpZW50KVxuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBydW5DYWxsYmFja3MsIGdldEVycm9ycyB9IGZyb20gXCJAdnVsY2FuanMvY29yZVwiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmltcG9ydCB7IHJlbW92ZVByb3BlcnR5IH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcImxvZGFzaC9maWx0ZXJcIjtcbmltcG9ydCBjbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcbmltcG9ydCBjb21wYWN0IGZyb20gXCJsb2Rhc2gvY29tcGFjdFwiO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNPYmplY3RcIjtcbmltcG9ydCBtYXBWYWx1ZXMgZnJvbSBcImxvZGFzaC9tYXBWYWx1ZXNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwibG9kYXNoL21lcmdlXCI7XG5pbXBvcnQgb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCBvbWl0QnkgZnJvbSBcImxvZGFzaC9vbWl0QnlcIjtcbmltcG9ydCBwaWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuaW1wb3J0IHBpY2tCeSBmcm9tIFwibG9kYXNoL3BpY2tCeVwiO1xuaW1wb3J0IHNldCBmcm9tIFwibG9kYXNoL3NldFwiO1xuaW1wb3J0IHVuc2V0IGZyb20gXCJsb2Rhc2gvdW5zZXRcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcImxvZGFzaC91cGRhdGVcIjtcbmltcG9ydCB3aXRob3V0IGZyb20gXCJsb2Rhc2gvd2l0aG91dFwiO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1MYXlvdXRQcm9wcyB9IGZyb20gXCIuLi9Gb3JtTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1TdWJtaXRQcm9wcyB9IGZyb20gXCIuLi9Gb3JtU3VibWl0XCI7XG5cbmltcG9ydCB7XG4gIGNvbnZlcnRTY2hlbWEsXG4gIGdldEVkaXRhYmxlRmllbGRzLFxuICBnZXRJbnNlcnRhYmxlRmllbGRzLFxufSBmcm9tIFwiLi4vbW9kdWxlcy9zY2hlbWFfdXRpbHNcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL21vZHVsZXMvcGF0aF91dGlsc1wiO1xuLy8gaW1wb3J0IHdpdGhDb2xsZWN0aW9uUHJvcHMgZnJvbSBcIi4vd2l0aENvbGxlY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiLi4vRm9ybUNvbnRleHRcIjtcbmltcG9ydCB7IGdldEZpZWxkR3JvdXBzLCBnZXRGaWVsZE5hbWVzLCBnZXRMYWJlbCB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgaXNOb3RTYW1lRG9jdW1lbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgdXNlV2Fybk9uVW5zYXZlZCB9IGZyb20gXCIuLi91c2VXYXJuT25VbnNhdmVkXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4uL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuaW1wb3J0IHR5cGUgeyBGb3JtVHlwZSB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5pbXBvcnQge1xuICBDcmVhdGVEb2N1bWVudFJlc3VsdCxcbiAgRm9ybVByb3BzLFxuICBGb3JtU3RhdGUsXG4gIFVwZGF0ZURvY3VtZW50UmVzdWx0LFxufSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyBNdXRhdGlvblJlc3VsdCB9IGZyb20gXCJAYXBvbGxvL2NsaWVudFwiO1xuXG4vLyBwcm9wcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgZm9ybSByZXNldFxuY29uc3QgUkVTRVRfUFJPUFMgPSBbXG4gIFwibW9kZWxcIixcbiAgLy8gXCJjb2xsZWN0aW9uXCIsXG4gIC8vIFwiY29sbGVjdGlvbk5hbWVcIixcbiAgXCJkb2N1bWVudFwiLFxuICBcInNjaGVtYVwiLFxuICBcImN1cnJlbnRVc2VyXCIsXG4gIFwiZmllbGRzXCIsXG4gIFwicmVtb3ZlRmllbGRzXCIsXG4gIFwicHJlZmlsbGVkUHJvcHNcIiwgLy8gVE9ETzogcHJlZmlsbGVkUHJvcHMgc2hvdWxkIGJlIG1lcmdlZCBpbnN0ZWFkP1xuXTtcblxuY29uc3QgY29tcGFjdFBhcmVudCA9IChvYmplY3QsIHBhdGgpID0+IHtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhcmVudFBhdGgocGF0aCk7XG5cbiAgLy8gbm90ZTogd2Ugb25seSB3YW50IHRvIGNvbXBhY3QgYXJyYXlzLCBub3Qgb2JqZWN0c1xuICBjb25zdCBjb21wYWN0SWZBcnJheSA9ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGNvbXBhY3QoeCkgOiB4KTtcblxuICB1cGRhdGUob2JqZWN0LCBwYXJlbnRQYXRoLCBjb21wYWN0SWZBcnJheSk7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0VmFsdWVzID0gKGNvbnZlcnRlZFNjaGVtYSkgPT4ge1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgd29yayB3aXRoIG5lc3RlZCBzY2hlbWFzLCB0b29cbiAgcmV0dXJuIHBpY2tCeShcbiAgICBtYXBWYWx1ZXMoY29udmVydGVkU2NoZW1hLCAoZmllbGQpID0+IGZpZWxkLmRlZmF1bHRWYWx1ZSksXG4gICAgKHZhbHVlKSA9PiB2YWx1ZVxuICApO1xufTtcblxuY29uc3QgY29tcGFjdE9iamVjdCA9IChvKSA9PiBvbWl0QnkobywgKGYpID0+IGYgPT09IG51bGwgfHwgZiA9PT0gdW5kZWZpbmVkKTtcblxuY29uc3QgZ2V0SW5pdGlhbFN0YXRlRnJvbVByb3BzID0gKG5leHRQcm9wczogRm9ybVByb3BzKTogRm9ybVN0YXRlID0+IHtcbiAgY29uc3Qgc2NoZW1hID0gbmV4dFByb3BzLnNjaGVtYSB8fCBuZXh0UHJvcHMubW9kZWwuc2NoZW1hO1xuICBjb25zdCBjb252ZXJ0ZWRTY2hlbWEgPSBjb252ZXJ0U2NoZW1hKHNjaGVtYSk7XG4gIGNvbnN0IGZvcm1UeXBlOiBGb3JtVHlwZSA9IG5leHRQcm9wcy5kb2N1bWVudCA/IFwiZWRpdFwiIDogXCJuZXdcIjtcbiAgLy8gZm9yIG5ldyBkb2N1bWVudCBmb3JtcywgYWRkIGRlZmF1bHQgdmFsdWVzIHRvIGluaXRpYWwgZG9jdW1lbnRcbiAgY29uc3QgZGVmYXVsdFZhbHVlcyA9XG4gICAgZm9ybVR5cGUgPT09IFwibmV3XCIgPyBnZXREZWZhdWx0VmFsdWVzKGNvbnZlcnRlZFNjaGVtYSkgOiB7fTtcbiAgLy8gbm90ZTogd2UgcmVtb3ZlIG51bGwvdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBsb2FkZWQgZG9jdW1lbnQgc28gdGhleSBkb24ndCBvdmVyd3JpdGUgcG9zc2libGUgcHJlZmlsbGVkUHJvcHNcbiAgY29uc3QgaW5pdGlhbERvY3VtZW50ID0gbWVyZ2UoXG4gICAge30sXG4gICAgZGVmYXVsdFZhbHVlcyxcbiAgICBuZXh0UHJvcHMucHJlZmlsbGVkUHJvcHMsXG4gICAgY29tcGFjdE9iamVjdChuZXh0UHJvcHMuZG9jdW1lbnQpXG4gICk7XG5cbiAgLy9pZiBtaW5Db3VudCBpcyBzcGVjaWZpZWQsIGdvIGFoZWFkIGFuZCBjcmVhdGUgZW1wdHkgbmVzdGVkIGRvY3VtZW50c1xuICBPYmplY3Qua2V5cyhjb252ZXJ0ZWRTY2hlbWEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGxldCBtaW5Db3VudCA9IGNvbnZlcnRlZFNjaGVtYVtrZXldLm1pbkNvdW50O1xuICAgIGlmIChtaW5Db3VudCkge1xuICAgICAgaW5pdGlhbERvY3VtZW50W2tleV0gPSBpbml0aWFsRG9jdW1lbnRba2V5XSB8fCBbXTtcbiAgICAgIHdoaWxlIChpbml0aWFsRG9jdW1lbnRba2V5XS5sZW5ndGggPCBtaW5Db3VudClcbiAgICAgICAgaW5pdGlhbERvY3VtZW50W2tleV0ucHVzaCh7fSk7XG4gICAgfVxuICB9KTtcblxuICAvLyByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiB0aGUgYF9fdHlwZW5hbWVgIHByb3BlcnR5IGZyb20gZG9jdW1lbnRcbiAgcmVtb3ZlUHJvcGVydHkoaW5pdGlhbERvY3VtZW50LCBcIl9fdHlwZW5hbWVcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlZDogbmV4dFByb3BzLmRpc2FibGVkLFxuICAgIGVycm9yczogW10sXG4gICAgZGVsZXRlZFZhbHVlczogW10sXG4gICAgY3VycmVudFZhbHVlczoge30sXG4gICAgb3JpZ2luYWxTY2hlbWE6IGNvbnZlcnRTY2hlbWEoc2NoZW1hLCB7IHJlbW92ZUFycmF5czogZmFsc2UgfSksXG4gICAgLy8gY29udmVydCBTaW1wbGVTY2hlbWEgc2NoZW1hIGludG8gSlNPTiBvYmplY3RcbiAgICBzY2hlbWE6IGNvbnZlcnRlZFNjaGVtYSxcbiAgICAvLyBBbHNvIHN0b3JlIGFsbCBmaWVsZCBzY2hlbWFzIChpbmNsdWRpbmcgbmVzdGVkIHNjaGVtYXMpIGluIGEgZmxhdCBzdHJ1Y3R1cmVcbiAgICBmbGF0U2NoZW1hOiBjb252ZXJ0U2NoZW1hKHNjaGVtYSwgeyBmbGF0dGVuOiB0cnVlIH0pLFxuICAgIC8vIHRoZSBpbml0aWFsIGRvY3VtZW50IHBhc3NlZCBhcyBwcm9wc1xuICAgIGluaXRpYWxEb2N1bWVudCxcbiAgICAvLyBpbml0aWFsaXplIHRoZSBjdXJyZW50IGRvY3VtZW50IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsIGRvY3VtZW50XG4gICAgY3VycmVudERvY3VtZW50OiBpbml0aWFsRG9jdW1lbnQsXG4gIH07XG59O1xuXG5jb25zdCBnZXRDaGlsZHJlblByb3BzID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiZGlzYWJsZWRcIiB8IFwiY3VycmVudERvY3VtZW50XCI+LFxuICBvcHRpb25zOiB7IGZvcm1UeXBlOiBGb3JtVHlwZSB9LFxuICAvLyBUT0RPOiB0aGF0IGJlbG9uZ3MgdG8gdGhlIGNvbnRleHQgaW5zdGVhZFxuICBjYWxsYmFja3M6IHsgZGVsZXRlRG9jdW1lbnQ6IEZ1bmN0aW9uIH1cbik6IHtcbiAgZm9ybUxheW91dFByb3BzOiBGb3JtTGF5b3V0UHJvcHM7XG4gIGZvcm1Hcm91cFByb3BzOiBGdW5jdGlvbjtcbiAgY29tbW9uUHJvcHM6IGFueTtcbiAgZm9ybVN1Ym1pdFByb3BzOiBGb3JtU3VibWl0UHJvcHM7XG59ID0+IHtcbiAgY29uc3Qge1xuICAgIGN1cnJlbnRVc2VyLFxuICAgIHJlcGVhdEVycm9ycyxcbiAgICBzdWJtaXRMYWJlbCxcbiAgICBjYW5jZWxMYWJlbCxcbiAgICByZXZlcnRMYWJlbCxcbiAgICBjYW5jZWxDYWxsYmFjayxcbiAgICByZXZlcnRDYWxsYmFjayxcbiAgICBpZCxcbiAgICBtb2RlbCxcbiAgICBwcmVmaWxsZWRQcm9wcyxcbiAgICBpdGVtUHJvcGVydGllcyxcbiAgICBjb250ZXh0TmFtZSxcbiAgICBzaG93UmVtb3ZlLFxuICAgIHNob3dEZWxldGUsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyBkaXNhYmxlZCwgY3VycmVudERvY3VtZW50IH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBmb3JtVHlwZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyBkZWxldGVEb2N1bWVudCB9ID0gY2FsbGJhY2tzO1xuICBjb25zdCBjb21tb25Qcm9wcyA9IHtcbiAgICBkb2N1bWVudDogY3VycmVudERvY3VtZW50LFxuICAgIGZvcm1UeXBlLFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIGRpc2FibGVkLFxuICAgIHByZWZpbGxlZFByb3BzLFxuICAgIGl0ZW1Qcm9wZXJ0aWVzLFxuICAgIGNvbnRleHROYW1lLFxuICB9O1xuXG4gIGNvbnN0IGRvY0NsYXNzTmFtZSA9IGBkb2N1bWVudC0ke2Zvcm1UeXBlfWA7XG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZm9ybVByb3BzID0ge1xuICAgIGNsYXNzTmFtZTogYCR7ZG9jQ2xhc3NOYW1lfSAke2RvY0NsYXNzTmFtZX0tJHttb2RlbE5hbWV9YCxcbiAgICBpZDogaWQsXG4gICAgLy8gSXQncyB0aGUgZm9ybSBlbGVtZW50IHJlc3BvbnNpYmlsaXR5IHRvIGdldCBzdWJtaXRGb3JtIGZyb20gY29udGV4dFxuICAgIC8vIG9uU3VibWl0OiB0aGlzLnN1Ym1pdEZvcm0oZm9ybVR5cGUpLFxuICAgIC8vIFRPRE86IHVwZGF0ZSB0byB1c2VSZWZcbiAgICAvL3JlZjogKGUpID0+IHtcbiAgICAvLyAgdGhpcy5mb3JtID0gZTtcbiAgICAvL30sXG4gIH07XG5cbiAgY29uc3QgZm9ybUdyb3VwUHJvcHMgPSAoZ3JvdXApID0+ICh7XG4gICAga2V5OiBncm91cC5uYW1lLFxuICAgIC4uLmdyb3VwLFxuICAgIGdyb3VwOiBvbWl0KGdyb3VwLCBbXCJmaWVsZHNcIl0pLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICB9KTtcblxuICBjb25zdCBmb3JtU3VibWl0UHJvcHMgPSB7XG4gICAgbW9kZWwsXG4gICAgY3VycmVudFVzZXIsXG4gICAgc3VibWl0TGFiZWwsXG4gICAgY2FuY2VsTGFiZWwsXG4gICAgcmV2ZXJ0TGFiZWwsXG4gICAgY2FuY2VsQ2FsbGJhY2ssXG4gICAgcmV2ZXJ0Q2FsbGJhY2ssXG4gICAgZG9jdW1lbnQ6IGN1cnJlbnREb2N1bWVudCxcbiAgICAvLyBUT0RPOiBzaG91bGQgcHJvYmFibHkgYmUgcGFzc2VkIHRocm91Z2ggY29udGV4dFxuICAgIGRlbGV0ZURvY3VtZW50OlxuICAgICAgKGZvcm1UeXBlID09PSBcImVkaXRcIiAmJiBzaG93UmVtb3ZlICYmIHNob3dEZWxldGUgJiYgZGVsZXRlRG9jdW1lbnQpIHx8XG4gICAgICBudWxsLFxuICB9O1xuXG4gIGNvbnN0IGZvcm1MYXlvdXRQcm9wcyA9IHtcbiAgICBmb3JtUHJvcHM6IGZvcm1Qcm9wcyxcbiAgICByZXBlYXRFcnJvcnM6IHJlcGVhdEVycm9ycyxcbiAgICBzdWJtaXRQcm9wczogZm9ybVN1Ym1pdFByb3BzLFxuICAgIGNvbW1vblByb3BzLFxuICB9O1xuICByZXR1cm4ge1xuICAgIGNvbW1vblByb3BzLFxuICAgIGZvcm1TdWJtaXRQcm9wcyxcbiAgICBmb3JtR3JvdXBQcm9wcyxcbiAgICBmb3JtTGF5b3V0UHJvcHMsXG4gIH07XG59O1xuXG4vLyBjb21wb25lbnQgZm9ybSB1bnRpbCB3ZSBnbyBzdGF0ZWxlc3NcbmNvbnN0IEZvcm1XYXJuVW5zYXZlZCA9ICh7XG4gIGlzQ2hhbmdlZCxcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzLFxuICBjaGlsZHJlbixcbn06IHtcbiAgaXNDaGFuZ2VkOiBib29sZWFuO1xuICB3YXJuVW5zYXZlZENoYW5nZXM/OiBib29sZWFuO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4ge1xuICB1c2VXYXJuT25VbnNhdmVkKHtcbiAgICBpc0NoYW5nZWQsXG4gICAgd2FyblVuc2F2ZWRDaGFuZ2VzLFxuICB9KTtcbiAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbn07XG5cbi8qXG5cbiAgTGlrZSBnZXREb2N1bWVudCwgYnV0IGNyb3NzLXJlZmVyZW5jZSB3aXRoIGdldEZpZWxkTmFtZXMoKVxuICB0byBvbmx5IHJldHVybiBmaWVsZHMgdGhhdCBhY3R1YWxseSBuZWVkIHRvIGJlIHN1Ym1pdHRlZFxuXG4gIEFsc28gcmVtb3ZlIGFueSBkZWxldGVkIHZhbHVlcy5cblxuICAqL1xuY29uc3QgZ2V0RGF0YSA9IChcbiAgY3VzdG9tQXJncyxcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJkZWxldGVkVmFsdWVzXCI+LFxuICAvLyBwcmV2aW91c2x5IGZyb20gXCJ0aGlzXCIgb2JqZWN0XG4gIHsgc3VibWl0Rm9ybUNhbGxiYWNrcywgZm9ybSB9OiBhbnlcbikgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgbW9kZWwsIHByZWZpbGxlZFByb3BzIH0gPSBwcm9wcztcbiAgLy8gd2Ugd2FudCB0byBrZWVwIHByZWZpbGxlZCBkYXRhIGV2ZW4gZm9yIGhpZGRlbi9yZW1vdmVkIGZpZWxkc1xuICBsZXQgZGF0YSA9IHByZWZpbGxlZFByb3BzIHx8IHt9O1xuXG4gIC8vIG9taXQgcHJlZmlsbGVkIHByb3BzIGZvciBuZXN0ZWQgZmllbGRzXG4gIGRhdGEgPSBvbWl0QnkoZGF0YSwgKHZhbHVlLCBrZXkpID0+IGtleS5lbmRzV2l0aChcIi4kXCIpKTtcblxuICBjb25zdCBhcmdzID0ge1xuICAgIHNjaGVtYTogbW9kZWwuc2NoZW1hLFxuICAgIGV4Y2x1ZGVSZW1vdmVkRmllbGRzOiBmYWxzZSxcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzOiBmYWxzZSxcbiAgICByZXBsYWNlSW50bEZpZWxkczogdHJ1ZSxcbiAgICBhZGRFeHRyYUZpZWxkczogZmFsc2UsXG4gICAgLi4uY3VzdG9tQXJncyxcbiAgfTtcblxuICAvLyBvbmx5IGtlZXAgcmVsZXZhbnQgZmllbGRzXG4gIC8vIGZvciBpbnRsIGZpZWxkcywgbWFrZSBzdXJlIHdlIGxvb2sgaW4gZm9vX2ludGwgYW5kIG5vdCBmb29cbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGROYW1lcyhwcm9wcywgY3VycmVudERvY3VtZW50LCBhcmdzKTtcbiAgZGF0YSA9IHsgLi4uZGF0YSwgLi4ucGljayhjdXJyZW50RG9jdW1lbnQsIC4uLmZpZWxkcykgfTtcblxuICAvLyBjb21wYWN0IGRlbGV0ZWQgdmFsdWVzXG4gIHN0YXRlLmRlbGV0ZWRWYWx1ZXMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLypcblxuICAgICAgICBJZiBkZWxldGVkIGZpZWxkIGlzIGEgbmVzdGVkIGZpZWxkLCBuZXN0ZWQgYXJyYXksIG9yIG5lc3RlZCBhcnJheSBpdGVtLCB0cnkgdG8gY29tcGFjdCBpdHMgcGFyZW50IGFycmF5XG5cbiAgICAgICAgLSBOZXN0ZWQgZmllbGQ6ICdhZGRyZXNzLmNpdHknXG4gICAgICAgIC0gTmVzdGVkIGFycmF5OiAnYWRkcmVzc2VzLjEnXG4gICAgICAgIC0gTmVzdGVkIGFycmF5IGl0ZW06ICdhZGRyZXNzZXMuMS5jaXR5J1xuXG4gICAgICAgICovXG4gICAgICBjb21wYWN0UGFyZW50KGRhdGEsIHBhdGgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcnVuIGRhdGEgb2JqZWN0IHRocm91Z2ggc3VibWl0Rm9ybSBjYWxsYmFja3NcbiAgZGF0YSA9IHJ1bkNhbGxiYWNrcyh7XG4gICAgY2FsbGJhY2tzOiBzdWJtaXRGb3JtQ2FsbGJhY2tzLFxuICAgIGl0ZXJhdG9yOiBkYXRhLFxuICAgIGFyZ3M6IFtcbiAgICAgIHtcbiAgICAgICAgLypmb3JtOiB0aGlzKi9cbiAgICAgIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgRm9ybSA9IChwcm9wczogRm9ybVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgaW5pdENhbGxiYWNrLCBjcmVhdGVEb2N1bWVudCwgdXBkYXRlRG9jdW1lbnQsIGRlbGV0ZURvY3VtZW50IH0gPVxuICAgIHByb3BzO1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICBjb25zdCB7IHNjaGVtYSwgb3JpZ2luYWxTY2hlbWEsIGZsYXRTY2hlbWEsIGluaXRpYWxEb2N1bWVudCB9ID0gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBpc0ZpcnN0UmVuZGVyID0gdXNlUmVmKHRydWUpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0ZpcnN0UmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgIGlzRmlyc3RSZW5kZXIuY3VycmVudCA9IGZhbHNlOyAvLyB0b2dnbGUgZmxhZyBhZnRlciBmaXJzdCByZW5kZXIvbW91bnRpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluaXRDYWxsYmFjaykgaW5pdENhbGxiYWNrKGluaXRpYWxTdGF0ZS5jdXJyZW50RG9jdW1lbnQpO1xuICB9LCBbaW5pdENhbGxiYWNrXSk7XG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYXlvdXQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgIHByZWZpbGxlZFByb3BzOiB7fSxcbiAgICByZXBlYXRFcnJvcnM6IGZhbHNlLFxuICAgIHNob3dSZW1vdmU6IHRydWUsXG4gICAgc2hvd0RlbGV0ZTogdHJ1ZSxcbiAgfTtcbiAgY29uc3QgYWxsUHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgLi4ucHJvcHMgfTtcbiAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IHt9O1xuICBjb25zdCBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgY29uc3Qgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBjb25zdCBmYWlsdXJlRm9ybUNhbGxiYWNrczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsQ29udGV4dCgpO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVycm9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLypcblxuICBBZGQgZXJyb3IgdG8gZm9ybSBzdGF0ZVxuXG4gIEVycm9ycyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgLSBpZDogdXNlZCBhcyBhbiBpbnRlcm5hdGlvbmFsaXphdGlvbiBrZXksIGZvciBleGFtcGxlIGBlcnJvcnMucmVxdWlyZWRgXG4gICAgLSBwYXRoOiBmb3IgZmllbGQtc3BlY2lmaWMgZXJyb3JzLCB0aGUgcGF0aCBvZiB0aGUgZmllbGQgd2l0aCB0aGUgaXNzdWVcbiAgICAtIHByb3BlcnRpZXM6IGFkZGl0aW9uYWwgZGF0YS4gV2lsbCBiZSBwYXNzZWQgdG8gdnVsY2FuLWkxOG4gYXMgdmFsdWVzXG4gICAgLSBtZXNzYWdlOiBpZiBpZCBjYW5ub3QgYmUgdXNlZCBhcyBpODFuIGtleSwgbWVzc2FnZSB3aWxsIGJlIHVzZWRcblxuICAqL1xuICBjb25zdCBbZXJyb3JzLCBzZXRFcnJvcnNdID0gdXNlU3RhdGU8QXJyYXk8YW55Pj4oW10pO1xuICBjb25zdCB0aHJvd0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgbGV0IGZvcm1FcnJvcnMgPSBnZXRFcnJvcnMoZXJyb3IpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhmb3JtRXJyb3JzKTtcblxuICAgIC8vIGFkZCBlcnJvcihzKSB0byBzdGF0ZVxuICAgIHNldEVycm9ycygocHJldkVycm9ycykgPT4gWy4uLnByZXZFcnJvcnMsIC4uLmZvcm1FcnJvcnNdKTtcbiAgfTtcblxuICAvKlxuXG4gIENsZWFyIGVycm9ycyBmb3IgYSBmaWVsZFxuXG4gICovXG4gIGNvbnN0IGNsZWFyRmllbGRFcnJvcnMgPSAocGF0aCkgPT4ge1xuICAgIHNldEVycm9ycygocHJldkVycm9ycykgPT5cbiAgICAgIHByZXZFcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGF0aCAhPT0gcGF0aClcbiAgICApO1xuICB9O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgY29uc3QgW2RlbGV0ZWRWYWx1ZXMsIHNldERlbGV0ZWRWYWx1ZXNdID0gdXNlU3RhdGU8QXJyYXk8YW55Pj4oW10pO1xuXG4gIC8vIGFkZCBzb21ldGhpbmcgdG8gZGVsZXRlZCB2YWx1ZXNcbiAgY29uc3QgYWRkVG9EZWxldGVkVmFsdWVzID0gKG5hbWUpID0+IHtcbiAgICBzZXREZWxldGVkVmFsdWVzKChwcmV2RGVsZXRlZFZhbHVlcykgPT4gWy4uLnByZXZEZWxldGVkVmFsdWVzLCBuYW1lXSk7XG4gIH07XG5cbiAgaW50ZXJmYWNlIENhbGxiYWNrcyB7XG4gICAgc3VibWl0Rm9ybUNhbGxiYWNrczogQXJyYXk8YW55PjtcbiAgICBzdWNjZXNzRm9ybUNhbGxiYWNrczogQXJyYXk8YW55PjtcbiAgICBmYWlsdXJlRm9ybUNhbGxiYWNrczogQXJyYXk8YW55PjtcbiAgfVxuICBjb25zdCBbY2FsbGJhY2tzLCBzZXRDYWxsYmFja3NdID0gdXNlU3RhdGU8Q2FsbGJhY2tzPih7XG4gICAgc3VibWl0Rm9ybUNhbGxiYWNrczogW10sXG4gICAgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IFtdLFxuICAgIGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgfSk7XG4gIC8vIGFkZCBhIGNhbGxiYWNrIHRvIHRoZSBmb3JtIHN1Ym1pc3Npb25cbiAgY29uc3QgYWRkVG9TdWJtaXRGb3JtID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgc2V0Q2FsbGJhY2tzKChjYnMpID0+ICh7XG4gICAgICAuLi5jYnMsXG4gICAgICBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBbLi4uY2JzLnN1Ym1pdEZvcm1DYWxsYmFja3MsIGNhbGxiYWNrXSxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gYWRkIGEgY2FsbGJhY2sgdG8gZm9ybSBzdWJtaXNzaW9uIHN1Y2Nlc3NcbiAgY29uc3QgYWRkVG9TdWNjZXNzRm9ybSA9IChjYWxsYmFjaykgPT4ge1xuICAgIHNldENhbGxiYWNrcygoY2JzKSA9PiAoe1xuICAgICAgLi4uY2JzLFxuICAgICAgc3VjY2Vzc0Zvcm1DYWxsYmFja3M6IFsuLi5jYnMuc3VjY2Vzc0Zvcm1DYWxsYmFja3MsIGNhbGxiYWNrXSxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gYWRkIGEgY2FsbGJhY2sgdG8gZm9ybSBzdWJtaXNzaW9uIGZhaWx1cmVcbiAgY29uc3QgYWRkVG9GYWlsdXJlRm9ybSA9IChjYWxsYmFjaykgPT4ge1xuICAgIHNldENhbGxiYWNrcygoY2JzKSA9PiAoe1xuICAgICAgLi4uY2JzLFxuICAgICAgZmFpbHVyZUZvcm1DYWxsYmFja3M6IFsuLi5jYnMuZmFpbHVyZUZvcm1DYWxsYmFja3MsIGNhbGxiYWNrXSxcbiAgICB9KSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYXJGb3JtQ2FsbGJhY2tzID0gKCkgPT4ge1xuICAgIHNldENhbGxiYWNrcyh7XG4gICAgICBzdWJtaXRGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICAgIHN1Y2Nlc3NGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICAgIGZhaWx1cmVGb3JtQ2FsbGJhY2tzOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICAvKlxuICBzZXRGb3JtU3RhdGUgPSAoZm4pID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKGZuKTtcbiAgfTtcbiAgKi9cblxuICBjb25zdCBbY3VycmVudFZhbHVlcywgc2V0Q3VycmVudFZhbHVlc10gPSB1c2VTdGF0ZTxPYmplY3Q+KHt9KTtcblxuICBjb25zdCBzdWJtaXRGb3JtQ29udGV4dCA9IChmb3JtVHlwZTogRm9ybVR5cGUpID0+IChldmVudCAvKm5ld1ZhbHVlcyovKSA9PiB7XG4gICAgLypcbiAgICBUT0RPOiBwcmV2aW91c2x5IHRoaXMgY2FsbGJhY2sgd2FzIHVwZGF0aW5nIHRoZSBjdXJyZW50IHZhbHVlcyB3aXRoIG5ldyB2YWx1ZXMgYWZ0ZXIgdGhpcyBjYWxsXG4gICAgTmVlZCB0byBjaGVjayBob3cgdGhpcyB3b3JrZWQgaW4gVnVsY2FuIGluaXRpYWxseVxuICAgIHNldEN1cnJlbnRWYWx1ZXMoKHByZXZDdXJyZW50VmFsdWVzKSA9PiAoe1xuICAgICAgLi4ucHJldkN1cnJlbnRWYWx1ZXMsXG4gICAgICAuLi5uZXdWYWx1ZXMsXG4gICAgfSkpO1xuICAgICovXG4gICAgLy8gVE9ETzogcHJldmlvdXNseSwgdGhpcyB3YXMgdXNpbmcgYSBjYWxsYmFjayBmcm9tIHNldEN1cnJlbnRWYWx1ZXNcbiAgICAvLyB0aGlzIG5lZWRzIHRvIGJlIHJlYXJjaGl0ZWN0dXJlZCB0byB3b3JrIHdpdGhvdXQsIHdpbGwgbmVlZCBzb21lIGNoZWNrXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTYyNDc0MzMvaG93LXRvLXVzZS1zZXRzdGF0ZS1jYWxsYmFjay1vbi1yZWFjdC1ob29rc1xuICAgIHN1Ym1pdEZvcm0oZm9ybVR5cGUpKGV2ZW50KTtcbiAgfTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8qXG5cbiAgV2hlbiBwcm9wcyBjaGFuZ2UsIHJlaW5pdGlhbGl6ZSB0aGUgZm9ybSAgc3RhdGVcbiAgVHJpZ2dlcmVkIG9ubHkgZm9yIGRhdGEgcmVsYXRlZCBwcm9wcyAoY29sbGVjdGlvbiwgZG9jdW1lbnQsIGN1cnJlbnRVc2VyIGV0Yy4pXG5cbiAgQHNlZSBodHRwczovL3JlYWN0anMub3JnL2Jsb2cvMjAxOC8wNi8wNy95b3UtcHJvYmFibHktZG9udC1uZWVkLWRlcml2ZWQtc3RhdGUuaHRtbFxuXG4gICovXG4gIC8qXG4gIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGNvbnN0IG5lZWRSZXNldCA9ICEhUkVTRVRfUFJPUFMuZmluZChcbiAgICAgIChwcm9wKSA9PiAhaXNFcXVhbCh0aGlzLnByb3BzW3Byb3BdLCBuZXh0UHJvcHNbcHJvcF0pXG4gICAgKTtcbiAgICBpZiAobmVlZFJlc2V0KSB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICBpZiAobmV4dFByb3BzLmluaXRDYWxsYmFjaylcbiAgICAgICAgbmV4dFByb3BzLmluaXRDYWxsYmFjayhuZXdTdGF0ZS5jdXJyZW50RG9jdW1lbnQpO1xuICAgIH1cbiAgfSovXG5cbiAgY29uc3QgW2N1cnJlbnREb2N1bWVudCwgc2V0Q3VycmVudERvY3VtZW50XSA9XG4gICAgdXNlU3RhdGU8e1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBfaWQ/OiBzdHJpbmc7XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgIH0+KGluaXRpYWxEb2N1bWVudCk7XG5cbiAgLypcblxuICBNYW51YWxseSB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIG9uZSBvciBtb3JlIGZpZWxkcyhpLmUuIG9uIGNoYW5nZSBvciBibHVyKS5cblxuICAqL1xuICBjb25zdCB1cGRhdGVDdXJyZW50VmFsdWVzID0gKG5ld1ZhbHVlcywgb3B0aW9uczogeyBtb2RlPzogc3RyaW5nIH0gPSB7fSkgPT4ge1xuICAgIC8vIGRlZmF1bHQgdG8gb3ZlcndyaXRpbmcgb2xkIHZhbHVlIHdpdGggbmV3XG4gICAgY29uc3QgeyBtb2RlID0gXCJvdmVyd3JpdGVcIiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGNoYW5nZUNhbGxiYWNrIH0gPSBwcm9wcztcblxuICAgIC8vIGtlZXAgdGhlIHByZXZpb3VzIG9uZXMgYW5kIGV4dGVuZCAod2l0aCBwb3NzaWJsZSByZXBsYWNlbWVudCkgd2l0aCBuZXcgb25lc1xuICAgIC8vIGtlZXAgb25seSB0aGUgcmVsZXZhbnQgcHJvcGVydGllc1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgY3VycmVudFZhbHVlczogY2xvbmVEZWVwKGN1cnJlbnRWYWx1ZXMpLFxuICAgICAgY3VycmVudERvY3VtZW50OiBjbG9uZURlZXAoY3VycmVudERvY3VtZW50KSxcbiAgICAgIGRlbGV0ZWRWYWx1ZXM6IGNsb25lRGVlcChkZWxldGVkVmFsdWVzKSxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmtleXMobmV3VmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBrZXk7XG4gICAgICBsZXQgdmFsdWUgPSBuZXdWYWx1ZXNba2V5XTtcblxuICAgICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZGVsZXRlIHZhbHVlXG4gICAgICAgIHVuc2V0KG5ld1N0YXRlLmN1cnJlbnRWYWx1ZXMsIHBhdGgpO1xuICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoLCBudWxsKTtcbiAgICAgICAgbmV3U3RhdGUuZGVsZXRlZFZhbHVlcyA9IFsuLi5uZXdTdGF0ZS5kZWxldGVkVmFsdWVzLCBwYXRoXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDEuIHVwZGF0ZSBjdXJyZW50VmFsdWVzXG4gICAgICAgIHNldChuZXdTdGF0ZS5jdXJyZW50VmFsdWVzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICAgICAgLy8gMi4gdXBkYXRlIGN1cnJlbnREb2N1bWVudFxuICAgICAgICAvLyBGb3IgYXJyYXlzIGFuZCBvYmplY3RzLCBnaXZlIG9wdGlvbiB0byBtZXJnZSBpbnN0ZWFkIG9mIG92ZXJ3cml0ZVxuICAgICAgICBpZiAobW9kZSA9PT0gXCJtZXJnZVwiICYmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc09iamVjdCh2YWx1ZSkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBnZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoKTtcbiAgICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoLCBtZXJnZShvbGRWYWx1ZSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQobmV3U3RhdGUuY3VycmVudERvY3VtZW50LCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBpbiBjYXNlIHZhbHVlIGhhZCBwcmV2aW91c2x5IGJlZW4gZGVsZXRlZCwgXCJ1bmRlbGV0ZVwiIGl0XG4gICAgICAgIG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMgPSB3aXRob3V0KG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMsIHBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VDYWxsYmFjaykgY2hhbmdlQ2FsbGJhY2sobmV3U3RhdGUuY3VycmVudERvY3VtZW50KTtcblxuICAgIC8vIFRPRE86IHByZWZlciAgYSByZWR1Y2VyXG4gICAgc2V0Q3VycmVudFZhbHVlcyhuZXdTdGF0ZS5jdXJyZW50VmFsdWVzKTtcbiAgICBzZXRDdXJyZW50RG9jdW1lbnQobmV3U3RhdGUuY3VycmVudERvY3VtZW50KTtcbiAgICBzZXREZWxldGVkVmFsdWVzKG5ld1N0YXRlLmRlbGV0ZWRWYWx1ZXMpO1xuICB9O1xuXG4gIC8qXG5cbiAgUmVmZXRjaCB0aGUgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2UgKGluIGNhc2UgaXQgd2FzIHVwZGF0ZWQgYnkgYW5vdGhlciBwcm9jZXNzIG9yIHRvIHJlc2V0IHRoZSBmb3JtKVxuXG4gICovXG4gIGNvbnN0IHJlZmV0Y2hGb3JtID0gKCkgPT4ge1xuICAgIGlmIChwcm9wcy5yZWZldGNoKSB7XG4gICAgICBwcm9wcy5yZWZldGNoKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFtkaXNhYmxlZCwgc2V0RGlzYWJsZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOyAvLyBUT0RPXG4gIGNvbnN0IFtzdWNjZXNzLCBzZXRTdWNjZXNzXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsgLy8gVE9ET1xuICAvKipcbiAgICogQ2xlYXJzIGZvcm0gZXJyb3JzIGFuZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIENsZWFyIGZvcm1cbiAgICogIC8vIGZvcm0gd2lsbCBiZSBmdWxseSBlbXB0aWVkLCB3aXRoIGV4Y2VwdGlvbiBvZiBwcmVmaWxsZWQgdmFsdWVzXG4gICAqICBjbGVhckZvcm0oeyBkb2N1bWVudDoge30gfSk7XG4gICAqXG4gICAqIEBleGFtcGxlIFJlc2V0L3JldmVydCBmb3JtXG4gICAqICAvLyBmb3JtIHdpbGwgYmUgcmV2ZXJ0ZWQgdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgICogIGNsZWFyRm9ybSgpO1xuICAgKlxuICAgKiBAZXhhbXBsZSBDbGVhciB3aXRoIG5ldyB2YWx1ZXNcbiAgICogIC8vIGZvcm0gd2lsbCBiZSBjbGVhcmVkIGJ1dCBpbml0aWFsaXplZCB3aXRoIHRoZSBuZXcgZG9jdW1lbnRcbiAgICogIGNvbnN0IGRvY3VtZW50ID0ge1xuICAgKiAgICAvLyAuLi4gc29tZSB2YWx1ZXNcbiAgICogIH07XG4gICAqICBjbGVhckZvcm0oeyBkb2N1bWVudCB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucy5kb2N1bWVudFxuICAgKiAgRG9jdW1lbnQgdG8gdXNlIGFzIG5ldyBpbml0aWFsIGRvY3VtZW50IHdoZW4gdmFsdWVzIGFyZSBjbGVhcmVkIGluc3RlYWQgb2ZcbiAgICogIHRoZSBleGlzdGluZyBvbmUuIE5vdGUgdGhhdCBwcmVmaWxsZWQgcHJvcHMgd2lsbCBiZSBtZXJnZWRcbiAgICovXG4gIGNvbnN0IGNsZWFyRm9ybSA9IChvcHRpb25zOiB7IGRvY3VtZW50PzogYW55IH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZG9jdW1lbnQ6IG9wdGlvbnNEb2N1bWVudCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBkb2N1bWVudCA9IG9wdGlvbnNEb2N1bWVudFxuICAgICAgPyBtZXJnZSh7fSwgcHJvcHMucHJlZmlsbGVkUHJvcHMsIG9wdGlvbnNEb2N1bWVudClcbiAgICAgIDogbnVsbDtcbiAgICAvLyBUT0RPOiBwcmVmZXIgYSByZWR1Y2VyXG4gICAgc2V0RXJyb3JzKFtdKTtcbiAgICBzZXRDdXJyZW50VmFsdWVzKHt9KTtcbiAgICBzZXREZWxldGVkVmFsdWVzKFtdKTtcbiAgICBzZXRDdXJyZW50RG9jdW1lbnQoZG9jdW1lbnQgfHwgaW5pdGlhbERvY3VtZW50KTtcbiAgICAvLyBzZXRJbml0aWFsRG9jdW1lbnQoZG9jdW1lbnQgfHwgaW5pdGlhbERvY3VtZW50KTtcbiAgICBzZXREaXNhYmxlZChmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgbmV3TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VE1vZGVsID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IENyZWF0ZURvY3VtZW50UmVzdWx0PFRNb2RlbD5cbiAgKSB7XG4gICAgbXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0LCBcIm5ld1wiKTtcbiAgfTtcblxuICBjb25zdCBlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VE1vZGVsID0gT2JqZWN0PihcbiAgICByZXN1bHQ6IFVwZGF0ZURvY3VtZW50UmVzdWx0PFRNb2RlbD5cbiAgKSB7XG4gICAgbXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0LCBcImVkaXRcIik7XG4gIH07XG5cbiAgY29uc3QgZm9ybVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbXV0YXRpb25TdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbiA8VE1vZGVsID0gT2JqZWN0PihcbiAgICAvLyBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uIHZhbGlkIHJlc3VsdHNcbiAgICByZXN1bHQ6IENyZWF0ZURvY3VtZW50UmVzdWx0PFRNb2RlbD4sXG4gICAgbXV0YXRpb25UeXBlOiBGb3JtVHlwZVxuICApIHtcbiAgICAvLyBUT0RPOiB1c2UgYSByZWR1Y2VyXG4gICAgc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgIHNldFN1Y2Nlc3ModHJ1ZSk7XG4gICAgLy8gZm9yIG5ldyBtdXRhdGlvbiwgcnVuIHJlZmV0Y2ggZnVuY3Rpb24gaWYgaXQgZXhpc3RzXG4gICAgLy8gVE9ETzogdGhlIGNyZWF0ZSBtdXRhdGlvbiBzaG91bGQgYWxyZWFkeSByZXR1cm4gdGhlIGZyZXNoZXN0IHZhbHVlLCBkbyB3ZSByZWFsbHkgbmVlZCB0aGF0P1xuICAgIC8vIGluc3RlYWQgd2UgbWlnaHQgd2FudCB0byB1cGRhdGUgY3VycmVudFJlc3VsdCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNyZWF0aW9uXG4gICAgaWYgKG11dGF0aW9uVHlwZSA9PT0gXCJuZXdcIikgcmVmZXRjaEZvcm0oKTtcbiAgICBsZXQgeyBkb2N1bWVudCB9ID0gcmVzdWx0O1xuXG4gICAgLy8gY2FsbCB0aGUgY2xlYXIgZm9ybSBtZXRob2QgKGkuZS4gdHJpZ2dlciBzZXRTdGF0ZSkgb25seSBpZiB0aGUgZm9ybSBoYXMgbm90IGJlZW4gdW5tb3VudGVkXG4gICAgLy8gKHdlIGFyZSBpbiBhbiBhc3luYyBjYWxsYmFjaywgZXZlcnl0aGluZyBjYW4gaGFwcGVuISlcbiAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCByZWx5IG9uIGEgcmVmXG4gICAgaWYgKGZvcm1SZWYuY3VycmVudCkge1xuICAgICAgY2xlYXJGb3JtKHtcbiAgICAgICAgZG9jdW1lbnQ6IG11dGF0aW9uVHlwZSA9PT0gXCJlZGl0XCIgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHJ1biBkb2N1bWVudCB0aHJvdWdoIG11dGF0aW9uIHN1Y2Nlc3MgY2FsbGJhY2tzXG4gICAgZG9jdW1lbnQgPSBydW5DYWxsYmFja3Moe1xuICAgICAgY2FsbGJhY2tzOiBzdWNjZXNzRm9ybUNhbGxiYWNrcyxcbiAgICAgIGl0ZXJhdG9yOiBkb2N1bWVudCxcbiAgICAgIGFyZ3M6IFt7IGZvcm06IGZvcm1SZWYuY3VycmVudCB9XSxcbiAgICB9KTtcblxuICAgIC8vIHJ1biBzdWNjZXNzIGNhbGxiYWNrIGlmIGl0IGV4aXN0c1xuICAgIGlmIChwcm9wcy5zdWNjZXNzQ2FsbGJhY2spIHByb3BzLnN1Y2Nlc3NDYWxsYmFjayhkb2N1bWVudCwgeyBmb3JtOiB0aGlzIH0pO1xuICB9O1xuXG4gIC8vIGNhdGNoIGdyYXBocWwgZXJyb3JzXG4gIGNvbnN0IG11dGF0aW9uRXJyb3JDYWxsYmFjayA9IChkb2N1bWVudCwgZXJyb3IpID0+IHtcbiAgICBzZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoXCIvLyBncmFwaFFMIEVycm9yXCIpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAvLyBydW4gbXV0YXRpb24gZmFpbHVyZSBjYWxsYmFja3Mgb24gZXJyb3IsIHdlIGRvIG5vdCBhbGxvdyB0aGUgY2FsbGJhY2tzIHRvIGNoYW5nZSB0aGUgZXJyb3JcbiAgICBydW5DYWxsYmFja3Moe1xuICAgICAgY2FsbGJhY2tzOiBmYWlsdXJlRm9ybUNhbGxiYWNrcyxcbiAgICAgIGl0ZXJhdG9yOiBlcnJvcixcbiAgICAgIGFyZ3M6IFt7IGVycm9yLCBmb3JtOiBmb3JtUmVmLmN1cnJlbnQgfV0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWlzRW1wdHkoZXJyb3IpKSB7XG4gICAgICAvLyBhZGQgZXJyb3IgdG8gc3RhdGVcbiAgICAgIHRocm93RXJyb3IoZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIHJ1biBlcnJvciBjYWxsYmFjayBpZiBpdCBleGlzdHNcbiAgICBpZiAocHJvcHMuZXJyb3JDYWxsYmFjaylcbiAgICAgIHByb3BzLmVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIGVycm9yLCB7IGZvcm06IHRoaXMgfSk7XG5cbiAgICAvLyBzY3JvbGwgYmFjayB1cCB0byBzaG93IGVycm9yIG1lc3NhZ2VzXG4gICAgLy8gVE9ETzogbWlncmF0ZSB0aGlzIHRvIHNjcm9sbCBvbiB0b3Agb2YgdGhlIGZvcm1cbiAgICAvL1V0aWxzLnNjcm9sbEludG9WaWV3KFwiLmZsYXNoLW1lc3NhZ2VcIik7XG4gIH07XG5cbiAgLypcblxuICBTdWJtaXQgZm9ybSBoYW5kbGVyXG5cbiAgKi9cbiAgY29uc3Qgc3VibWl0Rm9ybSA9IChmb3JtVHlwZTogRm9ybVR5cGUpID0+IGFzeW5jIChldmVudD86IEV2ZW50KSA9PiB7XG4gICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudCAmJiBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHsgY29udGV4dE5hbWUgfSA9IHByb3BzO1xuXG4gICAgLy8gaWYgZm9ybSBpcyBkaXNhYmxlZCAodGhlcmUgaXMgYWxyZWFkeSBhIHN1Ym1pdCBoYW5kbGVyIHJ1bm5pbmcpIGRvbid0IGRvIGFueXRoaW5nXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgZXJyb3JzIGFuZCBkaXNhYmxlIGZvcm0gd2hpbGUgaXQncyBzdWJtaXR0aW5nXG4gICAgc2V0RXJyb3JzKFtdKTtcbiAgICBzZXREaXNhYmxlZCh0cnVlKTtcblxuICAgIC8vIGNvbXBsZXRlIHRoZSBkYXRhIHdpdGggdmFsdWVzIGZyb20gY3VzdG9tIGNvbXBvbmVudHNcbiAgICAvLyBub3RlOiBpdCBmb2xsb3dzIHRoZSBzYW1lIGxvZ2ljIGFzIFNtYXJ0Rm9ybSdzIGdldERvY3VtZW50IG1ldGhvZFxuICAgIGxldCBkYXRhID0gZ2V0RGF0YShcbiAgICAgIHsgcmVwbGFjZUludGxGaWVsZHM6IHRydWUsIGFkZEV4dHJhRmllbGRzOiBmYWxzZSwgbXV0YWJsZUZpZWxkcyB9LFxuICAgICAgcHJvcHMsXG4gICAgICB7XG4gICAgICAgIGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgZGVsZXRlZFZhbHVlcyxcbiAgICAgIH0sXG4gICAgICB7IGZvcm06IGZvcm1SZWYuY3VycmVudCwgc3VibWl0Rm9ybUNhbGxiYWNrcyB9XG4gICAgKTtcblxuICAgIC8vIGlmIHRoZXJlJ3MgYSBzdWJtaXQgY2FsbGJhY2ssIHJ1biBpdFxuICAgIGlmIChwcm9wcy5zdWJtaXRDYWxsYmFjaykge1xuICAgICAgZGF0YSA9IHByb3BzLnN1Ym1pdENhbGxiYWNrKGRhdGEpIHx8IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1UeXBlID09PSBcIm5ld1wiKSB7XG4gICAgICAvLyBjcmVhdGUgZG9jdW1lbnQgZm9ybVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRG9jdW1lbnQoe1xuICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgY29udGV4dE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBUT0RPOiBwcmV2aW91c2x5IGdvdCBmcm9tIG1ldGEsIHdlIGNvdWxkIGhhdmUgbW9yZSB0aGFuIDEgZXJyb3JcbiAgICAgICAgICBtdXRhdGlvbkVycm9yQ2FsbGJhY2soZG9jdW1lbnQsIHJlc3VsdC5lcnJvcnNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld011dGF0aW9uU3VjY2Vzc0NhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG11dGF0aW9uRXJyb3JDYWxsYmFjayhkb2N1bWVudCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1cGRhdGUgZG9jdW1lbnQgZm9ybVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRJZCA9IGN1cnJlbnREb2N1bWVudC5faWQ7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZURvY3VtZW50KHtcbiAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgaWQ6IGRvY3VtZW50SWQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgY29udGV4dE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBtb3JlIHRoYW4gMSBlcnJvclxuICAgICAgICBpZiAocmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgbXV0YXRpb25FcnJvckNhbGxiYWNrKGRvY3VtZW50LCByZXN1bHQuZXJyb3JzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGl0TXV0YXRpb25TdWNjZXNzQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbXV0YXRpb25FcnJvckNhbGxiYWNrKGRvY3VtZW50LCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qXG5cbiAgRGVsZXRlIGRvY3VtZW50IGhhbmRsZXJcblxuICAqL1xuICBjb25zdCBkZWxldGVEb2N1bWVudFdpdGhDb25maXJtID0gKCkgPT4ge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gY3VycmVudERvY3VtZW50O1xuICAgIGNvbnN0IGRvY3VtZW50SWQgPSBwcm9wcy5kb2N1bWVudC5faWQ7XG4gICAgY29uc3QgZG9jdW1lbnRUaXRsZSA9IGRvY3VtZW50LnRpdGxlIHx8IGRvY3VtZW50Lm5hbWUgfHwgXCJcIjtcblxuICAgIGNvbnN0IGRlbGV0ZURvY3VtZW50Q29uZmlybSA9IGludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgIHsgaWQ6IFwiZm9ybXMuZGVsZXRlX2NvbmZpcm1cIiB9LFxuICAgICAgeyB0aXRsZTogZG9jdW1lbnRUaXRsZSB9XG4gICAgKTtcblxuICAgIGlmICh3aW5kb3cuY29uZmlybShkZWxldGVEb2N1bWVudENvbmZpcm0pKSB7XG4gICAgICBkZWxldGVEb2N1bWVudCh7IGlucHV0OiB7IGlkOiBkb2N1bWVudElkIH0gfSlcbiAgICAgICAgLnRoZW4oKG11dGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgLy8gdGhlIG11dGF0aW9uIHJlc3VsdCBsb29rcyBsaWtlIHtkYXRhOntjb2xsZWN0aW9uUmVtb3ZlOiBudWxsfX0gaWYgc3VjY2VlZGVkXG4gICAgICAgICAgaWYgKHByb3BzLnJlbW92ZVN1Y2Nlc3NDYWxsYmFjaylcbiAgICAgICAgICAgIHByb3BzLnJlbW92ZVN1Y2Nlc3NDYWxsYmFjayh7IGRvY3VtZW50SWQsIGRvY3VtZW50VGl0bGUgfSk7XG4gICAgICAgICAgcmVmZXRjaEZvcm0oKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcHMgdG8gUGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVuZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIGNvbnN0IHsgc3VjY2Vzc0NvbXBvbmVudCwgZG9jdW1lbnQsIGN1cnJlbnRVc2VyLCBtb2RlbCwgd2FyblVuc2F2ZWRDaGFuZ2VzIH0gPVxuICAgIHByb3BzO1xuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcblxuICBjb25zdCBmb3JtVHlwZTogXCJlZGl0XCIgfCBcIm5ld1wiID0gZG9jdW1lbnQgPyBcImVkaXRcIiA6IFwibmV3XCI7XG5cbiAgLy8gRmllbGRzIGNvbXB1dGF0aW9uXG4gIGNvbnN0IG11dGFibGVGaWVsZHMgPVxuICAgIGZvcm1UeXBlID09PSBcImVkaXRcIlxuICAgICAgPyBnZXRFZGl0YWJsZUZpZWxkcyhzY2hlbWEsIGN1cnJlbnRVc2VyLCBpbml0aWFsRG9jdW1lbnQpXG4gICAgICA6IGdldEluc2VydGFibGVGaWVsZHMoc2NoZW1hLCBjdXJyZW50VXNlcik7XG5cbiAgY29uc3QgeyBmb3JtTGF5b3V0UHJvcHMsIGZvcm1Hcm91cFByb3BzIH0gPSBnZXRDaGlsZHJlblByb3BzKFxuICAgIHByb3BzLFxuICAgIHsgZGlzYWJsZWQsIGN1cnJlbnREb2N1bWVudCB9LFxuICAgIHtcbiAgICAgIGZvcm1UeXBlLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVsZXRlRG9jdW1lbnQ6IGRlbGV0ZURvY3VtZW50V2l0aENvbmZpcm0sXG4gICAgfVxuICApO1xuICBjb25zdCBpc0NoYW5nZWQgPSBpc05vdFNhbWVEb2N1bWVudChpbml0aWFsRG9jdW1lbnQsIGN1cnJlbnREb2N1bWVudCk7XG5cbiAgcmV0dXJuIHN1Y2Nlc3MgJiYgc3VjY2Vzc0NvbXBvbmVudCA/IChcbiAgICBzdWNjZXNzQ29tcG9uZW50XG4gICkgOiAoXG4gICAgPEZvcm1XYXJuVW5zYXZlZFxuICAgICAgaXNDaGFuZ2VkPXtpc0NoYW5nZWR9XG4gICAgICB3YXJuVW5zYXZlZENoYW5nZXM9e3dhcm5VbnNhdmVkQ2hhbmdlc31cbiAgICA+XG4gICAgICA8Rm9ybUNvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICB0aHJvd0Vycm9yLFxuICAgICAgICAgIGNsZWFyRm9ybSxcbiAgICAgICAgICByZWZldGNoRm9ybSxcbiAgICAgICAgICBpc0NoYW5nZWQsXG4gICAgICAgICAgc3VibWl0Rm9ybTogc3VibWl0Rm9ybUNvbnRleHQoZm9ybVR5cGUpLCAvL0NoYW5nZSBpbiBuYW1lIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIGEgZnVuY3Rpb25cbiAgICAgICAgICAvLyBjYWxsZWQgc3VibWl0Rm9ybSwgYnV0IG5vIHJlYXNvbiBmb3IgdGhlIHVzZXIgdG8ga25vd1xuICAgICAgICAgIC8vIGFib3V0IHRoYXRcbiAgICAgICAgICBhZGRUb0RlbGV0ZWRWYWx1ZXM6IGFkZFRvRGVsZXRlZFZhbHVlcyxcbiAgICAgICAgICB1cGRhdGVDdXJyZW50VmFsdWVzOiB1cGRhdGVDdXJyZW50VmFsdWVzLFxuICAgICAgICAgIGdldERvY3VtZW50OiAoKSA9PiBjdXJyZW50RG9jdW1lbnQsXG4gICAgICAgICAgZ2V0TGFiZWw6IChmaWVsZE5hbWUsIGZpZWxkTG9jYWxlKSA9PlxuICAgICAgICAgICAgZ2V0TGFiZWwobW9kZWwsIGZsYXRTY2hlbWEsIGludGwsIGZpZWxkTmFtZSwgZmllbGRMb2NhbGUpLFxuICAgICAgICAgIGluaXRpYWxEb2N1bWVudDogaW5pdGlhbERvY3VtZW50LFxuICAgICAgICAgIC8vIFRPRE8gQkFEOiBjaGVjayB3aGVyZSB1c2VkXG4gICAgICAgICAgLy9zZXRGb3JtU3RhdGU6IHRoaXMuc2V0Rm9ybVN0YXRlLFxuICAgICAgICAgIGFkZFRvU3VibWl0Rm9ybSxcbiAgICAgICAgICBhZGRUb1N1Y2Nlc3NGb3JtLFxuICAgICAgICAgIGFkZFRvRmFpbHVyZUZvcm0sXG4gICAgICAgICAgY2xlYXJGb3JtQ2FsbGJhY2tzLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgICBjdXJyZW50VmFsdWVzLFxuICAgICAgICAgIGRlbGV0ZWRWYWx1ZXMsXG4gICAgICAgICAgY2xlYXJGaWVsZEVycm9ycyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1MYXlvdXQgey4uLmZvcm1MYXlvdXRQcm9wc30+XG4gICAgICAgICAge2dldEZpZWxkR3JvdXBzKFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgICBmbGF0U2NoZW1hLFxuICAgICAgICAgICAgICBvcmlnaW5hbFNjaGVtYSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRsLFxuICAgICAgICAgICAgbXV0YWJsZUZpZWxkcyxcbiAgICAgICAgICAgIGludGwuZm9ybWF0TWVzc2FnZVxuICAgICAgICAgICkubWFwKChncm91cCwgaSkgPT4gKFxuICAgICAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1Hcm91cCBrZXk9e2l9IHsuLi5mb3JtR3JvdXBQcm9wcyhncm91cCl9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUxheW91dD5cbiAgICAgIDwvRm9ybUNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9Gb3JtV2FyblVuc2F2ZWQ+XG4gICk7XG59O1xuXG4vLyBNdXRhdGlvbiB0aGF0IHlpZWxkIGEgc3VjY2VzcyByZXN1bHRcbnR5cGUgU3VjY2Vzc2Z1bE11dGF0aW9uUmVzdWx0PFREYXRhID0gT2JqZWN0PiA9IE11dGF0aW9uUmVzdWx0PFREYXRhPiAmIHtcbiAgZGF0YTogVERhdGE7XG59O1xuLyoqXG4gKiBUeXBlZ3VhcmVkIHRvIGFsbG93IGNvbnNpZGVyaW5nIHRoZSByZXF1ZXN0IGFzIHN1Y2Nlc3NmdWxcbiAqL1xuY29uc3QgaXNTdWNjZXNzZnVsID0gZnVuY3Rpb24gPFQgPSBhbnk+KFxuICByZXN1bHQ6IE11dGF0aW9uUmVzdWx0PFQ+IHwgdW5kZWZpbmVkXG4pOiByZXN1bHQgaXMgU3VjY2Vzc2Z1bE11dGF0aW9uUmVzdWx0PFQ+IHtcbiAgcmV0dXJuICEhcmVzdWx0Py5kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkB2dWxjYW5qcy9jb3JlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9jbG9uZURlZXBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2lzT2JqZWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL29taXRCeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvcGlja0J5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC91bnNldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdXBkYXRlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC93aXRob3V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc1BsYWluT2JqZWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9zaXplXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC90b1BhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2luaXRpYWxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ZwL2Zsb3dcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3Rha2VSaWdodFwiKTsiLCJpbXBvcnQgeyBmb3JtUHJvcGVydGllcyB9IGZyb20gXCIuLi9tb2R1bGVzL3NjaGVtYV91dGlsc1wiO1xuaW1wb3J0IHsgRmllbGRHcm91cCB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tIFwiLi4vdHlwaW5nc1wiO1xuaW1wb3J0IHsgRm9ybVByb3BzLCBGb3JtU3RhdGUgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5cbi8qKlxuICogRmllbGQgcmVsYXRlZCBmdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBWdWxjYW5TY2hlbWEgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHVuaXEgZnJvbSBcImxvZGFzaC91bmlxXCI7XG5pbXBvcnQgY29tcGFjdCBmcm9tIFwibG9kYXNoL2NvbXBhY3RcIjtcbmltcG9ydCBnZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCBwaWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuaW1wb3J0IHtcbiAgaXNJbnRsRmllbGQsXG4gIGZvcm1hdExhYmVsLFxuICBnZXRJbnRsS2V5cyxcbiAgZ2V0SW50bExhYmVsLFxuICBJbnRsUHJvdmlkZXJDb250ZXh0VmFsdWUsXG59IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuXG5pbXBvcnQgbWFwIGZyb20gXCJsb2Rhc2gvbWFwXCI7XG5pbXBvcnQgc29ydEJ5IGZyb20gXCJsb2Rhc2gvc29ydEJ5XCI7XG5pbXBvcnQgdW5pcUJ5IGZyb20gXCJsb2Rhc2gvdW5pcUJ5XCI7XG5pbXBvcnQgZGlmZmVyZW5jZSBmcm9tIFwibG9kYXNoL2RpZmZlcmVuY2VcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcImxvZGFzaC9yZWplY3RcIjtcbmltcG9ydCBpbnRlcnNlY3Rpb24gZnJvbSBcImxvZGFzaC9pbnRlcnNlY3Rpb25cIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCJsb2Rhc2gvZmlsdGVyXCI7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSBcIkB2dWxjYW5qcy91dGlsc1wiO1xuaW1wb3J0IHsgVnVsY2FuRmllbGRTY2hlbWEgfSBmcm9tIFwiQHZ1bGNhbmpzL3NjaGVtYVwiO1xuaW1wb3J0IHsgVnVsY2FuTW9kZWwgfSBmcm9tIFwiQHZ1bGNhbmpzL21vZGVsXCI7XG5cbi8qXG5cbiAgR2V0IGEgZmllbGQncyBpbnRsIGtleXMgKHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuXG4gICovXG5jb25zdCBnZXRNb2RlbEludGxLZXlzID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGZsYXRTY2hlbWE6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGdldEludGxLZXlzKHtcbiAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBzY2hlbWE6IGZsYXRTY2hlbWEsXG4gIH0pO1xufTtcblxuLypcblxuICAgR2V0IGEgZmllbGQncyBsYWJlbFxuXG4gICAqL1xuZXhwb3J0IGNvbnN0IGdldExhYmVsID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGZsYXRTY2hlbWE6IGFueSxcbiAgY29udGV4dDogSW50bFByb3ZpZGVyQ29udGV4dFZhbHVlLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZmllbGRMb2NhbGU/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uTmFtZSA9IG1vZGVsLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbGFiZWwgPSBmb3JtYXRMYWJlbCh7XG4gICAgaW50bDogY29udGV4dCxcbiAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICBjb2xsZWN0aW9uTmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgc2NoZW1hOiBmbGF0U2NoZW1hLFxuICB9KTtcbiAgaWYgKGZpZWxkTG9jYWxlKSB7XG4gICAgY29uc3QgaW50bEZpZWxkTG9jYWxlID0gY29udGV4dC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgIGlkOiBgbG9jYWxlcy4ke2ZpZWxkTG9jYWxlfWAsXG4gICAgICBkZWZhdWx0TWVzc2FnZTogZmllbGRMb2NhbGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGAke2xhYmVsfSAoJHtpbnRsRmllbGRMb2NhbGV9KWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG59O1xuXG4vKlxuXG4gICBHZXQgYSBmaWVsZCdzIGRlc2NyaXB0aW9uXG5cbiAgIChTYW1lIGFzIGdldExhYmVsIGJ1dCBwYXNzIGlzRGVzY3JpcHRpb246IHRydWUgKVxuICAgKi9cbmNvbnN0IGdldERlc2NyaXB0aW9uID0gKFxuICBtb2RlbDogVnVsY2FuTW9kZWwsXG4gIGZsYXRTY2hlbWE6IGFueSxcbiAgY29udGV4dDogYW55LFxuICBmaWVsZE5hbWU6IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGdldEludGxMYWJlbCh7XG4gICAgaW50bDogY29udGV4dCxcbiAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSxcbiAgICBjb2xsZWN0aW9uTmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgc2NoZW1hOiBmbGF0U2NoZW1hLFxuICAgIGlzRGVzY3JpcHRpb246IHRydWUsXG4gIH0pO1xuICByZXR1cm4gZGVzY3JpcHRpb24gfHwgbnVsbDtcbn07XG5cbi8qXG5cbiAgR2V0IGEgZmllbGQgb3B0aW9uJ3MgbGFiZWxcblxuICAqL1xuY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAoXG4gIG1vZGVsOiBWdWxjYW5Nb2RlbCxcbiAgY29udGV4dDogeyBmb3JtYXRNZXNzYWdlOiBGdW5jdGlvbiB9LFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgb3B0aW9uOiB7IGludGxJZD86IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgdmFsdWU/OiBhbnkgfVxuKSA9PiB7XG4gIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gbW9kZWwubmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpbnRsSWQgPVxuICAgIG9wdGlvbi5pbnRsSWQgfHwgYCR7Y29sbGVjdGlvbk5hbWV9LiR7ZmllbGROYW1lfS4ke29wdGlvbi52YWx1ZX1gO1xuICByZXR1cm4gY29udGV4dC5mb3JtYXRNZXNzYWdlKHtcbiAgICBpZDogaW50bElkLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBvcHRpb24ubGFiZWwsXG4gIH0pO1xufTtcblxuLypcblxuICBHZXQgYSBsaXN0IG9mIHRoZSBmaWVsZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgZm9ybVxuXG4gIE5vdGU6IHdoZW4gc3VibWl0dGluZyB0aGUgZm9ybSAoZ2V0RGF0YSgpKSwgZG8gbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpZWxkcy5cblxuICAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkTmFtZXMgPSAoXG4gIHByb3BzOiBQaWNrPEZvcm1Qcm9wcywgXCJmaWVsZHNcIiB8IFwiYWRkRmllbGRzXCIgfCBcInJlbW92ZUZpZWxkc1wiPixcbiAgY3VycmVudERvY3VtZW50LFxuICBvcHRpb25zRnJvbUFyZ3M6IHtcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzPzogYm9vbGVhbjtcbiAgICBleGNsdWRlUmVtb3ZlZEZpZWxkcz86IGJvb2xlYW47XG4gICAgcmVwbGFjZUludGxGaWVsZHM/OiBib29sZWFuO1xuICAgIGFkZEV4dHJhRmllbGRzPzogYm9vbGVhbjtcbiAgICBzY2hlbWE/OiBWdWxjYW5TY2hlbWE7XG4gICAgbXV0YWJsZUZpZWxkcz86IEFycmF5PGFueT47XG4gIH1cbikgPT4ge1xuICBjb25zdCB7IGZpZWxkcywgYWRkRmllbGRzLCByZW1vdmVGaWVsZHMgfSA9IHByb3BzO1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBleGNsdWRlSGlkZGVuRmllbGRzOiB0cnVlLFxuICAgIGV4Y2x1ZGVSZW1vdmVkRmllbGRzOiB0cnVlLFxuICAgIHJlcGxhY2VJbnRsRmllbGRzOiBmYWxzZSxcbiAgICBhZGRFeHRyYUZpZWxkczogZmFsc2UsXG4gIH07XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgLi4ub3B0aW9uc0Zyb21BcmdzLFxuICB9O1xuICBjb25zdCB7XG4gICAgc2NoZW1hLFxuICAgIG11dGFibGVGaWVsZHMsXG4gICAgZXhjbHVkZVJlbW92ZWRGaWVsZHMsXG4gICAgZXhjbHVkZUhpZGRlbkZpZWxkcyxcbiAgICBhZGRFeHRyYUZpZWxkcyxcbiAgICByZXBsYWNlSW50bEZpZWxkcyxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gZ2V0IGFsbCBlZGl0YWJsZS9pbnNlcnRhYmxlIGZpZWxkcyAoZGVwZW5kaW5nIG9uIGN1cnJlbnQgZm9ybSB0eXBlKVxuICBsZXQgcmVsZXZhbnRGaWVsZHMgPSBtdXRhYmxlRmllbGRzO1xuXG4gIC8vIGlmIFwiZmllbGRzXCIgcHJvcCBpcyBzcGVjaWZpZWQsIHJlc3RyaWN0IGxpc3Qgb2YgZmllbGRzIHRvIGl0XG4gIGlmICh0eXBlb2YgZmllbGRzICE9PSBcInVuZGVmaW5lZFwiICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSBpbnRlcnNlY3Rpb24ocmVsZXZhbnRGaWVsZHMsIGZpZWxkcyk7XG4gIH1cblxuICAvLyBpZiBcImhpZGVGaWVsZHNcIiBwcm9wIGlzIHNwZWNpZmllZCwgcmVtb3ZlIGl0cyBmaWVsZHNcbiAgaWYgKGV4Y2x1ZGVSZW1vdmVkRmllbGRzKSB7XG4gICAgLy8gT3BlbkNSVUQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAvL2NvbnN0IHJlbW92ZUZpZWxkcyA9IHJlbW92ZUZpZWxkcyB8fCBoaWRlRmllbGRzO1xuICAgIGlmICh0eXBlb2YgcmVtb3ZlRmllbGRzICE9PSBcInVuZGVmaW5lZFwiICYmIHJlbW92ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZWxldmFudEZpZWxkcyA9IGRpZmZlcmVuY2UocmVsZXZhbnRGaWVsZHMsIHJlbW92ZUZpZWxkcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgXCJhZGRGaWVsZHNcIiBwcm9wIGlzIHNwZWNpZmllZCwgYWRkIGl0cyBmaWVsZHNcbiAgaWYgKFxuICAgIGFkZEV4dHJhRmllbGRzICYmXG4gICAgdHlwZW9mIGFkZEZpZWxkcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIGFkZEZpZWxkcy5sZW5ndGggPiAwXG4gICkge1xuICAgIHJlbGV2YW50RmllbGRzID0gcmVsZXZhbnRGaWVsZHM/LmNvbmNhdChhZGRGaWVsZHMpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFsbCBoaWRkZW4gZmllbGRzXG4gIGlmIChleGNsdWRlSGlkZGVuRmllbGRzKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQ7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSByZWplY3QocmVsZXZhbnRGaWVsZHMsIChmaWVsZE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHNjaGVtYT8uW2ZpZWxkTmFtZV0uaGlkZGVuO1xuICAgICAgcmV0dXJuIHR5cGVvZiBoaWRkZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGhpZGRlbih7IHByb3BzLCBkb2N1bWVudCB9KVxuICAgICAgICA6IGhpZGRlbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJlcGxhY2UgaW50bCBmaWVsZHNcbiAgaWYgKHJlcGxhY2VJbnRsRmllbGRzKSB7XG4gICAgcmVsZXZhbnRGaWVsZHMgPSByZWxldmFudEZpZWxkcz8ubWFwKChmaWVsZE5hbWUpID0+XG4gICAgICBpc0ludGxGaWVsZChzY2hlbWE/LltmaWVsZE5hbWVdKSA/IGAke2ZpZWxkTmFtZX1faW50bGAgOiBmaWVsZE5hbWVcbiAgICApO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFueSBkdXBsaWNhdGVzXG4gIHJlbGV2YW50RmllbGRzID0gdW5pcShyZWxldmFudEZpZWxkcyk7XG5cbiAgcmV0dXJuIHJlbGV2YW50RmllbGRzO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5jb25zdCBpbml0RmllbGQgPSAoXG4gIHByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQsXG4gIGZpZWxkTmFtZSxcbiAgZmllbGRTY2hlbWFcbikgPT4ge1xuICBjb25zdCB7IG1vZGVsIH0gPSBwcm9wcztcbiAgY29uc3QgeyBjdXJyZW50RG9jdW1lbnQsIGZsYXRTY2hlbWEgfSA9IHN0YXRlO1xuICBjb25zdCBpc0FycmF5ID0gZ2V0KGZpZWxkU2NoZW1hLCBcInR5cGUuMC50eXBlXCIpID09PSBBcnJheTtcblxuICAvLyBpbnRpYWxpemUgcHJvcGVydGllc1xuICBsZXQgZmllbGQ6IFBhcnRpYWw8Rm9ybUZpZWxkPiA9IHtcbiAgICAuLi5waWNrKGZpZWxkU2NoZW1hLCBmb3JtUHJvcGVydGllcyksXG4gICAgbmFtZTogZmllbGROYW1lLFxuICAgIGRhdGF0eXBlOiBmaWVsZFNjaGVtYS50eXBlLFxuICAgIGxheW91dDogcHJvcHMubGF5b3V0LCAvLyBBIGxheW91dCBwcm9wZXJ0eSB1c2VkIHRvIGNvbnRyb2wgaG93IHRoZSBmb3JtIGZpZWxkcyBhcmUgZGlzcGxheWVkLiBEZWZhdWx0cyB0byBob3Jpem9udGFsLlxuICAgIGlucHV0OiBmaWVsZFNjaGVtYS5pbnB1dCB8fCBmaWVsZFNjaGVtYS5jb250cm9sLCAvLyBUT0RPXG4gIH07XG5cbiAgLy8gaWYgdGhpcyBpcyBhbiBhcnJheSBmaWVsZCBhbHNvIHN0b3JlIGl0cyBhcnJheSBpdGVtIHR5cGVcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBjb25zdCBpdGVtRmllbGRTY2hlbWEgPSBzdGF0ZS5vcmlnaW5hbFNjaGVtYVtgJHtmaWVsZE5hbWV9LiRgXTtcbiAgICBmaWVsZC5pdGVtRGF0YXR5cGUgPSBnZXQoaXRlbUZpZWxkU2NoZW1hLCBcInR5cGUuMC50eXBlXCIpO1xuICB9XG5cbiAgZmllbGQubGFiZWwgPSBnZXRMYWJlbChtb2RlbCwgZmxhdFNjaGVtYSwgY29udGV4dCwgZmllbGROYW1lKTtcbiAgZmllbGQuaW50bEtleXMgPSBnZXRJbnRsS2V5cyhmaWVsZE5hbWUpO1xuICAvLyAvLyByZXBsYWNlIHZhbHVlIGJ5IHByZWZpbGxlZCB2YWx1ZSBpZiB2YWx1ZSBpcyBlbXB0eVxuICAvLyBjb25zdCBwcmVmaWxsID0gZmllbGRTY2hlbWEucHJlZmlsbCB8fCAoZmllbGRTY2hlbWEuZm9ybSAmJiBmaWVsZFNjaGVtYS5mb3JtLnByZWZpbGwpO1xuICAvLyBpZiAocHJlZmlsbCkge1xuICAvLyAgIGNvbnN0IHByZWZpbGxlZFZhbHVlID0gdHlwZW9mIHByZWZpbGwgPT09ICdmdW5jdGlvbicgPyBwcmVmaWxsLmNhbGwoZmllbGRTY2hlbWEpIDogcHJlZmlsbDtcbiAgLy8gICBpZiAoISFwcmVmaWxsZWRWYWx1ZSAmJiAhZmllbGQudmFsdWUpIHtcbiAgLy8gICAgIGZpZWxkLnByZWZpbGxlZFZhbHVlID0gcHJlZmlsbGVkVmFsdWU7XG4gIC8vICAgICBmaWVsZC52YWx1ZSA9IHByZWZpbGxlZFZhbHVlO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGNvbnN0IGRvY3VtZW50ID0gY3VycmVudERvY3VtZW50O1xuICBmaWVsZC5kb2N1bWVudCA9IGRvY3VtZW50O1xuXG4gIC8vIGludGVybmF0aW9uYWxpemUgZmllbGQgb3B0aW9ucyBsYWJlbHNcbiAgaWYgKGZpZWxkLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5vcHRpb25zKSkge1xuICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgbGFiZWw6IGdldE9wdGlvbkxhYmVsKG1vZGVsLCBjb250ZXh0LCBmaWVsZE5hbWUsIG9wdGlvbiksXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBhbiBpbnRsJ2QgZmllbGQsIHVzZSBhIHNwZWNpYWwgaW50bElucHV0XG4gIGlmIChpc0ludGxGaWVsZChmaWVsZFNjaGVtYSkpIHtcbiAgICBmaWVsZC5pbnRsSW5wdXQgPSB0cnVlO1xuICB9XG5cbiAgLy8gYWRkIGFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbiBmaWVsZFNjaGVtYS5mb3JtIGFzIGV4dHJhIHByb3BzIHBhc3NlZCBvblxuICAvLyB0byB0aGUgZm9ybSBjb21wb25lbnQsIGNhbGxpbmcgdGhlbSBpZiB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgY29uc3QgaW5wdXRQcm9wZXJ0aWVzID0gZmllbGRTY2hlbWEuZm9ybSB8fCBmaWVsZFNjaGVtYS5pbnB1dFByb3BlcnRpZXMgfHwge307XG4gIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGlucHV0UHJvcGVydGllc1twcm9wXTtcbiAgICBmaWVsZFtwcm9wXSA9XG4gICAgICB0eXBlb2YgcHJvcGVydHkgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHByb3BlcnR5LmNhbGwoZmllbGRTY2hlbWEsIHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgICAgICBpbnRsOiBjb250ZXh0LFxuICAgICAgICAgIH0pXG4gICAgICAgIDogcHJvcGVydHk7XG4gIH1cblxuICAvLyBhZGQgZGVzY3JpcHRpb24gYXMgaGVscCBwcm9wXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24obW9kZWwsIGZsYXRTY2hlbWEsIGNvbnRleHQsIGZpZWxkTmFtZSk7XG4gIGlmIChkZXNjcmlwdGlvbikge1xuICAgIGZpZWxkLmhlbHAgPSBkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHJldHVybiBmaWVsZCBhcyBGb3JtRmllbGQ7XG59O1xuY29uc3QgaGFuZGxlRmllbGRQYXRoID0gKFxuICBmaWVsZDogRm9ybUZpZWxkLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgcGFyZW50UGF0aD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGZpZWxkUGF0aCA9IHBhcmVudFBhdGggPyBgJHtwYXJlbnRQYXRofS4ke2ZpZWxkTmFtZX1gIDogZmllbGROYW1lO1xuICBmaWVsZC5wYXRoID0gZmllbGRQYXRoO1xuICAvLyBUT0RPOiByZWludHJvZHVjZSB0aGlzIHNpZGUgZWZmZWN0IHRvIGNvcnJlY3RseSBzZXQgdGhlIGRlZmF1bHQgdmFsdWVzXG4gIC8vIChwcmV2aW91c2x5IHdhcyBpbiBGb3JtLnRzeClcbiAgLy8gTm90ZSBzdXJlIGlmIHRoaXMgaXMgYWN0dWFsbHkgbmVlZGVkXG4gIC8vIGlmIChmaWVsZC5kZWZhdWx0VmFsdWUpIHtcbiAgLy8gICBzZXQodGhpcy5kZWZhdWx0VmFsdWVzLCBmaWVsZFBhdGgsIGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gIC8vIH1cbiAgcmV0dXJuIGZpZWxkO1xufTtcbmNvbnN0IGhhbmRsZUZpZWxkUGFyZW50ID0gKGZpZWxkLCBwYXJlbnRGaWVsZE5hbWUpID0+IHtcbiAgLy8gaWYgZmllbGQgaGFzIGEgcGFyZW50IGZpZWxkLCBwYXNzIGl0IG9uXG4gIGlmIChwYXJlbnRGaWVsZE5hbWUpIHtcbiAgICBmaWVsZC5wYXJlbnRGaWVsZE5hbWUgPSBwYXJlbnRGaWVsZE5hbWU7XG4gIH1cblxuICByZXR1cm4gZmllbGQ7XG59O1xuY29uc3QgaGFuZGxlUGVybWlzc2lvbnMgPSAoZmllbGQsIGZpZWxkTmFtZSwgbXV0YWJsZUZpZWxkczogQXJyYXk8YW55PikgPT4ge1xuICAvLyBpZiBmaWVsZCBpcyBub3QgY3JlYXRhYmxlL3VwZGF0YWJsZSwgZGlzYWJsZSBpdFxuICBpZiAoIW11dGFibGVGaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKSkge1xuICAgIGZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmllbGQ7XG59O1xuY29uc3QgaGFuZGxlRmllbGRDaGlsZHJlbiA9IChcbiAgcHJvcHM6IEZvcm1Qcm9wcyxcbiAgc3RhdGU6IFBpY2s8Rm9ybVN0YXRlLCBcImN1cnJlbnREb2N1bWVudFwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCI+LFxuICBjb250ZXh0OiBhbnksXG4gIGZpZWxkLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZmllbGRTY2hlbWE6IGFueSwgLy8gVE9ETzogbm90IGEgVnVsY2FuRmllbGQsIG1vcmUgYSBGb3JtRmllbGRcbiAgc2NoZW1hOiBWdWxjYW5TY2hlbWEsXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PGFueT5cbikgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIC8vIGFycmF5IGZpZWxkXG4gIGlmIChmaWVsZFNjaGVtYS5hcnJheUZpZWxkU2NoZW1hKSB7XG4gICAgZmllbGQuYXJyYXlGaWVsZFNjaGVtYSA9IGZpZWxkU2NoZW1hLmFycmF5RmllbGRTY2hlbWE7XG4gICAgLy8gY3JlYXRlIGEgZmllbGQgdGhhdCBjYW4gYmUgZXhwbG9pdGVkIGJ5IHRoZSBmb3JtXG4gICAgZmllbGQuYXJyYXlGaWVsZCA9IGNyZWF0ZUFycmF5U3ViRmllbGQoXG4gICAgICBwcm9wcyxcbiAgICAgIHN0YXRlLFxuICAgICAgY29udGV4dCxcbiAgICAgIGZpZWxkTmFtZSxcbiAgICAgIGZpZWxkLmFycmF5RmllbGRTY2hlbWEsXG4gICAgICBzY2hlbWEsXG4gICAgICBtdXRhYmxlRmllbGRzXG4gICAgKTtcbiAgICAvL2ZpZWxkLm5lc3RlZElucHV0ID0gdHJ1ZVxuICB9XG4gIC8vIG5lc3RlZCBmaWVsZHM6IHNldCBpbnB1dCB0byBcIm5lc3RlZFwiXG4gIGlmIChmaWVsZFNjaGVtYS5zY2hlbWEpIHtcbiAgICBmaWVsZC5uZXN0ZWRTY2hlbWEgPSBmaWVsZFNjaGVtYS5zY2hlbWE7XG4gICAgZmllbGQubmVzdGVkSW5wdXQgPSB0cnVlO1xuXG4gICAgLy8gZ2V0IG5lc3RlZCBzY2hlbWFcbiAgICAvLyBmb3IgZWFjaCBuZXN0ZWQgZmllbGQsIGdldCBmaWVsZCBvYmplY3QgYnkgY2FsbGluZyBjcmVhdGVGaWVsZCByZWN1cnNpdmVseVxuICAgIGZpZWxkLm5lc3RlZEZpZWxkcyA9IGdldEZpZWxkTmFtZXMocHJvcHMsIGN1cnJlbnREb2N1bWVudCwge1xuICAgICAgc2NoZW1hOiBmaWVsZC5uZXN0ZWRTY2hlbWEsXG4gICAgICBhZGRFeHRyYUZpZWxkczogZmFsc2UsXG4gICAgfSkubWFwKChzdWJGaWVsZE5hbWUpID0+IHtcbiAgICAgIHJldHVybiBjcmVhdGVGaWVsZChcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBzdWJGaWVsZE5hbWUsXG4gICAgICAgIGZpZWxkLm5lc3RlZFNjaGVtYSxcbiAgICAgICAgbXV0YWJsZUZpZWxkcyxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBmaWVsZC5wYXRoXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBmaWVsZDtcbn07XG5cbi8qXG4gIEdpdmVuIGEgZmllbGQncyBuYW1lLCB0aGUgY29udGFpbmluZyBzY2hlbWEsIGFuZCBwYXJlbnQsIGNyZWF0ZSB0aGVcbiAgY29tcGxldGUgZmllbGQgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcG9uZW50XG5cbiAgKi9cbmNvbnN0IGNyZWF0ZUZpZWxkID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQ6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIHNjaGVtYTogYW55LFxuICBtdXRhYmxlRmllbGRzOiBBcnJheTxhbnk+LFxuICBwYXJlbnRGaWVsZE5hbWU/OiBzdHJpbmcsXG4gIHBhcmVudFBhdGg/OiBzdHJpbmdcbik6IEZvcm1GaWVsZCA9PiB7XG4gIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hW2ZpZWxkTmFtZV07XG4gIGxldCBmaWVsZCA9IGluaXRGaWVsZChwcm9wcywgc3RhdGUsIGNvbnRleHQsIGZpZWxkTmFtZSwgZmllbGRTY2hlbWEpO1xuICBmaWVsZCA9IGhhbmRsZUZpZWxkUGF0aChmaWVsZCwgZmllbGROYW1lLCBwYXJlbnRQYXRoKTtcbiAgZmllbGQgPSBoYW5kbGVGaWVsZFBhcmVudChmaWVsZCwgcGFyZW50RmllbGROYW1lKTtcbiAgZmllbGQgPSBoYW5kbGVQZXJtaXNzaW9ucyhmaWVsZCwgZmllbGROYW1lLCBtdXRhYmxlRmllbGRzKTtcbiAgZmllbGQgPSBoYW5kbGVGaWVsZENoaWxkcmVuKFxuICAgIHByb3BzLFxuICAgIHN0YXRlLFxuICAgIGNvbnRleHQsXG4gICAgZmllbGQsXG4gICAgZmllbGROYW1lLFxuICAgIGZpZWxkU2NoZW1hLFxuICAgIHNjaGVtYSxcbiAgICBtdXRhYmxlRmllbGRzXG4gICk7XG4gIHJldHVybiBmaWVsZDtcbn07XG5jb25zdCBjcmVhdGVBcnJheVN1YkZpZWxkID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogUGljazxGb3JtU3RhdGUsIFwiY3VycmVudERvY3VtZW50XCIgfCBcImZsYXRTY2hlbWFcIiB8IFwib3JpZ2luYWxTY2hlbWFcIj4sXG4gIGNvbnRleHQ6IGFueSxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIHN1YkZpZWxkU2NoZW1hOiBWdWxjYW5GaWVsZFNjaGVtYSxcbiAgc2NoZW1hOiBWdWxjYW5TY2hlbWEsXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PHN0cmluZz5cbikgPT4ge1xuICBjb25zdCBzdWJGaWVsZE5hbWUgPSBgJHtmaWVsZE5hbWV9LiRgO1xuICBsZXQgc3ViRmllbGQgPSBpbml0RmllbGQocHJvcHMsIHN0YXRlLCBjb250ZXh0LCBzdWJGaWVsZE5hbWUsIHN1YkZpZWxkU2NoZW1hKTtcbiAgLy8gYXJyYXkgc3ViZmllbGQgaGFzIHRoZSBzYW1lIHBhdGggYW5kIHBlcm1pc3Npb25zIGFzIGl0cyBwYXJlbnRcbiAgLy8gc28gd2UgdXNlIHBhcmVudCBuYW1lIChmaWVsZE5hbWUpIGFuZCBub3Qgc3ViZmllbGROYW1lXG4gIHN1YkZpZWxkID0gaGFuZGxlRmllbGRQYXRoKHN1YkZpZWxkLCBmaWVsZE5hbWUpO1xuICBzdWJGaWVsZCA9IGhhbmRsZVBlcm1pc3Npb25zKHN1YkZpZWxkLCBmaWVsZE5hbWUsIG11dGFibGVGaWVsZHMgLypzY2hlbWEqLyk7XG4gIC8vIHdlIGRvIG5vdCBhbGxvdyBuZXN0aW5nIHlldFxuICAvL3N1YkZpZWxkID0gdGhpcy5oYW5kbGVGaWVsZENoaWxkcmVuKGZpZWxkLCBmaWVsZFNjaGVtYSlcbiAgcmV0dXJuIHN1YkZpZWxkO1xufTtcblxuLy8gR3JvdXAgb2YgbXVsdGlwbGUgZmllbGRzIChvYnRhaW5lZCBieSBwYXJzaW5nIHRoZSB3aG9sZSBzY2hlbWEpXG5pbnRlcmZhY2UgR3JvdXBXaXRoRmllbGRzIGV4dGVuZHMgRmllbGRHcm91cCB7XG4gIGZpZWxkczogQXJyYXk8Rm9ybUZpZWxkPjtcbn1cblxudHlwZSBGb3JtU2NoZW1hU3RhdGUgPSBQaWNrPFxuICBGb3JtU3RhdGUsXG4gIFwiY3VycmVudERvY3VtZW50XCIgfCBcInNjaGVtYVwiIHwgXCJmbGF0U2NoZW1hXCIgfCBcIm9yaWdpbmFsU2NoZW1hXCJcbj47XG5cbi8qXG5cbiAgR2V0IGFsbCBmaWVsZCBncm91cHNcblxuICAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkR3JvdXBzID0gKFxuICBwcm9wczogRm9ybVByb3BzLFxuICBzdGF0ZTogRm9ybVNjaGVtYVN0YXRlLFxuICBjb250ZXh0OiBJbnRsUHJvdmlkZXJDb250ZXh0VmFsdWUsXG4gIG11dGFibGVGaWVsZHM6IEFycmF5PHN0cmluZz4sXG4gIGZvcm1hdE1lc3NhZ2U6IEZ1bmN0aW9uXG4pID0+IHtcbiAgY29uc3QgeyBzY2hlbWEsIGN1cnJlbnREb2N1bWVudCB9ID0gc3RhdGU7XG4gIC8vIGJ1aWxkIGZpZWxkcyBhcnJheSBieSBpdGVyYXRpbmcgb3ZlciB0aGUgbGlzdCBvZiBmaWVsZCBuYW1lc1xuICBsZXQgZmllbGRzID0gZ2V0RmllbGROYW1lcyhwcm9wcywgY3VycmVudERvY3VtZW50LCB7XG4gICAgbXV0YWJsZUZpZWxkcyxcbiAgICBzY2hlbWEsXG4gIH0pLm1hcCgoZmllbGROYW1lKSA9PiB7XG4gICAgLy8gZ2V0IHNjaGVtYSBmb3IgdGhlIGN1cnJlbnQgZmllbGRcbiAgICByZXR1cm4gY3JlYXRlRmllbGQocHJvcHMsIHN0YXRlLCBjb250ZXh0LCBmaWVsZE5hbWUsIHNjaGVtYSwgbXV0YWJsZUZpZWxkcyk7XG4gIH0pO1xuXG4gIGZpZWxkcyA9IHNvcnRCeShmaWVsZHMsIFwib3JkZXJcIik7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIHVuaXF1ZSBncm91cHMgKGJhc2VkIG9uIHRoZWlyIG5hbWUpIHVzZWQgaW4gY3VycmVudCBmaWVsZHMsIHJlbW92ZSBcImVtcHR5XCIgZ3JvdXBcbiAgbGV0IGdyb3VwcyA9IGNvbXBhY3QodW5pcUJ5KG1hcChmaWVsZHMsIFwiZ3JvdXBcIiksIChnKSA9PiAoZyA/IGcubmFtZSA6IFwiXCIpKSk7XG5cbiAgLy8gZm9yIGVhY2ggZ3JvdXAsIGFkZCByZWxldmFudCBmaWVsZHNcbiAgbGV0IGdyb3Vwc1dpdGhGaWVsZHMgPSBncm91cHMubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IGxhYmVsID1cbiAgICAgIGdyb3VwLmxhYmVsIHx8XG4gICAgICAvL3RoaXMuY29udGV4dC5mb3JtYXRNZXNzYWdlKHsgaWQ6IGdyb3VwLm5hbWUgfSkgfHxcbiAgICAgIGNhcGl0YWxpemUoZ3JvdXAubmFtZSk7XG4gICAgY29uc3QgZ3JvdXBGaWVsZHMgPSBfZmlsdGVyPEZvcm1GaWVsZD4oZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5ncm91cCAmJiBmaWVsZC5ncm91cC5uYW1lID09PSBncm91cC5uYW1lO1xuICAgIH0pO1xuICAgIGNvbnN0IGdyb3VwV2l0aEZpZWxkczogR3JvdXBXaXRoRmllbGRzID0ge1xuICAgICAgLi4uZ3JvdXAsXG4gICAgICBsYWJlbCxcbiAgICAgIGZpZWxkczogZ3JvdXBGaWVsZHMsXG4gICAgfTtcbiAgICByZXR1cm4gZ3JvdXBXaXRoRmllbGRzO1xuICB9KTtcblxuICAvLyBhZGQgZGVmYXVsdCBncm91cCBpZiBuZWNlc3NhcnlcbiAgY29uc3QgZGVmYXVsdEdyb3VwRmllbGRzID0gX2ZpbHRlcihmaWVsZHMsIChmaWVsZCkgPT4gIWZpZWxkLmdyb3VwKTtcbiAgaWYgKGRlZmF1bHRHcm91cEZpZWxkcy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZWZhdWx0R3JvdXA6IEdyb3VwV2l0aEZpZWxkcyA9IHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgICAgbGFiZWw6IFwiZGVmYXVsdFwiLFxuICAgICAgb3JkZXI6IDAsXG4gICAgICBmaWVsZHM6IGRlZmF1bHRHcm91cEZpZWxkcyxcbiAgICB9O1xuICAgIGdyb3Vwc1dpdGhGaWVsZHMgPSBbZGVmYXVsdEdyb3VwXS5jb25jYXQoZ3JvdXBzV2l0aEZpZWxkcyk7XG4gIH1cblxuICAvLyBzb3J0IGJ5IG9yZGVyXG4gIGdyb3Vwc1dpdGhGaWVsZHMgPSBzb3J0QnkoZ3JvdXBzV2l0aEZpZWxkcywgXCJvcmRlclwiKTtcblxuICAvLyBjb25zb2xlLmxvZyhncm91cHMpO1xuXG4gIHJldHVybiBncm91cHNXaXRoRmllbGRzO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9tYXBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2gvdW5pcUJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9kaWZmZXJlbmNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9yZWplY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKTsiLCJpbXBvcnQgZmluZCBmcm9tIFwibG9kYXNoL2ZpbmRcIjtcbmltcG9ydCBpc0VxdWFsV2l0aCBmcm9tIFwibG9kYXNoL2lzRXF1YWxXaXRoXCI7XG5leHBvcnQgY29uc3QgaXNOb3RTYW1lRG9jdW1lbnQgPSAoaW5pdGlhbERvY3VtZW50LCBjaGFuZ2VkRG9jdW1lbnQpID0+IHtcbiAgY29uc3QgY2hhbmdlZFZhbHVlID0gZmluZChjaGFuZ2VkRG9jdW1lbnQsICh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuICFpc0VxdWFsV2l0aCh2YWx1ZSwgaW5pdGlhbERvY3VtZW50W2tleV0sIChvYmpWYWx1ZSwgb3RoVmFsdWUpID0+IHtcbiAgICAgIGlmICghb2JqVmFsdWUgJiYgIW90aFZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0eXBlb2YgY2hhbmdlZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9pc0VxdWFsV2l0aFwiKTsiLCJleHBvcnQgKiBmcm9tIFwiLi91c2VXYXJuT25VbnNhdmVkXCI7XG4iLCJpbXBvcnQgeyB1c2VCbG9ja1RyYW5zaXRpb24gfSBmcm9tIFwiLi4vdXNlQmxvY2tUcmFuc2l0aW9uL3VzZUJsb2NrVHJhbnNpdGlvblwiO1xuaW1wb3J0IGRlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmNvbnN0IGRlYnVnVHJhbnNpdGlvbnMgPSBkZWJ1ZyhcInZuOnJvdXRlLXRyYW5zaXRpb25zXCIpO1xuXG4vKipcbiAqIENhbiB0cmlnZ2VyIGFuIGFsZXJ0IG9uIHVuc2F2ZWQgY2hhbmdlc1xuICpcbiAqIFRyaWdnZXJzIGV2ZW50IHNvIHlvdSBjYW4gYWxzbyBibG9jayBTUEEgdHJhbnNpdGlvbiAoaW1wbGVtZW50YXRpb24gaXMgTk9UIHByb3ZpZGVkIGJ5IHRoaXMgaG9vaywgeW91XG4gKiBuZWVkIGxpc3RlbmVycyB3aG9zZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHlvdXIgcm91dGVyIChSZWFjdCBSb3V0ZXIsIE5leHQgUm91dGVyLi4uKSwgc2VlIGJsb2NrLnRzKVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0VHJhaW5pbmcvaGlzdG9yeS9ibG9iL21hc3Rlci9kb2NzL2Jsb2NraW5nLXRyYW5zaXRpb25zLm1kXG4gKlxuICogQHBhcmFtIHBhcmFtMFxuICovXG5leHBvcnQgY29uc3QgdXNlV2Fybk9uVW5zYXZlZCA9ICh7XG4gIGlzQ2hhbmdlZCxcbiAgd2FyblVuc2F2ZWRDaGFuZ2VzLFxufToge1xuICBpc0NoYW5nZWQ6IGJvb2xlYW47XG4gIHdhcm5VbnNhdmVkQ2hhbmdlcz86IGJvb2xlYW47XG59KSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VJbnRsQ29udGV4dCgpO1xuICAvKipcbiAgICogVG8gYmUgcGFzc2VkIHRvIG9uYmVmb3JldW5sb2FkIGV2ZW50LiBUaGUgcmV0dXJuZWQgbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZFxuICAgKiBieSB0aGUgcHJvbXB0LlxuICAgKlxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0V2ZW50SGFuZGxlcnMvb25iZWZvcmV1bmxvYWRcbiAgICogdGhlIG1lc3NhZ2UgcmV0dXJuZWQgaXMgYWN0dWFsbHkgaWdub3JlZCBieSBtb3N0IGJyb3dzZXJzIGFuZCBhIGRlZmF1bHQgbWVzc2FnZSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoaXMgcGFnZT8gWW91IG1pZ2h0IGhhdmUgdW5zYXZlZCBjaGFuZ2VzJyBpcyBkaXNwbGF5ZWQuIFNlZSB0aGUgTm90ZXMgc2VjdGlvbiBvbiB0aGUgbW96aWxsYSBkb2NzIGFib3ZlXG4gICAqL1xuICBjb25zdCBnZXRCbG9ja2VkTWVzc2FnZSA9IChldmVudD86IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gICAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgaGFuZGxlUGFnZUxlYXZlXCIsIGV2ZW50KTtcbiAgICBjb25zdCBtZXNzYWdlID0gY29udGV4dC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgIGlkOiBcImZvcm1zLmNvbmZpcm1fZGlzY2FyZFwiLFxuICAgICAgZGVmYXVsdE1lc3NhZ2U6IFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRpc2NhcmQgeW91ciBjaGFuZ2VzP1wiLFxuICAgIH0pO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9O1xuICB1c2VCbG9ja1RyYW5zaXRpb24oe1xuICAgIHNob3VsZEJsb2NrOiAhISh3YXJuVW5zYXZlZENoYW5nZXMgJiYgaXNDaGFuZ2VkKSxcbiAgICBnZXRCbG9ja2VkTWVzc2FnZTogZ2V0QmxvY2tlZE1lc3NhZ2UsXG4gIH0pO1xufTtcbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBibG9jayB9IGZyb20gXCIuL2Jsb2NrXCI7XG5pbXBvcnQgZGVidWcgZnJvbSBcImRlYnVnXCI7XG5jb25zdCBkZWJ1Z1RyYW5zaXRpb25zID0gZGVidWcoXCJ2bjpyb3V0ZXItdHJhbnNpdGlvbnNcIik7XG5cbi8qKlxuICogQ2FuIHRyaWdnZXIgYW4gYWxlcnQgb24gdW5zYXZlZCBjaGFuZ2VzXG4gKlxuICogVHJpZ2dlcnMgZXZlbnQgc28geW91IGNhbiBhbHNvIGJsb2NrIFNQQSB0cmFuc2l0aW9uIChpbXBsZW1lbnRhdGlvbiBpcyBOT1QgcHJvdmlkZWQgYnkgdGhpcyBob29rLCB5b3VcbiAqIG5lZWQgbGlzdGVuZXJzIHdob3NlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24geW91ciByb3V0ZXIgKFJlYWN0IFJvdXRlciwgTmV4dCBSb3V0ZXIuLi4pLCBzZWUgYmxvY2sudHMpXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RUcmFpbmluZy9oaXN0b3J5L2Jsb2IvbWFzdGVyL2RvY3MvYmxvY2tpbmctdHJhbnNpdGlvbnMubWRcbiAqXG4gKiBAcGFyYW0gcGFyYW0wXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VCbG9ja1RyYW5zaXRpb24gPSAoe1xuICBzaG91bGRCbG9jayxcbiAgZ2V0QmxvY2tlZE1lc3NhZ2UsXG59OiB7XG4gIHNob3VsZEJsb2NrOiBib29sZWFuO1xuICBnZXRCbG9ja2VkTWVzc2FnZTogKGV2dD86IEJlZm9yZVVubG9hZEV2ZW50KSA9PiBzdHJpbmc7XG59KSA9PiB7XG4gIC8vIGZ1bmN0aW9uIHRvIHVuYmxvY2sgdGhlIGZvcm1cbiAgY29uc3QgdW5ibG9ja1JlZiA9IHVzZVJlZjxGdW5jdGlvbiB8IHVuZGVmaW5lZD4oKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGlzQmxvY2tpbmcgPSAhIXVuYmxvY2tSZWYuY3VycmVudDtcbiAgICBkZWJ1Z1RyYW5zaXRpb25zKFxuICAgICAgXCJydW5uaW5nIGVmZmVjdFwiLFxuICAgICAgXCJzaG91bGQgYmxvY2tcIixcbiAgICAgIHNob3VsZEJsb2NrLFxuICAgICAgXCJjdXJyZW50bHkgYmxvY2tlZFwiLFxuICAgICAgaXNCbG9ja2luZ1xuICAgICk7XG5cbiAgICBjb25zdCBvblVuYmxvY2sgPSAoKSA9PiB7XG4gICAgICBkZWJ1Z1RyYW5zaXRpb25zKFwicnVubmluZyB1bmJsb2NrIGZyb20gZWZmZWN0XCIpO1xuICAgICAgaWYgKCFzaG91bGRCbG9jaykge1xuICAgICAgICBpZiAodW5ibG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgdW5ibG9ja1JlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIGJsb2NrXG4gICAgY29uc3Qgb25CbG9ja2VkID0gKGV2dD86IEJlZm9yZVVubG9hZEV2ZW50KTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRCbG9ja2VkTWVzc2FnZShldnQpO1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcbiAgICAgICAgXCJ1c2VyIGlzIGJlaW5nIGJsb2NrZWQgYWZ0ZXIgdHJ5aW5nIHRvIGxlYXZlIHRoZSBwYWdlLCB3aXRoIG1lc3NhZ2U6IFwiICtcbiAgICAgICAgICBtZXNzYWdlXG4gICAgICApO1xuICAgICAgaWYgKGV2dCkge1xuICAgICAgICBldnQucmV0dXJuVmFsdWUgPSBtZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfTtcbiAgICBpZiAoc2hvdWxkQmxvY2spIHtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXG4gICAgICAgIFwic2hvdWxkIGJsb2NrIHRyYW5zaXRpb24sIHNldHRpbmcgdXAgcmVsZXZhbnQgZXZlbnQgbGlzdGVuZXJcIlxuICAgICAgKTtcbiAgICAgIHVuYmxvY2tSZWYuY3VycmVudCA9IGJsb2NrKG9uQmxvY2tlZCwgb25VbmJsb2NrKTtcbiAgICB9XG4gICAgLy8gdW5ibG9jayBpZiBub3QgYmxvY2tpbmcgYW55bW9yZSBhbmQgd2FzIGJsb2NraW5nIHByZXZpb3VzbHlcbiAgICBpZiAoIXNob3VsZEJsb2NrICYmIGlzQmxvY2tpbmcpIHtcbiAgICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJzaG91bGQgdW5ibG9jayAoc3RhdGUgaGFzIGJlZW4gcmVpbml0aWFsaXplZClcIik7XG4gICAgICBpZiAodW5ibG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICAgIHVuYmxvY2tSZWYuY3VycmVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB0cmlnZ2VyIHRoZSBwb3RlbnRpYWxseSByZWdpc3RlcmVkIHVuYmxvY2sgZnVuY3Rpb24gd2hlbiBjb21wb25lbnQgdW5tb3VudHNcbiAgICAvL3JldHVybiBvblVuYmxvY2s7XG4gIH0sIFtzaG91bGRCbG9ja10pO1xufTtcbiIsImltcG9ydCBkZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmNvbnN0IGRlYnVnVHJhbnNpdGlvbnMgPSBkZWJ1ZyhcInZuOnJvdXRlLXRyYW5zaXRpb25cIik7XG5jb25zdCBCZWZvcmVVbmxvYWRFdmVudFR5cGUgPSBcImJlZm9yZXVubG9hZFwiO1xuLyoqXG4gKiBFdmVudCB0cmlnZ2VyZWQgd2hlbiBhIHdhcm5pbmcgb24gdW5zYXZlZCBjaGFuZ2VzIGlzIG5lY2Vzc2FyeVxuICogVGhlIGFwcCBzaG91bGQgbGlzdGVuIGZvciB0aGlzIGV2ZW50IHRvIHNldHVwIHJlbGV2YW50IGJsb2NraW5nIG1ldGhvZHMgZGVwZW5kaW5nIG9uIHRoZSBmcmFtZXdvcmtcbiAqXG4gKiBGb3IgaW5zdGFuY2Ugd2l0aCBSZWFjdCBSb3V0ZXI6XG4gKlxuICogbGV0IHVuYmxvY2tcbiAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmxvY2t0cmFuc2l0aW9uXCIsICgpID0+IHtcbiAqICAgIHVuYmxvY2sgPSByb3V0ZXIuaGlzdG9yeS5ibG9jayguLi4pXG4gKiB9KVxuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmJsb2NrdHJhbnNpdGlvblwiLCAoKSA9PiB7XG4gKiAgICB1bmJsb2NrKClcbiAqIH0pXG4gKlxuICogRm9yIE5leHQuanMsIHlvdSB3b3VsZCBkbyBzb21ldGhpbmcgc2ltaWxhclxuICogQ2hlY2sgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC9uZXh0LmpzL2Rpc2N1c3Npb25zLzEyMzQ4XG4gKlxuICovXG5leHBvcnQgY29uc3QgQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFID0gXCJibG9ja3RyYW5zaXRpb25cIjtcbi8qKlxuICogQ2FsbGVkIHdoZW4gYmxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeSBhbnltb3JlOlxuICogLSB0aGVyZSBhcmUgbm8gdW5zYXZlZCBjaGFuZ2VzIGFueW1vcmVcbiAqIC0gdXNlciBoYXMgY29uZmlybWVkIHRoZXkgd2FudCB0byBsZWF2ZVxuICovXG5leHBvcnQgY29uc3QgVU5CTE9DS19UUkFOU0lUSU9OX0VWRU5UX1RZUEUgPSBcInVuYmxvY2t0cmFuc2l0aW9uXCI7XG4vKipcbiAqIEludGVyY2VwdHMgdGhlIGJlZm9yZXVubG9hZCBldmVudFxuICpcbiAqIENvZGUgdGFrZW4gZnJvbSBSZWFjdCBSb3V0ZXIgaGlzdG9yeSBmZWF0dXJlXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdFRyYWluaW5nL2hpc3RvcnkvYmxvYi9tYXN0ZXIvZG9jcy9ibG9ja2luZy10cmFuc2l0aW9ucy5tZFxuICovXG5mdW5jdGlvbiBibG9ja0JlZm9yZVVubG9hZChldmVudDogQmVmb3JlVW5sb2FkRXZlbnQpIHtcbiAgLy8gQ2FuY2VsIHRoZSBldmVudC5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgLy8gQ2hyb21lIChhbmQgbGVnYWN5IElFKSByZXF1aXJlcyByZXR1cm5WYWx1ZSB0byBiZSBzZXQuXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn1cblxuLyoqXG4gKiBCbG9ja3MgdHJhbnNpdGlvblxuICpcbiAqIC8hXFwgSW4gb3JkZXIgdG8gY2F0Y2ggU1BBIHRyYW5zaXRpb24sIHlvdSBuZWVkIHRvIGltcGxlbWVudFxuICogYW4gZXZlbnQgbGlzdGVuZXIgaW4geW91ciBvd24gYXBwLlxuICpcbiAqXG4gKiBAcGFyYW0gb25VbmJsb2NrIENhbGxiYWNrIHRvIGNhbGwgb24gdW5ibG9jaywgZm9yIGN1c3RvbSBiZWhhdmlvdXJcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gdW5ibG9jayB0aGUgdHJhbnNpdGlvbiAoZWcgaWYgdGhlIGZvcm0gaXMgYmFjayB0b1xuICogaXRzIG9yaWdpbmFsIHN0YXRlKVxuICovXG5leHBvcnQgY29uc3QgYmxvY2sgPSAoXG4gIHNldENvbmZpcm1hdGlvbk1lc3NhZ2U6IChldmVudD86IEJlZm9yZVVubG9hZEV2ZW50KSA9PiBzdHJpbmcsXG4gIG9uVW5ibG9jaz86IEZ1bmN0aW9uXG4pID0+IHtcbiAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgYmxvY2sgZnVuY3Rpb25cIik7XG4gIC8vIHRyaWdnZXIgYSBibG9jayBldmVudCwgdG8gYmUgaGFuZGxlZCBhdCB0aGUgZnJhbWV3b3JrIGxldmVsXG4gIC8vIFRPRE86IHNldENvbmZpcm1hdGlvbk1lc3NhZ2Ugc2hvdWxkIGJlIHBhc3NlZCBhcyB3ZWxsXG4gIGNvbnN0IGJsb2NrRXZlbnQgPSBuZXcgRXZlbnQoQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFKTtcbiAgd2luZG93LmRpc3BhdGNoRXZlbnQoYmxvY2tFdmVudCk7XG4gIC8vIGJsb2NrIGF0IGJyb3dzZXIgbGV2ZWxcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoQmVmb3JlVW5sb2FkRXZlbnRUeXBlLCBibG9ja0JlZm9yZVVubG9hZCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEJlZm9yZVVubG9hZEV2ZW50VHlwZSwgc2V0Q29uZmlybWF0aW9uTWVzc2FnZSk7XG4gIC8vIHJldHVybiBhbiB1bmJsb2NrIGZ1bmN0aW9uIHRvIGNhbmNlbFxuICBjb25zdCB1bmJsb2NrID0gKCkgPT4ge1xuICAgIGRlYnVnVHJhbnNpdGlvbnMoXCJydW5uaW5nIHVuYmxvY2sgZnVuY3Rpb25cIik7XG4gICAgaWYgKG9uVW5ibG9jaykge1xuICAgICAgZGVidWdUcmFuc2l0aW9ucyhcInJ1bm5pbmcgdXNlciBkZWZpbmVkIGZ1bmN0aW9uXCIpO1xuICAgICAgb25VbmJsb2NrKCk7IC8vIGNhbGxiYWNrIGZyb20gdXNlciBsYW5kXG4gICAgfVxuICAgIC8vIHRyaWdnZXIgYW4gdW5ibG9jayBldmVudCwgdG8gYmUgaGFuZGxlZCBhdCB0aGUgZnJhbWV3b3JrIGxldmVsXG4gICAgY29uc3QgdW5ibG9ja0V2ZW50ID0gbmV3IEV2ZW50KFVOQkxPQ0tfVFJBTlNJVElPTl9FVkVOVF9UWVBFKTtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudCh1bmJsb2NrRXZlbnQpO1xuICAgIC8vIHJlbW92ZSB0aGUgYnJvd3NlciBsZXZlbCBldmVudHNcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihCZWZvcmVVbmxvYWRFdmVudFR5cGUsIGJsb2NrQmVmb3JlVW5sb2FkKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihCZWZvcmVVbmxvYWRFdmVudFR5cGUsIHNldENvbmZpcm1hdGlvbk1lc3NhZ2UpO1xuICAgIC8vIHVuYmxvY2sgYnJvd3NlciBjaGFuZ2VcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gdW5kZWZpbmVkOyAvL3VuZGVmaW5lZCBpbnN0ZWFkIG9mIG51bGwgdG8gc3VwcG9ydCBJRVxuICB9O1xuICByZXR1cm4gdW5ibG9jaztcbn07XG4iLCIvKipcbiAqIE5PVEU6IEtFRVAgU0VQQVJBVEVEIEZST00gVEhFIEhPT0tTIFRPIENPTlNVTUUgVEhFIENPTlRFWFRcbiAqIG90aGVyd2lzZSB5b3UnbGwgZW5kIHVwIHdpdGggY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGJlY2F1c2Ugb2YgdGhlIGRlZmF1bHQgY29tcG9uZW50c1xuICovXG4vLyBUT0RPOiB3ZSBtaWdodCBuZWVkIHRvIGFkYXB0IHRoZSBwcm92aWRlciB0byBtZXJnZSBpdHMgdmFsdWUgd2l0aCBhIHBvdGVudGlhbGx5IGhpZ2hlciB1cCBjb250ZXh0XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IGRlZmF1bHRWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vZGVmYXVsdFZ1bGNhbkNvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7IFZ1bGNhbkNvbXBvbmVudHNDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucy52YWx1ZSBBbiBvYmplY3Qgb2YgVnVsY2FuIGNvbXBvbmVudHMgdG8gYmUgb3ZlcnJpZGVuLlxuICovXG5leHBvcnQgY29uc3QgVnVsY2FuQ29tcG9uZW50c1Byb3ZpZGVyID0gKHtcbiAgdmFsdWUsXG4gIC4uLnByb3BzXG59OiB7XG4gIHZhbHVlPzogUGFydGlhbDxQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHM+O1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkgPT4gKFxuICA8VnVsY2FuQ29tcG9uZW50c0NvbnRleHQuUHJvdmlkZXJcbiAgICB2YWx1ZT17eyAuLi5kZWZhdWx0VnVsY2FuQ29tcG9uZW50cywgLi4uKHZhbHVlIHx8IHt9KSB9fSAvLyBtZXJnZSBwcm92aWRlZCBjb21wb25lbnRzIHNvIHRoZSB1c2VyIGNhbiBwcm92aWRlIG9ubHkgYSBwYXJ0aWFsIHJlcGxhY2VtZW50XG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcbiIsImltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcbmltcG9ydCB7IEZvcm1FcnJvciB9IGZyb20gXCIuLi9Gb3JtRXJyb3JcIjtcbi8vIFRPRE86IGN1cnJlbnRseSB3ZSBuZWVkIHRoZSBkZWZhdWx0IGV4cG9ydCBiZWNhdXNlIHdlIHBhc3MgY29tcG9uZW50cyBtYW51YWxseVxuaW1wb3J0IEZvcm1Db21wb25lbnQgZnJvbSBcIi4uL0Zvcm1Db21wb25lbnRcIjtcbmltcG9ydCB7IEZvcm1Db21wb25lbnRJbm5lciB9IGZyb20gXCIuLi9Gb3JtQ29tcG9uZW50SW5uZXJcIjtcbmltcG9ydCB7IEZvcm1Db21wb25lbnRMb2FkZXIgfSBmcm9tIFwiLi4vRm9ybUNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vRm9ybUVsZW1lbnRcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUdyb3VwTGF5b3V0LCBGb3JtR3JvdXBIZWFkZXIgfSBmcm9tIFwiLi4vRm9ybUdyb3VwXCI7XG5pbXBvcnQgeyBGb3JtSW50bCwgRm9ybUludGxJdGVtTGF5b3V0LCBGb3JtSW50bExheW91dCB9IGZyb20gXCIuLi9Gb3JtSW50bFwiO1xuaW1wb3J0IHsgRm9ybUVycm9ycyB9IGZyb20gXCIuLi9Gb3JtRXJyb3JzXCI7XG5pbXBvcnQgeyBGb3JtU3VibWl0IH0gZnJvbSBcIi4uL0Zvcm1TdWJtaXRcIjtcbmltcG9ydCB7IEZvcm1MYXlvdXQgfSBmcm9tIFwiLi4vRm9ybUxheW91dFwiO1xuaW1wb3J0IHtcbiAgRm9ybU5lc3RlZEFycmF5LFxuICBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dCxcbiAgSWNvbkFkZCxcbiAgSWNvblJlbW92ZSxcbn0gZnJvbSBcIi4uL0Zvcm1OZXN0ZWRBcnJheVwiO1xuaW1wb3J0IHsgRm9ybU5lc3RlZEFycmF5TGF5b3V0IH0gZnJvbSBcIi4uL0Zvcm1OZXN0ZWRBcnJheUxheW91dFwiO1xuaW1wb3J0IHsgRm9ybU5lc3RlZEl0ZW0sIEZvcm1OZXN0ZWRJdGVtTGF5b3V0IH0gZnJvbSBcIi4uL0Zvcm1OZXN0ZWRJdGVtXCI7XG5pbXBvcnQgeyBGb3JtTmVzdGVkRGl2aWRlciB9IGZyb20gXCIuLi9Gb3JtTmVzdGVkRGl2aWRlclwiO1xuaW1wb3J0IHsgRmllbGRFcnJvcnMgfSBmcm9tIFwiLi4vRmllbGRFcnJvcnNcIjtcbmltcG9ydCB7IEZvcm1OZXN0ZWRPYmplY3QsIEZvcm1OZXN0ZWRPYmplY3RMYXlvdXQgfSBmcm9tIFwiLi4vRm9ybU5lc3RlZE9iamVjdFwiO1xuaW1wb3J0IHsgRm9ybU9wdGlvbkxhYmVsIH0gZnJvbSBcIi4uL0Zvcm1PcHRpb25MYWJlbFwiO1xuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuLi9Gb3JtXCI7XG5cbmltcG9ydCB7XG4gIEZvcm1Db21wb25lbnREZWZhdWx0LFxuICBGb3JtQ29tcG9uZW50UGFzc3dvcmQsXG4gIEZvcm1Db21wb25lbnROdW1iZXIsXG4gIEZvcm1Db21wb25lbnRVcmwsXG4gIEZvcm1Db21wb25lbnRFbWFpbCxcbiAgRm9ybUNvbXBvbmVudFRleHRhcmVhLFxuICBGb3JtQ29tcG9uZW50Q2hlY2tib3gsXG4gIEZvcm1Db21wb25lbnRDaGVja2JveEdyb3VwLFxuICBGb3JtQ29tcG9uZW50UmFkaW9Hcm91cCxcbiAgRm9ybUNvbXBvbmVudFNlbGVjdCxcbiAgRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlLFxuICBGb3JtQ29tcG9uZW50RGF0ZVRpbWUsXG4gIEZvcm1Db21wb25lbnREYXRlLFxuICBGb3JtQ29tcG9uZW50VGltZSxcbiAgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQsXG4gIEZvcm1Db21wb25lbnRMaWtlcnQsXG4gIEZvcm1Db21wb25lbnRBdXRvY29tcGxldGUsXG4gIEZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSxcbn0gZnJvbSBcIi4uL2lucHV0cy9CYXNpY0lucHV0c1wiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIi4uL2NvcmUvQnV0dG9uXCI7XG5pbXBvcnQgeyBMb2FkaW5nIH0gZnJvbSBcIi4uL2NvcmUvTG9hZGluZ1wiO1xuaW1wb3J0IHsgUG9zc2libGVDb3JlQ29tcG9uZW50cywgUG9zc2libGVGb3JtQ29tcG9uZW50cyB9IGZyb20gXCIuL3R5cGluZ3NcIjtcblxuY29uc3QgZGVmYXVsdENvcmVDb21wb25lbnRzOiBQb3NzaWJsZUNvcmVDb21wb25lbnRzID0ge1xuICBMb2FkaW5nLFxuICBGb3JtYXR0ZWRNZXNzYWdlLFxuICBBbGVydDogKCkgPT4gbnVsbCxcbiAgQnV0dG9uLFxuICBJY29uOiAoKSA9PiBudWxsLFxufTtcbmNvbnN0IGRlZmF1bHRGb3JtQ29tcG9uZW50czogUG9zc2libGVGb3JtQ29tcG9uZW50cyA9IHtcbiAgRm9ybUVycm9yLCAvLyB1c2VkIGJ5OiBGaWVsZEVycm9yc1xuICAvLyBUbyBiZSBkZWZpbmVkIGJ5IHRoZSBVSSBmcmFtZXdvcmtcbiAgLy8gVE9ETzogYWRkIGRlZmF1bHRzIGluIFJlYWN0IGNvbXBvbmVudHNcbiAgRm9ybUNvbXBvbmVudERlZmF1bHQsXG4gIEZvcm1Db21wb25lbnRQYXNzd29yZCxcbiAgRm9ybUNvbXBvbmVudE51bWJlcixcbiAgRm9ybUNvbXBvbmVudFVybCxcbiAgRm9ybUNvbXBvbmVudEVtYWlsLFxuICBGb3JtQ29tcG9uZW50VGV4dGFyZWEsXG4gIEZvcm1Db21wb25lbnRDaGVja2JveCxcbiAgRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXAsXG4gIEZvcm1Db21wb25lbnRSYWRpb0dyb3VwLFxuICBGb3JtQ29tcG9uZW50U2VsZWN0LFxuICBGb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGUsXG4gIEZvcm1Db21wb25lbnREYXRlVGltZSxcbiAgRm9ybUNvbXBvbmVudERhdGUsXG4gIC8vRm9ybUNvbXBvbmVudERhdGUyLFxuICBGb3JtQ29tcG9uZW50VGltZSxcbiAgRm9ybUNvbXBvbmVudFN0YXRpY1RleHQsXG4gIEZvcm1Db21wb25lbnRMaWtlcnQsXG4gIEZvcm1Db21wb25lbnRBdXRvY29tcGxldGUsXG4gIEZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSxcbiAgLy8gQ29tcG9uZW50cyBkZWZpbmVkIGluIGRlZmF1bHQgdnVsY2FuL2Zvcm1zXG4gIEZvcm1Db21wb25lbnQsXG4gIEZvcm1Db21wb25lbnRJbm5lcixcbiAgRm9ybUNvbXBvbmVudExvYWRlcixcbiAgRm9ybUVsZW1lbnQsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUdyb3VwTGF5b3V0LFxuICBGb3JtR3JvdXBIZWFkZXIsXG4gIEZvcm1JbnRsLFxuICBGb3JtSW50bEl0ZW1MYXlvdXQsXG4gIEZvcm1JbnRsTGF5b3V0LFxuXG4gIC8vIExheW91dFxuICBGaWVsZEVycm9ycyxcbiAgRm9ybUVycm9ycyxcbiAgRm9ybVN1Ym1pdCxcbiAgRm9ybUxheW91dCxcblxuICBGb3JtTmVzdGVkQXJyYXksXG4gIEZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0LFxuICBGb3JtTmVzdGVkQXJyYXlMYXlvdXQsXG4gIEZvcm1OZXN0ZWRJdGVtLFxuICBJY29uQWRkLFxuICBJY29uUmVtb3ZlLFxuICBGb3JtTmVzdGVkRGl2aWRlcixcbiAgLy8gbmVzdGVkIGl0ZW1cbiAgRm9ybU5lc3RlZEl0ZW1MYXlvdXQsXG4gIEZvcm1OZXN0ZWRPYmplY3RMYXlvdXQsXG4gIEZvcm1OZXN0ZWRPYmplY3QsXG4gIEZvcm1PcHRpb25MYWJlbCxcbiAgLy9cbiAgRm9ybSxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0VnVsY2FuQ29tcG9uZW50cyA9IHtcbiAgLi4uZGVmYXVsdENvcmVDb21wb25lbnRzLFxuICAuLi5kZWZhdWx0Rm9ybUNvbXBvbmVudHMsXG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuLy8gaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuLy8gaW1wb3J0IGdldENvbnRleHQgZnJvbSAncmVjb21wb3NlL2dldENvbnRleHQnO1xuLy8gaW1wb3J0IHsgQ29tcG9uZW50cywgcmVnaXN0ZXJDb21wb25lbnQgfSBmcm9tICdtZXRlb3IvdnVsY2FuOmNvcmUnO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1FcnJvciA9ICh7IGVycm9yLCBlcnJvckNvbnRleHQgfSkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IGdldExhYmVsIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvLyB1c2UgdGhlIGVycm9yIG9yIGVycm9yIG1lc3NhZ2UgYXMgZGVmYXVsdCBtZXNzYWdlXG4gIGNvbnN0IGRlZmF1bHRNZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gIGNvbnN0IGlkID0gZXJyb3IuaWQgfHwgXCJhcHAuZGVmYXVsdEVycm9yXCI7XG5cbiAgLy8gZGVmYXVsdCBwcm9wcyBmb3IgYWxsIGVycm9yc1xuICBsZXQgbWVzc2FnZVByb3BzID0ge1xuICAgIGlkLFxuICAgIGRlZmF1bHRNZXNzYWdlLFxuICAgIHZhbHVlczoge1xuICAgICAgZXJyb3JDb250ZXh0LFxuICAgICAgZGVmYXVsdE1lc3NhZ2UsXG4gICAgfSxcbiAgfTtcblxuICAvLyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gZW5oYW5jZSB0aGUgbWVzc2FnZVxuICBpZiAoZXJyb3IucHJvcGVydGllcykge1xuICAgIC8vIGluIGNhc2UgdGhpcyBpcyBhIG5lc3RlZCBmaWVsZHMsIG9ubHkga2VlcCBsYXN0IHNlZ21lbnQgb2YgcGF0aFxuICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICBlcnJvci5wcm9wZXJ0aWVzLm5hbWUgJiYgZXJyb3IucHJvcGVydGllcy5uYW1lLnNwbGl0KFwiLlwiKS5zbGljZSgtMSlbMF07XG4gICAgbWVzc2FnZVByb3BzLnZhbHVlcyA9IHtcbiAgICAgIC4uLm1lc3NhZ2VQcm9wcy52YWx1ZXMsXG4gICAgICAvLyBpZiB0aGUgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IGEgZmllbGQsIGdldCB0aGUgcmVsZXZhbnQgbGFiZWxcbiAgICAgIGxhYmVsOiBlcnJvck5hbWUgJiYgZ2V0TGFiZWwoZXJyb3JOYW1lLCBlcnJvci5wcm9wZXJ0aWVzLmxvY2FsZSksXG4gICAgICAuLi5lcnJvci5wcm9wZXJ0aWVzLFxuICAgIH07XG4gIH1cblxuICBpZiAoZXJyb3IuZGF0YSkge1xuICAgIG1lc3NhZ2VQcm9wcy52YWx1ZXMgPSB7XG4gICAgICAuLi5tZXNzYWdlUHJvcHMudmFsdWVzLFxuICAgICAgLi4uZXJyb3IuZGF0YSwgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZXhjZXB0aW9uID0gZ2V0KGVycm9yLCBcImV4dGVuc2lvbnMuZXhjZXB0aW9uXCIpO1xuICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgbWVzc2FnZVByb3BzID0ge1xuICAgICAgLi4ubWVzc2FnZVByb3BzLFxuICAgICAgaWQ6IGV4Y2VwdGlvbi5pZCxcbiAgICAgIHZhbHVlczogZXhjZXB0aW9uLmRhdGEsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZSBodG1sPXt0cnVlfSB7Li4ubWVzc2FnZVByb3BzfSAvPjtcbn07XG5cbkZvcm1FcnJvci5kZWZhdWx0UHJvcHMgPSB7XG4gIGVycm9yQ29udGV4dDogXCJcIiwgLy8gZGVmYXVsdCBjb250ZXh0IHNvIGZvcm1hdCBtZXNzYWdlIGRvZXMgbm90IGNvbXBsYWluXG59O1xuIiwiLyoqXG4gKiBUT0RPOiByZW5hbWUgXCJGaWVsZENvbXBvbmVudFwiIHRvIGNsYXJpZnlcbiAqIENoYW5nZSBjb21wYXJlZCB0byBNZXRlb3I6XG4gKiAtIGN1c3RvbSBpbnB1dHMgY2Fubm90IGJlIGEgcmVmZXJlbmNlIGFueW1vcmUsIHlvdSBuZWVkIHRvIHBhc3MgdGhlIHdob2xlIGNvbXBvbmVudCBhbmQgbm90IGp1c3QgdGhlIG5hbWVcbiAqIC0gRm9ybUNvbXBvbmVudHMgY29udGV4dCBpcyBsaW1pdGVkIHRvIGRlZmF1bHQgY29tcG9uZW50LiBPdGhlciBjb21wb25lbnRzIG11c3QgYmUgcGFzc2VkIHRocm91Z2ggdGhlIHNjaGVtYSBpbnN0ZWFkXG4gKiAoaXQgbWVhbnMgeW91IGNhbid0IGV4dGVuZCB0aGUgU21hcnRGb3JtIHdpdGggbmV3IGlucHV0VHlwZSwgaW5zdGVhZCB1c2UgYSBmdWxseSBjdXN0b20gaW5wdXQpXG4gKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRUeXBlLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgU2ltcGxlU2NoZW1hIGZyb20gXCJzaW1wbC1zY2hlbWFcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSwgZ2V0TnVsbFZhbHVlIH0gZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBQb3NzaWJsZUZvcm1Db21wb25lbnRzLFxuICBQb3NzaWJsZVZ1bGNhbkNvbXBvbmVudHMsXG59IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvdHlwaW5nc1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IEZvcm1GaWVsZCB9IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCB7XG4gIFZ1bGNhbkZpZWxkU2NoZW1hLFxuICBWdWxjYW5GaWVsZElucHV0LFxuICBWdWxjYW5GaWVsZFR5cGUsXG59IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBnZXRBdXRvSW5wdXRGcm9tVHlwZSB9IGZyb20gXCIuL2lucHV0cy9jb25zdHNcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuY29uc3QgZ2V0Q2hhcmFjdGVyQ291bnRzID0gKHZhbHVlOiBhbnksIG1heDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNoYXJhY3RlckNvdW50OiBudW1iZXIgPSB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPyB2YWx1ZS5sZW5ndGggOiAwO1xuICByZXR1cm4geyBjaGFyc1JlbWFpbmluZzogbWF4IC0gY2hhcmFjdGVyQ291bnQsIGNoYXJzQ291bnQ6IGNoYXJhY3RlckNvdW50IH07XG59O1xuXG4vKipcbiAqIEdldCBmaWVsZCBwYXRoLCB0YWtpbmcgaW50bElucHV0IGZpZWxkcyBpbnRvIGFjY291bnRcbiAqL1xuY29uc3QgZ2V0UGF0aCA9ICh7XG4gIGludGxJbnB1dCxcbiAgcGF0aCxcbn06IHtcbiAgaW50bElucHV0PzogYm9vbGVhbjtcbiAgcGF0aDogc3RyaW5nO1xufSkgPT4ge1xuICByZXR1cm4gaW50bElucHV0ID8gYCR7cGF0aH1faW50bGAgOiBwYXRoO1xufTtcblxuY29uc3QgZ2V0Q2hhcmFjdGVyQ291bnRzRnJvbVByb3BzID0gKHtcbiAgZG9jdW1lbnQsXG4gIG1heCxcbiAgaW50bElucHV0LFxuICBwYXRoLFxufTogUGljazxGb3JtQ29tcG9uZW50UHJvcHMsIFwiZG9jdW1lbnRcIiB8IFwibWF4XCIgfCBcImludGxJbnB1dFwiIHwgXCJwYXRoXCI+KSA9PiB7XG4gIGlmICghbWF4KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZmllbGRQYXRoID0gZ2V0UGF0aCh7IGludGxJbnB1dCwgcGF0aCB9KTtcbiAgY29uc3QgaW50bE9yUmVndWxhclZhbHVlID0gZG9jdW1lbnQ/LltmaWVsZFBhdGhdO1xuICBjb25zdCB2YWx1ZSA9XG4gICAgaW50bE9yUmVndWxhclZhbHVlICYmIHR5cGVvZiBpbnRsT3JSZWd1bGFyVmFsdWUgPT09IFwib2JqZWN0XCJcbiAgICAgID8gaW50bE9yUmVndWxhclZhbHVlLnZhbHVlXG4gICAgICA6IGludGxPclJlZ3VsYXJWYWx1ZTtcbiAgcmV0dXJuIGdldENoYXJhY3RlckNvdW50cyh2YWx1ZSwgbWF4KTtcbn07XG5cbi8vIFRPRE86IG1vdmUgdG8gc2NoZW1hIGhlbHBlcnNcbmNvbnN0IGlzQXJyYXlGaWVsZCA9ICh0eXBlOiBWdWxjYW5GaWVsZFNjaGVtYVtcInR5cGVcIl0pID0+IHtcbiAgcmV0dXJuIHR5cGUgPT09IEFycmF5O1xufTtcblxuLy8gVE9ETzogbm90IHVwIHRvIGRhdGVcbmNvbnN0IGlzT2JqZWN0RmllbGQgPSAodHlwZTogVnVsY2FuRmllbGRTY2hlbWFbXCJ0eXBlXCJdKSA9PiB7XG4gIHJldHVybiB0eXBlIGluc3RhbmNlb2YgU2ltcGxlU2NoZW1hO1xufTtcblxuLypcblxuICBHZXQgZm9ybSBpbnB1dCB0eXBlLCBlaXRoZXIgYmFzZWQgb24gaW5wdXQgcHJvcHMsIG9yIGJ5IGd1ZXNzaW5nIGJhc2VkIG9uIGZvcm0gZmllbGQgdHlwZVxuXG4gICovXG5jb25zdCBnZXRJbnB1dE5hbWUgPSAoZmllbGRUeXBlOiBWdWxjYW5GaWVsZFR5cGUsIGlucHV0PzogVnVsY2FuRmllbGRJbnB1dCkgPT4ge1xuICBpZiAoaW5wdXQpIHJldHVybiBpbnB1dDtcbiAgcmV0dXJuIGdldEF1dG9JbnB1dEZyb21UeXBlKGZpZWxkVHlwZSk7XG59O1xuXG4vKlxuICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBpbnB1dCB0eXBlIGlzIGEgY3VzdG9tXG4gIE5PVEU6IGl0IGFsc28gYWNjZXB0IG5vbi1zdGFuZGFyZCBuYW1lLCBpZiB5b3Ugd2FudCB0byBhZGQgYSBuZXcgdHlwZSBvZiBJbnB1dCBpbiB0aGUgY29udGV4dFxuICAqL1xuLypcbmNvbnN0IGlzQ3VzdG9tSW5wdXQgPSAoaW5wdXRUeXBlOiBWdWxjYW5GaWVsZElucHV0KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXRUeXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaXNTdGFuZGFyZElucHV0ID0gYWxsVnVsY2FuSW5wdXRzLmluY2x1ZGVzKGlucHV0VHlwZSk7XG4gIHJldHVybiAhaXNTdGFuZGFyZElucHV0O1xufTtcbiovXG5cbi8qXG5cbiAgRnVuY3Rpb24gcGFzc2VkIHRvIEZvcm1Db21wb25lbnRJbm5lciB0byBoZWxwIHdpdGggcmVuZGVyaW5nIHRoZSBjb21wb25lbnRcblxuICAqL1xuY29uc3QgZ2V0Rm9ybUlucHV0ID0gKHtcbiAgdHlwZSxcbiAgaW5wdXQsXG4gIEZvcm1Db21wb25lbnRzLFxufToge1xuICB0eXBlOiBWdWxjYW5GaWVsZFR5cGU7XG4gIGlucHV0OiBWdWxjYW5GaWVsZElucHV0O1xuICBGb3JtQ29tcG9uZW50czogUG9zc2libGVGb3JtQ29tcG9uZW50cztcbn0pOiAvLyBUT0RPOiB3ZSBjb3VsZCB0eXBlIHRoZSBwcm9wcyBoZXJlLCBpdCdzIGFuIElucHV0Q29tcG9uZW50IHRvIGJlIG1vcmUgcHJlY2lzZVxuQ29tcG9uZW50VHlwZSA9PiB7XG4gIC8vIGlmIGlucHV0IGlzIGEgUmVhY3QgY29tcG9uZW50LCB1c2UgaXRcbiAgLy8gTk9URTogZG9lcyBpdCB3b3JrIHdpdGggY2xhc3MgY29tcG9uZW50cz9cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgSW5wdXRDb21wb25lbnQgPSBpbnB1dDtcbiAgICByZXR1cm4gSW5wdXRDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW5wdXROYW1lID0gZ2V0SW5wdXROYW1lKHR5cGUsIGlucHV0KTtcbiAgICAvLyBlbHNlIHBpY2sgYSBwcmVkZWZpbmVkIGNvbXBvbmVudFxuICAgIHN3aXRjaCAoaW5wdXROYW1lKSB7XG4gICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudERlZmF1bHQ7XG5cbiAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFBhc3N3b3JkO1xuXG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50TnVtYmVyO1xuXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50VXJsO1xuXG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgcmV0dXJuIEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRFbWFpbDtcblxuICAgICAgY2FzZSBcInRleHRhcmVhXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50VGV4dGFyZWE7XG5cbiAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudENoZWNrYm94O1xuXG4gICAgICBjYXNlIFwiY2hlY2tib3hncm91cFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXA7XG5cbiAgICAgIGNhc2UgXCJyYWRpb2dyb3VwXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50UmFkaW9Hcm91cDtcblxuICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFNlbGVjdDtcblxuICAgICAgY2FzZSBcInNlbGVjdG11bHRpcGxlXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50U2VsZWN0TXVsdGlwbGU7XG5cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudERhdGVUaW1lO1xuXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudERhdGU7XG5cbiAgICAgIC8vIGNhc2UgXCJkYXRlMlwiOlxuICAgICAgLy8gICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudERhdGUyO1xuXG4gICAgICBjYXNlIFwidGltZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFRpbWU7XG5cbiAgICAgIGNhc2UgXCJzdGF0aWN0ZXh0XCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50U3RhdGljVGV4dDtcblxuICAgICAgY2FzZSBcImxpa2VydFwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudExpa2VydDtcblxuICAgICAgY2FzZSBcImF1dG9jb21wbGV0ZVwiOlxuICAgICAgICByZXR1cm4gRm9ybUNvbXBvbmVudHMuRm9ybUNvbXBvbmVudEF1dG9jb21wbGV0ZTtcblxuICAgICAgY2FzZSBcIm11bHRpYXV0b2NvbXBsZXRlXCI6XG4gICAgICAgIHJldHVybiBGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50TXVsdGlBdXRvY29tcGxldGU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1Z1bGNhbkpTL3Z1bGNhbi1ucG0vcHVsbC8zMSBkaXNjdXNzaW9ucyBhYm91dCBjdXN0b20gY29tcG9uZW50cyBzdXBwb3J0IGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnB1dCBuYW1lIFwiJHtpbnB1dE5hbWV9XCIgaXMgbm90IGEgc3RhbmRhcmQgVnVsY2FuIGZvcm0gaW5wdXQgKHR5cGU6ICR7dHlwZX0sIGlucHV0OiAke2lucHV0fSlgXG4gICAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG50eXBlIE9wdGlvbnM8VEZpZWxkID0gYW55PiA9IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IFRGaWVsZCB9PjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29tcG9uZW50UHJvcHM8VEZpZWxkID0gYW55PiBleHRlbmRzIEZvcm1GaWVsZCB7XG4gIGRvY3VtZW50OiBhbnk7XG4gIGRhdGF0eXBlOiBWdWxjYW5GaWVsZFR5cGU7IC8vIFRPRE86IHR5cGUgb2YgdGhlIGZpZWxkLCByZXBsYWNlIHRoaXMgYnkgYSBjbGVhbmVyIHZhbHVlIGxpa2Ugd2UgZG8gaW4gZ3JhcGhxbCB0byBnZXQgdGhlIGZpZWxkIHR5cGVcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGVycm9yczogQXJyYXk8YW55PjtcbiAgLyoqIEhlbHAgdGV4dCBmb3IgdGhlIGZvcm0gKi9cbiAgaGVscD86IHN0cmluZztcbiAgLyoqIFBhdGggb2YgdGhlIGZpZWxkIGlmIG5lc3RlZCAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIGRlZmF1bHRWYWx1ZT86IFRGaWVsZDtcbiAgbWF4PzogbnVtYmVyO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIC8qKiBJbnB1dCBmb3IgdGhpcyBmaWVsZCAqL1xuICBpbnB1dD86IFZ1bGNhbkZpZWxkSW5wdXQgfCBzdHJpbmcgfCBSZWFjdC5Db21wb25lbnQ7XG4gIGZvcm1UeXBlOiBcIm5ld1wiIHwgXCJlZGl0XCI7IC8vIG5ldyBvciBlZGl0XG4gIGludGxJbnB1dD86IGJvb2xlYW47XG4gIG5lc3RlZElucHV0PzogYm9vbGVhbjtcbiAgLyoqIEdyYXBocWwgcXVlcnkgeW91IGNhbiBwYXNzIHRvIGZldGNoIHRoZSBvcHRpb25zIGFzeW5jaHJvbm91c2x5ICovXG4gIHF1ZXJ5Pzogc3RyaW5nO1xuICBvcHRpb25zPzogT3B0aW9ucyB8ICgoZmNpUHJvcHM/OiBhbnkpID0+IE9wdGlvbnMpO1xuICB2dWxjYW5Db21wb25lbnRzPzogUG9zc2libGVWdWxjYW5Db21wb25lbnRzO1xufVxuLyoqXG4gKiBDb21wb25lbnQgZm9yIHRoZSBkaXNwbGF5IG9mIGFueSBmaWVsZCBvZiB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudCA9IChwcm9wczogRm9ybUNvbXBvbmVudFByb3BzKSA9PiB7XG4gIC8qXG4gIFRPRE86IHJlcGxhY2Ugd2l0aCBhIHVzZU1lbW9cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgLy8gYWxsb3cgY3VzdG9tIGNvbnRyb2xzIHRvIGRldGVybWluZSBpZiB0aGV5IHNob3VsZCB1cGRhdGVcbiAgICBpZiAodGhpcy5pc0N1c3RvbUlucHV0KHRoaXMuZ2V0SW5wdXRUeXBlKG5leHRQcm9wcykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRvY3VtZW50LCBkZWxldGVkVmFsdWVzLCBlcnJvcnMgfSA9IG5leHRQcm9wcztcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aCh0aGlzLnByb3BzKTtcblxuICAgIC8vIHdoZW4gY2hlY2tpbmcgZm9yIGRlbGV0ZWQgdmFsdWVzLCBib3RoIGN1cnJlbnQgcGF0aCAoJ2ZvbycpIGFuZCBjaGlsZCBwYXRoICgnZm9vLjAuYmFyJykgc2hvdWxkIHRyaWdnZXIgdXBkYXRlc1xuICAgIGNvbnN0IGluY2x1ZGVzUGF0aE9yQ2hpbGRyZW4gPSAoZGVsZXRlZFZhbHVlcykgPT5cbiAgICAgIGRlbGV0ZWRWYWx1ZXMuc29tZSgoZGVsZXRlZFBhdGgpID0+IGRlbGV0ZWRQYXRoLmluY2x1ZGVzKHBhdGgpKTtcblxuICAgIGNvbnN0IHZhbHVlQ2hhbmdlZCA9ICFpc0VxdWFsKFxuICAgICAgZ2V0KGRvY3VtZW50LCBwYXRoKSxcbiAgICAgIGdldCh0aGlzLnByb3BzLmRvY3VtZW50LCBwYXRoKVxuICAgICk7XG4gICAgY29uc3QgZXJyb3JDaGFuZ2VkID0gIWlzRXF1YWwodGhpcy5nZXRFcnJvcnMoZXJyb3JzKSwgdGhpcy5nZXRFcnJvcnMoKSk7XG4gICAgY29uc3QgZGVsZXRlQ2hhbmdlZCA9XG4gICAgICBpbmNsdWRlc1BhdGhPckNoaWxkcmVuKGRlbGV0ZWRWYWx1ZXMpICE9PVxuICAgICAgaW5jbHVkZXNQYXRoT3JDaGlsZHJlbih0aGlzLnByb3BzLmRlbGV0ZWRWYWx1ZXMpO1xuICAgIGNvbnN0IGNoYXJzQ2hhbmdlZCA9IG5leHRTdGF0ZS5jaGFyc1JlbWFpbmluZyAhPT0gdGhpcy5zdGF0ZS5jaGFyc1JlbWFpbmluZztcbiAgICBjb25zdCBkaXNhYmxlZENoYW5nZWQgPSBuZXh0UHJvcHMuZGlzYWJsZWQgIT09IHRoaXMucHJvcHMuZGlzYWJsZWQ7XG4gICAgY29uc3QgaGVscENoYW5nZWQgPSBuZXh0UHJvcHMuaGVscCAhPT0gdGhpcy5wcm9wcy5oZWxwO1xuXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgIHZhbHVlQ2hhbmdlZCB8fFxuICAgICAgZXJyb3JDaGFuZ2VkIHx8XG4gICAgICBkZWxldGVDaGFuZ2VkIHx8XG4gICAgICBjaGFyc0NoYW5nZWQgfHxcbiAgICAgIGRpc2FibGVkQ2hhbmdlZCB8fFxuICAgICAgaGVscENoYW5nZWQ7XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9Ki9cblxuICBjb25zdCB7XG4gICAgbG9jYWxlLFxuICAgIG1heCxcbiAgICBwYXRoLFxuICAgIC8vdHlwZSxcbiAgICBkYXRhdHlwZSxcbiAgICBpbnB1dCxcbiAgICBpbnRsSW5wdXQsXG4gICAgbmVzdGVkSW5wdXQsXG4gICAgcXVlcnksXG4gICAgb3B0aW9ucyxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7IHVwZGF0ZUN1cnJlbnRWYWx1ZXMsIGRlbGV0ZWRWYWx1ZXMsIGNsZWFyRmllbGRFcnJvcnMgfSA9XG4gICAgdXNlRm9ybUNvbnRleHQoKTtcblxuICBjb25zdCB0eXBlID0gZGF0YXR5cGU7XG4gIGNvbnN0IGNvdW50RnJvbVByb3BzID0gZ2V0Q2hhcmFjdGVyQ291bnRzRnJvbVByb3BzKHByb3BzKTtcbiAgLy8gZXF1aXZhbGVudCB0byBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcbiAgY29uc3QgW2NoYXJzQ291bnRTdGF0ZSwgc2V0Q2hhcmFjdGVyQ291bnRzXSA9XG4gICAgdXNlU3RhdGU8e1xuICAgICAgY2hhcnNDb3VudDogbnVtYmVyO1xuICAgICAgY2hhcnNSZW1haW5pbmc6IG51bWJlcjtcbiAgICB9IHwgbnVsbD4oY291bnRGcm9tUHJvcHMpO1xuXG4gIC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyBzb21ld2hlcmUgZWxzZSwgYXMgaXQgaXMgc3BlY2lmaWMgdG8gU3RyaW5nIGNvbXBvbmVudHMuXG4gIC8vIEVnIHVzaW5nIGFuIGludGVybWVkaWF0ZSBGb3JtQ29tcG9uZW50VGV4dFxuICAvKlxuICBVcGRhdGVzIHRoZSBzdGF0ZSBvZiBjaGFyc0NvdW50IGFuZCBjaGFyc1JlbWFpbmluZyBhcyB0aGUgdXNlcnMgdHlwZXNcbiAgKi9cbiAgY29uc3QgdXBkYXRlQ2hhcmFjdGVyQ291bnQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIW1heClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgdXBkYXRlIGNoYXJhY3RlciBjb3VudCB3aGVuIG5vIG1heCB2YWx1ZSBpcyBzZXQuXCJcbiAgICAgICk7XG4gICAgc2V0Q2hhcmFjdGVyQ291bnRzKGdldENoYXJhY3RlckNvdW50cyh2YWx1ZSwgbWF4KSk7XG4gIH07XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGNvdW50RnJvbVByb3BzKSB7XG4gICAgICBzZXRDaGFyYWN0ZXJDb3VudHMoY291bnRGcm9tUHJvcHMpO1xuICAgIH1cbiAgfSwgW2NvdW50RnJvbVByb3BzPy5jaGFyc0NvdW50LCBjb3VudEZyb21Qcm9wcz8uY2hhcnNSZW1haW5pbmddKTtcbiAgLypcblxuICBXaGV0aGVyIHRvIGtlZXAgdHJhY2sgb2YgYW5kIHNob3cgcmVtYWluaW5nIGNoYXJzXG5cbiAgKi9cbiAgbGV0IHNob3dDaGFyc1JlbWFpbmluZyA9IGZhbHNlO1xuICBsZXQgaW5wdXROYW1lID0gbnVsbDtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlucHV0TmFtZSA9IGdldElucHV0TmFtZSh0eXBlLCBpbnB1dCk7XG4gICAgc2hvd0NoYXJzUmVtYWluaW5nID0gISEoXG4gICAgICB0eXBlb2YgbWF4ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICBpbnB1dE5hbWUgJiZcbiAgICAgIFtcInVybFwiLCBcImVtYWlsXCIsIFwidGV4dGFyZWFcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGlucHV0TmFtZSlcbiAgICApO1xuICB9XG4gIC8vIGNvbnN0IGlucHV0VHlwZSA9IGlucHV0TmFtZTsgLy8gVE9ETzogcmVuYW1lIGlucHV0VHlwZSBpbiB0aGUgY29ycmVzcG9uZGluZyBjaGlsZCBjb21wb25lbnRzXG5cbiAgLypcbiAgRnVuY3Rpb24gcGFzc2VkIHRvIGZvcm0gY29udHJvbHMgKGFsd2F5cyBjb250cm9sbGVkKSB0byB1cGRhdGUgdGhlaXIgdmFsdWVcbiAgKE5vdGU6IHdlIGNvdWxkIHVzZSB0aGUgY29udGV4dCBpbnN0ZWFkPylcbiAgKi9cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKHZhbHVlKSA9PiB7XG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nLCBkZWxldGUgdGhlIGZpZWxkXG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIC8vIGlmIHRoaXMgaXMgYSBudW1iZXIgZmllbGQsIGNvbnZlcnQgdmFsdWUgYmVmb3JlIHNlbmRpbmcgaXQgdXAgdG8gRm9ybVxuICAgIGlmICh0eXBlID09PSBOdW1iZXIgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gU2ltcGxlU2NoZW1hLkludGVnZXIgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICE9PSBnZXRWYWx1ZSgpKSB7XG4gICAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IGxvY2FsZSA/IHsgbG9jYWxlOiBsb2NhbGUsIHZhbHVlIH0gOiB2YWx1ZTtcbiAgICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXMoeyBbZ2V0UGF0aChwcm9wcyldOiB1cGRhdGVWYWx1ZSB9KTtcbiAgICAgIGNsZWFyRmllbGRFcnJvcnMoZ2V0UGF0aChwcm9wcykpO1xuICAgIH1cblxuICAgIC8vIGZvciB0ZXh0IGZpZWxkcywgdXBkYXRlIGNoYXJhY3RlciBjb3VudCBvbiBjaGFuZ2VcbiAgICBpZiAoc2hvd0NoYXJzUmVtYWluaW5nKSB7XG4gICAgICB1cGRhdGVDaGFyYWN0ZXJDb3VudCh2YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qXG4gIEdldCB2YWx1ZSBmcm9tIEZvcm0gc3RhdGUgdGhyb3VnaCBkb2N1bWVudCBhbmQgY3VycmVudFZhbHVlcyBwcm9wc1xuICAgIC8vIFRPRE86IGdldCBkb2N1bWVudCBmcm9tIGNvbnRleHRcbiAgKi9cbiAgY29uc3QgZ2V0VmFsdWUgPSAoKSA9PiB7XG4gICAgLy9jb25zdCBjID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3QgeyBsb2NhbGUsIGRlZmF1bHRWYWx1ZSwgZm9ybVR5cGUsIGRhdGF0eXBlIH0gPSBwcm9wcztcbiAgICBjb25zdCBwYXRoID0gbG9jYWxlID8gYCR7Z2V0UGF0aChwcm9wcyl9LnZhbHVlYCA6IGdldFBhdGgocHJvcHMpO1xuICAgIGNvbnN0IGN1cnJlbnREb2N1bWVudCA9IHByb3BzLmRvY3VtZW50O1xuICAgIGxldCB2YWx1ZSA9IGdldChjdXJyZW50RG9jdW1lbnQsIHBhdGgpO1xuICAgIC8vIG5vdGU6IGZvcmNlIGludGwgZmllbGRzIHRvIGJlIHRyZWF0ZWQgbGlrZSBzdHJpbmdzXG4gICAgY29uc3QgbnVsbFZhbHVlID0gbG9jYWxlID8gXCJcIiA6IGdldE51bGxWYWx1ZShkYXRhdHlwZSk7XG5cbiAgICAvLyBoYW5kbGUgZGVsZXRlZCAmIGVtcHR5IHZhbHVlXG4gICAgaWYgKGRlbGV0ZWRWYWx1ZXMuaW5jbHVkZXMocGF0aCkpIHtcbiAgICAgIHZhbHVlID0gbnVsbFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgLy8gcmVwbGFjZSBlbXB0eSB2YWx1ZSBieSB0aGUgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBzY2hlbWEgaWYgaXQgZXhpc3RzIOKAkyBmb3IgbmV3IGZvcm1zIG9ubHlcbiAgICAgIHZhbHVlID0gZm9ybVR5cGUgPT09IFwibmV3XCIgJiYgZGVmYXVsdFZhbHVlID8gZGVmYXVsdFZhbHVlIDogbnVsbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLypcblxuICBHZXQgZXJyb3JzIGZyb20gRm9ybSBzdGF0ZSB0aHJvdWdoIGNvbnRleHRcblxuICBOb3RlOiB3ZSB1c2UgYGluY2x1ZGVzYCB0byBnZXQgYWxsIGVycm9ycyBmcm9tIG5lc3RlZCBjb21wb25lbnRzLCB3aGljaCBoYXZlIGxvbmdlciBwYXRoc1xuXG4gICovXG4gIGNvbnN0IGdldEVycm9ycyA9IChlcnJvcnM/OiBBcnJheTxhbnk+KSA9PiB7XG4gICAgZXJyb3JzID0gZXJyb3JzIHx8IHByb3BzLmVycm9ycyB8fCBbXTtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IGVycm9ycy5maWx0ZXIoXG4gICAgICAoZXJyb3IpID0+IGVycm9yLnBhdGggJiYgZXJyb3IucGF0aC5pbmNsdWRlcyhwYXRoKVxuICAgICk7XG4gICAgcmV0dXJuIGZpZWxkRXJyb3JzO1xuICB9O1xuXG4gIC8qXG5cbiAgRnVuY3Rpb24gcGFzc2VkIHRvIGZvcm0gY29udHJvbHMgdG8gY2xlYXIgdGhlaXIgY29udGVudHMgKHNldCB0aGVpciB2YWx1ZSB0byBudWxsKVxuXG4gICovXG4gIGNvbnN0IGNsZWFyRmllbGQgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXMoeyBbcGF0aF06IG51bGwgfSk7XG4gICAgaWYgKHNob3dDaGFyc1JlbWFpbmluZykge1xuICAgICAgdXBkYXRlQ2hhcmFjdGVyQ291bnQobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IEZvcm1Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIGlmIChpbnRsSW5wdXQpIHtcbiAgICByZXR1cm4gPEZvcm1Db21wb25lbnRzLkZvcm1JbnRsIHsuLi5wcm9wc30gLz47XG4gIH0gZWxzZSBpZiAoIWlucHV0ICYmIG5lc3RlZElucHV0KSB7XG4gICAgaWYgKGlzQXJyYXlGaWVsZCh0eXBlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRBcnJheVxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICBmb3JtQ29tcG9uZW50cz17Rm9ybUNvbXBvbmVudHN9XG4gICAgICAgICAgZXJyb3JzPXtnZXRFcnJvcnMoKX1cbiAgICAgICAgICB2YWx1ZT17Z2V0VmFsdWUoKX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdEZpZWxkKHR5cGUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Rm9ybUNvbXBvbmVudHMuRm9ybU5lc3RlZE9iamVjdFxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICBmb3JtQ29tcG9uZW50cz17Rm9ybUNvbXBvbmVudHN9XG4gICAgICAgICAgZXJyb3JzPXtnZXRFcnJvcnMoKX1cbiAgICAgICAgICB2YWx1ZT17Z2V0VmFsdWUoKX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmNpUHJvcHMgPSB7XG4gICAgLi4ucHJvcHMsXG4gICAgLi4uKGNoYXJzQ291bnRTdGF0ZSB8fCB7fSksXG4gICAgaW5wdXRUeXBlOiBnZXRJbnB1dE5hbWUodHlwZSwgaW5wdXQpLFxuICAgIHZhbHVlOiBnZXRWYWx1ZSgpLFxuICAgIGVycm9yczogZ2V0RXJyb3JzKCksXG4gICAgc2hvd0NoYXJzUmVtYWluaW5nOiAhIXNob3dDaGFyc1JlbWFpbmluZyxcbiAgICBoYW5kbGVDaGFuZ2U6IGhhbmRsZUNoYW5nZSxcbiAgICBjbGVhckZpZWxkOiBjbGVhckZpZWxkLFxuICAgIGZvcm1JbnB1dDogZ2V0Rm9ybUlucHV0KHsgRm9ybUNvbXBvbmVudHMsIGlucHV0LCB0eXBlIH0pLFxuICB9O1xuXG4gIC8vIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5LCBoYW5kbGUgb3B0aW9ucyBoZXJlOyBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGhhbmRsZWQgYnlcbiAgLy8gdGhlIEZvcm1Db21wb25lbnRMb2FkZXIgY29tcG9uZW50XG4gIGlmICghcXVlcnkgJiYgdHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZjaVByb3BzLm9wdGlvbnMgPSBvcHRpb25zKGZjaVByb3BzKTtcbiAgfVxuXG4gIGNvbnN0IGZjaSA9IDxGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50SW5uZXIgey4uLmZjaVByb3BzfSAvPjtcblxuICByZXR1cm4gcXVlcnkgPyAoXG4gICAgPEZvcm1Db21wb25lbnRzLkZvcm1Db21wb25lbnRMb2FkZXIgey4uLmZjaVByb3BzfT5cbiAgICAgIHtmY2l9XG4gICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50TG9hZGVyPlxuICApIDogKFxuICAgIGZjaVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1Db21wb25lbnRzRGVwZW5kZW5jaWVzID0gW1xuICBcIkZvcm1Db21wb25lbnREZWZhdWx0XCIsXG4gIFwiRm9ybUNvbXBvbmVudFBhc3N3b3JkXCIsXG4gIFwiRm9ybUNvbXBvbmVudE51bWJlclwiLFxuICBcIkZvcm1Db21wb25lbnRVcmxcIixcbiAgXCJGb3JtQ29tcG9uZW50RW1haWxcIixcbiAgXCJGb3JtQ29tcG9uZW50VGV4dGFyZWFcIixcbiAgXCJGb3JtQ29tcG9uZW50Q2hlY2tib3hcIixcbiAgXCJGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cFwiLFxuICBcIkZvcm1Db21wb25lbnRSYWRpb0dyb3VwXCIsXG4gIFwiRm9ybUNvbXBvbmVudFNlbGVjdFwiLFxuICBcIkZvcm1Db21wb25lbnRTZWxlY3RNdWx0aXBsZVwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlVGltZVwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlXCIsXG4gIFwiRm9ybUNvbXBvbmVudERhdGUyXCIsXG4gIFwiRm9ybUNvbXBvbmVudFRpbWVcIixcbiAgXCJGb3JtQ29tcG9uZW50U3RhdGljVGV4dFwiLFxuICBcIkZvcm1Db21wb25lbnRMaWtlcnRcIixcbiAgXCJGb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlXCIsXG4gIFwiRm9ybUNvbXBvbmVudE11bHRpQXV0b2NvbXBsZXRlXCIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBGb3JtQ29tcG9uZW50O1xuIiwiaW1wb3J0IFJlYWN0LCB7IE1vdXNlRXZlbnRIYW5kbGVyIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VJbnRsQ29udGV4dCB9IGZyb20gXCJAdnVsY2FuanMvaTE4blwiO1xuaW1wb3J0IHsgd2hpdGVsaXN0SW5wdXRQcm9wcyB9IGZyb20gXCIuL3VpX3V0aWxzXCI7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50UHJvcHMgfSBmcm9tIFwiLi9Gb3JtQ29tcG9uZW50XCI7XG4vKlxuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGVDb21wb25lbnQsXG4gIHdoaXRlbGlzdElucHV0UHJvcHMsXG59IGZyb20gXCJtZXRlb3IvdnVsY2FuOmNvcmVcIjtcbiovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgVnVsY2FuQ29yZUlucHV0IH0gZnJvbSBcIkB2dWxjYW5qcy9zY2hlbWFcIjtcbmltcG9ydCB7IFBvc3NpYmxlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvdHlwaW5nc1wiO1xuaW1wb3J0IHsgY2xlYXJhYmxlSW5wdXRzIH0gZnJvbSBcIi4vaW5wdXRzL2NvbnN0c1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29tcG9uZW50SW5uZXJQcm9wcyBleHRlbmRzIEZvcm1Db21wb25lbnRQcm9wcyB7XG4gIGlucHV0VHlwZTogVnVsY2FuQ29yZUlucHV0O1xuICAvL2Rpc2FibGVkPzogYm9vbGVhbjtcbiAgLy8gaGVscD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIGNsaWNraW5nIG9uIHRoZSBcImNsZWFyIGlucHV0XCIgYnV0dG9uXG4gICAqL1xuICBjbGVhckZpZWxkPzogTW91c2VFdmVudEhhbmRsZXI8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICAvKipcbiAgICogVE9ETzogbm90IHN1cmUgaWYgaXQgc2hvdWxkIGJlIG1hbmRhdG9yeSBvciBub3QgKGVnIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cz8pXG4gICAqL1xuICBoYW5kbGVDaGFuZ2U/OiBGdW5jdGlvbjtcbiAgaXRlbVByb3BlcnRpZXM/OiBhbnk7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgc3VibWl0Rm9ybTogYW55O1xuICBmb3JtQ29tcG9uZW50czogUG9zc2libGVWdWxjYW5Db21wb25lbnRzO1xuICBpbnRsS2V5cz86IGFueTtcbiAgaW5wdXRDbGFzc05hbWU6IGFueTtcbiAgbmFtZTogYW55O1xuICBpbnB1dDogYW55O1xuICBiZWZvcmVDb21wb25lbnQ6IGFueTtcbiAgYWZ0ZXJDb21wb25lbnQ6IGFueTtcbiAgZXJyb3JzOiBhbnk7XG4gIHNob3dDaGFyc1JlbWFpbmluZzogYW55O1xuICBjaGFyc1JlbWFpbmluZzogYW55O1xuICByZW5kZXJDb21wb25lbnQ6IGFueTtcbiAgZm9ybUlucHV0OiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50SW5uZXIgPSAocHJvcHM6IEZvcm1Db21wb25lbnRJbm5lclByb3BzKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsQ29udGV4dCgpO1xuICBjb25zdCB7IGlucHV0VHlwZSwgZGlzYWJsZWQsIGNsZWFyRmllbGQgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHJlbmRlckNsZWFyID0gKCkgPT4ge1xuICAgIGlmIChjbGVhcmFibGVJbnB1dHMuaW5jbHVkZXMoaW5wdXRUeXBlKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgIC8qXG4gICAgICBGcm9tIGJvb3RzdHJhcDpcbiAgICAgICAgPENvbXBvbmVudHMuVG9vbHRpcFRyaWdnZXJcbiAgICAgICAgICB0cmlnZ2VyPXtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb21wb25lbnQtY2xlYXJcIlxuICAgICAgICAgICAgICB0aXRsZT17dGhpcy5jb250ZXh0LmludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IFwiZm9ybXMuY2xlYXJfZmllbGRcIixcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2xlYXJGaWVsZH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4+4pyVPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAgPENvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZSBpZD1cImZvcm1zLmNsZWFyX2ZpZWxkXCIgLz5cbiAgICAgICAgPC9Db21wb25lbnRzLlRvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29tcG9uZW50LWNsZWFyXCJcbiAgICAgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgIGlkOiBcImZvcm1zLmNsZWFyX2ZpZWxkXCIsXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgb25DbGljaz17Y2xlYXJGaWVsZH1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPuKclTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRQcm9wZXJ0aWVzID0gKCk6IEZvcm1JbnB1dFByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBoYW5kbGVDaGFuZ2UsXG4gICAgICBpbnB1dFR5cGUsXG4gICAgICBpdGVtUHJvcGVydGllcyxcbiAgICAgIGhlbHAsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGxvYWRpbmcsXG4gICAgICBzdWJtaXRGb3JtLFxuICAgICAgZm9ybUNvbXBvbmVudHMsXG4gICAgICBpbnRsS2V5cyxcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLndoaXRlbGlzdElucHV0UHJvcHMocHJvcHMpLFxuICAgICAgICBvbkNoYW5nZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gRm9ybUNvbXBvbmVudCdzIGhhbmRsZUNoYW5nZSBleHBlY3RzIHZhbHVlIGFzIGFyZ3VtZW50OyBsb29rIGluIHRhcmdldC5jaGVja2VkIG9yIHRhcmdldC52YWx1ZVxuICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPVxuICAgICAgICAgICAgaW5wdXRUeXBlID09PSBcImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgPyAvLyBUT0RPOiBub3Qgc3VyZSB3aHkgd2UgbmVlZCBhbiBpZ25vcmUgdGhlcmVcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWRcbiAgICAgICAgICAgICAgOiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIGlmIChoYW5kbGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIGhhbmRsZUNoYW5nZShpbnB1dFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qXG4gICAgICAgIFRPRE86IGNoZWNrIGlmIHRoaXMgY3JlYXRlcyByZWdyZXNzaW9uXG4gICAgICAgIG9uS2V5UHJlc3M6IChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiAmJiBpbnB1dFR5cGUgIT09IFwidGV4dGFyZWFcIikge1xuICAgICAgICAgICAgc3VibWl0Rm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKi9cbiAgICAgIH0sXG5cbiAgICAgIGl0ZW1Qcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLml0ZW1Qcm9wZXJ0aWVzLFxuICAgICAgICBpbnRsS2V5cyxcbiAgICAgICAgQ29tcG9uZW50czogZm9ybUNvbXBvbmVudHMsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB8fCBoZWxwLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBpbnB1dENsYXNzTmFtZSxcbiAgICBuYW1lLFxuICAgIGlucHV0LFxuICAgIC8vaW5wdXRUeXBlLFxuICAgIGJlZm9yZUNvbXBvbmVudCxcbiAgICBhZnRlckNvbXBvbmVudCxcbiAgICBlcnJvcnMsXG4gICAgc2hvd0NoYXJzUmVtYWluaW5nLFxuICAgIGNoYXJzUmVtYWluaW5nLFxuICAgIHJlbmRlckNvbXBvbmVudCxcbiAgICBmb3JtSW5wdXQsXG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBGb3JtQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgLy9jb25zdCBGb3JtQ29tcG9uZW50cyA9IGZvcm1Db21wb25lbnRzO1xuXG4gIGNvbnN0IGhhc0Vycm9ycyA9IGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoO1xuXG4gIGNvbnN0IGlucHV0TmFtZSA9IHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiID8gaW5wdXQubmFtZSA6IGlucHV0VHlwZTtcbiAgY29uc3QgaW5wdXRDbGFzcyA9IGNsYXNzTmFtZXMoXG4gICAgXCJmb3JtLWlucHV0XCIsXG4gICAgaW5wdXRDbGFzc05hbWUsXG4gICAgYGlucHV0LSR7bmFtZX1gLFxuICAgIGBmb3JtLWNvbXBvbmVudC0ke2lucHV0TmFtZSB8fCBcImRlZmF1bHRcIn1gLFxuICAgIHtcbiAgICAgIFwiaW5wdXQtZXJyb3JcIjogaGFzRXJyb3JzLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMoKTtcblxuICBjb25zdCBGb3JtSW5wdXQgPSBmb3JtSW5wdXQ7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17aW5wdXRDbGFzc30+XG4gICAgICB7LyppbnN0YW50aWF0ZUNvbXBvbmVudChiZWZvcmVDb21wb25lbnQsIHByb3BlcnRpZXMpKi99XG4gICAgICA8Rm9ybUlucHV0IHsuLi5wcm9wZXJ0aWVzfSAvPlxuICAgICAge2hhc0Vycm9ycyA/IDxGb3JtQ29tcG9uZW50cy5GaWVsZEVycm9ycyBlcnJvcnM9e2Vycm9yc30gLz4gOiBudWxsfVxuICAgICAge3JlbmRlckNsZWFyKCl9XG4gICAgICB7c2hvd0NoYXJzUmVtYWluaW5nICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcImZvcm0tY29udHJvbC1saW1pdFwiLCB7XG4gICAgICAgICAgICBkYW5nZXI6IGNoYXJzUmVtYWluaW5nIDwgMTAsXG4gICAgICAgICAgfSl9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2hhcnNSZW1haW5pbmd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIHsvKmluc3RhbnRpYXRlQ29tcG9uZW50KGFmdGVyQ29tcG9uZW50LCBwcm9wZXJ0aWVzKSovfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtSW5wdXRQcm9wcyBleHRlbmRzIEZvcm1Db21wb25lbnRJbm5lclByb3BzIHtcbiAgLy8gVE9ETzogbm90ZSBzdXJlIGFib3V0IHRoaXMsIHRoZXJlIGFsc28gc2VlbXMgdG8gYmUgbGFiZWwgYW5kIG90aGVyIHByb3BzIHRoYXQgYXJlIG5vdCBIVE1MSW5wdXQgcHJvcHMgcGVyIHNlXG4gIC8vIEl0IG1heSBkZXBlbmQgb24gdGhlIHR5cGUgb2YgaW5wdXQgYXMgd2VsbCwgbWF5YmUgdGhlIHR5cGUgaXMgbW9yZSBhbiB1bmlvblxuICBpbnB1dFByb3BlcnRpZXM6IFJlYWN0LkhUTUxQcm9wczxIVE1MSW5wdXRFbGVtZW50PjtcbiAgaXRlbVByb3BlcnRpZXM6IGFueTsgLy8gVE9ET1xufVxuIiwiaW1wb3J0IHBpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5cbi8qKlxuICogRXh0cmFjdCBpbnB1dCBwcm9wcyBmb3IgdGhlIEZvcm1Db21wb25lbnRJbm5lclxuICogQHBhcmFtIHsqfSBwcm9wcyBBbGwgY29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBJbml0aWFsIHByb3BzICsgcHJvcHMgc3BlY2lmaWMgdG8gdGhlIEhUTUwgaW5wdXQgaW4gYW4gaW5wdXRQcm9wZXJ0aWVzIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0SHRtbElucHV0UHJvcHMgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBuYW1lLCBwYXRoLCBvcHRpb25zLCBsYWJlbCwgb25DaGFuZ2UsIG9uQmx1ciwgdmFsdWUsIGRpc2FibGVkIH0gPVxuICAgIHByb3BzO1xuXG4gIC8vIHRoZXNlIHByb3BlcnRpZXMgYXJlIHdoaXRlbGlzdGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCB0byB0aGUgYWN0dWFsIGZvcm0gaW5wdXRcbiAgLy8gYW5kIGF2b2lkIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L3dhcm5pbmdzL3Vua25vd24tcHJvcC5odG1sIHdhcm5pbmdzXG4gIGNvbnN0IGlucHV0UHJvcGVydGllcyA9IHtcbiAgICAuLi5wcm9wcy5pbnB1dFByb3BlcnRpZXMsXG4gICAgbmFtZSxcbiAgICBwYXRoLFxuICAgIG9wdGlvbnMsXG4gICAgbGFiZWwsXG4gICAgb25DaGFuZ2UsXG4gICAgb25CbHVyLFxuICAgIHZhbHVlLFxuICAgIGRpc2FibGVkLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4ucHJvcHMsXG4gICAgaW5wdXRQcm9wZXJ0aWVzLFxuICB9O1xufTtcblxuLyoqXG4gKiBFeHRyYWN0IGlucHV0IHByb3BzIGZvciB0aGUgRm9ybUNvbXBvbmVudElubmVyXG4gKiBAcGFyYW0geyp9IHByb3BzIEFsbCBjb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIEluaXRpYWwgcHJvcHMgKyBwcm9wcyBzcGVjaWZpYyB0byB0aGUgSFRNTCBpbnB1dCBpbiBhbiBpbnB1dFByb3BlcnRpZXMgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aGl0ZWxpc3RJbnB1dFByb3BzID0gKFxuICBwcm9wczogYW55XG4pOiBSZWFjdC5IVE1MUHJvcHM8SFRNTElucHV0RWxlbWVudD4gPT4ge1xuICBjb25zdCB3aGl0ZWxpc3QgPSBbXG4gICAgXCJuYW1lXCIsXG4gICAgXCJwYXRoXCIsXG4gICAgXCJvcHRpb25zXCIsXG4gICAgXCJsYWJlbFwiLFxuICAgIFwib25DaGFuZ2VcIixcbiAgICBcIm9uQmx1clwiLFxuICAgIFwidmFsdWVcIixcbiAgICBcImRpc2FibGVkXCIsXG4gICAgXCJwbGFjZWhvbGRlclwiLFxuICBdO1xuICByZXR1cm4gcGljayhwcm9wcywgd2hpdGVsaXN0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpOyIsIi8qKlxuICogQ2hhbmdlcyBmcm9tIFZ1bGNhbiBNZXRlb3I6XG4gKiAtIHF1ZXJ5IGlzIG5vdCBleHBhbmRlZDogeW91IG5lZWQgdG8gcGFzcyB0aGUgZnVsbCBxdWVyeSB3aXRoIGZyYWdtZW50cyBhbHJlYWR5XG4gKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbi8vwqBAc2VlIHBhY2thZ2VzL3Z1bGNhbi1saWIvbGliL21vZHVsZXMvZnJhZ21lbnRzLmpzIGluIFZ1bGNhblxuLy8gc2hvdWxkIHdlIHJlZW5hYmxlIHRoaXM/XG4vLyBpbXBvcnQgeyBleHBhbmRRdWVyeUZyYWdtZW50cyB9IGZyb20gXCJtZXRlb3IvdnVsY2FuOmNvcmVcIjtcbmltcG9ydCB7IHVzZUxhenlRdWVyeSwgZ3FsIH0gZnJvbSBcIkBhcG9sbG8vY2xpZW50XCI7XG5pbXBvcnQgaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbXBvbmVudExvYWRlclByb3BzIHtcbiAgcXVlcnk6IHN0cmluZyB8ICgoeyB2YWx1ZTogYW55IH0pID0+IHN0cmluZyk7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIG9wdGlvbnM6IGFueTtcbiAgdmFsdWU6IGFueTtcbiAgLyoqIFJ1biB0aGUgcXVlcnkgb25seSB3aGVuIHZhbHVlIGlzIG5vdCBlbXB0eSAqL1xuICBxdWVyeVdhaXRzRm9yVmFsdWU/OiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRMb2FkZXIgPSAocHJvcHM6IEZvcm1Db21wb25lbnRMb2FkZXJQcm9wcykgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IHF1ZXJ5LCBjaGlsZHJlbiwgb3B0aW9ucywgdmFsdWUsIHF1ZXJ5V2FpdHNGb3JWYWx1ZSB9ID0gcHJvcHM7XG5cbiAgLy8gaWYgcXVlcnkgaXMgYSBmdW5jdGlvbiwgZXhlY3V0ZSBpdFxuICBjb25zdCBxdWVyeVRleHQgPSB0eXBlb2YgcXVlcnkgPT09IFwiZnVuY3Rpb25cIiA/IHF1ZXJ5KHsgdmFsdWUgfSkgOiBxdWVyeTtcblxuICBjb25zdCBbbG9hZEZpZWxkUXVlcnksIHsgbG9hZGluZywgZXJyb3IsIGRhdGEgfV0gPSB1c2VMYXp5UXVlcnkoXG4gICAgZ3FsKHF1ZXJ5VGV4dClcbiAgICAvLyBncWwoZXhwYW5kUXVlcnlGcmFnbWVudHMocXVlcnlUZXh0KSlcbiAgKTtcblxuICBjb25zdCB2YWx1ZUlzRW1wdHkgPVxuICAgIGlzRW1wdHkodmFsdWUpIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID09PSAwO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHF1ZXJ5V2FpdHNGb3JWYWx1ZSAmJiB2YWx1ZUlzRW1wdHkpIHtcbiAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gcnVuIHRoaXMgcXVlcnkgdW50aWwgd2UgaGF2ZSBhIHZhbHVlIHRvIHBhc3MgdG8gaXRcbiAgICAgIC8vIHNvIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEZpZWxkUXVlcnkoe1xuICAgICAgICB2YXJpYWJsZXM6IHsgdmFsdWUgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3ZhbHVlSXNFbXB0eSwgdmFsdWUsIHF1ZXJ5V2FpdHNGb3JWYWx1ZV0pO1xuXG4gIGlmIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci50b1N0cmluZygpKTtcbiAgfVxuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1jb21wb25lbnQtbG9hZGVyXCI+XG4gICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkxvYWRpbmcgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICAvLyBwYXNzIG5ld2x5IGxvYWRlZCBkYXRhIChhbmQgb3B0aW9ucyBpZiBuZWVkZWQpIHRvIGNoaWxkIGNvbXBvbmVudFxuICBjb25zdCBleHRyYVByb3BzOiB7XG4gICAgZGF0YTogYW55O1xuICAgIHF1ZXJ5RGF0YTogYW55O1xuICAgIHF1ZXJ5RXJyb3I6IGFueTtcbiAgICBsb2FkaW5nOiBib29sZWFuO1xuICAgIG9wdGlvbnNGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAgIG9wdGlvbnM/OiBBcnJheTxhbnk+O1xuICB9ID0geyBkYXRhLCBxdWVyeURhdGE6IGRhdGEsIHF1ZXJ5RXJyb3I6IGVycm9yLCBsb2FkaW5nIH07XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXh0cmFQcm9wcy5vcHRpb25zRnVuY3Rpb24gPSBvcHRpb25zO1xuICAgIGV4dHJhUHJvcHMub3B0aW9ucyA9IG9wdGlvbnMuY2FsbCh7fSwgeyAuLi5wcm9wcywgZGF0YSB9KTtcbiAgfVxuICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQ2hpbGRyZW4gb2YgRm9ybUNvbXBvbmVudExvYWRlciBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgZ290IFwiICsgY2hpbGRyZW5cbiAgICApO1xuICB9XG4gIGNvbnN0IGZjaSA9IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgZXh0cmFQcm9wcyk7XG5cbiAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1jb21wb25lbnQtbG9hZGVyXCI+e2ZjaX08L2Rpdj47XG59O1xuXG5Gb3JtQ29tcG9uZW50TG9hZGVyLnByb3BUeXBlcyA9IHt9O1xuIiwiaW1wb3J0IFJlYWN0LCB7IEhUTUxBdHRyaWJ1dGVzLCBQcm9wc1dpdGhDaGlsZHJlbiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBGb3JtRWxlbWVudFByb3BzID0gSFRNTEF0dHJpYnV0ZXM8SFRNTEZvcm1FbGVtZW50Pjtcbi8qKlxuICogVGhlIGFjdHVhbCB3cmFwcGVyIG9mIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBGb3JtRWxlbWVudCA9IFJlYWN0LmZvcndhcmRSZWY8SFRNTEZvcm1FbGVtZW50PihcbiAgKHsgY2hpbGRyZW4sIC4uLm90aGVyUHJvcHMgfTogUHJvcHNXaXRoQ2hpbGRyZW48Rm9ybUVsZW1lbnRQcm9wcz4sIHJlZikgPT4ge1xuICAgIGNvbnN0IHsgc3VibWl0Rm9ybSB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGZvcm0gey4uLm90aGVyUHJvcHN9IG9uU3VibWl0PXtzdWJtaXRGb3JtfSByZWY9e3JlZn0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvZm9ybT5cbiAgICApO1xuICB9XG4pO1xuIiwiaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgX3NvbWUgZnJvbSBcImxvZGFzaC9zb21lXCI7XG5pbXBvcnQgeyBWdWxjYW5Vc2VyLCBpc0FkbWluIH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgRmllbGRHcm91cCB9IGZyb20gXCJAdnVsY2FuanMvc2NoZW1hXCI7XG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tIFwiLi90eXBpbmdzXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cFByb3BzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBncm91cDogRmllbGRHcm91cCAvKntcbiAgICBhZG1pbnNPbmx5PzogYm9vbGVhbjtcbiAgICBiZWZvcmVDb21wb25lbnQ/OiBhbnk7XG4gIH07Ki87XG4gIGZpZWxkczogQXJyYXk8Rm9ybUZpZWxkPjtcbiAgaGlkZGVuPzogYm9vbGVhbiB8IEZ1bmN0aW9uO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGRvY3VtZW50OiBhbnk7XG4gIGN1cnJlbnRVc2VyPzogVnVsY2FuVXNlcjtcbiAgaXRlbVByb3BlcnRpZXM6IGFueTtcbiAgZm9ybVR5cGU6IGFueTtcbiAgcHJlZmlsbGVkUHJvcHM6IGFueTtcbn1cblxuLyoqXG4gKiBUT0RPOiB0YWtlIHVudXNlZCBwcm9wcyBpbnRvIGFjY291bnRcbiAqIEBwYXJhbSBwYXJhbTBcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBGb3JtR3JvdXBMYXlvdXQgPSAoe1xuICBhbmNob3JOYW1lLFxuICBjb2xsYXBzZWQsXG4gIGhhc0Vycm9ycyxcbiAgZ3JvdXAsXG4gIGRvY3VtZW50LFxuICB0b2dnbGUsXG4gIC4uLnByb3BzXG59KSA9PiB7XG4gIHJldHVybiA8ZmllbGRzZXQgey4uLnByb3BzfSAvPjtcbn07XG5cbmV4cG9ydCBjb25zdCBGb3JtR3JvdXBIZWFkZXIgPSAocHJvcHMpID0+IDxoMiB7Li4ucHJvcHN9IC8+O1xuXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwIC8qPEZvcm1Hcm91cFByb3BzLCBGb3JtR3JvdXBTdGF0ZT4qLyA9IChcbiAgcHJvcHM6IEZvcm1Hcm91cFByb3BzXG4pID0+IHtcbiAgLy8gVE9ETzogZ2V0IHZhbHVlL3VwZGF0ZSBtZXRob2RzIGZyb20gY29udGV4dCBpbnN0ZWFkXG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGxhYmVsLFxuICAgIGdyb3VwLFxuICAgIGZpZWxkcyxcbiAgICBoaWRkZW4sXG4gICAgZG9jdW1lbnQsXG4gICAgY3VycmVudFVzZXIsXG4gICAgZGlzYWJsZWQsXG4gICAgaXRlbVByb3BlcnRpZXMsXG4gICAgcHJlZmlsbGVkUHJvcHMsXG4gICAgZm9ybVR5cGUsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgeyBlcnJvcnMsIGNsZWFyRmllbGRFcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIGNvbnN0IFtjb2xsYXBzZWQsIHNldENvbGxhcHNlZF0gPSB1c2VTdGF0ZTxib29sZWFuPihcbiAgICBncm91cC5zdGFydENvbGxhcHNlZCB8fCBmYWxzZVxuICApO1xuICBjb25zdCB0b2dnbGUgPSAoKSA9PiBzZXRDb2xsYXBzZWQoKGNvbGxhcHNlZCkgPT4gIWNvbGxhcHNlZCk7XG4gIC8vIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBncm91cCBoYXMgYW4gZXJyb3IsIHRoZSBncm91cCBhcyBhIHdob2xlIGhhcyBhbiBlcnJvclxuICBjb25zdCBoYXNFcnJvcnMgPSBfc29tZShmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgIHJldHVybiAhIWVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiBlcnJvci5wYXRoID09PSBmaWVsZC5wYXRoKS5sZW5ndGg7XG4gIH0pO1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIGNvbnN0IGlzSGlkZGVuID1cbiAgICB0eXBlb2YgaGlkZGVuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gaGlkZGVuKHsgLi4ucHJvcHMsIGRvY3VtZW50IH0pXG4gICAgICA6IGhpZGRlbiB8fCBmYWxzZTtcbiAgLypcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9yZGVyOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGhpZGRlbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZmllbGRzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBncm91cDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGVycm9yczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgdGhyb3dFcnJvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBjdXJyZW50VmFsdWVzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlQ3VycmVudFZhbHVlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBkZWxldGVkVmFsdWVzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBhZGRUb0RlbGV0ZWRWYWx1ZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgY2xlYXJGaWVsZEVycm9yczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBmb3JtVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIGN1cnJlbnRVc2VyOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHByZWZpbGxlZFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9OyovXG5cbiAgY29uc3QgaGVhZGluZyA9IChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtR3JvdXBIZWFkZXJcbiAgICAgIHRvZ2dsZT17dG9nZ2xlfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgY29sbGFwc2VkPXtjb2xsYXBzZWR9XG4gICAgICBoaWRkZW49e2lzSGlkZGVufVxuICAgICAgZ3JvdXA9e2dyb3VwfVxuICAgIC8+XG4gICk7XG5cbiAgaWYgKGdyb3VwLmFkbWluc09ubHkgJiYgIWlzQWRtaW4oY3VycmVudFVzZXIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYW5jaG9yTmFtZSA9IG5hbWUuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEgPyBuYW1lLnNwbGl0KFwiLlwiKVsxXSA6IG5hbWU7XG5cbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtR3JvdXBMYXlvdXRcbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGFuY2hvck5hbWU9e2FuY2hvck5hbWV9XG4gICAgICB0b2dnbGU9e3RvZ2dsZX1cbiAgICAgIGNvbGxhcHNlZD17Y29sbGFwc2VkfVxuICAgICAgaGlkZGVuPXtpc0hpZGRlbn1cbiAgICAgIGdyb3VwPXtncm91cH1cbiAgICAgIGhlYWRpbmc9e25hbWUgPT09IFwiZGVmYXVsdFwiID8gbnVsbCA6IGhlYWRpbmd9XG4gICAgICBoYXNFcnJvcnM9e2hhc0Vycm9yc31cbiAgICAgIGRvY3VtZW50PXtkb2N1bWVudH1cbiAgICA+XG4gICAgICB7LyogVE9ETzogY3JlYXRlIFRTIGVycm9yIGF0IHRoZSBtb21lbnQ6IGdyb3VwLmJlZm9yZUNvbXBvbmVudCAmJiA8Z3JvdXAuYmVmb3JlQ29tcG9uZW50IHsuLi5wcm9wc30gLz4qL31cbiAgICAgIHsvKiogVE9ETzogd2UgcGFzcyBhbGwgdGhlIGZ1bmN0aW9ucyBhcyBwcm9wcyB0byB0aGUgRm9ybUNvbXBvbmVudCxcbiAgICAgICAqIGJ1dCBpdCBzaG91bGQgcmVseSBvbiB0aGUgY29udGV4dCBpbnN0ZWFkIGZvciBtZXRob2RzXG4gICAgICAgKi99XG5cbiAgICAgIHtmaWVsZHMubWFwKChmaWVsZCkgPT4gKFxuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50XG4gICAgICAgICAga2V5PXtmaWVsZC5uYW1lfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICB7Li4uZmllbGR9XG4gICAgICAgICAgZG9jdW1lbnQ9e2RvY3VtZW50fVxuICAgICAgICAgIGl0ZW1Qcm9wZXJ0aWVzPXt7XG4gICAgICAgICAgICAuLi5pdGVtUHJvcGVydGllcyxcbiAgICAgICAgICAgIC4uLmZpZWxkLml0ZW1Qcm9wZXJ0aWVzLFxuICAgICAgICAgIH19XG4gICAgICAgICAgY2xlYXJGaWVsZEVycm9ycz17Y2xlYXJGaWVsZEVycm9yc31cbiAgICAgICAgICBmb3JtVHlwZT17Zm9ybVR5cGV9XG4gICAgICAgICAgY3VycmVudFVzZXI9e2N1cnJlbnRVc2VyfVxuICAgICAgICAgIHByZWZpbGxlZFByb3BzPXtwcmVmaWxsZWRQcm9wc31cbiAgICAgICAgLz5cbiAgICAgICkpfVxuXG4gICAgICB7LyogVE9ETzogY3JlYXRlIFRTIGVycm9yIGF0IHRoZSBtb21lbnQ6IGdyb3VwLmFmdGVyQ29tcG9uZW50ICYmIDxncm91cC5hZnRlckNvbXBvbmVudCB7Li4ucHJvcHN9IC8+Ki99XG4gICAgPC9WdWxjYW5Db21wb25lbnRzLkZvcm1Hcm91cExheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1Hcm91cDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC9zb21lXCIpOyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBvbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuY29uc3QgTG9jYWxlczogQXJyYXk8eyBpZDogc3RyaW5nIH0+ID0gW107IC8vID8/IG1pZ2h0IG5lZWQgdG8gZ2V0IHRoaXMgZnJvbSBjb250ZXh0XG5leHBvcnQgY29uc3QgRm9ybUludGxMYXlvdXQgPSAoeyBjaGlsZHJlbiB9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1pbnRsXCI+e2NoaWxkcmVufTwvZGl2PlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtSW50bEl0ZW1MYXlvdXQgPSAoeyBsb2NhbGUsIGNoaWxkcmVuIH0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9e2Bmb3JtLWludGwtJHtsb2NhbGUuaWR9YH0+e2NoaWxkcmVufTwvZGl2PlxuKTtcblxuaW50ZXJmYWNlIEZvcm1JbnRsUHJvcHMge1xuICBwYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IEZvcm1JbnRsID0gKHByb3BzOiBGb3JtSW50bFByb3BzKSA9PiB7XG4gIGNvbnN0IEZvcm1Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCB7IGdldExhYmVsIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICAvKlxuICBOb3RlOiBpZGVhbGx5IHdlJ2QgdHJ5IHRvIG1ha2Ugc3VyZSB0byByZXR1cm4gdGhlIHJpZ2h0IHBhdGggbm8gbWF0dGVyXG4gIHRoZSBvcmRlciB0cmFuc2xhdGlvbnMgYXJlIHN0b3JlZCBpbiwgYnV0IGluIHByYWN0aWNlIHdlIGNhbid0IGd1YXJhbnRlZSBpdFxuICBzbyB3ZSBqdXN0IHVzZSB0aGUgb3JkZXIgb2YgdGhlIExvY2FsZXMgYXJyYXkuXG5cbiAgKi9cbiAgY29uc3QgZ2V0TG9jYWxlUGF0aCA9IChkZWZhdWx0SW5kZXgpID0+IHtcbiAgICByZXR1cm4gYCR7cHJvcHMucGF0aH1faW50bC4ke2RlZmF1bHRJbmRleH1gO1xuICB9O1xuXG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHM7XG5cbiAgLy8gZG8gbm90IHBhc3MgRm9ybUludGwncyBvd24gdmFsdWUsIGlucHV0UHJvcGVydGllcywgYW5kIGludGxJbnB1dCBwcm9wcyBkb3duXG4gIGNvbnN0IHByb3BlcnRpZXMgPSBvbWl0KFxuICAgIHByb3BzLFxuICAgIFwidmFsdWVcIixcbiAgICBcImlucHV0UHJvcGVydGllc1wiLFxuICAgIFwiaW50bElucHV0XCIsXG4gICAgXCJuZXN0ZWRJbnB1dFwiXG4gICk7XG4gIHJldHVybiAoXG4gICAgPEZvcm1Db21wb25lbnRzLkZvcm1JbnRsTGF5b3V0PlxuICAgICAge0xvY2FsZXMubWFwKChsb2NhbGUsIGkpID0+IChcbiAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1JbnRsSXRlbUxheW91dCBrZXk9e2xvY2FsZS5pZH0gbG9jYWxlPXtsb2NhbGV9PlxuICAgICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtQ29tcG9uZW50XG4gICAgICAgICAgICB7Li4ucHJvcGVydGllc31cbiAgICAgICAgICAgIGxhYmVsPXtnZXRMYWJlbChuYW1lLCBsb2NhbGUuaWQpfVxuICAgICAgICAgICAgcGF0aD17Z2V0TG9jYWxlUGF0aChpKX1cbiAgICAgICAgICAgIGxvY2FsZT17bG9jYWxlLmlkfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRm9ybUNvbXBvbmVudHMuRm9ybUludGxJdGVtTGF5b3V0PlxuICAgICAgKSl9XG4gICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtSW50bExheW91dD5cbiAgKTtcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vKipcbiAqIERpc3BsYXkgZXJyb3JzIGZvciB0aGUgY3VycmVudCBmb3JtLCBiYXNlZCBvbiB0aGUgY29udGV4dFxuICovXG5leHBvcnQgY29uc3QgRm9ybUVycm9ycyA9ICgpID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgY29uc3QgeyBlcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZXJyb3JzXCI+XG4gICAgICB7ISFlcnJvcnMubGVuZ3RoICYmIChcbiAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQWxlcnQgY2xhc3NOYW1lPVwiZmxhc2gtbWVzc2FnZVwiIHZhcmlhbnQ9XCJkYW5nZXJcIj5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICB7ZXJyb3JzLm1hcCgoZXJyb3IsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxsaSBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRXJyb3IgZXJyb3I9e2Vycm9yfSBlcnJvckNvbnRleHQ9XCJmb3JtXCIgLz5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvVnVsY2FuQ29tcG9uZW50cy5BbGVydD5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG4vLyAvKlxuXG4vLyAgIFJlbmRlciBlcnJvcnNcblxuLy8gICAqL1xuLy8gIHJlbmRlckVycm9ycyA9ICgpID0+IHtcbi8vICAgcmV0dXJuIChcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZXJyb3JzXCI+XG4vLyAgICAgICB7dGhpcy5zdGF0ZS5lcnJvcnMubWFwKChlcnJvciwgaW5kZXgpID0+IHtcbi8vICAgICAgICAgbGV0IG1lc3NhZ2U7XG5cbi8vICAgICAgICAgaWYgKGVycm9yLmRhdGEgJiYgZXJyb3IuZGF0YS5lcnJvcnMpIHtcbi8vICAgICAgICAgICAvLyB0aGlzIGVycm9yIGlzIGEgXCJtdWx0aS1lcnJvclwiIHdpdGggbXVsdGlwbGUgc3ViLWVycm9yc1xuXG4vLyAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLmRhdGEuZXJyb3JzLm1hcChlcnJvciA9PiB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge1xuLy8gICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvciksXG4vLyAgICAgICAgICAgICAgIGRhdGE6IGVycm9yLmRhdGEsXG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICAgIH0pO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgIC8vIHRoaXMgaXMgYSByZWd1bGFyIGVycm9yXG5cbi8vICAgICAgICAgICBtZXNzYWdlID0ge1xuLy8gICAgICAgICAgICAgY29udGVudDpcbi8vICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fFxuLy8gICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW50bC5mb3JtYXRNZXNzYWdlKHsgaWQ6IGVycm9yLmlkLCBkZWZhdWx0TWVzc2FnZTogZXJyb3IuaWQgfSwgZXJyb3IuZGF0YSksXG4vLyAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIHJldHVybiA8Q29tcG9uZW50cy5Gb3JtRmxhc2gga2V5PXtpbmRleH0gbWVzc2FnZT17bWVzc2FnZX0gdHlwZT1cImVycm9yXCIgLz47XG4vLyAgICAgICB9KX1cbi8vICAgICA8L2Rpdj5cbi8vICAgKTtcbi8vIH07XG4iLCIvKipcbiAqIENoYW5nZSBjb21wYXJlZCB0byBWdWxjYW46XG4gKiAtIHVzaW5nIGEgbW9kZWwgaW5zdGVhZCBvZiBhIGNvbGxlY3Rpb25OYW1lXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IGNhbkRlbGV0ZURvY3VtZW50IH0gZnJvbSBcIkB2dWxjYW5qcy9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU3VibWl0UHJvcHMge1xuICBzdWJtaXRMYWJlbDogYW55O1xuICBjYW5jZWxMYWJlbDogYW55O1xuICBjYW5jZWxDYWxsYmFjazogYW55O1xuICByZXZlcnRMYWJlbDogYW55O1xuICByZXZlcnRDYWxsYmFjazogYW55O1xuICBkb2N1bWVudDogYW55O1xuICBkZWxldGVEb2N1bWVudDogYW55O1xuICBtb2RlbDogYW55O1xuICAvLyBjbGFzc2VzOiBhbnksXG4gIGN1cnJlbnRVc2VyOiBhbnk7XG59XG5leHBvcnQgY29uc3QgRm9ybVN1Ym1pdCA9ICh7XG4gIHN1Ym1pdExhYmVsLFxuICBjYW5jZWxMYWJlbCxcbiAgY2FuY2VsQ2FsbGJhY2ssXG4gIHJldmVydExhYmVsLFxuICByZXZlcnRDYWxsYmFjayxcbiAgZG9jdW1lbnQsXG4gIGRlbGV0ZURvY3VtZW50LFxuICBtb2RlbCxcbiAgLy8gY2xhc3NlcyxcbiAgY3VycmVudFVzZXIsXG59KSA9PiB7XG4gIGNvbnN0IFZ1bGNhbkNvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIGNvbnN0IHsgY2xlYXJGb3JtIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1zdWJtaXRcIj5cbiAgICAgIDxWdWxjYW5Db21wb25lbnRzLkJ1dHRvbiB0eXBlPVwic3VibWl0XCIgdmFyaWFudD1cInByaW1hcnlcIj5cbiAgICAgICAge3N1Ym1pdExhYmVsID8gKFxuICAgICAgICAgIHN1Ym1pdExhYmVsXG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgaWQ9XCJmb3Jtcy5zdWJtaXRcIlxuICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9XCJTdWJtaXRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuXG4gICAgICB7Y2FuY2VsQ2FsbGJhY2sgPyAoXG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jYW5jZWxcIlxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjYW5jZWxDYWxsYmFjayhkb2N1bWVudCk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtjYW5jZWxMYWJlbCA/IChcbiAgICAgICAgICAgIGNhbmNlbExhYmVsXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9XCJmb3Jtcy5jYW5jZWxcIlxuICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT1cIkNhbmNlbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvYT5cbiAgICAgICkgOiBudWxsfVxuXG4gICAgICB7cmV2ZXJ0Q2FsbGJhY2sgPyAoXG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jYW5jZWxcIlxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjbGVhckZvcm0oKTtcbiAgICAgICAgICAgIHJldmVydENhbGxiYWNrKGRvY3VtZW50KTtcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3JldmVydExhYmVsID8gKFxuICAgICAgICAgICAgcmV2ZXJ0TGFiZWxcbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICBpZD1cImZvcm1zLnJldmVydFwiXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPVwiUmV2ZXJ0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9hPlxuICAgICAgKSA6IG51bGx9XG5cbiAgICAgIHtkZWxldGVEb2N1bWVudCAmJlxuICAgICAgY2FuRGVsZXRlRG9jdW1lbnQoe1xuICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgfSkgPyAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwibGlua1wiXG4gICAgICAgICAgICBvbkNsaWNrPXtkZWxldGVEb2N1bWVudH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YGRlbGV0ZS1saW5rICR7bW9kZWwubmFtZX0tZGVsZXRlLWxpbmtgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkljb24gbmFtZT1cImNsb3NlXCIgLz57XCIgXCJ9XG4gICAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgIGlkPVwiZm9ybXMuZGVsZXRlXCJcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9XCJEZWxldGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuRm9ybVN1Ym1pdC5wcm9wVHlwZXMgPSB7XG4gIHN1Ym1pdExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgY2FuY2VsTGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBjYW5jZWxDYWxsYmFjazogUHJvcFR5cGVzLmZ1bmMsXG4gIHJldmVydExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgcmV2ZXJ0Q2FsbGJhY2s6IFByb3BUeXBlcy5mdW5jLFxuICBkb2N1bWVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgZGVsZXRlRG9jdW1lbnQ6IFByb3BUeXBlcy5mdW5jLFxuICBjb2xsZWN0aW9uTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYXlvdXRQcm9wcyB7XG4gIGNvbW1vblByb3BzOiBhbnk7XG4gIGZvcm1Qcm9wczogYW55O1xuICBzdWJtaXRQcm9wczogYW55O1xuICByZXBlYXRFcnJvcnM/OiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IEZvcm1MYXlvdXQ6IFJlYWN0LkZDPEZvcm1MYXlvdXRQcm9wcz4gPSAoe1xuICBjb21tb25Qcm9wcyxcbiAgZm9ybVByb3BzLFxuICByZXBlYXRFcnJvcnMsXG4gIHN1Ym1pdFByb3BzLFxuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtRWxlbWVudCB7Li4uZm9ybVByb3BzfT5cbiAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1FcnJvcnMgey4uLmNvbW1vblByb3BzfSAvPlxuXG4gICAgICB7Y2hpbGRyZW59XG5cbiAgICAgIHtyZXBlYXRFcnJvcnMgJiYgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUVycm9ycyB7Li4uY29tbW9uUHJvcHN9IC8+fVxuXG4gICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtU3VibWl0IHsuLi5jb21tb25Qcm9wc30gey4uLnN1Ym1pdFByb3BzfSAvPlxuICAgIDwvVnVsY2FuQ29tcG9uZW50cy5Gb3JtRWxlbWVudD5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtQ29tcG9uZW50c0RlcGVuZGVuY2llcyA9IFtcbiAgXCJGb3JtRXJyb3JzXCIsXG4gIFwiRm9ybVN1Ym1pdFwiLFxuICBcIkZvcm1FbGVtZW50XCIsXG5dO1xuIiwiLyoqXG4gKiBDaGFuZ2UgY29tcGFyZWQgdG8gVnVsY2FuIE1ldGVvcjpcbiAqIGFmdGVyL2JlZm9yZSA9PiBBZnRlciwgQmVmb3JlIHdpdGggdGl0bGVjYXNlXG4gKi9cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBfb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgeyB1c2VGb3JtQ29udGV4dCB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vLyBXcmFwcyB0aGUgRm9ybU5lc3RlZEl0ZW0sIHJlcGVhdGVkIGZvciBlYWNoIG9iamVjdFxuLy8gQWxsb3cgZm9yIGV4YW1wbGUgdG8gaGF2ZSBhIGxhYmVsIHBlciBvYmplY3RcbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dCA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGxhYmVsLCBjaGlsZHJlbiwgYWRkSXRlbSwgQmVmb3JlQ29tcG9uZW50LCBBZnRlckNvbXBvbmVudCB9ID0gcHJvcHM7XG4gIGNvbnN0IEZvcm1Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtYXJyYXktaW5uZXItbGF5b3V0XCI+XG4gICAgICA8QmVmb3JlQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkRGl2aWRlciBsYWJlbD17bGFiZWx9IGFkZEl0ZW09e2FkZEl0ZW19IC8+XG4gICAgICA8QWZ0ZXJDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTmVzdGVkQXJyYXlQcm9wczxUVmFsdWUgPSBhbnk+IHtcbiAgdmFsdWU6IFRWYWx1ZTtcbiAgLyoqIFBhdGggZm9yIHRoZSBuZXN0ZWQgb2JqZWN0ICovXG4gIHBhdGg6IHN0cmluZztcbiAgaXRlbVByb3BlcnRpZXM6IGFueTtcbiAgbWluQ291bnQ/OiBudW1iZXI7XG4gIG1heENvdW50PzogbnVtYmVyO1xuICBhcnJheUZpZWxkPzogYm9vbGVhbjtcbiAgbmVzdGVkQXJyYXlFcnJvcnM6IGFueTtcbiAgaGFzRXJyb3JzPzogYm9vbGVhbjtcbiAgLy8gVE9ETzogZ2V0IGZyb20gY29udGV4dFxuICBwcmVmaWxsZWRQcm9wcz86IGFueTtcbiAgYWRkSXRlbTogRnVuY3Rpb24gfCBudWxsO1xufVxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRBcnJheSA9IChwcm9wczogRm9ybU5lc3RlZEFycmF5UHJvcHMpID0+IHtcbiAgY29uc3QgeyB1cGRhdGVDdXJyZW50VmFsdWVzLCBkZWxldGVkVmFsdWVzLCBlcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIC8qc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBpdGVtUHJvcGVydGllczoge30sXG4gIH07Ki9cbiAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZSB8fCBbXTtcblxuICBjb25zdCBhZGRJdGVtID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgcHJlZmlsbGVkUHJvcHMsIHBhdGggfSA9IHByb3BzO1xuICAgIHVwZGF0ZUN1cnJlbnRWYWx1ZXMoXG4gICAgICB7IFtgJHtwYXRofS4ke3ZhbHVlLmxlbmd0aH1gXTogX2dldChwcmVmaWxsZWRQcm9wcywgYCR7cGF0aH0uJGApIHx8IHt9IH0sXG4gICAgICB7IG1vZGU6IFwibWVyZ2VcIiB9XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCByZW1vdmVJdGVtID0gKGluZGV4KSA9PiB7XG4gICAgdXBkYXRlQ3VycmVudFZhbHVlcyh7IFtgJHtwcm9wcy5wYXRofS4ke2luZGV4fWBdOiBudWxsIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgR28gdGhyb3VnaCB0aGlzLmNvbnRleHQuZGVsZXRlZFZhbHVlcyBhbmQgc2VlIGlmIGFueSB2YWx1ZSBtYXRjaGVzIGJvdGggdGhlIGN1cnJlbnQgZmllbGRcbiAgYW5kIHRoZSBnaXZlbiBpbmRleCAoZXg6IGlmIHdlIHdhbnQgdG8ga25vdyBpZiB0aGUgc2Vjb25kIGFkZHJlc3MgaXMgZGVsZXRlZCwgd2VcbiAgbG9vayBmb3IgdGhlIHByZXNlbmNlIG9mICdhZGRyZXNzZXMuMScpXG4gICovXG4gIGNvbnN0IGlzRGVsZXRlZCA9IChpbmRleCkgPT4ge1xuICAgIHJldHVybiBkZWxldGVkVmFsdWVzLmluY2x1ZGVzKGAke3Byb3BzLnBhdGh9LiR7aW5kZXh9YCk7XG4gIH07XG5cbiAgY29uc3QgY29tcHV0ZVZpc2libGVJbmRleCA9ICh2YWx1ZXMpID0+IHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICBjb25zdCB2aXNpYmxlSW5kZXhlcyA9IHZhbHVlcy5tYXAoKHN1YkRvY3VtZW50LCBzdWJEb2N1bWVudEluZHgpID0+IHtcbiAgICAgIGlmIChpc0RlbGV0ZWQoc3ViRG9jdW1lbnRJbmR4KSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZpc2libGVJbmRleGVzO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByb3BzLml0ZW1Qcm9wZXJ0aWVzLm9wZW5OZXN0ZWQpIGFkZEl0ZW0oKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IHZpc2libGVJdGVtSW5kZXhlcyA9IGNvbXB1dGVWaXNpYmxlSW5kZXgodmFsdWUpO1xuICAvLyBkbyBub3QgcGFzcyBGb3JtTmVzdGVkJ3Mgb3duIHZhbHVlLCBpbnB1dCBhbmQgaW5wdXRQcm9wZXJ0aWVzIHByb3BzIGRvd25cbiAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAuLi5fb21pdChcbiAgICAgIHByb3BzLFxuICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgXCJpbnB1dFwiLFxuICAgICAgXCJpbnB1dFByb3BlcnRpZXNcIixcbiAgICAgIFwibmVzdGVkSW5wdXRcIixcbiAgICAgIFwiYmVmb3JlQ29tcG9uZW50XCIsXG4gICAgICBcImFmdGVyQ29tcG9uZW50XCJcbiAgICApLFxuICB9O1xuICBjb25zdCB7IHBhdGgsIG1pbkNvdW50LCBtYXhDb3VudCwgYXJyYXlGaWVsZCB9ID0gcHJvcHM7XG4gIGNvbnN0IEZvcm1Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIC8vZmlsdGVyIG91dCBudWxsIHZhbHVlcyB0byBjYWxjdWxhdGUgYXJyYXkgbGVuZ3RoXG4gIGxldCBhcnJheUxlbmd0aCA9IHZhbHVlLmZpbHRlcigoc2luZ2xlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHNpbmdsZVZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIHNpbmdsZVZhbHVlICE9PSBudWxsO1xuICB9KS5sZW5ndGg7XG4gIHByb3BlcnRpZXMuYWRkSXRlbSA9ICFtYXhDb3VudCB8fCBhcnJheUxlbmd0aCA8IG1heENvdW50ID8gYWRkSXRlbSA6IG51bGw7XG5cbiAgLy8gb25seSBrZWVwIGVycm9ycyBzcGVjaWZpYyB0byB0aGUgbmVzdGVkIGFycmF5IChhbmQgbm90IGl0cyBzdWJmaWVsZHMpXG4gIHByb3BlcnRpZXMubmVzdGVkQXJyYXlFcnJvcnMgPSBlcnJvcnMuZmlsdGVyKFxuICAgIChlcnJvcikgPT4gZXJyb3IucGF0aCAmJiBlcnJvci5wYXRoID09PSBwYXRoXG4gICk7XG4gIHByb3BlcnRpZXMuaGFzRXJyb3JzID0gISEoXG4gICAgcHJvcGVydGllcy5uZXN0ZWRBcnJheUVycm9ycyAmJiBwcm9wZXJ0aWVzLm5lc3RlZEFycmF5RXJyb3JzLmxlbmd0aFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRBcnJheUxheW91dCB7Li4ucHJvcGVydGllc30+XG4gICAgICB7dmFsdWUubWFwKChzdWJEb2N1bWVudCwgaSkgPT4ge1xuICAgICAgICBpZiAoaXNEZWxldGVkKGkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcGF0aCA9IGAke3Byb3BzLnBhdGh9LiR7aX1gO1xuICAgICAgICBjb25zdCB2aXNpYmxlSXRlbUluZGV4ID0gdmlzaWJsZUl0ZW1JbmRleGVzW2ldO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxGb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlJbm5lckxheW91dFxuICAgICAgICAgICAgey4uLmFycmF5RmllbGR9XG4gICAgICAgICAgICBrZXk9e3BhdGh9XG4gICAgICAgICAgICBhZGRJdGVtPXthZGRJdGVtfVxuICAgICAgICAgICAgaXRlbUluZGV4PXtpfVxuICAgICAgICAgICAgdmlzaWJsZUl0ZW1JbmRleD17dmlzaWJsZUl0ZW1JbmRleH1cbiAgICAgICAgICAgIHBhdGg9e3BhdGh9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEZvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRJdGVtXG4gICAgICAgICAgICAgIHsuLi5wcm9wZXJ0aWVzfVxuICAgICAgICAgICAgICBpdGVtSW5kZXg9e2l9XG4gICAgICAgICAgICAgIHZpc2libGVJdGVtSW5kZXg9e3Zpc2libGVJdGVtSW5kZXh9XG4gICAgICAgICAgICAgIHBhdGg9e3BhdGh9XG4gICAgICAgICAgICAgIHJlbW92ZUl0ZW09eygpID0+IHtcbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtKGkpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBoaWRlUmVtb3ZlPXshIW1pbkNvdW50ICYmIGFycmF5TGVuZ3RoIDw9IG1pbkNvdW50fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0Zvcm1Db21wb25lbnRzLkZvcm1OZXN0ZWRBcnJheUlubmVyTGF5b3V0PlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgPC9Gb3JtQ29tcG9uZW50cy5Gb3JtTmVzdGVkQXJyYXlMYXlvdXQ+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybUNvbXBvbmVudHNEZXBlbmRlbmNpZXMgPSBbXG4gIFwiRm9ybU5lc3RlZEFycmF5SW5uZXJMYXlvdXRcIixcbiAgXCJGb3JtTmVzdGVkQXJyYXlMYXlvdXRcIixcbl07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1OZXN0ZWRBcnJheTtcblxuZXhwb3J0IGNvbnN0IEljb25BZGQgPSAoeyB3aWR0aCA9IDI0LCBoZWlnaHQgPSAyNCB9KSA9PiAoXG4gIDxzdmdcbiAgICB3aWR0aD17d2lkdGh9XG4gICAgaGVpZ2h0PXtoZWlnaHR9XG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgdmlld0JveD1cIjAgMCA0NDggNTEyXCJcbiAgPlxuICAgIDxwYXRoXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgIGQ9XCJNNDQ4IDI5NC4ydi03Ni40YzAtMTMuMy0xMC43LTI0LTI0LTI0SDI4Ni4yVjU2YzAtMTMuMy0xMC43LTI0LTI0LTI0aC03Ni40Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHYxMzcuOEgyNGMtMTMuMyAwLTI0IDEwLjctMjQgMjR2NzYuNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGgxMzcuOFY0NTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRoNzYuNGMxMy4zIDAgMjQtMTAuNyAyNC0yNFYzMTguMkg0MjRjMTMuMyAwIDI0LTEwLjcgMjQtMjR6XCJcbiAgICAvPlxuICA8L3N2Zz5cbik7XG5cbmV4cG9ydCBjb25zdCBJY29uUmVtb3ZlID0gKHsgd2lkdGggPSAyNCwgaGVpZ2h0ID0gMjQgfSkgPT4gKFxuICA8c3ZnXG4gICAgd2lkdGg9e3dpZHRofVxuICAgIGhlaWdodD17aGVpZ2h0fVxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiXG4gID5cbiAgICA8cGF0aFxuICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICBkPVwiTTQyNCAzMTguMmMxMy4zIDAgMjQtMTAuNyAyNC0yNHYtNzYuNGMwLTEzLjMtMTAuNy0yNC0yNC0yNEgyNGMtMTMuMyAwLTI0IDEwLjctMjQgMjR2NzYuNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGg0MDB6XCJcbiAgICAvPlxuICA8L3N2Zz5cbik7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuXG4vLyBSZXBsYWNlYWJsZSBsYXlvdXQsIGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkQXJyYXlMYXlvdXQgPSAocHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGhhc0Vycm9ycyxcbiAgICBuZXN0ZWRBcnJheUVycm9ycyxcbiAgICBsYWJlbCxcbiAgICBhZGRJdGVtLFxuICAgIEJlZm9yZUNvbXBvbmVudCxcbiAgICBBZnRlckNvbXBvbmVudCxcbiAgICBjaGlsZHJlbixcbiAgfSA9IHByb3BzO1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgZm9ybS1ncm91cCByb3cgZm9ybS1uZXN0ZWQgJHtoYXNFcnJvcnMgPyBcImlucHV0LWVycm9yXCIgOiBcIlwifWB9XG4gICAgPlxuICAgICAge0JlZm9yZUNvbXBvbmVudCAmJiA8QmVmb3JlQ29tcG9uZW50IHsuLi5wcm9wc30gLz59XG5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjb250cm9sLWxhYmVsIGNvbC1zbS0zXCI+e2xhYmVsfTwvbGFiZWw+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTlcIj5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICB7YWRkSXRlbSAmJiAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1idXR0b24gZm9ybS1uZXN0ZWQtYWRkXCJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICB2YXJpYW50PVwic3VjY2Vzc1wiXG4gICAgICAgICAgICBvbkNsaWNrPXthZGRJdGVtfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkljb25BZGQgaGVpZ2h0PXsxMn0gd2lkdGg9ezEyfSAvPlxuICAgICAgICAgIDwvVnVsY2FuQ29tcG9uZW50cy5CdXR0b24+XG4gICAgICAgICl9XG4gICAgICAgIHtwcm9wcy5oYXNFcnJvcnMgPyAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRmllbGRFcnJvcnNcbiAgICAgICAgICAgIGtleT1cImZvcm0tbmVzdGVkLWVycm9yc1wiXG4gICAgICAgICAgICBlcnJvcnM9e25lc3RlZEFycmF5RXJyb3JzfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtBZnRlckNvbXBvbmVudCAmJiA8QWZ0ZXJDb21wb25lbnQgey4uLnByb3BzfSAvPn1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbkZvcm1OZXN0ZWRBcnJheUxheW91dC5wcm9wVHlwZXMgPSB7XG4gIGhhc0Vycm9yczogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbmVzdGVkQXJyYXlFcnJvcnM6IFByb3BUeXBlcy5hcnJheSxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBoaWRlTGFiZWw6IFByb3BUeXBlcy5ib29sLFxuICBhZGRJdGVtOiBQcm9wVHlwZXMuZnVuYyxcbiAgYmVmb3JlQ29tcG9uZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgYWZ0ZXJDb21wb25lbnQ6IFByb3BUeXBlcy5ub2RlLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9ybU5lc3RlZEFycmF5TGF5b3V0O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgaW50bFNoYXBlIH0gZnJvbSBcIkB2dWxjYW5qcy9pMThuXCI7XG5pbXBvcnQgeyB1c2VWdWxjYW5Db21wb25lbnRzIH0gZnJvbSBcIi4vVnVsY2FuQ29tcG9uZW50cy9Db25zdW1lclwiO1xuaW1wb3J0IHsgdXNlSW50bENvbnRleHQgfSBmcm9tIFwiQHZ1bGNhbmpzL2kxOG5cIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRJdGVtTGF5b3V0ID0gKHsgY29udGVudCwgcmVtb3ZlQnV0dG9uIH0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtXCI+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLWlubmVyXCI+e2NvbnRlbnR9PC9kaXY+XG4gICAge3JlbW92ZUJ1dHRvbiAmJiBbXG4gICAgICA8ZGl2IGtleT1cInJlbW92ZS1idXR0b25cIiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLXJlbW92ZVwiPlxuICAgICAgICB7cmVtb3ZlQnV0dG9ufVxuICAgICAgPC9kaXY+LFxuICAgICAgPGRpdlxuICAgICAgICBrZXk9XCJyZW1vdmUtYnV0dG9uLW92ZXJsYXlcIlxuICAgICAgICBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLWRlbGV0ZWQtb3ZlcmxheVwiXG4gICAgICAvPixcbiAgICBdfVxuICA8L2Rpdj5cbik7XG5Gb3JtTmVzdGVkSXRlbUxheW91dC5wcm9wVHlwZXMgPSB7XG4gIGNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIHJlbW92ZUJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG59O1xuXG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZEl0ZW0gPSAoe1xuICBuZXN0ZWRGaWVsZHMsXG4gIG5hbWUsXG4gIHBhdGgsXG4gIHJlbW92ZUl0ZW0sXG4gIGl0ZW1JbmRleCxcbiAgZm9ybUNvbXBvbmVudHMsXG4gIGhpZGVSZW1vdmUsXG4gIGxhYmVsLFxuICAuLi5wcm9wc1xufSkgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICBjb25zdCBpbnRsID0gdXNlSW50bENvbnRleHQoKTtcbiAgY29uc3QgaXNBcnJheSA9IHR5cGVvZiBpdGVtSW5kZXggIT09IFwidW5kZWZpbmVkXCI7XG4gIHJldHVybiAoXG4gICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybU5lc3RlZEl0ZW1MYXlvdXRcbiAgICAgIGNvbnRlbnQ9e25lc3RlZEZpZWxkcy5tYXAoKGZpZWxkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuRm9ybUNvbXBvbmVudFxuICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgICAgcGF0aD17YCR7cGF0aH0uJHtmaWVsZC5uYW1lfWB9XG4gICAgICAgICAgICBpdGVtSW5kZXg9e2l0ZW1JbmRleH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgICByZW1vdmVCdXR0b249e1xuICAgICAgICBpc0FycmF5ICYmXG4gICAgICAgICFoaWRlUmVtb3ZlICYmIFtcbiAgICAgICAgICA8ZGl2IGtleT1cInJlbW92ZS1idXR0b25cIiBjbGFzc05hbWU9XCJmb3JtLW5lc3RlZC1pdGVtLXJlbW92ZVwiPlxuICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tbmVzdGVkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICBpY29uQnV0dG9uXG4gICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW0obmFtZSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICAgICAgICB7IGlkOiBcImZvcm1zLmRlbGV0ZV9uZXN0ZWRfZmllbGRcIiB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6IGxhYmVsIH1cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFZ1bGNhbkNvbXBvbmVudHMuSWNvblJlbW92ZSBoZWlnaHQ9ezEyfSB3aWR0aD17MTJ9IC8+XG4gICAgICAgICAgICA8L1Z1bGNhbkNvbXBvbmVudHMuQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9XCJyZW1vdmUtYnV0dG9uLW92ZXJsYXlcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1uZXN0ZWQtaXRlbS1kZWxldGVkLW92ZXJsYXlcIlxuICAgICAgICAgIC8+LFxuICAgICAgICBdXG4gICAgICB9XG4gICAgLz5cbiAgKTtcbn07XG5cbkZvcm1OZXN0ZWRJdGVtLnByb3BUeXBlcyA9IHtcbiAgcGF0aDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBpdGVtSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGZvcm1Db21wb25lbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBoaWRlUmVtb3ZlOiBQcm9wVHlwZXMuYm9vbCxcbn07XG5cbkZvcm1OZXN0ZWRJdGVtLmNvbnRleHRUeXBlcyA9IHtcbiAgZXJyb3JzOiBQcm9wVHlwZXMuYXJyYXksXG4gIGludGw6IGludGxTaGFwZSxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtTmVzdGVkRGl2aWRlciA9ICh7IGxhYmVsLCBhZGRJdGVtIH0pID0+IDxkaXYgLz47XG5cbkZvcm1OZXN0ZWREaXZpZGVyLnByb3BUeXBlcyA9IHtcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFkZEl0ZW06IFByb3BUeXBlcy5mdW5jLFxufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IHVzZVZ1bGNhbkNvbXBvbmVudHMgfSBmcm9tIFwiLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8vIFRyYWNrIGRlcGVuZGVuY2llcywgbm90IHVzZWQgeWV0XG5leHBvcnQgY29uc3QgZm9ybUNvbXBvbmVudHNEZXBlbmRlbmNpZXMgPSBbXCJGb3JtRXJyb3JcIl07XG5cbi8qKlxuICogRXJyb3JzIGZvciBvbmUgc3BlY2lmIGZpZWxkc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IEZpZWxkRXJyb3JzID0gKHtcbiAgZXJyb3JzLFxufToge1xuICAvKipcbiAgICogRXJyb3JzIGZvciB0aGlzIHNwZWNpZmljIGZpZWxkIG9ubHlcbiAgICovXG4gIGVycm9yczogQXJyYXk8YW55Pjtcbn0pID0+IHtcbiAgY29uc3QgVnVsY2FuQ29tcG9uZW50cyA9IHVzZVZ1bGNhbkNvbXBvbmVudHMoKTtcbiAgcmV0dXJuIChcbiAgICA8dWwgY2xhc3NOYW1lPVwiZm9ybS1pbnB1dC1lcnJvcnNcIj5cbiAgICAgIHtlcnJvcnMubWFwKChlcnJvciwgaW5kZXgpID0+IChcbiAgICAgICAgPGxpIGtleT17aW5kZXh9PlxuICAgICAgICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1FcnJvciBlcnJvcj17ZXJyb3J9IGVycm9yQ29udGV4dD1cImZpZWxkXCIgLz5cbiAgICAgICAgPC9saT5cbiAgICAgICkpfVxuICAgIDwvdWw+XG4gICk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuL1Z1bGNhbkNvbXBvbmVudHMvQ29uc3VtZXJcIjtcbmltcG9ydCB7IHVzZUZvcm1Db250ZXh0IH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcblxuLy8gUmVwbGFjZWFibGUgbGF5b3V0XG5leHBvcnQgY29uc3QgRm9ybU5lc3RlZE9iamVjdExheW91dCA9ICh7IGhhc0Vycm9ycywgbGFiZWwsIGNvbnRlbnQgfSkgPT4gKFxuICA8ZGl2XG4gICAgY2xhc3NOYW1lPXtgZm9ybS1ncm91cCByb3cgZm9ybS1uZXN0ZWQgJHtoYXNFcnJvcnMgPyBcImlucHV0LWVycm9yXCIgOiBcIlwifWB9XG4gID5cbiAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY29udHJvbC1sYWJlbCBjb2wtc20tM1wiPntsYWJlbH08L2xhYmVsPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTlcIj57Y29udGVudH08L2Rpdj5cbiAgPC9kaXY+XG4pO1xuRm9ybU5lc3RlZE9iamVjdExheW91dC5wcm9wVHlwZXMgPSB7XG4gIGhhc0Vycm9yczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBjb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbn07XG5cbmludGVyZmFjZSBGb3JtTmVzdGVkT2JqZWN0UHJvcHMge1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgaW5wdXQ6IGFueTtcbiAgaW5wdXRQcm9wZXJ0aWVzOiBhbnk7XG4gIG5lc3RlZElucHV0OiBhbnk7XG4gIGVycm9yczogQXJyYXk8YW55PjtcbiAgcGF0aDogc3RyaW5nO1xufVxuZXhwb3J0IGNvbnN0IEZvcm1OZXN0ZWRPYmplY3QgPSAocHJvcHM6IEZvcm1OZXN0ZWRPYmplY3RQcm9wcykgPT4ge1xuICBjb25zdCBWdWxjYW5Db21wb25lbnRzID0gdXNlVnVsY2FuQ29tcG9uZW50cygpO1xuICAvL2NvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKVxuICAvLyBkbyBub3QgcGFzcyBGb3JtTmVzdGVkJ3Mgb3duIHZhbHVlLCBpbnB1dCBhbmQgaW5wdXRQcm9wZXJ0aWVzIHByb3BzIGRvd25cbiAgY29uc3QgcHJvcGVydGllcyA9IF9vbWl0KFxuICAgIHByb3BzLFxuICAgIFwidmFsdWVcIixcbiAgICBcImlucHV0XCIsXG4gICAgXCJpbnB1dFByb3BlcnRpZXNcIixcbiAgICBcIm5lc3RlZElucHV0XCJcbiAgKTtcbiAgY29uc3QgeyBlcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XG4gIC8vIG9ubHkga2VlcCBlcnJvcnMgc3BlY2lmaWMgdG8gdGhlIG5lc3RlZCBhcnJheSAoYW5kIG5vdCBpdHMgc3ViZmllbGRzKVxuICBjb25zdCBuZXN0ZWRPYmplY3RFcnJvcnMgPSBlcnJvcnMuZmlsdGVyKFxuICAgIChlcnJvcikgPT4gZXJyb3IucGF0aCAmJiBlcnJvci5wYXRoID09PSBwcm9wcy5wYXRoXG4gICk7XG4gIGNvbnN0IGhhc0Vycm9ycyA9IG5lc3RlZE9iamVjdEVycm9ycyAmJiBuZXN0ZWRPYmplY3RFcnJvcnMubGVuZ3RoO1xuICByZXR1cm4gKFxuICAgIDxWdWxjYW5Db21wb25lbnRzLkZvcm1OZXN0ZWRPYmplY3RMYXlvdXRcbiAgICAgIGhhc0Vycm9ycz17aGFzRXJyb3JzfVxuICAgICAgbGFiZWw9e3Byb3BzLmxhYmVsfVxuICAgICAgY29udGVudD17W1xuICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5Gb3JtTmVzdGVkSXRlbVxuICAgICAgICAgIGtleT1cImZvcm0tbmVzdGVkLWl0ZW1cIlxuICAgICAgICAgIHsuLi5wcm9wZXJ0aWVzfVxuICAgICAgICAgIHBhdGg9e2Ake3Byb3BzLnBhdGh9YH1cbiAgICAgICAgLz4sXG4gICAgICAgIGhhc0Vycm9ycyA/IChcbiAgICAgICAgICA8VnVsY2FuQ29tcG9uZW50cy5GaWVsZEVycm9yc1xuICAgICAgICAgICAga2V5PVwiZm9ybS1uZXN0ZWQtZXJyb3JzXCJcbiAgICAgICAgICAgIGVycm9ycz17bmVzdGVkT2JqZWN0RXJyb3JzfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsLFxuICAgICAgXX1cbiAgICAvPlxuICApO1xufTtcblxuRm9ybU5lc3RlZE9iamVjdC5wcm9wVHlwZXMgPSB7XG4gIGN1cnJlbnRWYWx1ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIHBhdGg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBlcnJvcnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICBmb3JtQ29tcG9uZW50czogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1OZXN0ZWRPYmplY3Q7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtT3B0aW9uTGFiZWwgPSAoeyBvcHRpb24gfSkgPT4ge1xuICBjb25zdCB7IGxhYmVsIH0gPSBvcHRpb247XG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJmb3JtLW9wdGlvbi1sYWJlbFwiPntsYWJlbH08L3NwYW4+O1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEZvcm1JbnB1dFByb3BzIH0gZnJvbSBcIi4uL0Zvcm1Db21wb25lbnRJbm5lclwiO1xuaW1wb3J0IHsgdXNlVnVsY2FuQ29tcG9uZW50cyB9IGZyb20gXCIuLi9WdWxjYW5Db21wb25lbnRzL0NvbnN1bWVyXCI7XG5cbi8qKlxuICogQ29udmVydHMgcHJvcHMgcGFzc2VkIGJ5IFZ1bGNhbiB0byBhbiBIVE1MIElucHV0XG4gKiBAc2VlIHBhY2thZ2VzL3Z1bGNhbi11aS1ib290c3RyYXAvbGliL2NvbXBvbmVudHMvZm9ybXMvRm9ybUl0ZW0uanN4IGluIFZ1bGNhblxuICogQHBhcmFtIHBhcmFtMFxuICogQHJldHVybnNcbiAqL1xuY29uc3QgSFRNTElucHV0QWRhcHRlciA9IChwcm9wczogRm9ybUlucHV0UHJvcHMgJiB7IHR5cGU6IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRQcm9wZXJ0aWVzIH0gPSBwcm9wcztcbiAgY29uc3QgeyBsYWJlbCwgbmFtZSwgLi4ub3RoZXJJbnB1dFByb3BlcnRpZXMgfSA9IGlucHV0UHJvcGVydGllcztcblxuICByZXR1cm4gKFxuICAgIDxkaXY+XG4gICAgICA8bGFiZWwgaHRtbEZvcj17bmFtZX0+e2xhYmVsfTwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgey4uLm90aGVySW5wdXRQcm9wZXJ0aWVzfVxuICAgICAgICBpZD17bmFtZX0gLy8gbmVlZGVkIGZvciBhY2Nlc3NpYmlsaXR5LiBOT1RFOiB3ZSBtaWdodCBuZWVkIHRvIHVzZSBcImNvbnRleHRcIiBhcyBhIHByZWZpeCB3aGVuIGhhdmluZ1xuICAgICAgICAvLyBtdWx0aXBsZSBmb3JtcyBmb3IgdGhlIHNhbWUga2luZCBvZiBkYXRhXG4gICAgICAgIG5hbWU9e25hbWV9XG4gICAgICAgIHR5cGU9e3Byb3BzLnR5cGV9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufTsgLy8gVE9ETzogbWlnaHQgbmVlZCBzb21lIHNhbml0aXphdGlvblxuXG5jb25zdCBIVE1MU2VsZWN0QWRhcHRlciA9IChwcm9wczogRm9ybUlucHV0UHJvcHMpID0+IHtcbiAgY29uc3QgeyBpbnB1dFByb3BlcnRpZXMsIG9wdGlvbnMgPSBbXSB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgbGFiZWwsIG5hbWUgfSA9IGlucHV0UHJvcGVydGllcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkhUTUxTZWxlY3RBZGFwYXRlciBub3QgeWV0IHN1cHBvcnRpbmcgZnVuY3Rpb25hbCBvcHRpb25zXCIpO1xuICByZXR1cm4gKFxuICAgIDxkaXY+XG4gICAgICA8bGFiZWwgaHRtbEZvcj17bmFtZX0+e2xhYmVsfTwvbGFiZWw+XG4gICAgICB7LyoqIFRPRE86IHdoaXRlbGlzdGluZyBmZWF0dXJlIHNob3VsZCBiZSBzbWFydGVyIHRvIGRpZmZlcmVudGlhdGUgc2VsZWN0IGFuZCBpbnB1dCAqL31cbiAgICAgIDxzZWxlY3RcbiAgICAgICAgey4uLihpbnB1dFByb3BlcnRpZXMgYXMgdW5rbm93biBhcyBSZWFjdC5IVE1MUHJvcHM8SFRNTFNlbGVjdEVsZW1lbnQ+KX1cbiAgICAgID5cbiAgICAgICAge29wdGlvbnMubWFwKCh7IGxhYmVsLCB2YWx1ZSB9KSA9PiAoXG4gICAgICAgICAgPG9wdGlvbiBrZXk9e3ZhbHVlfSBsYWJlbD17bGFiZWx9IHZhbHVlPXt2YWx1ZX0+PC9vcHRpb24+XG4gICAgICAgICkpfVxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREZWZhdWx0ID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJ0ZXh0XCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50UGFzc3dvcmQgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInBhc3N3b3JkXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50TnVtYmVyID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJudW1iZXJcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRVcmwgPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cInVybFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudEVtYWlsID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJlbWFpbFwiIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFRleHRhcmVhID0gKHByb3BzKSA9PiA8dGV4dGFyZWEgey4uLnByb3BzfSAvPjtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50Q2hlY2tib3ggPSAocHJvcHMpID0+IChcbiAgPEhUTUxJbnB1dEFkYXB0ZXIgdHlwZT1cImNoZWNrYm94XCIgey4uLnByb3BzfSAvPlxuKTtcbi8vIFRPRE9cbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50Q2hlY2tib3hHcm91cCA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB7Li4ucHJvcHN9IC8+XG4pO1xuLy8gVE9ET1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRSYWRpb0dyb3VwID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFNlbGVjdCA9IChwcm9wczogRm9ybUlucHV0UHJvcHMpID0+IChcbiAgPEhUTUxTZWxlY3RBZGFwdGVyIHsuLi5wcm9wc30gLz5cbik7XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IENvbXBvbmVudHMgPSB1c2VWdWxjYW5Db21wb25lbnRzKCk7XG4gIHJldHVybiA8Q29tcG9uZW50cy5Gb3JtQ29tcG9uZW50U2VsZWN0IG11bHRpcGxlIHsuLi5wcm9wc30gLz47XG59O1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREYXRlID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJkYXRlXCIgey4uLnByb3BzfSAvPlxuKTtcbi8qXG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudERhdGUyID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHsuLi5wcm9wc30gLz5cbik7XG4qL1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnREYXRlVGltZSA9IChwcm9wcykgPT4gKFxuICA8SFRNTElucHV0QWRhcHRlciB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiB7Li4ucHJvcHN9IC8+XG4pO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRUaW1lID0gKHByb3BzKSA9PiAoXG4gIDxIVE1MSW5wdXRBZGFwdGVyIHR5cGU9XCJ0aW1lXCIgey4uLnByb3BzfSAvPlxuKTtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50U3RhdGljVGV4dCA9IChwcm9wcykgPT4gPGlucHV0IGRpc2FibGVkIHsuLi5wcm9wc30gLz47XG5leHBvcnQgY29uc3QgRm9ybUNvbXBvbmVudExpa2VydCA9IChwcm9wcykgPT5cbiAgXCJMaWtlcnQgY29tcG9uZW50IG5vdCB5ZXQgaW1wbGVtZW50ZWRcIjtcbmV4cG9ydCBjb25zdCBGb3JtQ29tcG9uZW50QXV0b2NvbXBsZXRlID0gKHByb3BzKSA9PlxuICBcIkF1dG9jb21wbGV0ZSBjb21wb25lbnQgbm90IHlldCBpbXBsZW1lbnRlZFwiO1xuZXhwb3J0IGNvbnN0IEZvcm1Db21wb25lbnRNdWx0aUF1dG9jb21wbGV0ZSA9IChwcm9wcykgPT5cbiAgXCJNdWx0aUF1dG9jb21wbGV0ZSBjb21wb25lbnQgbm90IHlldCBpbXBsZW1lbnRlZFwiO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG4vLyBUT0RPOiB3aGl0ZWxpc3QgSFRNTEJ1dHRvbiBwcm9wc1xuZXhwb3J0IGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfSkgPT4gKFxuICA8YnV0dG9uIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYnV0dG9uPlxuKTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbi8vIEBzZWUgaHR0cHM6Ly9kb2NreWFyZC5jb20vYmxvZy8yMDIwLzAzLzAyL2FjY2Vzc2libGUtbG9hZGluZy1pbmRpY2F0b3Jzd2l0aC1uby1leHRyYS1lbGVtZW50c1xuZXhwb3J0IGNvbnN0IExvYWRpbmcgPSAoKSA9PiAoXG4gIDxzcGFuIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYnVzeT1cInRydWVcIj5cbiAgICBMb2FkaW5nLi4uXG4gIDwvc3Bhbj5cbik7XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9Db25zdW1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUHJvdmlkZXJcIjtcbiIsIi8qKlxuICogTk9URTogS0VFUCBTRVBBUkFURUQgRlJPTSBUSEUgSE9PS1MgVE8gQ09OU1VNRSBUSEUgQ09OVEVYVFxuICogb3RoZXJ3aXNlIHlvdSdsbCBlbmQgdXAgd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmVjYXVzZSBvZiB0aGUgZGVmYXVsdCBjb21wb25lbnRzXG4gKi9cbi8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdG8gYWRhcHQgdGhlIHByb3ZpZGVyIHRvIG1lcmdlIGl0cyB2YWx1ZSB3aXRoIGEgcG90ZW50aWFsbHkgaGlnaGVyIHVwIGNvbnRleHRcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHtcbiAgVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0LFxuICBWdWxjYW5DdXJyZW50VXNlckNvbnRleHRUeXBlLFxufSBmcm9tIFwiLi9Db250ZXh0XCI7XG5cbi8vIFNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSBvbmx5IHNvbWUgY29tcG9uZW50cyBieSBhZGRpbmcgYW4gYWRkaXRpb25hbCBjb250ZXh0IHdoaWxlIGtlZXBpbmcgdGhlIGRlZmF1bHRzXG5leHBvcnQgY29uc3QgVnVsY2FuQ3VycmVudFVzZXJQcm92aWRlciA9ICh7XG4gIHZhbHVlLFxuICAuLi5wcm9wc1xufToge1xuICB2YWx1ZTogVnVsY2FuQ3VycmVudFVzZXJDb250ZXh0VHlwZTtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IChcbiAgPFZ1bGNhbkN1cnJlbnRVc2VyQ29udGV4dC5Qcm92aWRlclxuICAgIHZhbHVlPXt2YWx1ZX0gLy8gbWVyZ2UgcHJvdmlkZWQgY29tcG9uZW50cyBzbyB0aGUgdXNlciBjYW4gcHJvdmlkZSBvbmx5IGEgcGFydGlhbCByZXBsYWNlbWVudFxuICAgIHsuLi5wcm9wc31cbiAgLz5cbik7XG4iLCIvLyBpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSBcInJlY29tcG9zZVwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGRpZmZlcmVuY2UgZnJvbSBcImxvZGFzaC9kaWZmZXJlbmNlXCI7XG5cbmV4cG9ydCBjb25zdCBDb21wb25lbnRzID0ge307IC8vIHdpbGwgYmUgcG9wdWxhdGVkIG9uIHN0YXJ0dXBcbmV4cG9ydCBjb25zdCBDb21wb25lbnRzVGFibGUgPSB7fTsgLy8gc3RvcmFnZSBmb3IgaW5mb3MgYWJvdXQgY29tcG9uZW50c1xuXG5leHBvcnQgY29uc3QgY29yZUNvbXBvbmVudHMgPSBbXG4gIFwiQWxlcnRcIixcbiAgXCJCdXR0b25cIixcbiAgXCJNb2RhbFwiLFxuICBcIk1vZGFsVHJpZ2dlclwiLFxuICBcIlRhYmxlXCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94XCIsXG4gIFwiRm9ybUNvbXBvbmVudENoZWNrYm94R3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50RGF0ZVwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlMlwiLFxuICBcIkZvcm1Db21wb25lbnREYXRlVGltZVwiLFxuICBcIkZvcm1Db21wb25lbnREZWZhdWx0XCIsXG4gIFwiRm9ybUNvbXBvbmVudFRleHRcIixcbiAgXCJGb3JtQ29tcG9uZW50RW1haWxcIixcbiAgXCJGb3JtQ29tcG9uZW50TnVtYmVyXCIsXG4gIFwiRm9ybUNvbXBvbmVudFJhZGlvR3JvdXBcIixcbiAgXCJGb3JtQ29tcG9uZW50U2VsZWN0XCIsXG4gIFwiRm9ybUNvbXBvbmVudFNlbGVjdE11bHRpcGxlXCIsXG4gIFwiRm9ybUNvbXBvbmVudFN0YXRpY1RleHRcIixcbiAgXCJGb3JtQ29tcG9uZW50VGV4dGFyZWFcIixcbiAgXCJGb3JtQ29tcG9uZW50VGltZVwiLFxuICBcIkZvcm1Db21wb25lbnRVcmxcIixcbiAgXCJGb3JtQ29tcG9uZW50SW5uZXJcIixcbiAgXCJGb3JtQ29udHJvbFwiLFxuICBcIkZvcm1FbGVtZW50XCIsXG5dO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgVnVsY2FuIGNvbXBvbmVudCB3aXRoIGEgbmFtZSwgYSByYXcgY29tcG9uZW50IHRoYW4gY2FuIGJlIGV4dGVuZGVkXG4gKiBhbmQgb25lIG9yIG1vcmUgb3B0aW9uYWwgaGlnaGVyIG9yZGVyIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZWdpc3Rlci5cbiAqIEBwYXJhbSB7Q29tcG9uZW50fSByYXdDb21wb25lbnQgSW50ZXJjaGFuZ2VhYmxlL2V4dGVuZGFibGUgcmVhY3QgY29tcG9uZW50LlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258QXJyYXkpfSBob2NzIFRoZSBIT0NzIHRvIGNvbXBvc2Ugd2l0aCB0aGUgcmF3IGNvbXBvbmVudC5cbiAqXG4gKiBOb3RlOiB3aGVuIGEgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBoaWdoZXIgb3JkZXIgY29tcG9uZW50LCBgaG9jc2Agd2lsbCBiZVxuICogYW4gZW1wdHkgYXJyYXksIGFuZCBpdCdzIG9rIVxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlZHV4L2Jsb2IvbWFzdGVyL3NyYy9jb21wb3NlLmpzI0wxMy1MMTVcbiAqXG4gKiBAcmV0dXJucyBTdHJ1Y3R1cmUgb2YgYSBjb21wb25lbnQgaW4gdGhlIGxpc3Q6XG4gKlxuICogQ29tcG9uZW50c1RhYmxlLkZvbyA9IHtcbiAqICAgIG5hbWU6ICdGb28nLFxuICogICAgaG9jczogW2ZuMSwgZm4yXSxcbiAqICAgIHJhd0NvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50LFxuICogICAgY2FsbDogKCkgPT4gY29tcG9zZSguLi5ob2NzKShyYXdDb21wb25lbnQpLFxuICogfVxuICpcbiAqL1xuLypcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudChuYW1lLCByYXdDb21wb25lbnQsIC4uLmhvY3MpIHtcbiAgLy8gc3VwcG9ydCBzaW5nbGUtYXJndW1lbnQgc3ludGF4XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgLy8gbm90ZTogY2Fubm90IHVzZSBgY29uc3RgIGJlY2F1c2UgbmFtZSwgY29tcG9uZW50cywgaG9jcyBhcmUgYWxyZWFkeSBkZWZpbmVkXG4gICAgLy8gYXMgYXJndW1lbnRzIHNvIGRlc3RydWN0dXJpbmcgY2Fubm90IHdvcmtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG4gICAgdmFyIHtcbiAgICAgIG5hbWUsXG4gICAgICBjb21wb25lbnQsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBob2NzID0gW10sXG4gICAgfSA9IGFyZ3VtZW50c1swXTtcbiAgICByYXdDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gIH1cbiAgLy8gc3RvcmUgdGhlIGNvbXBvbmVudCBpbiB0aGUgdGFibGVcbiAgQ29tcG9uZW50c1RhYmxlW25hbWVdID0ge1xuICAgIG5hbWUsXG4gICAgcmF3Q29tcG9uZW50LFxuICAgIGhvY3MsXG4gIH07XG59XG4qL1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aFxuICogcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgY29tcG9uZW50LCAuLi5ob2NzKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5leHBvcnQgY29uc3QgY29tcG9uZW50RXhpc3RzID0gKG5hbWUpID0+IHtcbiAgY29uc3QgY29tcG9uZW50ID0gQ29tcG9uZW50c1RhYmxlW25hbWVdO1xuICByZXR1cm4gISFjb21wb25lbnQ7XG59O1xuXG4vKipcbiAqIEdldCBhIGNvbXBvbmVudCByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgY29tcG9uZW50LCAuLi5ob2NzKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxSZWFjdCBDb21wb25lbnR9IEEgKHdyYXBwZWQpIFJlYWN0IGNvbXBvbmVudFxuICovXG4vKlxuZXhwb3J0IGNvbnN0IGdldENvbXBvbmVudCA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IENvbXBvbmVudHNUYWJsZVtuYW1lXTtcbiAgaWYgKCFjb21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCAke25hbWV9IG5vdCByZWdpc3RlcmVkLmApO1xuICB9XG4gIGlmIChjb21wb25lbnQuaG9jcyAmJiBjb21wb25lbnQuaG9jcy5sZW5ndGgpIHtcbiAgICBjb25zdCBob2NzID0gY29tcG9uZW50LmhvY3MubWFwKChob2MpID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShob2MpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaG9jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW4gcmVnaXN0ZXJlZCBjb21wb25lbnQgJHtuYW1lfSwgYW4gaG9jIGlzIG9mIHR5cGUgJHt0eXBlb2YgaG9jfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob2M7XG4gICAgICB9XG4gICAgICBjb25zdCBbYWN0dWFsSG9jLCAuLi5hcmdzXSA9IGhvYztcbiAgICAgIGlmICh0eXBlb2YgYWN0dWFsSG9jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbiByZWdpc3RlcmVkIGNvbXBvbmVudCAke25hbWV9LCBhbiBob2MgaXMgb2YgdHlwZSAke3R5cGVvZiBhY3R1YWxIb2N9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjdHVhbEhvYyguLi5hcmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcG9zZSguLi5ob2NzKShjb21wb25lbnQucmF3Q29tcG9uZW50KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnJhd0NvbXBvbmVudDtcbiAgfVxufTtcbiovXG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGxvb2t1cCB0YWJsZSBmb3IgY29tcG9uZW50cyB0byBiZSBjYWxsYWJsZVxuICog4oS577iPIENhbGxlZCBvbmNlIG9uIGFwcCBzdGFydHVwXG4gKiovXG4vKlxuZXhwb3J0IGNvbnN0IHBvcHVsYXRlQ29tcG9uZW50c0FwcCA9ICgpID0+IHtcbiAgY29uc3QgcmVnaXN0ZXJlZENvbXBvbmVudHMgPSBPYmplY3Qua2V5cyhDb21wb25lbnRzVGFibGUpO1xuXG4gIC8vIGxvb3Agb3ZlciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgbGlzdFxuICByZWdpc3RlcmVkQ29tcG9uZW50cy5tYXAoKG5hbWUpID0+IHtcbiAgICAvLyBwb3B1bGF0ZSBhbiBlbnRyeSBpbiB0aGUgbG9va3VwIHRhYmxlXG4gICAgQ29tcG9uZW50c1tuYW1lXSA9IGdldENvbXBvbmVudChuYW1lKTtcblxuICAgIC8vIHVuY29tbWVudCBmb3IgZGVidWdcbiAgICAvLyBjb25zb2xlLmxvZygnaW5pdCBjb21wb25lbnQ6JywgbmFtZSk7XG4gIH0pO1xuXG4gIGNvbnN0IG1pc3NpbmdDb21wb25lbnRzID0gZGlmZmVyZW5jZShjb3JlQ29tcG9uZW50cywgcmVnaXN0ZXJlZENvbXBvbmVudHMpO1xuXG4gIGlmIChtaXNzaW5nQ29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGb3VuZCB0aGUgZm9sbG93aW5nIG1pc3NpbmcgY29yZSBjb21wb25lbnRzOiAke21pc3NpbmdDb21wb25lbnRzLmpvaW4oXG4gICAgICAgIFwiLCBcIlxuICAgICAgKX0uIEluY2x1ZGUgYSBVSSBwYWNrYWdlIHN1Y2ggYXMgdnVsY2FuOnVpLWJvb3RzdHJhcCB0byBhZGQgdGhlbS5gXG4gICAgKTtcbiAgfVxufTtcbiovXG4vKipcbiAqIEdldCB0aGUgKipyYXcqKiAob3JpZ2luYWwpIGNvbXBvbmVudCByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJDb21wb25lbnRcbiAqIHdpdGhvdXQgdGhlIHBvc3NpYmxlIEhPQ3Mgd3JhcHBpbmcgaXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258UmVhY3QgQ29tcG9uZW50fSBBbiBpbnRlcmNoYW5nZWFibGUvZXh0ZW5kYWJsZSBSZWFjdCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJhd0NvbXBvbmVudCA9IChuYW1lKSA9PiB7XG4gIHJldHVybiBDb21wb25lbnRzVGFibGVbbmFtZV0ucmF3Q29tcG9uZW50O1xufTtcblxuLyoqXG4gKiBSZXBsYWNlIGEgVnVsY2FuIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aCBhIG5ldyBjb21wb25lbnQgb3JcbiAqIGFuIGV4dGVuc2lvbiBvZiB0aGUgcmF3IGNvbXBvbmVudCBhbmQgb25lIG9yIG1vcmUgb3B0aW9uYWwgaGlnaGVyIG9yZGVyIGNvbXBvbmVudHMuXG4gKiBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBIT0NzIGFuZCB3cmFwIHRoZSBuZXcgSE9DcyBhcm91bmQgcHJldmlvdXMgb25lc1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuXG4gKiBAcGFyYW0ge1JlYWN0IENvbXBvbmVudH0gbmV3Q29tcG9uZW50IEludGVyY2hhbmdlYWJsZS9leHRlbmRhYmxlIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG5ld0hvY3MgVGhlIEhPQ3MgdG8gY29tcG9zZSB3aXRoIHRoZSByYXcgY29tcG9uZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufFJlYWN0IENvbXBvbmVudH0gQSBjb21wb25lbnQgY2FsbGFibGUgd2l0aCBDb21wb25lbnRzW25hbWVdXG4gKlxuICogTm90ZTogd2hlbiBhIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkIHdpdGhvdXQgaGlnaGVyIG9yZGVyIGNvbXBvbmVudCwgYGhvY3NgIHdpbGwgYmVcbiAqIGFuIGVtcHR5IGFycmF5LCBhbmQgaXQncyBvayFcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWR1eC9ibG9iL21hc3Rlci9zcmMvY29tcG9zZS5qcyNMMTMtTDE1XG4gKi9cbi8qXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUNvbXBvbmVudChuYW1lLCBuZXdDb21wb25lbnQsIC4uLm5ld0hvY3MpIHtcbiAgLy8gc3VwcG9ydCBzaW5nbGUgYXJndW1lbnQgc3ludGF4XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuICAgIHZhciB7IG5hbWUsIGNvbXBvbmVudCwgaG9jcyA9IFtdIH0gPSBhcmd1bWVudHNbMF07XG4gICAgbmV3Q29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIG5ld0hvY3MgPSBob2NzO1xuICB9XG5cbiAgY29uc3QgcHJldmlvdXNDb21wb25lbnQgPSBDb21wb25lbnRzVGFibGVbbmFtZV07XG4gIGNvbnN0IHByZXZpb3VzSG9jcyA9IChwcmV2aW91c0NvbXBvbmVudCAmJiBwcmV2aW91c0NvbXBvbmVudC5ob2NzKSB8fCBbXTtcblxuICBpZiAoIXByZXZpb3VzQ29tcG9uZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgVHJ5aW5nIHRvIHJlcGxhY2Ugbm9uLXJlZ2lzdGVyZWQgY29tcG9uZW50ICR7bmFtZX0uIFRoZSBjb21wb25lbnQgaXMgYCArXG4gICAgICAgIFwiYmVpbmcgcmVnaXN0ZXJlZC4gSWYgeW91IHdlcmUgdHJ5aW5nIHRvIHJlcGxhY2UgYSBjb21wb25lbnQgZGVmaW5lZCBieSBcIiArXG4gICAgICAgIFwiYW5vdGhlciBwYWNrYWdlLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZW4ndCBtaXNzcGVsbGVkIHRoZSBuYW1lLiBDaGVjayBcIiArXG4gICAgICAgIFwiYWxzbyBpZiB0aGUgb3JpZ2luYWwgY29tcG9uZW50IGlzIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQgb3IgdGhhdCBpdCBcIiArXG4gICAgICAgIFwiaGFzbid0IGJlZW4gcmVuYW1lZC5cIlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgbmV3Q29tcG9uZW50LCAuLi5uZXdIb2NzLCAuLi5wcmV2aW91c0hvY3MpO1xufVxuKi9cblxuLypcbmV4cG9ydCBjb25zdCBjb3B5SG9DcyA9IChzb3VyY2VDb21wb25lbnQsIHRhcmdldENvbXBvbmVudCkgPT4ge1xuICByZXR1cm4gY29tcG9zZSguLi5zb3VyY2VDb21wb25lbnQuaG9jcykodGFyZ2V0Q29tcG9uZW50KTtcbn07XG4qL1xuXG4vKipcbiAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNvbXBvbmVudCBuYW1lIG9mIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbn0gY29tcG9uZW50ICBBIGNvbXBvbmVudCwgdGhlIG5hbWUgb2YgYSBjb21wb25lbnQsIG9yIGEgcmVhY3QgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wc10gIE9wdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50XG4gKi9cbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Rpc3BsYXktbmFtZVxuLy8gbGVnYWN5XG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGVDb21wb25lbnQgPSAoXG4gIGNvbXBvbmVudD86IFJlYWN0LkNvbXBvbmVudFR5cGUgfCBGdW5jdGlvbiB8IGFueSxcbiAgcHJvcHM/OiBhbnlcbikgPT4ge1xuICBpZiAoIWNvbXBvbmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8qZWxzZSBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IENvbXBvbmVudCA9IENvbXBvbmVudHNbY29tcG9uZW50XTtcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9ICovIGVsc2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNvbXBvbmVudCwgcHJvcHMpO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIGNvbXBvbmVudC5wcm90b3R5cGUgJiZcbiAgICBjb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnRcbiAgKSB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIFJlYWN0LkNvbXBvbmVudFR5cGU7XG4gICAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY29tcG9uZW50KHByb3BzKTtcbiAgfSBlbHNlIGlmIChcbiAgICB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmXG4gICAgY29tcG9uZW50LiQkdHlwZW9mICYmXG4gICAgY29tcG9uZW50LnJlbmRlclxuICApIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBjb21wb25lbnQgYXMgUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCB0aGF0IHdpbGwgcmVuZGVyIHRoZSByZWdpc3RlcmVkIGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gIG1heSBiZSB1c2VmdWwgd2hlbiBpbiBuZWVkIGZvciBzb21lIHJlZ2lzdGVyZWQgY29tcG9uZW50LCBidXQgaW4gY29udGV4dHNcbiAqIHdoZXJlIHRoZXkgaGF2ZSBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQsIGZvciBleGFtcGxlIGF0IGNvbXBpbGUgdGltZSBleGVjdXRpb24uIEluIG90aGVyXG4gKiB3b3Jkcywgd2hlbiB1c2luZyBgQ29tcG9uZW50cy5Db21wb25lbnROYW1lYCBpcyBub3QgYWxsb3dlZCAoYmVjYXVzZSBpdCBoYXMgbm90IHlldCBiZWVuXG4gKiBwb3B1bGF0ZWQsIGhlbmNlIHdvdWxkIGJlIGB1bmRlZmluZWRgKSwgdGhlbiBgZGVsYXllZENvbXBvbmVudCgnQ29tcG9uZW50TmFtZScpYCBjYW4gYmVcbiAqIHVzZWQgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZSBDcmVhdGUgYSBjb250YWluZXIgZm9yIGEgcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqICAvLyBTb21lQ29udGFpbmVyLmpzXG4gKiAgaW1wb3J0IGNvbXBvc2UgZnJvbSAncmVjb21wb3NlL2NvbXBvc2UnO1xuICogIGltcG9ydCB7IGRlbGF5ZWRDb21wb25lbnQgfSBmcm9tICdtZXRlb3IvdnVsY2FuOmNvcmUnO1xuICpcbiAqICBleHBvcnQgZGVmYXVsdCBjb21wb3NlKFxuICogICAgLy8gLi4uc29tZSBob2NzIHdpdGggY29udGFpbmVyIGxvZ2ljXG4gKiAgKShkZWxheWVkQ29tcG9uZW50KCdDb21wb25lbnROYW1lJykpOyAvLyBjYW5ub3QgdXNlIENvbXBvbmVudHMuQ29tcG9uZW50TmFtZSBpbiB0aGlzIGNvbnRleHQhXG4gKlxuICogQGV4YW1wbGUge0BsaW5rIGR5bmFtaWNMb2FkZXJ9XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBDb21wb25lbnQgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiAgRnVuY3Rpb25hbCBjb21wb25lbnQgdGhhdCB3aWxsIHJlbmRlciB0aGUgZ2l2ZW4gcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGF5ZWRDb21wb25lbnQgPSAobmFtZSkgPT4ge1xuICByZXR1cm4gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gQ29tcG9uZW50c1tuYW1lXSB8fCBudWxsO1xuICAgIHJldHVybiBDb21wb25lbnQgJiYgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xuICB9O1xufTtcblxuLy8gRXhhbXBsZSB3aXRoIFByb3h5IChtaWdodCBiZSB1bnN0YWJsZS9oYXJkIHRvIHJlYXNvbiBhYm91dClcbi8vY29uc3QgbWVyZ2VXaXRoQ29tcG9uZW50cyA9IChteUNvbXBvbmVudHMgPSB7fSkgPT4ge1xuLy8gIGNvbnN0IGhhbmRsZXIgPSB7XG4vLyAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuLy8gICAgICByZXR1cm4gbmFtZSBpbiB0YXJnZXQgPyB0YXJnZXRbbmFtZV0gOiBDb21wb25lbnRzW25hbWVdO1xuLy8gICAgfVxuLy8gIH07XG4vLyAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkobXlDb21wb25lbnRzLCBoYW5kbGVyKTtcbi8vICByZXR1cm4gcHJveHk7XG4vL307XG5leHBvcnQgY29uc3QgbWVyZ2VXaXRoQ29tcG9uZW50cyA9IChteUNvbXBvbmVudHMpID0+XG4gIG15Q29tcG9uZW50cyA/IHsgLi4uQ29tcG9uZW50cywgLi4ubXlDb21wb25lbnRzIH0gOiBDb21wb25lbnRzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==