ngx-bootstrap 3.0.1 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1869) hide show
  1. package/CHANGELOG.md +298 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +24 -8
  4. package/accordion/accordion-group.component.d.ts +3 -3
  5. package/accordion/bundles/ngx-bootstrap-accordion.umd.js +264 -0
  6. package/accordion/bundles/ngx-bootstrap-accordion.umd.js.map +1 -0
  7. package/accordion/bundles/ngx-bootstrap-accordion.umd.min.js +2 -0
  8. package/accordion/bundles/ngx-bootstrap-accordion.umd.min.js.map +1 -0
  9. package/accordion/esm2015/accordion-group.component.js +140 -0
  10. package/accordion/esm2015/accordion.component.js +88 -0
  11. package/accordion/esm2015/accordion.config.js +35 -0
  12. package/accordion/esm2015/accordion.module.js +36 -0
  13. package/accordion/esm2015/ngx-bootstrap-accordion.js +10 -0
  14. package/accordion/esm2015/public_api.js +10 -0
  15. package/accordion/esm5/accordion-group.component.js +157 -0
  16. package/accordion/esm5/accordion.component.js +99 -0
  17. package/accordion/esm5/accordion.config.js +37 -0
  18. package/accordion/esm5/accordion.module.js +43 -0
  19. package/accordion/esm5/ngx-bootstrap-accordion.js +10 -0
  20. package/accordion/esm5/public_api.js +10 -0
  21. package/accordion/fesm2015/ngx-bootstrap-accordion.js +222 -0
  22. package/accordion/fesm2015/ngx-bootstrap-accordion.js.map +1 -0
  23. package/accordion/fesm5/ngx-bootstrap-accordion.js +255 -0
  24. package/accordion/fesm5/ngx-bootstrap-accordion.js.map +1 -0
  25. package/accordion/ngx-bootstrap-accordion.d.ts +4 -0
  26. package/accordion/ngx-bootstrap-accordion.metadata.json +1 -0
  27. package/accordion/package.json +19 -0
  28. package/accordion/{index.d.ts → public_api.d.ts} +0 -0
  29. package/alert/bundles/ngx-bootstrap-alert.umd.js +209 -0
  30. package/alert/bundles/ngx-bootstrap-alert.umd.js.map +1 -0
  31. package/alert/bundles/ngx-bootstrap-alert.umd.min.js +2 -0
  32. package/alert/bundles/ngx-bootstrap-alert.umd.min.js.map +1 -0
  33. package/alert/esm2015/alert.component.js +145 -0
  34. package/alert/esm2015/alert.config.js +50 -0
  35. package/alert/esm2015/alert.module.js +35 -0
  36. package/alert/esm2015/ngx-bootstrap-alert.js +10 -0
  37. package/alert/esm2015/public_api.js +9 -0
  38. package/alert/esm5/alert.component.js +157 -0
  39. package/alert/esm5/alert.config.js +52 -0
  40. package/alert/esm5/alert.module.js +42 -0
  41. package/alert/esm5/ngx-bootstrap-alert.js +10 -0
  42. package/alert/esm5/public_api.js +9 -0
  43. package/alert/fesm2015/ngx-bootstrap-alert.js +153 -0
  44. package/alert/fesm2015/ngx-bootstrap-alert.js.map +1 -0
  45. package/alert/fesm5/ngx-bootstrap-alert.js +171 -0
  46. package/alert/fesm5/ngx-bootstrap-alert.js.map +1 -0
  47. package/alert/ngx-bootstrap-alert.d.ts +4 -0
  48. package/alert/ngx-bootstrap-alert.metadata.json +1 -0
  49. package/alert/package.json +19 -0
  50. package/alert/{index.d.ts → public_api.d.ts} +0 -0
  51. package/bundles/ngx-bootstrap.es2015.js +20178 -12836
  52. package/bundles/ngx-bootstrap.es2015.js.map +1 -1
  53. package/bundles/ngx-bootstrap.umd.js +179 -21213
  54. package/bundles/ngx-bootstrap.umd.js.map +1 -1
  55. package/bundles/ngx-bootstrap.umd.min.js +1 -64
  56. package/bundles/ngx-bootstrap.umd.min.js.map +1 -1
  57. package/buttons/bundles/ngx-bootstrap-buttons.umd.js +479 -0
  58. package/buttons/bundles/ngx-bootstrap-buttons.umd.js.map +1 -0
  59. package/buttons/bundles/ngx-bootstrap-buttons.umd.min.js +2 -0
  60. package/buttons/bundles/ngx-bootstrap-buttons.umd.min.js.map +1 -0
  61. package/buttons/button-checkbox.directive.d.ts +10 -10
  62. package/buttons/button-radio-group.directive.d.ts +9 -10
  63. package/buttons/button-radio.directive.d.ts +12 -12
  64. package/buttons/esm2015/button-checkbox.directive.js +146 -0
  65. package/buttons/esm2015/button-radio-group.directive.js +90 -0
  66. package/buttons/esm2015/button-radio.directive.js +200 -0
  67. package/buttons/esm2015/buttons.module.js +33 -0
  68. package/buttons/esm2015/ngx-bootstrap-buttons.js +13 -0
  69. package/buttons/esm2015/public_api.js +10 -0
  70. package/buttons/esm5/button-checkbox.directive.js +184 -0
  71. package/buttons/esm5/button-radio-group.directive.js +105 -0
  72. package/buttons/esm5/button-radio.directive.js +239 -0
  73. package/buttons/esm5/buttons.module.js +40 -0
  74. package/buttons/esm5/ngx-bootstrap-buttons.js +13 -0
  75. package/buttons/esm5/public_api.js +10 -0
  76. package/buttons/fesm2015/ngx-bootstrap-buttons.js +376 -0
  77. package/buttons/fesm2015/ngx-bootstrap-buttons.js.map +1 -0
  78. package/buttons/fesm5/ngx-bootstrap-buttons.js +471 -0
  79. package/buttons/fesm5/ngx-bootstrap-buttons.js.map +1 -0
  80. package/buttons/ngx-bootstrap-buttons.d.ts +7 -0
  81. package/buttons/ngx-bootstrap-buttons.metadata.json +1 -0
  82. package/buttons/package.json +19 -0
  83. package/buttons/{index.d.ts → public_api.d.ts} +0 -0
  84. package/carousel/bundles/ngx-bootstrap-carousel.umd.js +567 -0
  85. package/carousel/bundles/ngx-bootstrap-carousel.umd.js.map +1 -0
  86. package/carousel/bundles/ngx-bootstrap-carousel.umd.min.js +2 -0
  87. package/carousel/bundles/ngx-bootstrap-carousel.umd.min.js.map +1 -0
  88. package/carousel/carousel.component.d.ts +3 -7
  89. package/carousel/esm2015/carousel.component.js +372 -0
  90. package/carousel/esm2015/carousel.config.js +59 -0
  91. package/carousel/esm2015/carousel.module.js +36 -0
  92. package/carousel/esm2015/ngx-bootstrap-carousel.js +10 -0
  93. package/carousel/esm2015/public_api.js +10 -0
  94. package/carousel/esm2015/slide.component.js +81 -0
  95. package/carousel/esm5/carousel.component.js +495 -0
  96. package/carousel/esm5/carousel.config.js +61 -0
  97. package/carousel/esm5/carousel.module.js +43 -0
  98. package/carousel/esm5/ngx-bootstrap-carousel.js +10 -0
  99. package/carousel/esm5/public_api.js +10 -0
  100. package/carousel/esm5/slide.component.js +86 -0
  101. package/carousel/fesm2015/ngx-bootstrap-carousel.js +423 -0
  102. package/carousel/fesm2015/ngx-bootstrap-carousel.js.map +1 -0
  103. package/carousel/fesm5/ngx-bootstrap-carousel.js +556 -0
  104. package/carousel/fesm5/ngx-bootstrap-carousel.js.map +1 -0
  105. package/carousel/ngx-bootstrap-carousel.d.ts +4 -0
  106. package/carousel/ngx-bootstrap-carousel.metadata.json +1 -0
  107. package/carousel/package.json +19 -0
  108. package/carousel/{index.d.ts → public_api.d.ts} +0 -0
  109. package/chronos/bundles/ngx-bootstrap-chronos.umd.js +8428 -0
  110. package/chronos/bundles/ngx-bootstrap-chronos.umd.js.map +1 -0
  111. package/chronos/bundles/ngx-bootstrap-chronos.umd.min.js +2 -0
  112. package/chronos/bundles/ngx-bootstrap-chronos.umd.min.js.map +1 -0
  113. package/chronos/esm2015/create/check-overflow.js +39 -0
  114. package/chronos/esm2015/create/clone.js +13 -0
  115. package/chronos/esm2015/create/date-from-array.js +38 -0
  116. package/chronos/esm2015/create/from-anything.js +131 -0
  117. package/chronos/esm2015/create/from-array.js +149 -0
  118. package/chronos/esm2015/create/from-object.js +25 -0
  119. package/chronos/esm2015/create/from-string-and-array.js +46 -0
  120. package/chronos/esm2015/create/from-string-and-format.js +120 -0
  121. package/chronos/esm2015/create/from-string.js +268 -0
  122. package/chronos/esm2015/create/local.js +23 -0
  123. package/chronos/esm2015/create/parsing-flags.js +38 -0
  124. package/chronos/esm2015/create/parsing.types.js +146 -0
  125. package/chronos/esm2015/create/valid.js +60 -0
  126. package/chronos/esm2015/duration/bubble.js +64 -0
  127. package/chronos/esm2015/duration/constructor.js +182 -0
  128. package/chronos/esm2015/duration/create.js +141 -0
  129. package/chronos/esm2015/duration/humanize.js +109 -0
  130. package/chronos/esm2015/duration/valid.js +54 -0
  131. package/chronos/esm2015/format/format.js +67 -0
  132. package/chronos/esm2015/format.js +71 -0
  133. package/chronos/esm2015/i18n/ar.js +155 -0
  134. package/chronos/esm2015/i18n/bg.js +101 -0
  135. package/chronos/esm2015/i18n/cs.js +215 -0
  136. package/chronos/esm2015/i18n/da.js +56 -0
  137. package/chronos/esm2015/i18n/de.js +80 -0
  138. package/chronos/esm2015/i18n/en-gb.js +72 -0
  139. package/chronos/esm2015/i18n/es-do.js +118 -0
  140. package/chronos/esm2015/i18n/es-us.js +111 -0
  141. package/chronos/esm2015/i18n/es.js +117 -0
  142. package/chronos/esm2015/i18n/fi.js +119 -0
  143. package/chronos/esm2015/i18n/fr.js +87 -0
  144. package/chronos/esm2015/i18n/gl.js +117 -0
  145. package/chronos/esm2015/i18n/he.js +129 -0
  146. package/chronos/esm2015/i18n/hi.js +150 -0
  147. package/chronos/esm2015/i18n/hu.js +140 -0
  148. package/chronos/esm2015/i18n/id.js +100 -0
  149. package/chronos/esm2015/i18n/it.js +79 -0
  150. package/chronos/esm2015/i18n/ja.js +95 -0
  151. package/chronos/esm2015/i18n/ko.js +82 -0
  152. package/chronos/esm2015/i18n/lt.js +155 -0
  153. package/chronos/esm2015/i18n/mn.js +108 -0
  154. package/chronos/esm2015/i18n/nb.js +59 -0
  155. package/chronos/esm2015/i18n/nl-be.js +97 -0
  156. package/chronos/esm2015/i18n/nl.js +97 -0
  157. package/chronos/esm2015/i18n/pl.js +156 -0
  158. package/chronos/esm2015/i18n/pt-br.js +65 -0
  159. package/chronos/esm2015/i18n/ro.js +73 -0
  160. package/chronos/esm2015/i18n/ru.js +218 -0
  161. package/chronos/esm2015/i18n/sk.js +193 -0
  162. package/chronos/esm2015/i18n/sl.js +202 -0
  163. package/chronos/esm2015/i18n/sv.js +74 -0
  164. package/chronos/esm2015/i18n/th.js +75 -0
  165. package/chronos/esm2015/i18n/tr.js +95 -0
  166. package/chronos/esm2015/i18n/zh-cn.js +136 -0
  167. package/chronos/esm2015/index.js +7 -0
  168. package/chronos/esm2015/locale/calendar.js +14 -0
  169. package/chronos/esm2015/locale/locale.class.js +841 -0
  170. package/chronos/esm2015/locale/locale.defaults.js +46 -0
  171. package/chronos/esm2015/locale/locales.js +272 -0
  172. package/chronos/esm2015/moment/add-subtract.js +61 -0
  173. package/chronos/esm2015/moment/calendar.js +81 -0
  174. package/chronos/esm2015/moment/diff.js +88 -0
  175. package/chronos/esm2015/moment/min-max.js +50 -0
  176. package/chronos/esm2015/ngx-bootstrap-chronos.js +11 -0
  177. package/chronos/esm2015/parse/regex.js +72 -0
  178. package/chronos/esm2015/parse/token.js +52 -0
  179. package/chronos/esm2015/public_api.js +50 -0
  180. package/chronos/esm2015/test/chain.js +1212 -0
  181. package/chronos/esm2015/types.js +76 -0
  182. package/chronos/esm2015/units/aliases.js +53 -0
  183. package/chronos/esm2015/units/constants.js +16 -0
  184. package/chronos/esm2015/units/day-of-month.js +39 -0
  185. package/chronos/esm2015/units/day-of-week.js +183 -0
  186. package/chronos/esm2015/units/day-of-year.js +55 -0
  187. package/chronos/esm2015/units/hour.js +153 -0
  188. package/chronos/esm2015/units/index.js +24 -0
  189. package/chronos/esm2015/units/millisecond.js +74 -0
  190. package/chronos/esm2015/units/minute.js +31 -0
  191. package/chronos/esm2015/units/month.js +75 -0
  192. package/chronos/esm2015/units/offset.js +227 -0
  193. package/chronos/esm2015/units/priorities.js +31 -0
  194. package/chronos/esm2015/units/quarter.js +57 -0
  195. package/chronos/esm2015/units/second.js +31 -0
  196. package/chronos/esm2015/units/timestamp.js +36 -0
  197. package/chronos/esm2015/units/timezone.js +33 -0
  198. package/chronos/esm2015/units/week-calendar-utils.js +94 -0
  199. package/chronos/esm2015/units/week-year.js +175 -0
  200. package/chronos/esm2015/units/week.js +83 -0
  201. package/chronos/esm2015/units/year.js +81 -0
  202. package/chronos/esm2015/utils/abs-ceil.js +13 -0
  203. package/chronos/esm2015/utils/abs-round.js +13 -0
  204. package/chronos/esm2015/utils/compare-arrays.js +27 -0
  205. package/chronos/esm2015/utils/date-compare.js +108 -0
  206. package/chronos/esm2015/utils/date-getters.js +157 -0
  207. package/chronos/esm2015/utils/date-setters.js +147 -0
  208. package/chronos/esm2015/utils/defaults.js +22 -0
  209. package/chronos/esm2015/utils/start-end-of.js +74 -0
  210. package/chronos/esm2015/utils/type-checks.js +114 -0
  211. package/chronos/esm2015/utils/zero-fill.js +21 -0
  212. package/chronos/esm2015/utils.js +21 -0
  213. package/chronos/esm5/create/check-overflow.js +39 -0
  214. package/chronos/esm5/create/clone.js +13 -0
  215. package/chronos/esm5/create/date-from-array.js +44 -0
  216. package/chronos/esm5/create/from-anything.js +131 -0
  217. package/chronos/esm5/create/from-array.js +149 -0
  218. package/chronos/esm5/create/from-object.js +25 -0
  219. package/chronos/esm5/create/from-string-and-array.js +46 -0
  220. package/chronos/esm5/create/from-string-and-format.js +120 -0
  221. package/chronos/esm5/create/from-string.js +268 -0
  222. package/chronos/esm5/create/local.js +23 -0
  223. package/chronos/esm5/create/parsing-flags.js +38 -0
  224. package/chronos/esm5/create/parsing.types.js +146 -0
  225. package/chronos/esm5/create/valid.js +60 -0
  226. package/chronos/esm5/duration/bubble.js +64 -0
  227. package/chronos/esm5/duration/constructor.js +205 -0
  228. package/chronos/esm5/duration/create.js +143 -0
  229. package/chronos/esm5/duration/humanize.js +109 -0
  230. package/chronos/esm5/duration/valid.js +54 -0
  231. package/chronos/esm5/format/format.js +68 -0
  232. package/chronos/esm5/format.js +73 -0
  233. package/chronos/esm5/i18n/ar.js +155 -0
  234. package/chronos/esm5/i18n/bg.js +101 -0
  235. package/chronos/esm5/i18n/cs.js +215 -0
  236. package/chronos/esm5/i18n/da.js +56 -0
  237. package/chronos/esm5/i18n/de.js +80 -0
  238. package/chronos/esm5/i18n/en-gb.js +72 -0
  239. package/chronos/esm5/i18n/es-do.js +118 -0
  240. package/chronos/esm5/i18n/es-us.js +111 -0
  241. package/chronos/esm5/i18n/es.js +117 -0
  242. package/chronos/esm5/i18n/fi.js +119 -0
  243. package/chronos/esm5/i18n/fr.js +87 -0
  244. package/chronos/esm5/i18n/gl.js +117 -0
  245. package/chronos/esm5/i18n/he.js +129 -0
  246. package/chronos/esm5/i18n/hi.js +150 -0
  247. package/chronos/esm5/i18n/hu.js +140 -0
  248. package/chronos/esm5/i18n/id.js +100 -0
  249. package/chronos/esm5/i18n/it.js +79 -0
  250. package/chronos/esm5/i18n/ja.js +95 -0
  251. package/chronos/esm5/i18n/ko.js +82 -0
  252. package/chronos/esm5/i18n/lt.js +155 -0
  253. package/chronos/esm5/i18n/mn.js +108 -0
  254. package/chronos/esm5/i18n/nb.js +59 -0
  255. package/chronos/esm5/i18n/nl-be.js +97 -0
  256. package/chronos/esm5/i18n/nl.js +97 -0
  257. package/chronos/esm5/i18n/pl.js +156 -0
  258. package/chronos/esm5/i18n/pt-br.js +65 -0
  259. package/chronos/esm5/i18n/ro.js +73 -0
  260. package/chronos/esm5/i18n/ru.js +218 -0
  261. package/chronos/esm5/i18n/sk.js +193 -0
  262. package/chronos/esm5/i18n/sl.js +202 -0
  263. package/chronos/esm5/i18n/sv.js +74 -0
  264. package/chronos/esm5/i18n/th.js +75 -0
  265. package/chronos/esm5/i18n/tr.js +95 -0
  266. package/chronos/esm5/i18n/zh-cn.js +136 -0
  267. package/chronos/esm5/index.js +7 -0
  268. package/chronos/esm5/locale/calendar.js +14 -0
  269. package/chronos/esm5/locale/locale.class.js +996 -0
  270. package/chronos/esm5/locale/locale.defaults.js +46 -0
  271. package/chronos/esm5/locale/locales.js +272 -0
  272. package/chronos/esm5/moment/add-subtract.js +61 -0
  273. package/chronos/esm5/moment/calendar.js +83 -0
  274. package/chronos/esm5/moment/diff.js +89 -0
  275. package/chronos/esm5/moment/min-max.js +58 -0
  276. package/chronos/esm5/ngx-bootstrap-chronos.js +11 -0
  277. package/chronos/esm5/parse/regex.js +72 -0
  278. package/chronos/esm5/parse/token.js +52 -0
  279. package/chronos/esm5/public_api.js +50 -0
  280. package/chronos/esm5/test/chain.js +1506 -0
  281. package/chronos/esm5/types.js +76 -0
  282. package/chronos/esm5/units/aliases.js +53 -0
  283. package/chronos/esm5/units/constants.js +16 -0
  284. package/chronos/esm5/units/day-of-month.js +39 -0
  285. package/chronos/esm5/units/day-of-week.js +188 -0
  286. package/chronos/esm5/units/day-of-year.js +55 -0
  287. package/chronos/esm5/units/hour.js +153 -0
  288. package/chronos/esm5/units/index.js +24 -0
  289. package/chronos/esm5/units/millisecond.js +74 -0
  290. package/chronos/esm5/units/minute.js +31 -0
  291. package/chronos/esm5/units/month.js +75 -0
  292. package/chronos/esm5/units/offset.js +231 -0
  293. package/chronos/esm5/units/priorities.js +31 -0
  294. package/chronos/esm5/units/quarter.js +58 -0
  295. package/chronos/esm5/units/second.js +31 -0
  296. package/chronos/esm5/units/timestamp.js +36 -0
  297. package/chronos/esm5/units/timezone.js +33 -0
  298. package/chronos/esm5/units/week-calendar-utils.js +94 -0
  299. package/chronos/esm5/units/week-year.js +178 -0
  300. package/chronos/esm5/units/week.js +85 -0
  301. package/chronos/esm5/units/year.js +81 -0
  302. package/chronos/esm5/utils/abs-ceil.js +13 -0
  303. package/chronos/esm5/utils/abs-round.js +13 -0
  304. package/chronos/esm5/utils/compare-arrays.js +27 -0
  305. package/chronos/esm5/utils/date-compare.js +112 -0
  306. package/chronos/esm5/utils/date-getters.js +165 -0
  307. package/chronos/esm5/utils/date-setters.js +147 -0
  308. package/chronos/esm5/utils/defaults.js +22 -0
  309. package/chronos/esm5/utils/start-end-of.js +74 -0
  310. package/chronos/esm5/utils/type-checks.js +114 -0
  311. package/chronos/esm5/utils/zero-fill.js +21 -0
  312. package/chronos/esm5/utils.js +21 -0
  313. package/chronos/fesm2015/ngx-bootstrap-chronos.js +8176 -0
  314. package/chronos/fesm2015/ngx-bootstrap-chronos.js.map +1 -0
  315. package/chronos/fesm5/ngx-bootstrap-chronos.js +8383 -0
  316. package/chronos/fesm5/ngx-bootstrap-chronos.js.map +1 -0
  317. package/chronos/i18n/bg.d.ts +2 -0
  318. package/chronos/i18n/lt.d.ts +2 -0
  319. package/chronos/i18n/nb.d.ts +2 -0
  320. package/chronos/i18n/sk.d.ts +2 -0
  321. package/chronos/index.d.ts +1 -7
  322. package/chronos/ngx-bootstrap-chronos.d.ts +5 -0
  323. package/chronos/ngx-bootstrap-chronos.metadata.json +1 -0
  324. package/chronos/package.json +19 -0
  325. package/chronos/public_api.d.ts +46 -0
  326. package/chronos/units/day-of-month.d.ts +1 -1
  327. package/chronos/units/day-of-week.d.ts +1 -0
  328. package/chronos/units/day-of-year.d.ts +1 -0
  329. package/chronos/units/hour.d.ts +1 -1
  330. package/chronos/units/millisecond.d.ts +1 -1
  331. package/chronos/units/minute.d.ts +1 -1
  332. package/chronos/units/month.d.ts +1 -0
  333. package/chronos/units/offset.d.ts +1 -0
  334. package/chronos/units/quarter.d.ts +1 -0
  335. package/chronos/units/second.d.ts +1 -1
  336. package/chronos/units/timestamp.d.ts +1 -1
  337. package/chronos/units/timezone.d.ts +1 -0
  338. package/chronos/units/week-year.d.ts +1 -0
  339. package/chronos/units/week.d.ts +1 -0
  340. package/chronos/units/year.d.ts +1 -0
  341. package/chronos/utils/date-compare.d.ts +2 -0
  342. package/chronos/utils/type-checks.d.ts +1 -1
  343. package/collapse/bundles/ngx-bootstrap-collapse.umd.js +178 -0
  344. package/collapse/bundles/ngx-bootstrap-collapse.umd.js.map +1 -0
  345. package/collapse/bundles/ngx-bootstrap-collapse.umd.min.js +2 -0
  346. package/collapse/bundles/ngx-bootstrap-collapse.umd.min.js.map +1 -0
  347. package/collapse/esm2015/collapse.directive.js +150 -0
  348. package/collapse/esm2015/collapse.module.js +31 -0
  349. package/collapse/esm2015/ngx-bootstrap-collapse.js +10 -0
  350. package/collapse/esm2015/public_api.js +8 -0
  351. package/collapse/esm5/collapse.directive.js +167 -0
  352. package/collapse/esm5/collapse.module.js +38 -0
  353. package/collapse/esm5/ngx-bootstrap-collapse.js +10 -0
  354. package/collapse/esm5/public_api.js +8 -0
  355. package/collapse/fesm2015/ngx-bootstrap-collapse.js +147 -0
  356. package/collapse/fesm2015/ngx-bootstrap-collapse.js.map +1 -0
  357. package/collapse/fesm5/ngx-bootstrap-collapse.js +169 -0
  358. package/collapse/fesm5/ngx-bootstrap-collapse.js.map +1 -0
  359. package/collapse/ngx-bootstrap-collapse.d.ts +4 -0
  360. package/collapse/ngx-bootstrap-collapse.metadata.json +1 -0
  361. package/collapse/package.json +19 -0
  362. package/collapse/{index.d.ts → public_api.d.ts} +0 -0
  363. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.js +508 -0
  364. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.js.map +1 -0
  365. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.min.js +2 -0
  366. package/component-loader/bundles/ngx-bootstrap-component-loader.umd.min.js.map +1 -0
  367. package/component-loader/component-loader.class.d.ts +11 -5
  368. package/component-loader/component-loader.factory.d.ts +1 -2
  369. package/component-loader/esm2015/bs-component-ref.class.js +17 -0
  370. package/component-loader/esm2015/component-loader.class.js +402 -0
  371. package/component-loader/esm2015/component-loader.factory.js +66 -0
  372. package/component-loader/esm2015/content-ref.class.js +34 -0
  373. package/component-loader/esm2015/listen-options.model.js +28 -0
  374. package/component-loader/esm2015/ngx-bootstrap-component-loader.js +10 -0
  375. package/component-loader/esm2015/public_api.js +10 -0
  376. package/component-loader/esm5/bs-component-ref.class.js +27 -0
  377. package/component-loader/esm5/component-loader.class.js +468 -0
  378. package/component-loader/esm5/component-loader.factory.js +75 -0
  379. package/component-loader/esm5/content-ref.class.js +31 -0
  380. package/component-loader/esm5/listen-options.model.js +28 -0
  381. package/component-loader/esm5/ngx-bootstrap-component-loader.js +10 -0
  382. package/component-loader/esm5/public_api.js +10 -0
  383. package/component-loader/fesm2015/ngx-bootstrap-component-loader.js +426 -0
  384. package/component-loader/fesm2015/ngx-bootstrap-component-loader.js.map +1 -0
  385. package/component-loader/fesm5/ngx-bootstrap-component-loader.js +498 -0
  386. package/component-loader/fesm5/ngx-bootstrap-component-loader.js.map +1 -0
  387. package/component-loader/listen-options.model.d.ts +1 -0
  388. package/component-loader/ngx-bootstrap-component-loader.d.ts +4 -0
  389. package/component-loader/ngx-bootstrap-component-loader.metadata.json +1 -0
  390. package/component-loader/package.json +19 -0
  391. package/component-loader/public_api.d.ts +4 -0
  392. package/datepicker/base/bs-datepicker-container.d.ts +3 -1
  393. package/datepicker/bs-datepicker-input.directive.d.ts +3 -3
  394. package/datepicker/bs-datepicker.component.d.ts +13 -3
  395. package/datepicker/bs-datepicker.config.d.ts +14 -1
  396. package/datepicker/bs-datepicker.css +14 -5
  397. package/datepicker/bs-datepicker.css.map +2 -2
  398. package/datepicker/bs-datepicker.module.d.ts +0 -1
  399. package/datepicker/bs-datepicker.scss +23 -10
  400. package/datepicker/bs-daterangepicker-input.directive.d.ts +3 -3
  401. package/datepicker/bs-daterangepicker.component.d.ts +4 -3
  402. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.js +4334 -0
  403. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.js.map +1 -0
  404. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.min.js +2 -0
  405. package/datepicker/bundles/ngx-bootstrap-datepicker.umd.min.js.map +1 -0
  406. package/datepicker/datepicker.component.d.ts +5 -5
  407. package/datepicker/engine/calc-days-calendar.d.ts +1 -1
  408. package/datepicker/engine/flag-days-calendar.d.ts +2 -1
  409. package/datepicker/engine/flag-months-calendar.d.ts +1 -1
  410. package/datepicker/engine/flag-years-calendar.d.ts +1 -1
  411. package/datepicker/engine/format-days-calendar.d.ts +1 -1
  412. package/datepicker/engine/format-months-calendar.d.ts +1 -1
  413. package/datepicker/engine/format-years-calendar.d.ts +1 -1
  414. package/datepicker/engine/view-mode.d.ts +2 -2
  415. package/datepicker/esm2015/base/bs-datepicker-container.js +109 -0
  416. package/datepicker/esm2015/bs-datepicker-input.directive.js +208 -0
  417. package/datepicker/esm2015/bs-datepicker.component.js +307 -0
  418. package/datepicker/esm2015/bs-datepicker.config.js +117 -0
  419. package/datepicker/esm2015/bs-datepicker.module.js +90 -0
  420. package/datepicker/esm2015/bs-daterangepicker-input.directive.js +224 -0
  421. package/datepicker/esm2015/bs-daterangepicker.component.js +293 -0
  422. package/datepicker/esm2015/bs-daterangepicker.config.js +29 -0
  423. package/datepicker/esm2015/bs-locale.service.js +61 -0
  424. package/datepicker/esm2015/date-formatter.js +18 -0
  425. package/datepicker/esm2015/datepicker-inner.component.js +451 -0
  426. package/datepicker/esm2015/datepicker.component.js +326 -0
  427. package/datepicker/esm2015/datepicker.config.js +74 -0
  428. package/datepicker/esm2015/datepicker.module.js +52 -0
  429. package/datepicker/esm2015/daypicker.component.js +212 -0
  430. package/datepicker/esm2015/engine/calc-days-calendar.js +29 -0
  431. package/datepicker/esm2015/engine/flag-days-calendar.js +115 -0
  432. package/datepicker/esm2015/engine/flag-months-calendar.js +57 -0
  433. package/datepicker/esm2015/engine/flag-years-calendar.js +56 -0
  434. package/datepicker/esm2015/engine/format-days-calendar.js +50 -0
  435. package/datepicker/esm2015/engine/format-months-calendar.js +29 -0
  436. package/datepicker/esm2015/engine/format-years-calendar.js +42 -0
  437. package/datepicker/esm2015/engine/view-mode.js +14 -0
  438. package/datepicker/esm2015/models/index.js +199 -0
  439. package/datepicker/esm2015/monthpicker.component.js +118 -0
  440. package/datepicker/esm2015/ngx-bootstrap-datepicker.js +29 -0
  441. package/datepicker/esm2015/public_api.js +19 -0
  442. package/datepicker/esm2015/reducer/_defaults.js +10 -0
  443. package/datepicker/esm2015/reducer/bs-datepicker.actions.js +204 -0
  444. package/datepicker/esm2015/reducer/bs-datepicker.effects.js +249 -0
  445. package/datepicker/esm2015/reducer/bs-datepicker.reducer.js +289 -0
  446. package/datepicker/esm2015/reducer/bs-datepicker.state.js +87 -0
  447. package/datepicker/esm2015/reducer/bs-datepicker.store.js +34 -0
  448. package/datepicker/esm2015/themes/bs/bs-calendar-layout.component.js +39 -0
  449. package/datepicker/esm2015/themes/bs/bs-current-date-view.component.js +32 -0
  450. package/datepicker/esm2015/themes/bs/bs-custom-dates-view.component.js +51 -0
  451. package/datepicker/esm2015/themes/bs/bs-datepicker-container.component.js +113 -0
  452. package/datepicker/esm2015/themes/bs/bs-datepicker-day-decorator.directive.js +73 -0
  453. package/datepicker/esm2015/themes/bs/bs-datepicker-navigation-view.component.js +88 -0
  454. package/datepicker/esm2015/themes/bs/bs-daterangepicker-container.component.js +133 -0
  455. package/datepicker/esm2015/themes/bs/bs-days-calendar-view.component.js +134 -0
  456. package/datepicker/esm2015/themes/bs/bs-months-calendar-view.component.js +104 -0
  457. package/datepicker/esm2015/themes/bs/bs-timepicker-view.component.js +53 -0
  458. package/datepicker/esm2015/themes/bs/bs-years-calendar-view.component.js +105 -0
  459. package/datepicker/esm2015/utils/bs-calendar-utils.js +54 -0
  460. package/datepicker/esm2015/utils/matrix-utils.js +39 -0
  461. package/datepicker/esm2015/yearpicker.component.js +122 -0
  462. package/datepicker/esm5/base/bs-datepicker-container.js +170 -0
  463. package/datepicker/esm5/bs-datepicker-input.directive.js +242 -0
  464. package/datepicker/esm5/bs-datepicker.component.js +368 -0
  465. package/datepicker/esm5/bs-datepicker.config.js +119 -0
  466. package/datepicker/esm5/bs-datepicker.module.js +97 -0
  467. package/datepicker/esm5/bs-daterangepicker-input.directive.js +263 -0
  468. package/datepicker/esm5/bs-daterangepicker.component.js +354 -0
  469. package/datepicker/esm5/bs-daterangepicker.config.js +34 -0
  470. package/datepicker/esm5/bs-locale.service.js +79 -0
  471. package/datepicker/esm5/date-formatter.js +28 -0
  472. package/datepicker/esm5/datepicker-inner.component.js +547 -0
  473. package/datepicker/esm5/datepicker.component.js +325 -0
  474. package/datepicker/esm5/datepicker.config.js +76 -0
  475. package/datepicker/esm5/datepicker.module.js +59 -0
  476. package/datepicker/esm5/daypicker.component.js +157 -0
  477. package/datepicker/esm5/engine/calc-days-calendar.js +29 -0
  478. package/datepicker/esm5/engine/flag-days-calendar.js +115 -0
  479. package/datepicker/esm5/engine/flag-months-calendar.js +57 -0
  480. package/datepicker/esm5/engine/flag-years-calendar.js +56 -0
  481. package/datepicker/esm5/engine/format-days-calendar.js +55 -0
  482. package/datepicker/esm5/engine/format-months-calendar.js +31 -0
  483. package/datepicker/esm5/engine/format-years-calendar.js +44 -0
  484. package/datepicker/esm5/engine/view-mode.js +14 -0
  485. package/datepicker/esm5/models/index.js +199 -0
  486. package/datepicker/esm5/monthpicker.component.js +85 -0
  487. package/datepicker/esm5/ngx-bootstrap-datepicker.js +29 -0
  488. package/datepicker/esm5/public_api.js +19 -0
  489. package/datepicker/esm5/reducer/_defaults.js +10 -0
  490. package/datepicker/esm5/reducer/bs-datepicker.actions.js +266 -0
  491. package/datepicker/esm5/reducer/bs-datepicker.effects.js +314 -0
  492. package/datepicker/esm5/reducer/bs-datepicker.reducer.js +298 -0
  493. package/datepicker/esm5/reducer/bs-datepicker.state.js +91 -0
  494. package/datepicker/esm5/reducer/bs-datepicker.store.js +40 -0
  495. package/datepicker/esm5/themes/bs/bs-calendar-layout.component.js +28 -0
  496. package/datepicker/esm5/themes/bs/bs-current-date-view.component.js +36 -0
  497. package/datepicker/esm5/themes/bs/bs-custom-dates-view.component.js +50 -0
  498. package/datepicker/esm5/themes/bs/bs-datepicker-container.component.js +138 -0
  499. package/datepicker/esm5/themes/bs/bs-datepicker-day-decorator.directive.js +73 -0
  500. package/datepicker/esm5/themes/bs/bs-datepicker-navigation-view.component.js +68 -0
  501. package/datepicker/esm5/themes/bs/bs-daterangepicker-container.component.js +158 -0
  502. package/datepicker/esm5/themes/bs/bs-days-calendar-view.component.js +114 -0
  503. package/datepicker/esm5/themes/bs/bs-months-calendar-view.component.js +100 -0
  504. package/datepicker/esm5/themes/bs/bs-timepicker-view.component.js +37 -0
  505. package/datepicker/esm5/themes/bs/bs-years-calendar-view.component.js +101 -0
  506. package/datepicker/esm5/utils/bs-calendar-utils.js +54 -0
  507. package/datepicker/esm5/utils/matrix-utils.js +39 -0
  508. package/datepicker/esm5/yearpicker.component.js +92 -0
  509. package/datepicker/fesm2015/ngx-bootstrap-datepicker.js +3827 -0
  510. package/datepicker/fesm2015/ngx-bootstrap-datepicker.js.map +1 -0
  511. package/datepicker/fesm5/ngx-bootstrap-datepicker.js +4198 -0
  512. package/datepicker/fesm5/ngx-bootstrap-datepicker.js.map +1 -0
  513. package/datepicker/models/index.d.ts +3 -1
  514. package/datepicker/ngx-bootstrap-datepicker.d.ts +23 -0
  515. package/datepicker/ngx-bootstrap-datepicker.metadata.json +1 -0
  516. package/datepicker/package.json +19 -0
  517. package/datepicker/public_api.d.ts +14 -0
  518. package/datepicker/reducer/_defaults.d.ts +1 -1
  519. package/datepicker/reducer/bs-datepicker.actions.d.ts +5 -3
  520. package/datepicker/reducer/bs-datepicker.effects.d.ts +3 -2
  521. package/datepicker/reducer/bs-datepicker.reducer.d.ts +1 -1
  522. package/datepicker/reducer/bs-datepicker.state.d.ts +4 -1
  523. package/datepicker/reducer/bs-datepicker.store.d.ts +1 -1
  524. package/datepicker/themes/bs/bs-datepicker-container.component.d.ts +1 -1
  525. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.d.ts +9 -2
  526. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.d.ts +1 -1
  527. package/datepicker/themes/bs/bs-daterangepicker-container.component.d.ts +1 -1
  528. package/datepicker/themes/bs/bs-days-calendar-view.component.d.ts +4 -1
  529. package/datepicker/themes/bs/bs-months-calendar-view.component.d.ts +1 -1
  530. package/datepicker/themes/bs/bs-years-calendar-view.component.d.ts +1 -1
  531. package/datepicker/utils/matrix-utils.d.ts +1 -1
  532. package/dropdown/bs-dropdown-container.component.d.ts +3 -0
  533. package/dropdown/bs-dropdown-toggle.directive.d.ts +4 -2
  534. package/dropdown/bs-dropdown.config.d.ts +2 -0
  535. package/dropdown/bs-dropdown.directive.d.ts +12 -6
  536. package/dropdown/bs-dropdown.state.d.ts +2 -1
  537. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.js +793 -0
  538. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.js.map +1 -0
  539. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.min.js +2 -0
  540. package/dropdown/bundles/ngx-bootstrap-dropdown.umd.min.js.map +1 -0
  541. package/dropdown/esm2015/bs-dropdown-container.component.js +104 -0
  542. package/dropdown/esm2015/bs-dropdown-menu.directive.js +42 -0
  543. package/dropdown/esm2015/bs-dropdown-toggle.directive.js +109 -0
  544. package/dropdown/esm2015/bs-dropdown.config.js +44 -0
  545. package/dropdown/esm2015/bs-dropdown.directive.js +408 -0
  546. package/dropdown/esm2015/bs-dropdown.module.js +60 -0
  547. package/dropdown/esm2015/bs-dropdown.state.js +51 -0
  548. package/dropdown/esm2015/index.js +7 -0
  549. package/dropdown/esm2015/ngx-bootstrap-dropdown.js +10 -0
  550. package/dropdown/esm2015/public_api.js +13 -0
  551. package/dropdown/esm5/bs-dropdown-container.component.js +109 -0
  552. package/dropdown/esm5/bs-dropdown-menu.directive.js +40 -0
  553. package/dropdown/esm5/bs-dropdown-toggle.directive.js +132 -0
  554. package/dropdown/esm5/bs-dropdown.config.js +46 -0
  555. package/dropdown/esm5/bs-dropdown.directive.js +501 -0
  556. package/dropdown/esm5/bs-dropdown.module.js +69 -0
  557. package/dropdown/esm5/bs-dropdown.state.js +54 -0
  558. package/dropdown/esm5/index.js +7 -0
  559. package/dropdown/esm5/ngx-bootstrap-dropdown.js +10 -0
  560. package/dropdown/esm5/public_api.js +13 -0
  561. package/dropdown/fesm2015/ngx-bootstrap-dropdown.js +623 -0
  562. package/dropdown/fesm2015/ngx-bootstrap-dropdown.js.map +1 -0
  563. package/dropdown/fesm5/ngx-bootstrap-dropdown.js +748 -0
  564. package/dropdown/fesm5/ngx-bootstrap-dropdown.js.map +1 -0
  565. package/dropdown/index.d.ts +1 -7
  566. package/dropdown/ngx-bootstrap-dropdown.d.ts +4 -0
  567. package/dropdown/ngx-bootstrap-dropdown.metadata.json +1 -0
  568. package/dropdown/package.json +19 -0
  569. package/dropdown/public_api.d.ts +7 -0
  570. package/esm2015/ngx-bootstrap.js +10 -0
  571. package/esm2015/public_api.js +31 -0
  572. package/esm5/ngx-bootstrap.js +10 -0
  573. package/esm5/public_api.js +31 -0
  574. package/fesm2015/ngx-bootstrap.js +35 -0
  575. package/fesm2015/ngx-bootstrap.js.map +1 -0
  576. package/fesm5/ngx-bootstrap.js +35 -0
  577. package/fesm5/ngx-bootstrap.js.map +1 -0
  578. package/locale/bundles/ngx-bootstrap-locale.umd.js +56 -0
  579. package/locale/bundles/ngx-bootstrap-locale.umd.js.map +1 -0
  580. package/locale/bundles/ngx-bootstrap-locale.umd.min.js +2 -0
  581. package/locale/bundles/ngx-bootstrap-locale.umd.min.js.map +1 -0
  582. package/locale/esm2015/ngx-bootstrap-locale.js +10 -0
  583. package/locale/esm2015/public_api.js +40 -0
  584. package/locale/esm5/ngx-bootstrap-locale.js +10 -0
  585. package/locale/esm5/public_api.js +40 -0
  586. package/locale/fesm2015/ngx-bootstrap-locale.js +13 -0
  587. package/locale/fesm2015/ngx-bootstrap-locale.js.map +1 -0
  588. package/locale/fesm5/ngx-bootstrap-locale.js +13 -0
  589. package/locale/fesm5/ngx-bootstrap-locale.js.map +1 -0
  590. package/locale/ngx-bootstrap-locale.d.ts +4 -0
  591. package/locale/ngx-bootstrap-locale.metadata.json +1 -0
  592. package/locale/package.json +19 -0
  593. package/locale/public_api.d.ts +34 -0
  594. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.js +178 -0
  595. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.js.map +1 -0
  596. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.min.js +2 -0
  597. package/mini-ngrx/bundles/ngx-bootstrap-mini-ngrx.umd.min.js.map +1 -0
  598. package/mini-ngrx/esm2015/index.js +7 -0
  599. package/mini-ngrx/esm2015/ngx-bootstrap-mini-ngrx.js +10 -0
  600. package/mini-ngrx/esm2015/public_api.js +18 -0
  601. package/mini-ngrx/esm2015/state.class.js +29 -0
  602. package/mini-ngrx/esm2015/store.class.js +81 -0
  603. package/mini-ngrx/esm5/index.js +7 -0
  604. package/mini-ngrx/esm5/ngx-bootstrap-mini-ngrx.js +10 -0
  605. package/mini-ngrx/esm5/public_api.js +18 -0
  606. package/mini-ngrx/esm5/state.class.js +35 -0
  607. package/mini-ngrx/esm5/store.class.js +114 -0
  608. package/mini-ngrx/fesm2015/ngx-bootstrap-mini-ngrx.js +114 -0
  609. package/mini-ngrx/fesm2015/ngx-bootstrap-mini-ngrx.js.map +1 -0
  610. package/mini-ngrx/fesm5/ngx-bootstrap-mini-ngrx.js +144 -0
  611. package/mini-ngrx/fesm5/ngx-bootstrap-mini-ngrx.js.map +1 -0
  612. package/mini-ngrx/index.d.ts +1 -7
  613. package/mini-ngrx/ngx-bootstrap-mini-ngrx.d.ts +4 -0
  614. package/mini-ngrx/ngx-bootstrap-mini-ngrx.metadata.json +1 -0
  615. package/mini-ngrx/package.json +19 -0
  616. package/mini-ngrx/public_api.d.ts +7 -0
  617. package/modal/bs-modal-ref.service.d.ts +4 -0
  618. package/modal/bs-modal.service.d.ts +5 -1
  619. package/modal/bundles/ngx-bootstrap-modal.umd.js +1156 -0
  620. package/modal/bundles/ngx-bootstrap-modal.umd.js.map +1 -0
  621. package/modal/bundles/ngx-bootstrap-modal.umd.min.js +2 -0
  622. package/modal/bundles/ngx-bootstrap-modal.umd.min.js.map +1 -0
  623. package/modal/esm2015/bs-modal-ref.service.js +46 -0
  624. package/modal/esm2015/bs-modal.service.js +267 -0
  625. package/modal/esm2015/modal-backdrop.component.js +103 -0
  626. package/modal/esm2015/modal-backdrop.options.js +19 -0
  627. package/modal/esm2015/modal-container.component.js +160 -0
  628. package/modal/esm2015/modal-options.class.js +92 -0
  629. package/modal/esm2015/modal.directive.js +459 -0
  630. package/modal/esm2015/modal.module.js +44 -0
  631. package/modal/esm2015/models/index.js +58 -0
  632. package/modal/esm2015/ngx-bootstrap-modal.js +11 -0
  633. package/modal/esm2015/public_api.js +14 -0
  634. package/modal/esm5/bs-modal-ref.service.js +48 -0
  635. package/modal/esm5/bs-modal.service.js +333 -0
  636. package/modal/esm5/modal-backdrop.component.js +112 -0
  637. package/modal/esm5/modal-backdrop.options.js +18 -0
  638. package/modal/esm5/modal-container.component.js +170 -0
  639. package/modal/esm5/modal-options.class.js +96 -0
  640. package/modal/esm5/modal.directive.js +580 -0
  641. package/modal/esm5/modal.module.js +51 -0
  642. package/modal/esm5/models/index.js +58 -0
  643. package/modal/esm5/ngx-bootstrap-modal.js +11 -0
  644. package/modal/esm5/public_api.js +14 -0
  645. package/modal/fesm2015/ngx-bootstrap-modal.js +932 -0
  646. package/modal/fesm2015/ngx-bootstrap-modal.js.map +1 -0
  647. package/modal/fesm5/ngx-bootstrap-modal.js +1142 -0
  648. package/modal/fesm5/ngx-bootstrap-modal.js.map +1 -0
  649. package/modal/modal-container.component.d.ts +2 -2
  650. package/modal/modal-options.class.d.ts +5 -7
  651. package/modal/modal.directive.d.ts +25 -7
  652. package/modal/models/index.d.ts +22 -0
  653. package/modal/ngx-bootstrap-modal.d.ts +5 -0
  654. package/modal/ngx-bootstrap-modal.metadata.json +1 -0
  655. package/modal/package.json +19 -0
  656. package/modal/{index.d.ts → public_api.d.ts} +0 -0
  657. package/ngx-bootstrap.d.ts +4 -0
  658. package/ngx-bootstrap.metadata.json +1 -0
  659. package/package.json +30 -29
  660. package/pagination/bundles/ngx-bootstrap-pagination.umd.js +815 -0
  661. package/pagination/bundles/ngx-bootstrap-pagination.umd.js.map +1 -0
  662. package/pagination/bundles/ngx-bootstrap-pagination.umd.min.js +2 -0
  663. package/pagination/bundles/ngx-bootstrap-pagination.umd.min.js.map +1 -0
  664. package/pagination/esm2015/models/index.js +62 -0
  665. package/pagination/esm2015/ngx-bootstrap-pagination.js +12 -0
  666. package/pagination/esm2015/pager.component.js +412 -0
  667. package/pagination/esm2015/pagination.component.js +422 -0
  668. package/pagination/esm2015/pagination.config.js +49 -0
  669. package/pagination/esm2015/pagination.module.js +35 -0
  670. package/pagination/esm2015/public_api.js +10 -0
  671. package/pagination/esm5/models/index.js +62 -0
  672. package/pagination/esm5/ngx-bootstrap-pagination.js +12 -0
  673. package/pagination/esm5/pager.component.js +475 -0
  674. package/pagination/esm5/pagination.component.js +485 -0
  675. package/pagination/esm5/pagination.config.js +51 -0
  676. package/pagination/esm5/pagination.module.js +42 -0
  677. package/pagination/esm5/public_api.js +10 -0
  678. package/pagination/fesm2015/ngx-bootstrap-pagination.js +685 -0
  679. package/pagination/fesm2015/ngx-bootstrap-pagination.js.map +1 -0
  680. package/pagination/fesm5/ngx-bootstrap-pagination.js +816 -0
  681. package/pagination/fesm5/ngx-bootstrap-pagination.js.map +1 -0
  682. package/pagination/models/index.d.ts +25 -0
  683. package/pagination/ngx-bootstrap-pagination.d.ts +6 -0
  684. package/pagination/ngx-bootstrap-pagination.metadata.json +1 -0
  685. package/pagination/package.json +19 -0
  686. package/pagination/pager.component.d.ts +11 -11
  687. package/pagination/pagination.component.d.ts +12 -12
  688. package/pagination/pagination.config.d.ts +3 -2
  689. package/pagination/{index.d.ts → public_api.d.ts} +0 -0
  690. package/popover/bundles/ngx-bootstrap-popover.umd.js +317 -0
  691. package/popover/bundles/ngx-bootstrap-popover.umd.js.map +1 -0
  692. package/popover/bundles/ngx-bootstrap-popover.umd.min.js +2 -0
  693. package/popover/bundles/ngx-bootstrap-popover.umd.min.js.map +1 -0
  694. package/popover/esm2015/ngx-bootstrap-popover.js +10 -0
  695. package/popover/esm2015/popover-container.component.js +72 -0
  696. package/popover/esm2015/popover.config.js +58 -0
  697. package/popover/esm2015/popover.directive.js +227 -0
  698. package/popover/esm2015/popover.module.js +41 -0
  699. package/popover/esm2015/public_api.js +10 -0
  700. package/popover/esm5/ngx-bootstrap-popover.js +10 -0
  701. package/popover/esm5/popover-container.component.js +66 -0
  702. package/popover/esm5/popover.config.js +60 -0
  703. package/popover/esm5/popover.directive.js +260 -0
  704. package/popover/esm5/popover.module.js +48 -0
  705. package/popover/esm5/public_api.js +10 -0
  706. package/popover/fesm2015/ngx-bootstrap-popover.js +277 -0
  707. package/popover/fesm2015/ngx-bootstrap-popover.js.map +1 -0
  708. package/popover/fesm5/ngx-bootstrap-popover.js +309 -0
  709. package/popover/fesm5/ngx-bootstrap-popover.js.map +1 -0
  710. package/popover/ngx-bootstrap-popover.d.ts +4 -0
  711. package/popover/ngx-bootstrap-popover.metadata.json +1 -0
  712. package/popover/package.json +19 -0
  713. package/popover/popover.directive.d.ts +3 -3
  714. package/popover/{index.d.ts → public_api.d.ts} +0 -0
  715. package/positioning/bundles/ngx-bootstrap-positioning.umd.js +366 -0
  716. package/positioning/bundles/ngx-bootstrap-positioning.umd.js.map +1 -0
  717. package/positioning/bundles/ngx-bootstrap-positioning.umd.min.js +2 -0
  718. package/positioning/bundles/ngx-bootstrap-positioning.umd.min.js.map +1 -0
  719. package/positioning/esm2015/ng-positioning.js +253 -0
  720. package/positioning/esm2015/ngx-bootstrap-positioning.js +10 -0
  721. package/positioning/esm2015/positioning.service.js +91 -0
  722. package/positioning/esm2015/public_api.js +8 -0
  723. package/positioning/esm5/ng-positioning.js +300 -0
  724. package/positioning/esm5/ngx-bootstrap-positioning.js +10 -0
  725. package/positioning/esm5/positioning.service.js +99 -0
  726. package/positioning/esm5/public_api.js +8 -0
  727. package/positioning/fesm2015/ngx-bootstrap-positioning.js +299 -0
  728. package/positioning/fesm2015/ngx-bootstrap-positioning.js.map +1 -0
  729. package/positioning/fesm5/ngx-bootstrap-positioning.js +352 -0
  730. package/positioning/fesm5/ngx-bootstrap-positioning.js.map +1 -0
  731. package/positioning/ngx-bootstrap-positioning.d.ts +4 -0
  732. package/positioning/ngx-bootstrap-positioning.metadata.json +1 -0
  733. package/positioning/package.json +19 -0
  734. package/positioning/{index.d.ts → public_api.d.ts} +0 -0
  735. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.js +319 -0
  736. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.js.map +1 -0
  737. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.min.js +2 -0
  738. package/progressbar/bundles/ngx-bootstrap-progressbar.umd.min.js.map +1 -0
  739. package/progressbar/esm2015/bar.component.js +129 -0
  740. package/progressbar/esm2015/ngx-bootstrap-progressbar.js +10 -0
  741. package/progressbar/esm2015/progressbar.component.js +148 -0
  742. package/progressbar/esm2015/progressbar.config.js +41 -0
  743. package/progressbar/esm2015/progressbar.module.js +35 -0
  744. package/progressbar/esm2015/public_api.js +10 -0
  745. package/progressbar/esm5/bar.component.js +149 -0
  746. package/progressbar/esm5/ngx-bootstrap-progressbar.js +10 -0
  747. package/progressbar/esm5/progressbar.component.js +170 -0
  748. package/progressbar/esm5/progressbar.config.js +43 -0
  749. package/progressbar/esm5/progressbar.module.js +42 -0
  750. package/progressbar/esm5/public_api.js +10 -0
  751. package/progressbar/fesm2015/ngx-bootstrap-progressbar.js +268 -0
  752. package/progressbar/fesm2015/ngx-bootstrap-progressbar.js.map +1 -0
  753. package/progressbar/fesm5/ngx-bootstrap-progressbar.js +315 -0
  754. package/progressbar/fesm5/ngx-bootstrap-progressbar.js.map +1 -0
  755. package/progressbar/ngx-bootstrap-progressbar.d.ts +4 -0
  756. package/progressbar/ngx-bootstrap-progressbar.metadata.json +1 -0
  757. package/progressbar/package.json +19 -0
  758. package/progressbar/progressbar.component.d.ts +4 -2
  759. package/progressbar/{index.d.ts → public_api.d.ts} +0 -0
  760. package/public_api.d.ts +25 -0
  761. package/rating/bundles/ngx-bootstrap-rating.umd.js +243 -0
  762. package/rating/bundles/ngx-bootstrap-rating.umd.js.map +1 -0
  763. package/rating/bundles/ngx-bootstrap-rating.umd.min.js +2 -0
  764. package/rating/bundles/ngx-bootstrap-rating.umd.min.js.map +1 -0
  765. package/rating/esm2015/models/index.js +28 -0
  766. package/rating/esm2015/ngx-bootstrap-rating.js +11 -0
  767. package/rating/esm2015/public_api.js +8 -0
  768. package/rating/esm2015/rating.component.js +210 -0
  769. package/rating/esm2015/rating.module.js +36 -0
  770. package/rating/esm5/models/index.js +28 -0
  771. package/rating/esm5/ngx-bootstrap-rating.js +11 -0
  772. package/rating/esm5/public_api.js +8 -0
  773. package/rating/esm5/rating.component.js +244 -0
  774. package/rating/esm5/rating.module.js +43 -0
  775. package/rating/fesm2015/ngx-bootstrap-rating.js +194 -0
  776. package/rating/fesm2015/ngx-bootstrap-rating.js.map +1 -0
  777. package/rating/fesm5/ngx-bootstrap-rating.js +233 -0
  778. package/rating/fesm5/ngx-bootstrap-rating.js.map +1 -0
  779. package/rating/models/index.d.ts +9 -0
  780. package/rating/ngx-bootstrap-rating.d.ts +5 -0
  781. package/rating/ngx-bootstrap-rating.metadata.json +1 -0
  782. package/rating/package.json +19 -0
  783. package/rating/{index.d.ts → public_api.d.ts} +0 -0
  784. package/rating/rating.component.d.ts +6 -5
  785. package/schematics/collection.json +10 -0
  786. package/schematics/ng-add/index.js +98 -0
  787. package/schematics/ng-add/index.js.map +1 -0
  788. package/schematics/ng-add/index.spec.js +37 -0
  789. package/schematics/ng-add/index.spec.js.map +1 -0
  790. package/schematics/ng-add/schema.js +10 -0
  791. package/schematics/ng-add/schema.js.map +1 -0
  792. package/schematics/ng-add/schema.json +16 -0
  793. package/schematics/utils/index.js +135 -0
  794. package/schematics/utils/index.js.map +1 -0
  795. package/schematics/utils/ng-module-imports.js +69 -0
  796. package/schematics/utils/ng-module-imports.js.map +1 -0
  797. package/schematics/utils/project-main-file.js +22 -0
  798. package/schematics/utils/project-main-file.js.map +1 -0
  799. package/schematics/utils/project-targets.js +25 -0
  800. package/schematics/utils/project-targets.js.map +1 -0
  801. package/sortable/bundles/ngx-bootstrap-sortable.umd.js +464 -0
  802. package/sortable/bundles/ngx-bootstrap-sortable.umd.js.map +1 -0
  803. package/sortable/bundles/ngx-bootstrap-sortable.umd.min.js +2 -0
  804. package/sortable/bundles/ngx-bootstrap-sortable.umd.min.js.map +1 -0
  805. package/sortable/esm2015/draggable-item.js +24 -0
  806. package/sortable/esm2015/draggable-item.service.js +65 -0
  807. package/sortable/esm2015/ngx-bootstrap-sortable.js +10 -0
  808. package/sortable/esm2015/public_api.js +9 -0
  809. package/sortable/esm2015/sortable.component.js +382 -0
  810. package/sortable/esm2015/sortable.module.js +34 -0
  811. package/sortable/esm5/draggable-item.js +24 -0
  812. package/sortable/esm5/draggable-item.service.js +82 -0
  813. package/sortable/esm5/ngx-bootstrap-sortable.js +10 -0
  814. package/sortable/esm5/public_api.js +9 -0
  815. package/sortable/esm5/sortable.component.js +398 -0
  816. package/sortable/esm5/sortable.module.js +41 -0
  817. package/sortable/fesm2015/ngx-bootstrap-sortable.js +377 -0
  818. package/sortable/fesm2015/ngx-bootstrap-sortable.js.map +1 -0
  819. package/sortable/fesm5/ngx-bootstrap-sortable.js +414 -0
  820. package/sortable/fesm5/ngx-bootstrap-sortable.js.map +1 -0
  821. package/sortable/ngx-bootstrap-sortable.d.ts +4 -0
  822. package/sortable/ngx-bootstrap-sortable.metadata.json +1 -0
  823. package/sortable/package.json +19 -0
  824. package/sortable/{index.d.ts → public_api.d.ts} +0 -0
  825. package/sortable/sortable.component.d.ts +1 -1
  826. package/tabs/bundles/ngx-bootstrap-tabs.umd.js +481 -0
  827. package/tabs/bundles/ngx-bootstrap-tabs.umd.js.map +1 -0
  828. package/tabs/bundles/ngx-bootstrap-tabs.umd.min.js +2 -0
  829. package/tabs/bundles/ngx-bootstrap-tabs.umd.min.js.map +1 -0
  830. package/tabs/esm2015/ng-transclude.directive.js +61 -0
  831. package/tabs/esm2015/ngx-bootstrap-tabs.js +10 -0
  832. package/tabs/esm2015/public_api.js +12 -0
  833. package/tabs/esm2015/tab-heading.directive.js +39 -0
  834. package/tabs/esm2015/tab.directive.js +181 -0
  835. package/tabs/esm2015/tabs.module.js +50 -0
  836. package/tabs/esm2015/tabset.component.js +195 -0
  837. package/tabs/esm2015/tabset.config.js +32 -0
  838. package/tabs/esm5/ng-transclude.directive.js +65 -0
  839. package/tabs/esm5/ngx-bootstrap-tabs.js +10 -0
  840. package/tabs/esm5/public_api.js +12 -0
  841. package/tabs/esm5/tab-heading.directive.js +38 -0
  842. package/tabs/esm5/tab.directive.js +194 -0
  843. package/tabs/esm5/tabs.module.js +57 -0
  844. package/tabs/esm5/tabset.component.js +231 -0
  845. package/tabs/esm5/tabset.config.js +34 -0
  846. package/tabs/fesm2015/ngx-bootstrap-tabs.js +415 -0
  847. package/tabs/fesm2015/ngx-bootstrap-tabs.js.map +1 -0
  848. package/tabs/fesm5/ngx-bootstrap-tabs.js +470 -0
  849. package/tabs/fesm5/ngx-bootstrap-tabs.js.map +1 -0
  850. package/tabs/ngx-bootstrap-tabs.d.ts +4 -0
  851. package/tabs/ngx-bootstrap-tabs.metadata.json +1 -0
  852. package/tabs/package.json +19 -0
  853. package/tabs/{index.d.ts → public_api.d.ts} +0 -0
  854. package/tabs/tabset.component.d.ts +3 -1
  855. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.js +1183 -0
  856. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.js.map +1 -0
  857. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.min.js +2 -0
  858. package/timepicker/bundles/ngx-bootstrap-timepicker.umd.min.js.map +1 -0
  859. package/timepicker/esm2015/models/index.js +18 -0
  860. package/timepicker/esm2015/ngx-bootstrap-timepicker.js +11 -0
  861. package/timepicker/esm2015/public_api.js +11 -0
  862. package/timepicker/esm2015/reducer/timepicker.actions.js +99 -0
  863. package/timepicker/esm2015/reducer/timepicker.reducer.js +103 -0
  864. package/timepicker/esm2015/reducer/timepicker.store.js +33 -0
  865. package/timepicker/esm2015/timepicker-controls.util.js +156 -0
  866. package/timepicker/esm2015/timepicker.component.js +480 -0
  867. package/timepicker/esm2015/timepicker.config.js +144 -0
  868. package/timepicker/esm2015/timepicker.models.js +82 -0
  869. package/timepicker/esm2015/timepicker.module.js +39 -0
  870. package/timepicker/esm2015/timepicker.utils.js +224 -0
  871. package/timepicker/esm5/models/index.js +18 -0
  872. package/timepicker/esm5/ngx-bootstrap-timepicker.js +11 -0
  873. package/timepicker/esm5/public_api.js +11 -0
  874. package/timepicker/esm5/reducer/timepicker.actions.js +127 -0
  875. package/timepicker/esm5/reducer/timepicker.reducer.js +108 -0
  876. package/timepicker/esm5/reducer/timepicker.store.js +39 -0
  877. package/timepicker/esm5/timepicker-controls.util.js +156 -0
  878. package/timepicker/esm5/timepicker.component.js +564 -0
  879. package/timepicker/esm5/timepicker.config.js +146 -0
  880. package/timepicker/esm5/timepicker.models.js +82 -0
  881. package/timepicker/esm5/timepicker.module.js +46 -0
  882. package/timepicker/esm5/timepicker.utils.js +227 -0
  883. package/timepicker/fesm2015/ngx-bootstrap-timepicker.js +1006 -0
  884. package/timepicker/fesm2015/ngx-bootstrap-timepicker.js.map +1 -0
  885. package/timepicker/fesm5/ngx-bootstrap-timepicker.js +1132 -0
  886. package/timepicker/fesm5/ngx-bootstrap-timepicker.js.map +1 -0
  887. package/timepicker/models/index.d.ts +8 -0
  888. package/timepicker/ngx-bootstrap-timepicker.d.ts +5 -0
  889. package/timepicker/ngx-bootstrap-timepicker.metadata.json +1 -0
  890. package/timepicker/package.json +19 -0
  891. package/timepicker/{index.d.ts → public_api.d.ts} +0 -0
  892. package/timepicker/reducer/timepicker.actions.d.ts +1 -1
  893. package/timepicker/reducer/timepicker.reducer.d.ts +1 -1
  894. package/timepicker/reducer/timepicker.store.d.ts +1 -1
  895. package/timepicker/timepicker.component.d.ts +8 -7
  896. package/timepicker/timepicker.config.d.ts +1 -1
  897. package/timepicker/timepicker.utils.d.ts +1 -1
  898. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.js +546 -0
  899. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.js.map +1 -0
  900. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.min.js +2 -0
  901. package/tooltip/bundles/ngx-bootstrap-tooltip.umd.min.js.map +1 -0
  902. package/tooltip/esm2015/ngx-bootstrap-tooltip.js +10 -0
  903. package/tooltip/esm2015/public_api.js +10 -0
  904. package/tooltip/esm2015/tooltip-container.component.js +92 -0
  905. package/tooltip/esm2015/tooltip.config.js +49 -0
  906. package/tooltip/esm2015/tooltip.directive.js +419 -0
  907. package/tooltip/esm2015/tooltip.module.js +41 -0
  908. package/tooltip/esm5/ngx-bootstrap-tooltip.js +10 -0
  909. package/tooltip/esm5/public_api.js +10 -0
  910. package/tooltip/esm5/tooltip-container.component.js +82 -0
  911. package/tooltip/esm5/tooltip.config.js +51 -0
  912. package/tooltip/esm5/tooltip.directive.js +490 -0
  913. package/tooltip/esm5/tooltip.module.js +48 -0
  914. package/tooltip/fesm2015/ngx-bootstrap-tooltip.js +456 -0
  915. package/tooltip/fesm2015/ngx-bootstrap-tooltip.js.map +1 -0
  916. package/tooltip/fesm5/ngx-bootstrap-tooltip.js +522 -0
  917. package/tooltip/fesm5/ngx-bootstrap-tooltip.js.map +1 -0
  918. package/tooltip/ngx-bootstrap-tooltip.d.ts +4 -0
  919. package/tooltip/ngx-bootstrap-tooltip.metadata.json +1 -0
  920. package/tooltip/package.json +19 -0
  921. package/tooltip/{index.d.ts → public_api.d.ts} +0 -0
  922. package/tooltip/tooltip-container.component.d.ts +4 -1
  923. package/tooltip/tooltip.directive.d.ts +10 -8
  924. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.js +2029 -0
  925. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.js.map +1 -0
  926. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.min.js +2 -0
  927. package/typeahead/bundles/ngx-bootstrap-typeahead.umd.min.js.map +1 -0
  928. package/typeahead/esm2015/latin-map.js +833 -0
  929. package/typeahead/esm2015/ngx-bootstrap-typeahead.js +10 -0
  930. package/typeahead/esm2015/public_api.js +14 -0
  931. package/typeahead/esm2015/typeahead-container.component.js +336 -0
  932. package/typeahead/esm2015/typeahead-match.class.js +38 -0
  933. package/typeahead/esm2015/typeahead-options.class.js +22 -0
  934. package/typeahead/esm2015/typeahead-utils.js +80 -0
  935. package/typeahead/esm2015/typeahead.config.js +35 -0
  936. package/typeahead/esm2015/typeahead.directive.js +652 -0
  937. package/typeahead/esm2015/typeahead.module.js +41 -0
  938. package/typeahead/esm5/latin-map.js +833 -0
  939. package/typeahead/esm5/ngx-bootstrap-typeahead.js +10 -0
  940. package/typeahead/esm5/public_api.js +14 -0
  941. package/typeahead/esm5/typeahead-container.component.js +414 -0
  942. package/typeahead/esm5/typeahead-match.class.js +44 -0
  943. package/typeahead/esm5/typeahead-options.class.js +21 -0
  944. package/typeahead/esm5/typeahead-utils.js +94 -0
  945. package/typeahead/esm5/typeahead.config.js +37 -0
  946. package/typeahead/esm5/typeahead.directive.js +748 -0
  947. package/typeahead/esm5/typeahead.module.js +48 -0
  948. package/typeahead/fesm2015/ngx-bootstrap-typeahead.js +1780 -0
  949. package/typeahead/fesm2015/ngx-bootstrap-typeahead.js.map +1 -0
  950. package/typeahead/fesm5/ngx-bootstrap-typeahead.js +1975 -0
  951. package/typeahead/fesm5/ngx-bootstrap-typeahead.js.map +1 -0
  952. package/typeahead/ngx-bootstrap-typeahead.d.ts +4 -0
  953. package/typeahead/ngx-bootstrap-typeahead.metadata.json +1 -0
  954. package/typeahead/package.json +19 -0
  955. package/typeahead/public_api.d.ts +8 -0
  956. package/typeahead/typeahead-container.component.d.ts +2 -2
  957. package/typeahead/typeahead.config.d.ts +5 -0
  958. package/typeahead/typeahead.directive.d.ts +13 -10
  959. package/utils/bundles/ngx-bootstrap-utils.umd.js +792 -0
  960. package/utils/bundles/ngx-bootstrap-utils.umd.js.map +1 -0
  961. package/utils/bundles/ngx-bootstrap-utils.umd.min.js +10 -0
  962. package/utils/bundles/ngx-bootstrap-utils.umd.min.js.map +1 -0
  963. package/utils/esm2015/decorators.js +37 -0
  964. package/utils/esm2015/facade/browser.js +29 -0
  965. package/utils/esm2015/linked-list.class.js +324 -0
  966. package/utils/esm2015/ngx-bootstrap-utils.js +10 -0
  967. package/utils/esm2015/public_api.js +16 -0
  968. package/utils/esm2015/theme-provider.js +49 -0
  969. package/utils/esm2015/trigger.class.js +32 -0
  970. package/utils/esm2015/triggers.js +165 -0
  971. package/utils/esm2015/utils.class.js +31 -0
  972. package/utils/esm2015/warn-once.js +21 -0
  973. package/utils/esm5/decorators.js +39 -0
  974. package/utils/esm5/facade/browser.js +29 -0
  975. package/utils/esm5/linked-list.class.js +425 -0
  976. package/utils/esm5/ngx-bootstrap-utils.js +10 -0
  977. package/utils/esm5/public_api.js +16 -0
  978. package/utils/esm5/theme-provider.js +49 -0
  979. package/utils/esm5/trigger.class.js +33 -0
  980. package/utils/esm5/triggers.js +170 -0
  981. package/utils/esm5/utils.class.js +46 -0
  982. package/utils/esm5/warn-once.js +21 -0
  983. package/utils/facade/browser.d.ts +5 -5
  984. package/utils/fesm2015/ngx-bootstrap-utils.js +650 -0
  985. package/utils/fesm2015/ngx-bootstrap-utils.js.map +1 -0
  986. package/utils/fesm5/ngx-bootstrap-utils.js +768 -0
  987. package/utils/fesm5/ngx-bootstrap-utils.js.map +1 -0
  988. package/utils/ngx-bootstrap-utils.d.ts +4 -0
  989. package/utils/ngx-bootstrap-utils.metadata.json +1 -0
  990. package/utils/package.json +19 -0
  991. package/utils/public_api.d.ts +10 -0
  992. package/utils/triggers.d.ts +12 -1
  993. package/accordion/accordion-group.component.html +0 -19
  994. package/accordion/accordion-group.component.js +0 -82
  995. package/accordion/accordion-group.component.js.map +0 -1
  996. package/accordion/accordion-group.component.metadata.json +0 -1
  997. package/accordion/accordion-group.component.ngfactory.js.map +0 -1
  998. package/accordion/accordion.component.js +0 -50
  999. package/accordion/accordion.component.js.map +0 -1
  1000. package/accordion/accordion.component.metadata.json +0 -1
  1001. package/accordion/accordion.component.ngfactory.js.map +0 -1
  1002. package/accordion/accordion.config.js +0 -16
  1003. package/accordion/accordion.config.js.map +0 -1
  1004. package/accordion/accordion.config.metadata.json +0 -1
  1005. package/accordion/accordion.config.ngfactory.js.map +0 -1
  1006. package/accordion/accordion.module.js +0 -23
  1007. package/accordion/accordion.module.js.map +0 -1
  1008. package/accordion/accordion.module.metadata.json +0 -1
  1009. package/accordion/accordion.module.ngfactory.js.map +0 -1
  1010. package/accordion/index.js +0 -5
  1011. package/accordion/index.js.map +0 -1
  1012. package/accordion/index.metadata.json +0 -1
  1013. package/alert/alert.component.html +0 -11
  1014. package/alert/alert.component.js +0 -99
  1015. package/alert/alert.component.js.map +0 -1
  1016. package/alert/alert.component.metadata.json +0 -1
  1017. package/alert/alert.component.ngfactory.js.map +0 -1
  1018. package/alert/alert.config.js +0 -17
  1019. package/alert/alert.config.js.map +0 -1
  1020. package/alert/alert.config.metadata.json +0 -1
  1021. package/alert/alert.config.ngfactory.js.map +0 -1
  1022. package/alert/alert.module.js +0 -22
  1023. package/alert/alert.module.js.map +0 -1
  1024. package/alert/alert.module.metadata.json +0 -1
  1025. package/alert/alert.module.ngfactory.js.map +0 -1
  1026. package/alert/index.js +0 -4
  1027. package/alert/index.js.map +0 -1
  1028. package/alert/index.metadata.json +0 -1
  1029. package/buttons/button-checkbox.directive.js +0 -93
  1030. package/buttons/button-checkbox.directive.js.map +0 -1
  1031. package/buttons/button-checkbox.directive.metadata.json +0 -1
  1032. package/buttons/button-checkbox.directive.ngfactory.js.map +0 -1
  1033. package/buttons/button-radio-group.directive.js +0 -53
  1034. package/buttons/button-radio-group.directive.js.map +0 -1
  1035. package/buttons/button-radio-group.directive.metadata.json +0 -1
  1036. package/buttons/button-radio-group.directive.ngfactory.js.map +0 -1
  1037. package/buttons/button-radio.directive.js +0 -126
  1038. package/buttons/button-radio.directive.js.map +0 -1
  1039. package/buttons/button-radio.directive.metadata.json +0 -1
  1040. package/buttons/button-radio.directive.ngfactory.js.map +0 -1
  1041. package/buttons/buttons.module.js +0 -20
  1042. package/buttons/buttons.module.js.map +0 -1
  1043. package/buttons/buttons.module.metadata.json +0 -1
  1044. package/buttons/buttons.module.ngfactory.js.map +0 -1
  1045. package/buttons/index.js +0 -5
  1046. package/buttons/index.js.map +0 -1
  1047. package/buttons/index.metadata.json +0 -1
  1048. package/carousel/carousel.component.html +0 -14
  1049. package/carousel/carousel.component.js +0 -419
  1050. package/carousel/carousel.component.js.map +0 -1
  1051. package/carousel/carousel.component.metadata.json +0 -1
  1052. package/carousel/carousel.component.ngfactory.js.map +0 -1
  1053. package/carousel/carousel.config.js +0 -19
  1054. package/carousel/carousel.config.js.map +0 -1
  1055. package/carousel/carousel.config.metadata.json +0 -1
  1056. package/carousel/carousel.config.ngfactory.js.map +0 -1
  1057. package/carousel/carousel.module.js +0 -23
  1058. package/carousel/carousel.module.js.map +0 -1
  1059. package/carousel/carousel.module.metadata.json +0 -1
  1060. package/carousel/carousel.module.ngfactory.js.map +0 -1
  1061. package/carousel/index.js +0 -5
  1062. package/carousel/index.js.map +0 -1
  1063. package/carousel/index.metadata.json +0 -1
  1064. package/carousel/slide.component.js +0 -41
  1065. package/carousel/slide.component.js.map +0 -1
  1066. package/carousel/slide.component.metadata.json +0 -1
  1067. package/carousel/slide.component.ngfactory.js.map +0 -1
  1068. package/chronos/create/check-overflow.js +0 -30
  1069. package/chronos/create/check-overflow.js.map +0 -1
  1070. package/chronos/create/check-overflow.metadata.json +0 -1
  1071. package/chronos/create/clone.js +0 -6
  1072. package/chronos/create/clone.js.map +0 -1
  1073. package/chronos/create/clone.metadata.json +0 -1
  1074. package/chronos/create/date-from-array.js +0 -23
  1075. package/chronos/create/date-from-array.js.map +0 -1
  1076. package/chronos/create/date-from-array.metadata.json +0 -1
  1077. package/chronos/create/from-anything.js +0 -106
  1078. package/chronos/create/from-anything.js.map +0 -1
  1079. package/chronos/create/from-anything.metadata.json +0 -1
  1080. package/chronos/create/from-array.js +0 -136
  1081. package/chronos/create/from-array.js.map +0 -1
  1082. package/chronos/create/from-array.metadata.json +0 -1
  1083. package/chronos/create/from-object.js +0 -16
  1084. package/chronos/create/from-object.js.map +0 -1
  1085. package/chronos/create/from-object.metadata.json +0 -1
  1086. package/chronos/create/from-string-and-array.js +0 -38
  1087. package/chronos/create/from-string-and-array.js.map +0 -1
  1088. package/chronos/create/from-string-and-array.metadata.json +0 -1
  1089. package/chronos/create/from-string-and-format.js +0 -106
  1090. package/chronos/create/from-string-and-format.js.map +0 -1
  1091. package/chronos/create/from-string-and-format.metadata.json +0 -1
  1092. package/chronos/create/from-string.js +0 -226
  1093. package/chronos/create/from-string.js.map +0 -1
  1094. package/chronos/create/from-string.metadata.json +0 -1
  1095. package/chronos/create/local.js +0 -10
  1096. package/chronos/create/local.js.map +0 -1
  1097. package/chronos/create/local.metadata.json +0 -1
  1098. package/chronos/create/parsing-flags.js +0 -26
  1099. package/chronos/create/parsing-flags.js.map +0 -1
  1100. package/chronos/create/parsing-flags.metadata.json +0 -1
  1101. package/chronos/create/parsing.types.js +0 -1
  1102. package/chronos/create/parsing.types.js.map +0 -1
  1103. package/chronos/create/parsing.types.metadata.json +0 -1
  1104. package/chronos/create/valid.js +0 -42
  1105. package/chronos/create/valid.js.map +0 -1
  1106. package/chronos/create/valid.metadata.json +0 -1
  1107. package/chronos/duration/bubble.js +0 -47
  1108. package/chronos/duration/bubble.js.map +0 -1
  1109. package/chronos/duration/bubble.metadata.json +0 -1
  1110. package/chronos/duration/constructor.js +0 -134
  1111. package/chronos/duration/constructor.js.map +0 -1
  1112. package/chronos/duration/constructor.metadata.json +0 -1
  1113. package/chronos/duration/create.js +0 -114
  1114. package/chronos/duration/create.js.map +0 -1
  1115. package/chronos/duration/create.metadata.json +0 -1
  1116. package/chronos/duration/humanize.js +0 -84
  1117. package/chronos/duration/humanize.js.map +0 -1
  1118. package/chronos/duration/humanize.metadata.json +0 -1
  1119. package/chronos/duration/valid.js +0 -45
  1120. package/chronos/duration/valid.js.map +0 -1
  1121. package/chronos/duration/valid.metadata.json +0 -1
  1122. package/chronos/format/format.js +0 -52
  1123. package/chronos/format/format.js.map +0 -1
  1124. package/chronos/format/format.metadata.json +0 -1
  1125. package/chronos/format.js +0 -48
  1126. package/chronos/format.js.map +0 -1
  1127. package/chronos/format.metadata.json +0 -1
  1128. package/chronos/i18n/ar.js +0 -132
  1129. package/chronos/i18n/ar.js.map +0 -1
  1130. package/chronos/i18n/ar.metadata.json +0 -1
  1131. package/chronos/i18n/cs.js +0 -191
  1132. package/chronos/i18n/cs.js.map +0 -1
  1133. package/chronos/i18n/cs.metadata.json +0 -1
  1134. package/chronos/i18n/da.js +0 -51
  1135. package/chronos/i18n/da.js.map +0 -1
  1136. package/chronos/i18n/da.metadata.json +0 -1
  1137. package/chronos/i18n/de.js +0 -73
  1138. package/chronos/i18n/de.js.map +0 -1
  1139. package/chronos/i18n/de.metadata.json +0 -1
  1140. package/chronos/i18n/en-gb.js +0 -62
  1141. package/chronos/i18n/en-gb.js.map +0 -1
  1142. package/chronos/i18n/en-gb.metadata.json +0 -1
  1143. package/chronos/i18n/es-do.js +0 -86
  1144. package/chronos/i18n/es-do.js.map +0 -1
  1145. package/chronos/i18n/es-do.metadata.json +0 -1
  1146. package/chronos/i18n/es-us.js +0 -80
  1147. package/chronos/i18n/es-us.js.map +0 -1
  1148. package/chronos/i18n/es-us.metadata.json +0 -1
  1149. package/chronos/i18n/es.js +0 -85
  1150. package/chronos/i18n/es.js.map +0 -1
  1151. package/chronos/i18n/es.metadata.json +0 -1
  1152. package/chronos/i18n/fi.js +0 -101
  1153. package/chronos/i18n/fi.js.map +0 -1
  1154. package/chronos/i18n/fi.metadata.json +0 -1
  1155. package/chronos/i18n/fr.js +0 -77
  1156. package/chronos/i18n/fr.js.map +0 -1
  1157. package/chronos/i18n/fr.metadata.json +0 -1
  1158. package/chronos/i18n/gl.js +0 -85
  1159. package/chronos/i18n/gl.js.map +0 -1
  1160. package/chronos/i18n/gl.metadata.json +0 -1
  1161. package/chronos/i18n/he.js +0 -98
  1162. package/chronos/i18n/he.js.map +0 -1
  1163. package/chronos/i18n/he.metadata.json +0 -1
  1164. package/chronos/i18n/hi.js +0 -125
  1165. package/chronos/i18n/hi.js.map +0 -1
  1166. package/chronos/i18n/hi.metadata.json +0 -1
  1167. package/chronos/i18n/hu.js +0 -105
  1168. package/chronos/i18n/hu.js.map +0 -1
  1169. package/chronos/i18n/hu.metadata.json +0 -1
  1170. package/chronos/i18n/id.js +0 -84
  1171. package/chronos/i18n/id.js.map +0 -1
  1172. package/chronos/i18n/id.metadata.json +0 -1
  1173. package/chronos/i18n/it.js +0 -66
  1174. package/chronos/i18n/it.js.map +0 -1
  1175. package/chronos/i18n/it.metadata.json +0 -1
  1176. package/chronos/i18n/ja.js +0 -75
  1177. package/chronos/i18n/ja.js.map +0 -1
  1178. package/chronos/i18n/ja.metadata.json +0 -1
  1179. package/chronos/i18n/ko.js +0 -77
  1180. package/chronos/i18n/ko.js.map +0 -1
  1181. package/chronos/i18n/ko.metadata.json +0 -1
  1182. package/chronos/i18n/mn.js +0 -99
  1183. package/chronos/i18n/mn.js.map +0 -1
  1184. package/chronos/i18n/mn.metadata.json +0 -1
  1185. package/chronos/i18n/nl-be.js +0 -82
  1186. package/chronos/i18n/nl-be.js.map +0 -1
  1187. package/chronos/i18n/nl-be.metadata.json +0 -1
  1188. package/chronos/i18n/nl.js +0 -81
  1189. package/chronos/i18n/nl.js.map +0 -1
  1190. package/chronos/i18n/nl.metadata.json +0 -1
  1191. package/chronos/i18n/pl.js +0 -121
  1192. package/chronos/i18n/pl.js.map +0 -1
  1193. package/chronos/i18n/pl.metadata.json +0 -1
  1194. package/chronos/i18n/pt-br.js +0 -56
  1195. package/chronos/i18n/pt-br.js.map +0 -1
  1196. package/chronos/i18n/pt-br.metadata.json +0 -1
  1197. package/chronos/i18n/ro.js +0 -67
  1198. package/chronos/i18n/ro.js.map +0 -1
  1199. package/chronos/i18n/ro.metadata.json +0 -1
  1200. package/chronos/i18n/ru.js +0 -182
  1201. package/chronos/i18n/ru.js.map +0 -1
  1202. package/chronos/i18n/ru.metadata.json +0 -1
  1203. package/chronos/i18n/sl.js +0 -185
  1204. package/chronos/i18n/sl.js.map +0 -1
  1205. package/chronos/i18n/sl.metadata.json +0 -1
  1206. package/chronos/i18n/sv.js +0 -64
  1207. package/chronos/i18n/sv.js.map +0 -1
  1208. package/chronos/i18n/sv.metadata.json +0 -1
  1209. package/chronos/i18n/th.js +0 -60
  1210. package/chronos/i18n/th.js.map +0 -1
  1211. package/chronos/i18n/th.metadata.json +0 -1
  1212. package/chronos/i18n/tr.js +0 -84
  1213. package/chronos/i18n/tr.js.map +0 -1
  1214. package/chronos/i18n/tr.metadata.json +0 -1
  1215. package/chronos/i18n/zh-cn.js +0 -115
  1216. package/chronos/i18n/zh-cn.js.map +0 -1
  1217. package/chronos/i18n/zh-cn.metadata.json +0 -1
  1218. package/chronos/index.js +0 -7
  1219. package/chronos/index.js.map +0 -1
  1220. package/chronos/index.metadata.json +0 -1
  1221. package/chronos/locale/calendar.js +0 -9
  1222. package/chronos/locale/calendar.js.map +0 -1
  1223. package/chronos/locale/calendar.metadata.json +0 -1
  1224. package/chronos/locale/locale.class.js +0 -550
  1225. package/chronos/locale/locale.class.js.map +0 -1
  1226. package/chronos/locale/locale.class.metadata.json +0 -1
  1227. package/chronos/locale/locale.defaults.js +0 -41
  1228. package/chronos/locale/locale.defaults.js.map +0 -1
  1229. package/chronos/locale/locale.defaults.metadata.json +0 -1
  1230. package/chronos/locale/locales.js +0 -194
  1231. package/chronos/locale/locales.js.map +0 -1
  1232. package/chronos/locale/locales.metadata.json +0 -1
  1233. package/chronos/moment/add-subtract.js +0 -35
  1234. package/chronos/moment/add-subtract.js.map +0 -1
  1235. package/chronos/moment/add-subtract.metadata.json +0 -1
  1236. package/chronos/moment/calendar.js +0 -43
  1237. package/chronos/moment/calendar.js.map +0 -1
  1238. package/chronos/moment/calendar.metadata.json +0 -1
  1239. package/chronos/moment/diff.js +0 -71
  1240. package/chronos/moment/diff.js.map +0 -1
  1241. package/chronos/moment/diff.metadata.json +0 -1
  1242. package/chronos/moment/min-max.js +0 -41
  1243. package/chronos/moment/min-max.js.map +0 -1
  1244. package/chronos/moment/min-max.metadata.json +0 -1
  1245. package/chronos/parse/regex.js +0 -49
  1246. package/chronos/parse/regex.js.map +0 -1
  1247. package/chronos/parse/regex.metadata.json +0 -1
  1248. package/chronos/parse/token.js +0 -31
  1249. package/chronos/parse/token.js.map +0 -1
  1250. package/chronos/parse/token.metadata.json +0 -1
  1251. package/chronos/test/chain.js +0 -738
  1252. package/chronos/test/chain.js.map +0 -1
  1253. package/chronos/test/chain.metadata.json +0 -1
  1254. package/chronos/types.js +0 -1
  1255. package/chronos/types.js.map +0 -1
  1256. package/chronos/types.metadata.json +0 -1
  1257. package/chronos/units/aliases.js +0 -35
  1258. package/chronos/units/aliases.js.map +0 -1
  1259. package/chronos/units/aliases.metadata.json +0 -1
  1260. package/chronos/units/constants.js +0 -11
  1261. package/chronos/units/constants.js.map +0 -1
  1262. package/chronos/units/constants.metadata.json +0 -1
  1263. package/chronos/units/day-of-month.js +0 -28
  1264. package/chronos/units/day-of-month.js.map +0 -1
  1265. package/chronos/units/day-of-week.js +0 -129
  1266. package/chronos/units/day-of-week.js.map +0 -1
  1267. package/chronos/units/day-of-week.metadata.json +0 -1
  1268. package/chronos/units/day-of-year.js +0 -34
  1269. package/chronos/units/day-of-year.js.map +0 -1
  1270. package/chronos/units/day-of-year.metadata.json +0 -1
  1271. package/chronos/units/hour.js +0 -122
  1272. package/chronos/units/hour.js.map +0 -1
  1273. package/chronos/units/index.js +0 -19
  1274. package/chronos/units/index.js.map +0 -1
  1275. package/chronos/units/millisecond.js +0 -58
  1276. package/chronos/units/millisecond.js.map +0 -1
  1277. package/chronos/units/minute.js +0 -20
  1278. package/chronos/units/minute.js.map +0 -1
  1279. package/chronos/units/month.js +0 -61
  1280. package/chronos/units/month.js.map +0 -1
  1281. package/chronos/units/month.metadata.json +0 -1
  1282. package/chronos/units/offset.js +0 -212
  1283. package/chronos/units/offset.js.map +0 -1
  1284. package/chronos/units/offset.metadata.json +0 -1
  1285. package/chronos/units/priorities.js +0 -21
  1286. package/chronos/units/priorities.js.map +0 -1
  1287. package/chronos/units/priorities.metadata.json +0 -1
  1288. package/chronos/units/quarter.js +0 -37
  1289. package/chronos/units/quarter.js.map +0 -1
  1290. package/chronos/units/quarter.metadata.json +0 -1
  1291. package/chronos/units/second.js +0 -20
  1292. package/chronos/units/second.js.map +0 -1
  1293. package/chronos/units/timestamp.js +0 -24
  1294. package/chronos/units/timestamp.js.map +0 -1
  1295. package/chronos/units/timezone.js +0 -17
  1296. package/chronos/units/timezone.js.map +0 -1
  1297. package/chronos/units/timezone.metadata.json +0 -1
  1298. package/chronos/units/week-calendar-utils.js +0 -63
  1299. package/chronos/units/week-calendar-utils.js.map +0 -1
  1300. package/chronos/units/week-calendar-utils.metadata.json +0 -1
  1301. package/chronos/units/week-year.js +0 -102
  1302. package/chronos/units/week-year.js.map +0 -1
  1303. package/chronos/units/week-year.metadata.json +0 -1
  1304. package/chronos/units/week.js +0 -56
  1305. package/chronos/units/week.js.map +0 -1
  1306. package/chronos/units/week.metadata.json +0 -1
  1307. package/chronos/units/year.js +0 -55
  1308. package/chronos/units/year.js.map +0 -1
  1309. package/chronos/units/year.metadata.json +0 -1
  1310. package/chronos/utils/abs-ceil.js +0 -4
  1311. package/chronos/utils/abs-ceil.js.map +0 -1
  1312. package/chronos/utils/abs-ceil.metadata.json +0 -1
  1313. package/chronos/utils/abs-round.js +0 -4
  1314. package/chronos/utils/abs-round.js.map +0 -1
  1315. package/chronos/utils/abs-round.metadata.json +0 -1
  1316. package/chronos/utils/compare-arrays.js +0 -15
  1317. package/chronos/utils/compare-arrays.js.map +0 -1
  1318. package/chronos/utils/compare-arrays.metadata.json +0 -1
  1319. package/chronos/utils/date-compare.js +0 -50
  1320. package/chronos/utils/date-compare.js.map +0 -1
  1321. package/chronos/utils/date-compare.metadata.json +0 -1
  1322. package/chronos/utils/date-getters.js +0 -75
  1323. package/chronos/utils/date-getters.js.map +0 -1
  1324. package/chronos/utils/date-getters.metadata.json +0 -1
  1325. package/chronos/utils/date-setters.js +0 -74
  1326. package/chronos/utils/date-setters.js.map +0 -1
  1327. package/chronos/utils/date-setters.metadata.json +0 -1
  1328. package/chronos/utils/defaults.js +0 -11
  1329. package/chronos/utils/defaults.js.map +0 -1
  1330. package/chronos/utils/defaults.metadata.json +0 -1
  1331. package/chronos/utils/start-end-of.js +0 -57
  1332. package/chronos/utils/start-end-of.js.map +0 -1
  1333. package/chronos/utils/start-end-of.metadata.json +0 -1
  1334. package/chronos/utils/type-checks.js +0 -56
  1335. package/chronos/utils/type-checks.js.map +0 -1
  1336. package/chronos/utils/type-checks.metadata.json +0 -1
  1337. package/chronos/utils/zero-fill.js +0 -10
  1338. package/chronos/utils/zero-fill.js.map +0 -1
  1339. package/chronos/utils/zero-fill.metadata.json +0 -1
  1340. package/chronos/utils.js +0 -7
  1341. package/chronos/utils.js.map +0 -1
  1342. package/chronos/utils.metadata.json +0 -1
  1343. package/collapse/collapse.directive.js +0 -98
  1344. package/collapse/collapse.directive.js.map +0 -1
  1345. package/collapse/collapse.directive.metadata.json +0 -1
  1346. package/collapse/collapse.directive.ngfactory.js.map +0 -1
  1347. package/collapse/collapse.module.js +0 -18
  1348. package/collapse/collapse.module.js.map +0 -1
  1349. package/collapse/collapse.module.metadata.json +0 -1
  1350. package/collapse/collapse.module.ngfactory.js.map +0 -1
  1351. package/collapse/index.js +0 -3
  1352. package/collapse/index.js.map +0 -1
  1353. package/collapse/index.metadata.json +0 -1
  1354. package/component-loader/bs-component-ref.class.js +0 -7
  1355. package/component-loader/bs-component-ref.class.js.map +0 -1
  1356. package/component-loader/bs-component-ref.class.metadata.json +0 -1
  1357. package/component-loader/component-loader.class.js +0 -258
  1358. package/component-loader/component-loader.class.js.map +0 -1
  1359. package/component-loader/component-loader.class.metadata.json +0 -1
  1360. package/component-loader/component-loader.factory.js +0 -50
  1361. package/component-loader/component-loader.factory.js.map +0 -1
  1362. package/component-loader/component-loader.factory.metadata.json +0 -1
  1363. package/component-loader/component-loader.factory.ngfactory.js.map +0 -1
  1364. package/component-loader/content-ref.class.js +0 -14
  1365. package/component-loader/content-ref.class.js.map +0 -1
  1366. package/component-loader/content-ref.class.metadata.json +0 -1
  1367. package/component-loader/index.d.ts +0 -3
  1368. package/component-loader/index.js +0 -4
  1369. package/component-loader/index.js.map +0 -1
  1370. package/component-loader/index.metadata.json +0 -1
  1371. package/component-loader/listen-options.model.js +0 -1
  1372. package/component-loader/listen-options.model.js.map +0 -1
  1373. package/component-loader/listen-options.model.metadata.json +0 -1
  1374. package/datepicker/base/bs-datepicker-container.js +0 -40
  1375. package/datepicker/base/bs-datepicker-container.js.map +0 -1
  1376. package/datepicker/base/bs-datepicker-container.metadata.json +0 -1
  1377. package/datepicker/bs-datepicker-input.directive.js +0 -134
  1378. package/datepicker/bs-datepicker-input.directive.js.map +0 -1
  1379. package/datepicker/bs-datepicker-input.directive.metadata.json +0 -1
  1380. package/datepicker/bs-datepicker-input.directive.ngfactory.js.map +0 -1
  1381. package/datepicker/bs-datepicker.component.js +0 -217
  1382. package/datepicker/bs-datepicker.component.js.map +0 -1
  1383. package/datepicker/bs-datepicker.component.metadata.json +0 -1
  1384. package/datepicker/bs-datepicker.component.ngfactory.js.map +0 -1
  1385. package/datepicker/bs-datepicker.config.js +0 -39
  1386. package/datepicker/bs-datepicker.config.js.map +0 -1
  1387. package/datepicker/bs-datepicker.config.metadata.json +0 -1
  1388. package/datepicker/bs-datepicker.config.ngfactory.js.map +0 -1
  1389. package/datepicker/bs-datepicker.module.js +0 -80
  1390. package/datepicker/bs-datepicker.module.js.map +0 -1
  1391. package/datepicker/bs-datepicker.module.metadata.json +0 -1
  1392. package/datepicker/bs-datepicker.module.ngfactory.js.map +0 -1
  1393. package/datepicker/bs-daterangepicker-input.directive.js +0 -150
  1394. package/datepicker/bs-daterangepicker-input.directive.js.map +0 -1
  1395. package/datepicker/bs-daterangepicker-input.directive.metadata.json +0 -1
  1396. package/datepicker/bs-daterangepicker-input.directive.ngfactory.js.map +0 -1
  1397. package/datepicker/bs-daterangepicker.component.js +0 -220
  1398. package/datepicker/bs-daterangepicker.component.js.map +0 -1
  1399. package/datepicker/bs-daterangepicker.component.metadata.json +0 -1
  1400. package/datepicker/bs-daterangepicker.component.ngfactory.js.map +0 -1
  1401. package/datepicker/bs-daterangepicker.config.js +0 -27
  1402. package/datepicker/bs-daterangepicker.config.js.map +0 -1
  1403. package/datepicker/bs-daterangepicker.config.metadata.json +0 -1
  1404. package/datepicker/bs-daterangepicker.config.ngfactory.js.map +0 -1
  1405. package/datepicker/bs-locale.service.js +0 -42
  1406. package/datepicker/bs-locale.service.js.map +0 -1
  1407. package/datepicker/bs-locale.service.metadata.json +0 -1
  1408. package/datepicker/bs-locale.service.ngfactory.js.map +0 -1
  1409. package/datepicker/date-formatter.js +0 -11
  1410. package/datepicker/date-formatter.js.map +0 -1
  1411. package/datepicker/date-formatter.metadata.json +0 -1
  1412. package/datepicker/datepicker-inner.component.js +0 -317
  1413. package/datepicker/datepicker-inner.component.js.map +0 -1
  1414. package/datepicker/datepicker-inner.component.metadata.json +0 -1
  1415. package/datepicker/datepicker-inner.component.ngfactory.js.map +0 -1
  1416. package/datepicker/datepicker.component.js +0 -114
  1417. package/datepicker/datepicker.component.js.map +0 -1
  1418. package/datepicker/datepicker.component.metadata.json +0 -1
  1419. package/datepicker/datepicker.component.ngfactory.js.map +0 -1
  1420. package/datepicker/datepicker.config.js +0 -28
  1421. package/datepicker/datepicker.config.js.map +0 -1
  1422. package/datepicker/datepicker.config.metadata.json +0 -1
  1423. package/datepicker/datepicker.config.ngfactory.js.map +0 -1
  1424. package/datepicker/datepicker.module.js +0 -39
  1425. package/datepicker/datepicker.module.js.map +0 -1
  1426. package/datepicker/datepicker.module.metadata.json +0 -1
  1427. package/datepicker/datepicker.module.ngfactory.js.map +0 -1
  1428. package/datepicker/daypicker.component.js +0 -116
  1429. package/datepicker/daypicker.component.js.map +0 -1
  1430. package/datepicker/daypicker.component.metadata.json +0 -1
  1431. package/datepicker/daypicker.component.ngfactory.js.map +0 -1
  1432. package/datepicker/engine/calc-days-calendar.js +0 -19
  1433. package/datepicker/engine/calc-days-calendar.js.map +0 -1
  1434. package/datepicker/engine/calc-days-calendar.metadata.json +0 -1
  1435. package/datepicker/engine/flag-days-calendar.js +0 -72
  1436. package/datepicker/engine/flag-days-calendar.js.map +0 -1
  1437. package/datepicker/engine/flag-days-calendar.metadata.json +0 -1
  1438. package/datepicker/engine/flag-months-calendar.js +0 -30
  1439. package/datepicker/engine/flag-months-calendar.js.map +0 -1
  1440. package/datepicker/engine/flag-months-calendar.metadata.json +0 -1
  1441. package/datepicker/engine/flag-years-calendar.js +0 -29
  1442. package/datepicker/engine/flag-years-calendar.js.map +0 -1
  1443. package/datepicker/engine/flag-years-calendar.metadata.json +0 -1
  1444. package/datepicker/engine/format-days-calendar.js +0 -34
  1445. package/datepicker/engine/format-days-calendar.js.map +0 -1
  1446. package/datepicker/engine/format-days-calendar.metadata.json +0 -1
  1447. package/datepicker/engine/format-months-calendar.js +0 -22
  1448. package/datepicker/engine/format-months-calendar.js.map +0 -1
  1449. package/datepicker/engine/format-months-calendar.metadata.json +0 -1
  1450. package/datepicker/engine/format-years-calendar.js +0 -30
  1451. package/datepicker/engine/format-years-calendar.js.map +0 -1
  1452. package/datepicker/engine/format-years-calendar.metadata.json +0 -1
  1453. package/datepicker/engine/view-mode.js +0 -4
  1454. package/datepicker/engine/view-mode.js.map +0 -1
  1455. package/datepicker/engine/view-mode.metadata.json +0 -1
  1456. package/datepicker/index.d.ts +0 -13
  1457. package/datepicker/index.js +0 -14
  1458. package/datepicker/index.js.map +0 -1
  1459. package/datepicker/index.metadata.json +0 -1
  1460. package/datepicker/models/index.js +0 -15
  1461. package/datepicker/models/index.js.map +0 -1
  1462. package/datepicker/models/index.metadata.json +0 -1
  1463. package/datepicker/monthpicker.component.js +0 -56
  1464. package/datepicker/monthpicker.component.js.map +0 -1
  1465. package/datepicker/monthpicker.component.metadata.json +0 -1
  1466. package/datepicker/monthpicker.component.ngfactory.js.map +0 -1
  1467. package/datepicker/reducer/_defaults.js +0 -5
  1468. package/datepicker/reducer/_defaults.js.map +0 -1
  1469. package/datepicker/reducer/_defaults.metadata.json +0 -1
  1470. package/datepicker/reducer/bs-datepicker.actions.js +0 -104
  1471. package/datepicker/reducer/bs-datepicker.actions.js.map +0 -1
  1472. package/datepicker/reducer/bs-datepicker.actions.metadata.json +0 -1
  1473. package/datepicker/reducer/bs-datepicker.actions.ngfactory.js.map +0 -1
  1474. package/datepicker/reducer/bs-datepicker.effects.js +0 -179
  1475. package/datepicker/reducer/bs-datepicker.effects.js.map +0 -1
  1476. package/datepicker/reducer/bs-datepicker.effects.metadata.json +0 -1
  1477. package/datepicker/reducer/bs-datepicker.effects.ngfactory.js.map +0 -1
  1478. package/datepicker/reducer/bs-datepicker.reducer.js +0 -261
  1479. package/datepicker/reducer/bs-datepicker.reducer.js.map +0 -1
  1480. package/datepicker/reducer/bs-datepicker.reducer.metadata.json +0 -1
  1481. package/datepicker/reducer/bs-datepicker.state.js +0 -16
  1482. package/datepicker/reducer/bs-datepicker.state.js.map +0 -1
  1483. package/datepicker/reducer/bs-datepicker.state.metadata.json +0 -1
  1484. package/datepicker/reducer/bs-datepicker.store.js +0 -36
  1485. package/datepicker/reducer/bs-datepicker.store.js.map +0 -1
  1486. package/datepicker/reducer/bs-datepicker.store.metadata.json +0 -1
  1487. package/datepicker/reducer/bs-datepicker.store.ngfactory.js.map +0 -1
  1488. package/datepicker/themes/bs/bs-calendar-layout.component.js +0 -14
  1489. package/datepicker/themes/bs/bs-calendar-layout.component.js.map +0 -1
  1490. package/datepicker/themes/bs/bs-calendar-layout.component.metadata.json +0 -1
  1491. package/datepicker/themes/bs/bs-calendar-layout.component.ngfactory.js.map +0 -1
  1492. package/datepicker/themes/bs/bs-current-date-view.component.js +0 -18
  1493. package/datepicker/themes/bs/bs-current-date-view.component.js.map +0 -1
  1494. package/datepicker/themes/bs/bs-current-date-view.component.metadata.json +0 -1
  1495. package/datepicker/themes/bs/bs-current-date-view.component.ngfactory.js.map +0 -1
  1496. package/datepicker/themes/bs/bs-custom-dates-view.component.js +0 -20
  1497. package/datepicker/themes/bs/bs-custom-dates-view.component.js.map +0 -1
  1498. package/datepicker/themes/bs/bs-custom-dates-view.component.metadata.json +0 -1
  1499. package/datepicker/themes/bs/bs-custom-dates-view.component.ngfactory.js.map +0 -1
  1500. package/datepicker/themes/bs/bs-datepicker-container.component.js +0 -87
  1501. package/datepicker/themes/bs/bs-datepicker-container.component.js.map +0 -1
  1502. package/datepicker/themes/bs/bs-datepicker-container.component.metadata.json +0 -1
  1503. package/datepicker/themes/bs/bs-datepicker-container.component.ngfactory.js.map +0 -1
  1504. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.js +0 -28
  1505. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.js.map +0 -1
  1506. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.metadata.json +0 -1
  1507. package/datepicker/themes/bs/bs-datepicker-day-decorator.directive.ngfactory.js.map +0 -1
  1508. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.js +0 -30
  1509. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.js.map +0 -1
  1510. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.metadata.json +0 -1
  1511. package/datepicker/themes/bs/bs-datepicker-navigation-view.component.ngfactory.js.map +0 -1
  1512. package/datepicker/themes/bs/bs-datepicker-view.html +0 -61
  1513. package/datepicker/themes/bs/bs-daterangepicker-container.component.js +0 -105
  1514. package/datepicker/themes/bs/bs-daterangepicker-container.component.js.map +0 -1
  1515. package/datepicker/themes/bs/bs-daterangepicker-container.component.metadata.json +0 -1
  1516. package/datepicker/themes/bs/bs-daterangepicker-container.component.ngfactory.js.map +0 -1
  1517. package/datepicker/themes/bs/bs-days-calendar-view.component.js +0 -42
  1518. package/datepicker/themes/bs/bs-days-calendar-view.component.js.map +0 -1
  1519. package/datepicker/themes/bs/bs-days-calendar-view.component.metadata.json +0 -1
  1520. package/datepicker/themes/bs/bs-days-calendar-view.component.ngfactory.js.map +0 -1
  1521. package/datepicker/themes/bs/bs-months-calendar-view.component.js +0 -40
  1522. package/datepicker/themes/bs/bs-months-calendar-view.component.js.map +0 -1
  1523. package/datepicker/themes/bs/bs-months-calendar-view.component.metadata.json +0 -1
  1524. package/datepicker/themes/bs/bs-months-calendar-view.component.ngfactory.js.map +0 -1
  1525. package/datepicker/themes/bs/bs-timepicker-view.component.js +0 -17
  1526. package/datepicker/themes/bs/bs-timepicker-view.component.js.map +0 -1
  1527. package/datepicker/themes/bs/bs-timepicker-view.component.metadata.json +0 -1
  1528. package/datepicker/themes/bs/bs-timepicker-view.component.ngfactory.js.map +0 -1
  1529. package/datepicker/themes/bs/bs-years-calendar-view.component.js +0 -41
  1530. package/datepicker/themes/bs/bs-years-calendar-view.component.js.map +0 -1
  1531. package/datepicker/themes/bs/bs-years-calendar-view.component.metadata.json +0 -1
  1532. package/datepicker/themes/bs/bs-years-calendar-view.component.ngfactory.js.map +0 -1
  1533. package/datepicker/utils/bs-calendar-utils.js +0 -30
  1534. package/datepicker/utils/bs-calendar-utils.js.map +0 -1
  1535. package/datepicker/utils/bs-calendar-utils.metadata.json +0 -1
  1536. package/datepicker/utils/matrix-utils.js +0 -14
  1537. package/datepicker/utils/matrix-utils.js.map +0 -1
  1538. package/datepicker/utils/matrix-utils.metadata.json +0 -1
  1539. package/datepicker/yearpicker.component.js +0 -57
  1540. package/datepicker/yearpicker.component.js.map +0 -1
  1541. package/datepicker/yearpicker.component.metadata.json +0 -1
  1542. package/datepicker/yearpicker.component.ngfactory.js.map +0 -1
  1543. package/dropdown/bs-dropdown-container.component.js +0 -59
  1544. package/dropdown/bs-dropdown-container.component.js.map +0 -1
  1545. package/dropdown/bs-dropdown-container.component.metadata.json +0 -1
  1546. package/dropdown/bs-dropdown-container.component.ngfactory.js.map +0 -1
  1547. package/dropdown/bs-dropdown-menu.directive.js +0 -25
  1548. package/dropdown/bs-dropdown-menu.directive.js.map +0 -1
  1549. package/dropdown/bs-dropdown-menu.directive.metadata.json +0 -1
  1550. package/dropdown/bs-dropdown-menu.directive.ngfactory.js.map +0 -1
  1551. package/dropdown/bs-dropdown-toggle.directive.js +0 -63
  1552. package/dropdown/bs-dropdown-toggle.directive.js.map +0 -1
  1553. package/dropdown/bs-dropdown-toggle.directive.metadata.json +0 -1
  1554. package/dropdown/bs-dropdown-toggle.directive.ngfactory.js.map +0 -1
  1555. package/dropdown/bs-dropdown.config.js +0 -14
  1556. package/dropdown/bs-dropdown.config.js.map +0 -1
  1557. package/dropdown/bs-dropdown.config.metadata.json +0 -1
  1558. package/dropdown/bs-dropdown.config.ngfactory.js.map +0 -1
  1559. package/dropdown/bs-dropdown.directive.js +0 -300
  1560. package/dropdown/bs-dropdown.directive.js.map +0 -1
  1561. package/dropdown/bs-dropdown.directive.metadata.json +0 -1
  1562. package/dropdown/bs-dropdown.directive.ngfactory.js.map +0 -1
  1563. package/dropdown/bs-dropdown.module.js +0 -46
  1564. package/dropdown/bs-dropdown.module.js.map +0 -1
  1565. package/dropdown/bs-dropdown.module.metadata.json +0 -1
  1566. package/dropdown/bs-dropdown.module.ngfactory.js.map +0 -1
  1567. package/dropdown/bs-dropdown.state.js +0 -21
  1568. package/dropdown/bs-dropdown.state.js.map +0 -1
  1569. package/dropdown/bs-dropdown.state.metadata.json +0 -1
  1570. package/dropdown/bs-dropdown.state.ngfactory.js.map +0 -1
  1571. package/dropdown/index.js +0 -8
  1572. package/dropdown/index.js.map +0 -1
  1573. package/dropdown/index.metadata.json +0 -1
  1574. package/index.d.ts +0 -24
  1575. package/index.js +0 -25
  1576. package/index.js.map +0 -1
  1577. package/index.metadata.json +0 -1
  1578. package/locale.d.ts +0 -30
  1579. package/locale.js +0 -31
  1580. package/locale.js.map +0 -1
  1581. package/locale.metadata.json +0 -1
  1582. package/mini-ngrx/LICENCE +0 -21
  1583. package/mini-ngrx/index.js +0 -3
  1584. package/mini-ngrx/index.js.map +0 -1
  1585. package/mini-ngrx/index.metadata.json +0 -1
  1586. package/mini-ngrx/state.class.js +0 -30
  1587. package/mini-ngrx/state.class.js.map +0 -1
  1588. package/mini-ngrx/state.class.metadata.json +0 -1
  1589. package/mini-ngrx/store.class.js +0 -46
  1590. package/mini-ngrx/store.class.js.map +0 -1
  1591. package/mini-ngrx/store.class.metadata.json +0 -1
  1592. package/modal/bs-modal-ref.service.js +0 -15
  1593. package/modal/bs-modal-ref.service.js.map +0 -1
  1594. package/modal/bs-modal-ref.service.metadata.json +0 -1
  1595. package/modal/bs-modal-ref.service.ngfactory.js.map +0 -1
  1596. package/modal/bs-modal.service.js +0 -174
  1597. package/modal/bs-modal.service.js.map +0 -1
  1598. package/modal/bs-modal.service.metadata.json +0 -1
  1599. package/modal/bs-modal.service.ngfactory.js.map +0 -1
  1600. package/modal/index.js +0 -9
  1601. package/modal/index.js.map +0 -1
  1602. package/modal/index.metadata.json +0 -1
  1603. package/modal/modal-backdrop.component.js +0 -69
  1604. package/modal/modal-backdrop.component.js.map +0 -1
  1605. package/modal/modal-backdrop.component.metadata.json +0 -1
  1606. package/modal/modal-backdrop.component.ngfactory.js.map +0 -1
  1607. package/modal/modal-backdrop.options.js +0 -9
  1608. package/modal/modal-backdrop.options.js.map +0 -1
  1609. package/modal/modal-backdrop.options.metadata.json +0 -1
  1610. package/modal/modal-container.component.js +0 -103
  1611. package/modal/modal-container.component.js.map +0 -1
  1612. package/modal/modal-container.component.metadata.json +0 -1
  1613. package/modal/modal-container.component.ngfactory.js.map +0 -1
  1614. package/modal/modal-options.class.js +0 -44
  1615. package/modal/modal-options.class.js.map +0 -1
  1616. package/modal/modal-options.class.metadata.json +0 -1
  1617. package/modal/modal-options.class.ngfactory.js.map +0 -1
  1618. package/modal/modal.directive.js +0 -436
  1619. package/modal/modal.directive.js.map +0 -1
  1620. package/modal/modal.directive.metadata.json +0 -1
  1621. package/modal/modal.directive.ngfactory.js.map +0 -1
  1622. package/modal/modal.module.js +0 -31
  1623. package/modal/modal.module.js.map +0 -1
  1624. package/modal/modal.module.metadata.json +0 -1
  1625. package/modal/modal.module.ngfactory.js.map +0 -1
  1626. package/pagination/index.js +0 -5
  1627. package/pagination/index.js.map +0 -1
  1628. package/pagination/index.metadata.json +0 -1
  1629. package/pagination/pager.component.html +0 -12
  1630. package/pagination/pager.component.js +0 -249
  1631. package/pagination/pager.component.js.map +0 -1
  1632. package/pagination/pager.component.metadata.json +0 -1
  1633. package/pagination/pager.component.ngfactory.js.map +0 -1
  1634. package/pagination/pagination.component.html +0 -35
  1635. package/pagination/pagination.component.js +0 -249
  1636. package/pagination/pagination.component.js.map +0 -1
  1637. package/pagination/pagination.component.metadata.json +0 -1
  1638. package/pagination/pagination.component.ngfactory.js.map +0 -1
  1639. package/pagination/pagination.config.js +0 -31
  1640. package/pagination/pagination.config.js.map +0 -1
  1641. package/pagination/pagination.config.metadata.json +0 -1
  1642. package/pagination/pagination.config.ngfactory.js.map +0 -1
  1643. package/pagination/pagination.module.js +0 -22
  1644. package/pagination/pagination.module.js.map +0 -1
  1645. package/pagination/pagination.module.metadata.json +0 -1
  1646. package/pagination/pagination.module.ngfactory.js.map +0 -1
  1647. package/popover/index.js +0 -5
  1648. package/popover/index.js.map +0 -1
  1649. package/popover/index.metadata.json +0 -1
  1650. package/popover/popover-container.component.html +0 -5
  1651. package/popover/popover-container.component.js +0 -43
  1652. package/popover/popover-container.component.js.map +0 -1
  1653. package/popover/popover-container.component.metadata.json +0 -1
  1654. package/popover/popover-container.component.ngfactory.js.map +0 -1
  1655. package/popover/popover.config.js +0 -27
  1656. package/popover/popover.config.js.map +0 -1
  1657. package/popover/popover.config.metadata.json +0 -1
  1658. package/popover/popover.config.ngfactory.js.map +0 -1
  1659. package/popover/popover.directive.js +0 -165
  1660. package/popover/popover.directive.js.map +0 -1
  1661. package/popover/popover.directive.metadata.json +0 -1
  1662. package/popover/popover.directive.ngfactory.js.map +0 -1
  1663. package/popover/popover.module.js +0 -28
  1664. package/popover/popover.module.js.map +0 -1
  1665. package/popover/popover.module.metadata.json +0 -1
  1666. package/popover/popover.module.ngfactory.js.map +0 -1
  1667. package/positioning/index.js +0 -3
  1668. package/positioning/index.js.map +0 -1
  1669. package/positioning/index.metadata.json +0 -1
  1670. package/positioning/ng-positioning.js +0 -216
  1671. package/positioning/ng-positioning.js.map +0 -1
  1672. package/positioning/ng-positioning.metadata.json +0 -1
  1673. package/positioning/positioning.service.js +0 -26
  1674. package/positioning/positioning.service.js.map +0 -1
  1675. package/positioning/positioning.service.metadata.json +0 -1
  1676. package/positioning/positioning.service.ngfactory.js.map +0 -1
  1677. package/progressbar/bar.component.html +0 -1
  1678. package/progressbar/bar.component.js +0 -87
  1679. package/progressbar/bar.component.js.map +0 -1
  1680. package/progressbar/bar.component.metadata.json +0 -1
  1681. package/progressbar/bar.component.ngfactory.js.map +0 -1
  1682. package/progressbar/index.js +0 -5
  1683. package/progressbar/index.js.map +0 -1
  1684. package/progressbar/index.metadata.json +0 -1
  1685. package/progressbar/progressbar.component.html +0 -6
  1686. package/progressbar/progressbar.component.js +0 -76
  1687. package/progressbar/progressbar.component.js.map +0 -1
  1688. package/progressbar/progressbar.component.metadata.json +0 -1
  1689. package/progressbar/progressbar.component.ngfactory.js.map +0 -1
  1690. package/progressbar/progressbar.config.js +0 -15
  1691. package/progressbar/progressbar.config.js.map +0 -1
  1692. package/progressbar/progressbar.config.metadata.json +0 -1
  1693. package/progressbar/progressbar.config.ngfactory.js.map +0 -1
  1694. package/progressbar/progressbar.module.js +0 -22
  1695. package/progressbar/progressbar.module.js.map +0 -1
  1696. package/progressbar/progressbar.module.metadata.json +0 -1
  1697. package/progressbar/progressbar.module.ngfactory.js.map +0 -1
  1698. package/rating/index.js +0 -3
  1699. package/rating/index.js.map +0 -1
  1700. package/rating/index.metadata.json +0 -1
  1701. package/rating/rating.component.html +0 -18
  1702. package/rating/rating.component.js +0 -111
  1703. package/rating/rating.component.js.map +0 -1
  1704. package/rating/rating.component.metadata.json +0 -1
  1705. package/rating/rating.component.ngfactory.js.map +0 -1
  1706. package/rating/rating.module.js +0 -23
  1707. package/rating/rating.module.js.map +0 -1
  1708. package/rating/rating.module.metadata.json +0 -1
  1709. package/rating/rating.module.ngfactory.js.map +0 -1
  1710. package/sortable/draggable-item.js +0 -1
  1711. package/sortable/draggable-item.js.map +0 -1
  1712. package/sortable/draggable-item.metadata.json +0 -1
  1713. package/sortable/draggable-item.service.js +0 -34
  1714. package/sortable/draggable-item.service.js.map +0 -1
  1715. package/sortable/draggable-item.service.metadata.json +0 -1
  1716. package/sortable/draggable-item.service.ngfactory.js.map +0 -1
  1717. package/sortable/index.js +0 -4
  1718. package/sortable/index.js.map +0 -1
  1719. package/sortable/index.metadata.json +0 -1
  1720. package/sortable/sortable.component.js +0 -186
  1721. package/sortable/sortable.component.js.map +0 -1
  1722. package/sortable/sortable.component.metadata.json +0 -1
  1723. package/sortable/sortable.component.ngfactory.js.map +0 -1
  1724. package/sortable/sortable.module.js +0 -21
  1725. package/sortable/sortable.module.js.map +0 -1
  1726. package/sortable/sortable.module.metadata.json +0 -1
  1727. package/sortable/sortable.module.ngfactory.js.map +0 -1
  1728. package/spec/ng-bootstrap/license +0 -23
  1729. package/tabs/index.js +0 -7
  1730. package/tabs/index.js.map +0 -1
  1731. package/tabs/index.metadata.json +0 -1
  1732. package/tabs/ng-transclude.directive.js +0 -34
  1733. package/tabs/ng-transclude.directive.js.map +0 -1
  1734. package/tabs/ng-transclude.directive.metadata.json +0 -1
  1735. package/tabs/ng-transclude.directive.ngfactory.js.map +0 -1
  1736. package/tabs/tab-heading.directive.js +0 -19
  1737. package/tabs/tab-heading.directive.js.map +0 -1
  1738. package/tabs/tab-heading.directive.metadata.json +0 -1
  1739. package/tabs/tab-heading.directive.ngfactory.js.map +0 -1
  1740. package/tabs/tab.directive.js +0 -97
  1741. package/tabs/tab.directive.js.map +0 -1
  1742. package/tabs/tab.directive.metadata.json +0 -1
  1743. package/tabs/tab.directive.ngfactory.js.map +0 -1
  1744. package/tabs/tabs.module.js +0 -37
  1745. package/tabs/tabs.module.js.map +0 -1
  1746. package/tabs/tabs.module.metadata.json +0 -1
  1747. package/tabs/tabs.module.ngfactory.js.map +0 -1
  1748. package/tabs/tabset.component.html +0 -15
  1749. package/tabs/tabset.component.js +0 -134
  1750. package/tabs/tabset.component.js.map +0 -1
  1751. package/tabs/tabset.component.metadata.json +0 -1
  1752. package/tabs/tabset.component.ngfactory.js.map +0 -1
  1753. package/tabs/tabset.config.js +0 -13
  1754. package/tabs/tabset.config.js.map +0 -1
  1755. package/tabs/tabset.config.metadata.json +0 -1
  1756. package/tabs/tabset.config.ngfactory.js.map +0 -1
  1757. package/timepicker/index.js +0 -6
  1758. package/timepicker/index.js.map +0 -1
  1759. package/timepicker/index.metadata.json +0 -1
  1760. package/timepicker/reducer/timepicker.actions.js +0 -53
  1761. package/timepicker/reducer/timepicker.actions.js.map +0 -1
  1762. package/timepicker/reducer/timepicker.actions.metadata.json +0 -1
  1763. package/timepicker/reducer/timepicker.actions.ngfactory.js.map +0 -1
  1764. package/timepicker/reducer/timepicker.reducer.js +0 -90
  1765. package/timepicker/reducer/timepicker.reducer.js.map +0 -1
  1766. package/timepicker/reducer/timepicker.reducer.metadata.json +0 -1
  1767. package/timepicker/reducer/timepicker.store.js +0 -34
  1768. package/timepicker/reducer/timepicker.store.js.map +0 -1
  1769. package/timepicker/reducer/timepicker.store.metadata.json +0 -1
  1770. package/timepicker/reducer/timepicker.store.ngfactory.js.map +0 -1
  1771. package/timepicker/timepicker-controls.util.js +0 -122
  1772. package/timepicker/timepicker-controls.util.js.map +0 -1
  1773. package/timepicker/timepicker-controls.util.metadata.json +0 -1
  1774. package/timepicker/timepicker.component.html +0 -122
  1775. package/timepicker/timepicker.component.js +0 -288
  1776. package/timepicker/timepicker.component.js.map +0 -1
  1777. package/timepicker/timepicker.component.metadata.json +0 -1
  1778. package/timepicker/timepicker.component.ngfactory.js.map +0 -1
  1779. package/timepicker/timepicker.config.js +0 -36
  1780. package/timepicker/timepicker.config.js.map +0 -1
  1781. package/timepicker/timepicker.config.metadata.json +0 -1
  1782. package/timepicker/timepicker.config.ngfactory.js.map +0 -1
  1783. package/timepicker/timepicker.models.js +0 -1
  1784. package/timepicker/timepicker.models.js.map +0 -1
  1785. package/timepicker/timepicker.models.metadata.json +0 -1
  1786. package/timepicker/timepicker.module.js +0 -26
  1787. package/timepicker/timepicker.module.js.map +0 -1
  1788. package/timepicker/timepicker.module.metadata.json +0 -1
  1789. package/timepicker/timepicker.module.ngfactory.js.map +0 -1
  1790. package/timepicker/timepicker.utils.js +0 -141
  1791. package/timepicker/timepicker.utils.js.map +0 -1
  1792. package/timepicker/timepicker.utils.metadata.json +0 -1
  1793. package/tooltip/index.js +0 -5
  1794. package/tooltip/index.js.map +0 -1
  1795. package/tooltip/index.metadata.json +0 -1
  1796. package/tooltip/tooltip-container.component.js +0 -50
  1797. package/tooltip/tooltip-container.component.js.map +0 -1
  1798. package/tooltip/tooltip-container.component.metadata.json +0 -1
  1799. package/tooltip/tooltip-container.component.ngfactory.js.map +0 -1
  1800. package/tooltip/tooltip.config.js +0 -16
  1801. package/tooltip/tooltip.config.js.map +0 -1
  1802. package/tooltip/tooltip.config.metadata.json +0 -1
  1803. package/tooltip/tooltip.config.ngfactory.js.map +0 -1
  1804. package/tooltip/tooltip.directive.js +0 -315
  1805. package/tooltip/tooltip.directive.js.map +0 -1
  1806. package/tooltip/tooltip.directive.metadata.json +0 -1
  1807. package/tooltip/tooltip.directive.ngfactory.js.map +0 -1
  1808. package/tooltip/tooltip.module.js +0 -28
  1809. package/tooltip/tooltip.module.js.map +0 -1
  1810. package/tooltip/tooltip.module.metadata.json +0 -1
  1811. package/tooltip/tooltip.module.ngfactory.js.map +0 -1
  1812. package/tsconfig.spec.json +0 -41
  1813. package/typeahead/index.d.ts +0 -7
  1814. package/typeahead/index.js +0 -8
  1815. package/typeahead/index.js.map +0 -1
  1816. package/typeahead/index.metadata.json +0 -1
  1817. package/typeahead/latin-map.js +0 -828
  1818. package/typeahead/latin-map.js.map +0 -1
  1819. package/typeahead/latin-map.metadata.json +0 -1
  1820. package/typeahead/typeahead-container.component.html +0 -42
  1821. package/typeahead/typeahead-container.component.js +0 -240
  1822. package/typeahead/typeahead-container.component.js.map +0 -1
  1823. package/typeahead/typeahead-container.component.metadata.json +0 -1
  1824. package/typeahead/typeahead-container.component.ngfactory.js.map +0 -1
  1825. package/typeahead/typeahead-match.class.js +0 -18
  1826. package/typeahead/typeahead-match.class.js.map +0 -1
  1827. package/typeahead/typeahead-match.class.metadata.json +0 -1
  1828. package/typeahead/typeahead-options.class.js +0 -8
  1829. package/typeahead/typeahead-options.class.js.map +0 -1
  1830. package/typeahead/typeahead-options.class.metadata.json +0 -1
  1831. package/typeahead/typeahead-utils.js +0 -60
  1832. package/typeahead/typeahead-utils.js.map +0 -1
  1833. package/typeahead/typeahead-utils.metadata.json +0 -1
  1834. package/typeahead/typeahead.directive.js +0 -383
  1835. package/typeahead/typeahead.directive.js.map +0 -1
  1836. package/typeahead/typeahead.directive.metadata.json +0 -1
  1837. package/typeahead/typeahead.directive.ngfactory.js.map +0 -1
  1838. package/typeahead/typeahead.module.js +0 -27
  1839. package/typeahead/typeahead.module.js.map +0 -1
  1840. package/typeahead/typeahead.module.metadata.json +0 -1
  1841. package/typeahead/typeahead.module.ngfactory.js.map +0 -1
  1842. package/utils/decorators.js +0 -21
  1843. package/utils/decorators.js.map +0 -1
  1844. package/utils/decorators.metadata.json +0 -1
  1845. package/utils/facade/browser.js +0 -25
  1846. package/utils/facade/browser.js.map +0 -1
  1847. package/utils/facade/browser.metadata.json +0 -1
  1848. package/utils/index.d.ts +0 -6
  1849. package/utils/index.js +0 -7
  1850. package/utils/index.js.map +0 -1
  1851. package/utils/index.metadata.json +0 -1
  1852. package/utils/linked-list.class.js +0 -244
  1853. package/utils/linked-list.class.js.map +0 -1
  1854. package/utils/linked-list.class.metadata.json +0 -1
  1855. package/utils/theme-provider.js +0 -35
  1856. package/utils/theme-provider.js.map +0 -1
  1857. package/utils/theme-provider.metadata.json +0 -1
  1858. package/utils/trigger.class.js +0 -16
  1859. package/utils/trigger.class.js.map +0 -1
  1860. package/utils/trigger.class.metadata.json +0 -1
  1861. package/utils/triggers.js +0 -94
  1862. package/utils/triggers.js.map +0 -1
  1863. package/utils/triggers.metadata.json +0 -1
  1864. package/utils/utils.class.js +0 -25
  1865. package/utils/utils.class.js.map +0 -1
  1866. package/utils/utils.class.metadata.json +0 -1
  1867. package/utils/warn-once.js +0 -12
  1868. package/utils/warn-once.js.map +0 -1
  1869. package/utils/warn-once.metadata.json +0 -1
@@ -0,0 +1,4198 @@
1
+ import { Injectable, Component, EventEmitter, Directive, ElementRef, Input, Output, Renderer2, ViewContainerRef, ChangeDetectorRef, forwardRef, Host, ChangeDetectionStrategy, NgModule, ViewChild } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { __extends, __values, __spread } from 'tslib';
4
+ import { filter, map } from 'rxjs/operators';
5
+ import { getFullYear, getMonth, getDay, isFirstDayOfWeek, isAfter, isBefore, shiftDate, endOf, startOf, getFirstDayOfMonth, formatDate, getLocale, isDisabledDay, isSameDay, isSameMonth, isSameYear, setFullDate, isArray, isDateValid, parseDate, isDate } from 'ngx-bootstrap/chronos';
6
+ import { MiniStore, MiniState } from 'ngx-bootstrap/mini-ngrx';
7
+ import { ComponentLoaderFactory } from 'ngx-bootstrap/component-loader';
8
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
9
+ import { CommonModule } from '@angular/common';
10
+ import { PositioningService } from 'ngx-bootstrap/positioning';
11
+ import { isBs3 } from 'ngx-bootstrap/utils';
12
+
13
+ /**
14
+ * @fileoverview added by tsickle
15
+ * @suppress {checkTypes} checked by tsc
16
+ */
17
+ /**
18
+ * For date range picker there are `BsDaterangepickerConfig` which inherits all properties,
19
+ * except `displayMonths`, for range picker it default to `2`
20
+ */
21
+ var BsDatepickerConfig = /** @class */ (function () {
22
+ function BsDatepickerConfig() {
23
+ /**
24
+ * CSS class which will be applied to datepicker container,
25
+ * usually used to set color theme
26
+ */
27
+ this.containerClass = 'theme-green';
28
+ // DatepickerRenderOptions
29
+ this.displayMonths = 1;
30
+ /**
31
+ * Allows to hide week numbers in datepicker
32
+ */
33
+ this.showWeekNumbers = true;
34
+ this.dateInputFormat = 'L';
35
+ // range picker
36
+ this.rangeSeparator = ' - ';
37
+ /**
38
+ * Date format for date range input field
39
+ */
40
+ this.rangeInputFormat = 'L';
41
+ // DatepickerFormatOptions
42
+ this.monthTitle = 'MMMM';
43
+ this.yearTitle = 'YYYY';
44
+ this.dayLabel = 'D';
45
+ this.monthLabel = 'MMMM';
46
+ this.yearLabel = 'YYYY';
47
+ this.weekNumbers = 'w';
48
+ }
49
+ BsDatepickerConfig.decorators = [
50
+ { type: Injectable }
51
+ ];
52
+ return BsDatepickerConfig;
53
+ }());
54
+
55
+ /**
56
+ * @fileoverview added by tsickle
57
+ * @suppress {checkTypes} checked by tsc
58
+ */
59
+ /**
60
+ * @abstract
61
+ */
62
+ var /**
63
+ * @abstract
64
+ */
65
+ BsDatepickerAbstractComponent = /** @class */ (function () {
66
+ function BsDatepickerAbstractComponent() {
67
+ this._customRangesFish = [];
68
+ }
69
+ Object.defineProperty(BsDatepickerAbstractComponent.prototype, "minDate", {
70
+ set: /**
71
+ * @param {?} value
72
+ * @return {?}
73
+ */
74
+ function (value) {
75
+ this._effects.setMinDate(value);
76
+ },
77
+ enumerable: true,
78
+ configurable: true
79
+ });
80
+ Object.defineProperty(BsDatepickerAbstractComponent.prototype, "maxDate", {
81
+ set: /**
82
+ * @param {?} value
83
+ * @return {?}
84
+ */
85
+ function (value) {
86
+ this._effects.setMaxDate(value);
87
+ },
88
+ enumerable: true,
89
+ configurable: true
90
+ });
91
+ Object.defineProperty(BsDatepickerAbstractComponent.prototype, "daysDisabled", {
92
+ set: /**
93
+ * @param {?} value
94
+ * @return {?}
95
+ */
96
+ function (value) {
97
+ this._effects.setDaysDisabled(value);
98
+ },
99
+ enumerable: true,
100
+ configurable: true
101
+ });
102
+ Object.defineProperty(BsDatepickerAbstractComponent.prototype, "isDisabled", {
103
+ set: /**
104
+ * @param {?} value
105
+ * @return {?}
106
+ */
107
+ function (value) {
108
+ this._effects.setDisabled(value);
109
+ },
110
+ enumerable: true,
111
+ configurable: true
112
+ });
113
+ /**
114
+ * @param {?} event
115
+ * @return {?}
116
+ */
117
+ BsDatepickerAbstractComponent.prototype.setViewMode = /**
118
+ * @param {?} event
119
+ * @return {?}
120
+ */
121
+ function (event) { };
122
+ /**
123
+ * @param {?} event
124
+ * @return {?}
125
+ */
126
+ BsDatepickerAbstractComponent.prototype.navigateTo = /**
127
+ * @param {?} event
128
+ * @return {?}
129
+ */
130
+ function (event) { };
131
+ /**
132
+ * @param {?} event
133
+ * @return {?}
134
+ */
135
+ BsDatepickerAbstractComponent.prototype.dayHoverHandler = /**
136
+ * @param {?} event
137
+ * @return {?}
138
+ */
139
+ function (event) { };
140
+ /**
141
+ * @param {?} event
142
+ * @return {?}
143
+ */
144
+ BsDatepickerAbstractComponent.prototype.monthHoverHandler = /**
145
+ * @param {?} event
146
+ * @return {?}
147
+ */
148
+ function (event) { };
149
+ /**
150
+ * @param {?} event
151
+ * @return {?}
152
+ */
153
+ BsDatepickerAbstractComponent.prototype.yearHoverHandler = /**
154
+ * @param {?} event
155
+ * @return {?}
156
+ */
157
+ function (event) { };
158
+ /**
159
+ * @param {?} day
160
+ * @return {?}
161
+ */
162
+ BsDatepickerAbstractComponent.prototype.daySelectHandler = /**
163
+ * @param {?} day
164
+ * @return {?}
165
+ */
166
+ function (day) { };
167
+ /**
168
+ * @param {?} event
169
+ * @return {?}
170
+ */
171
+ BsDatepickerAbstractComponent.prototype.monthSelectHandler = /**
172
+ * @param {?} event
173
+ * @return {?}
174
+ */
175
+ function (event) { };
176
+ /**
177
+ * @param {?} event
178
+ * @return {?}
179
+ */
180
+ BsDatepickerAbstractComponent.prototype.yearSelectHandler = /**
181
+ * @param {?} event
182
+ * @return {?}
183
+ */
184
+ function (event) { };
185
+ /* tslint:disable-next-line: no-any */
186
+ /**
187
+ * @param {?} event
188
+ * @return {?}
189
+ */
190
+ BsDatepickerAbstractComponent.prototype._stopPropagation = /**
191
+ * @param {?} event
192
+ * @return {?}
193
+ */
194
+ function (event) {
195
+ event.stopPropagation();
196
+ };
197
+ return BsDatepickerAbstractComponent;
198
+ }());
199
+
200
+ /**
201
+ * @fileoverview added by tsickle
202
+ * @suppress {checkTypes} checked by tsc
203
+ */
204
+ var BsDatepickerActions = /** @class */ (function () {
205
+ function BsDatepickerActions() {
206
+ }
207
+ /**
208
+ * @return {?}
209
+ */
210
+ BsDatepickerActions.prototype.calculate = /**
211
+ * @return {?}
212
+ */
213
+ function () {
214
+ return { type: BsDatepickerActions.CALCULATE };
215
+ };
216
+ /**
217
+ * @return {?}
218
+ */
219
+ BsDatepickerActions.prototype.format = /**
220
+ * @return {?}
221
+ */
222
+ function () {
223
+ return { type: BsDatepickerActions.FORMAT };
224
+ };
225
+ /**
226
+ * @return {?}
227
+ */
228
+ BsDatepickerActions.prototype.flag = /**
229
+ * @return {?}
230
+ */
231
+ function () {
232
+ return { type: BsDatepickerActions.FLAG };
233
+ };
234
+ /**
235
+ * @param {?} date
236
+ * @return {?}
237
+ */
238
+ BsDatepickerActions.prototype.select = /**
239
+ * @param {?} date
240
+ * @return {?}
241
+ */
242
+ function (date) {
243
+ return {
244
+ type: BsDatepickerActions.SELECT,
245
+ payload: date
246
+ };
247
+ };
248
+ /**
249
+ * @param {?} event
250
+ * @return {?}
251
+ */
252
+ BsDatepickerActions.prototype.changeViewMode = /**
253
+ * @param {?} event
254
+ * @return {?}
255
+ */
256
+ function (event) {
257
+ return {
258
+ type: BsDatepickerActions.CHANGE_VIEWMODE,
259
+ payload: event
260
+ };
261
+ };
262
+ /**
263
+ * @param {?} event
264
+ * @return {?}
265
+ */
266
+ BsDatepickerActions.prototype.navigateTo = /**
267
+ * @param {?} event
268
+ * @return {?}
269
+ */
270
+ function (event) {
271
+ return {
272
+ type: BsDatepickerActions.NAVIGATE_TO,
273
+ payload: event
274
+ };
275
+ };
276
+ /**
277
+ * @param {?} step
278
+ * @return {?}
279
+ */
280
+ BsDatepickerActions.prototype.navigateStep = /**
281
+ * @param {?} step
282
+ * @return {?}
283
+ */
284
+ function (step) {
285
+ return {
286
+ type: BsDatepickerActions.NAVIGATE_OFFSET,
287
+ payload: step
288
+ };
289
+ };
290
+ /**
291
+ * @param {?} options
292
+ * @return {?}
293
+ */
294
+ BsDatepickerActions.prototype.setOptions = /**
295
+ * @param {?} options
296
+ * @return {?}
297
+ */
298
+ function (options) {
299
+ return {
300
+ type: BsDatepickerActions.SET_OPTIONS,
301
+ payload: options
302
+ };
303
+ };
304
+ // date range picker
305
+ /**
306
+ * @param {?} value
307
+ * @return {?}
308
+ */
309
+ BsDatepickerActions.prototype.selectRange = /**
310
+ * @param {?} value
311
+ * @return {?}
312
+ */
313
+ function (value) {
314
+ return {
315
+ type: BsDatepickerActions.SELECT_RANGE,
316
+ payload: value
317
+ };
318
+ };
319
+ /**
320
+ * @param {?} event
321
+ * @return {?}
322
+ */
323
+ BsDatepickerActions.prototype.hoverDay = /**
324
+ * @param {?} event
325
+ * @return {?}
326
+ */
327
+ function (event) {
328
+ return {
329
+ type: BsDatepickerActions.HOVER,
330
+ payload: event.isHovered ? event.cell.date : null
331
+ };
332
+ };
333
+ /**
334
+ * @param {?} date
335
+ * @return {?}
336
+ */
337
+ BsDatepickerActions.prototype.minDate = /**
338
+ * @param {?} date
339
+ * @return {?}
340
+ */
341
+ function (date) {
342
+ return {
343
+ type: BsDatepickerActions.SET_MIN_DATE,
344
+ payload: date
345
+ };
346
+ };
347
+ /**
348
+ * @param {?} date
349
+ * @return {?}
350
+ */
351
+ BsDatepickerActions.prototype.maxDate = /**
352
+ * @param {?} date
353
+ * @return {?}
354
+ */
355
+ function (date) {
356
+ return {
357
+ type: BsDatepickerActions.SET_MAX_DATE,
358
+ payload: date
359
+ };
360
+ };
361
+ /**
362
+ * @param {?} days
363
+ * @return {?}
364
+ */
365
+ BsDatepickerActions.prototype.daysDisabled = /**
366
+ * @param {?} days
367
+ * @return {?}
368
+ */
369
+ function (days) {
370
+ return {
371
+ type: BsDatepickerActions.SET_DAYSDISABLED,
372
+ payload: days
373
+ };
374
+ };
375
+ /**
376
+ * @param {?} value
377
+ * @return {?}
378
+ */
379
+ BsDatepickerActions.prototype.isDisabled = /**
380
+ * @param {?} value
381
+ * @return {?}
382
+ */
383
+ function (value) {
384
+ return {
385
+ type: BsDatepickerActions.SET_IS_DISABLED,
386
+ payload: value
387
+ };
388
+ };
389
+ /**
390
+ * @param {?} locale
391
+ * @return {?}
392
+ */
393
+ BsDatepickerActions.prototype.setLocale = /**
394
+ * @param {?} locale
395
+ * @return {?}
396
+ */
397
+ function (locale) {
398
+ return {
399
+ type: BsDatepickerActions.SET_LOCALE,
400
+ payload: locale
401
+ };
402
+ };
403
+ BsDatepickerActions.CALCULATE = '[datepicker] calculate dates matrix';
404
+ BsDatepickerActions.FORMAT = '[datepicker] format datepicker values';
405
+ BsDatepickerActions.FLAG = '[datepicker] set flags';
406
+ BsDatepickerActions.SELECT = '[datepicker] select date';
407
+ BsDatepickerActions.NAVIGATE_OFFSET = '[datepicker] shift view date';
408
+ BsDatepickerActions.NAVIGATE_TO = '[datepicker] change view date';
409
+ BsDatepickerActions.SET_OPTIONS = '[datepicker] update render options';
410
+ BsDatepickerActions.HOVER = '[datepicker] hover date';
411
+ BsDatepickerActions.CHANGE_VIEWMODE = '[datepicker] switch view mode';
412
+ BsDatepickerActions.SET_MIN_DATE = '[datepicker] set min date';
413
+ BsDatepickerActions.SET_MAX_DATE = '[datepicker] set max date';
414
+ BsDatepickerActions.SET_DAYSDISABLED = '[datepicker] set days disabled';
415
+ BsDatepickerActions.SET_IS_DISABLED = '[datepicker] set is disabled';
416
+ BsDatepickerActions.SET_LOCALE = '[datepicker] set datepicker locale';
417
+ BsDatepickerActions.SELECT_RANGE = '[daterangepicker] select dates range';
418
+ BsDatepickerActions.decorators = [
419
+ { type: Injectable }
420
+ ];
421
+ return BsDatepickerActions;
422
+ }());
423
+
424
+ /**
425
+ * @fileoverview added by tsickle
426
+ * @suppress {checkTypes} checked by tsc
427
+ */
428
+ var BsLocaleService = /** @class */ (function () {
429
+ function BsLocaleService() {
430
+ this._defaultLocale = 'en';
431
+ this._locale = new BehaviorSubject(this._defaultLocale);
432
+ this._localeChange = this._locale.asObservable();
433
+ }
434
+ Object.defineProperty(BsLocaleService.prototype, "locale", {
435
+ get: /**
436
+ * @return {?}
437
+ */
438
+ function () {
439
+ return this._locale;
440
+ },
441
+ enumerable: true,
442
+ configurable: true
443
+ });
444
+ Object.defineProperty(BsLocaleService.prototype, "localeChange", {
445
+ get: /**
446
+ * @return {?}
447
+ */
448
+ function () {
449
+ return this._localeChange;
450
+ },
451
+ enumerable: true,
452
+ configurable: true
453
+ });
454
+ Object.defineProperty(BsLocaleService.prototype, "currentLocale", {
455
+ get: /**
456
+ * @return {?}
457
+ */
458
+ function () {
459
+ return this._locale.getValue();
460
+ },
461
+ enumerable: true,
462
+ configurable: true
463
+ });
464
+ /**
465
+ * @param {?} locale
466
+ * @return {?}
467
+ */
468
+ BsLocaleService.prototype.use = /**
469
+ * @param {?} locale
470
+ * @return {?}
471
+ */
472
+ function (locale) {
473
+ if (locale === this.currentLocale) {
474
+ return;
475
+ }
476
+ this._locale.next(locale);
477
+ };
478
+ BsLocaleService.decorators = [
479
+ { type: Injectable }
480
+ ];
481
+ return BsLocaleService;
482
+ }());
483
+
484
+ /**
485
+ * @fileoverview added by tsickle
486
+ * @suppress {checkTypes} checked by tsc
487
+ */
488
+ var BsDatepickerEffects = /** @class */ (function () {
489
+ function BsDatepickerEffects(_actions, _localeService) {
490
+ this._actions = _actions;
491
+ this._localeService = _localeService;
492
+ this._subs = [];
493
+ }
494
+ /**
495
+ * @param {?} _bsDatepickerStore
496
+ * @return {?}
497
+ */
498
+ BsDatepickerEffects.prototype.init = /**
499
+ * @param {?} _bsDatepickerStore
500
+ * @return {?}
501
+ */
502
+ function (_bsDatepickerStore) {
503
+ this._store = _bsDatepickerStore;
504
+ return this;
505
+ };
506
+ /** setters */
507
+ /**
508
+ * setters
509
+ * @param {?} value
510
+ * @return {?}
511
+ */
512
+ BsDatepickerEffects.prototype.setValue = /**
513
+ * setters
514
+ * @param {?} value
515
+ * @return {?}
516
+ */
517
+ function (value) {
518
+ this._store.dispatch(this._actions.select(value));
519
+ };
520
+ /**
521
+ * @param {?} value
522
+ * @return {?}
523
+ */
524
+ BsDatepickerEffects.prototype.setRangeValue = /**
525
+ * @param {?} value
526
+ * @return {?}
527
+ */
528
+ function (value) {
529
+ this._store.dispatch(this._actions.selectRange(value));
530
+ };
531
+ /**
532
+ * @param {?} value
533
+ * @return {?}
534
+ */
535
+ BsDatepickerEffects.prototype.setMinDate = /**
536
+ * @param {?} value
537
+ * @return {?}
538
+ */
539
+ function (value) {
540
+ this._store.dispatch(this._actions.minDate(value));
541
+ return this;
542
+ };
543
+ /**
544
+ * @param {?} value
545
+ * @return {?}
546
+ */
547
+ BsDatepickerEffects.prototype.setMaxDate = /**
548
+ * @param {?} value
549
+ * @return {?}
550
+ */
551
+ function (value) {
552
+ this._store.dispatch(this._actions.maxDate(value));
553
+ return this;
554
+ };
555
+ /**
556
+ * @param {?} value
557
+ * @return {?}
558
+ */
559
+ BsDatepickerEffects.prototype.setDaysDisabled = /**
560
+ * @param {?} value
561
+ * @return {?}
562
+ */
563
+ function (value) {
564
+ this._store.dispatch(this._actions.daysDisabled(value));
565
+ return this;
566
+ };
567
+ /**
568
+ * @param {?} value
569
+ * @return {?}
570
+ */
571
+ BsDatepickerEffects.prototype.setDisabled = /**
572
+ * @param {?} value
573
+ * @return {?}
574
+ */
575
+ function (value) {
576
+ this._store.dispatch(this._actions.isDisabled(value));
577
+ return this;
578
+ };
579
+ /* Set rendering options */
580
+ /**
581
+ * @param {?} _config
582
+ * @return {?}
583
+ */
584
+ BsDatepickerEffects.prototype.setOptions = /**
585
+ * @param {?} _config
586
+ * @return {?}
587
+ */
588
+ function (_config) {
589
+ var /** @type {?} */ _options = Object.assign({ locale: this._localeService.currentLocale }, _config);
590
+ this._store.dispatch(this._actions.setOptions(_options));
591
+ return this;
592
+ };
593
+ /** view to mode bindings */
594
+ /**
595
+ * view to mode bindings
596
+ * @param {?} container
597
+ * @return {?}
598
+ */
599
+ BsDatepickerEffects.prototype.setBindings = /**
600
+ * view to mode bindings
601
+ * @param {?} container
602
+ * @return {?}
603
+ */
604
+ function (container) {
605
+ container.daysCalendar = this._store
606
+ .select(function (state) { return state.flaggedMonths; })
607
+ .pipe(filter(function (months) { return !!months; }));
608
+ // month calendar
609
+ container.monthsCalendar = this._store
610
+ .select(function (state) { return state.flaggedMonthsCalendar; })
611
+ .pipe(filter(function (months) { return !!months; }));
612
+ // year calendar
613
+ container.yearsCalendar = this._store
614
+ .select(function (state) { return state.yearsCalendarFlagged; })
615
+ .pipe(filter(function (years) { return !!years; }));
616
+ container.viewMode = this._store.select(function (state) { return state.view.mode; });
617
+ container.options = this._store
618
+ .select(function (state) { return state.showWeekNumbers; })
619
+ .pipe(map(function (showWeekNumbers) { return ({ showWeekNumbers: showWeekNumbers }); }));
620
+ return this;
621
+ };
622
+ /** event handlers */
623
+ /**
624
+ * event handlers
625
+ * @param {?} container
626
+ * @return {?}
627
+ */
628
+ BsDatepickerEffects.prototype.setEventHandlers = /**
629
+ * event handlers
630
+ * @param {?} container
631
+ * @return {?}
632
+ */
633
+ function (container) {
634
+ var _this = this;
635
+ container.setViewMode = function (event) {
636
+ _this._store.dispatch(_this._actions.changeViewMode(event));
637
+ };
638
+ container.navigateTo = function (event) {
639
+ _this._store.dispatch(_this._actions.navigateStep(event.step));
640
+ };
641
+ container.dayHoverHandler = function (event) {
642
+ var /** @type {?} */ _cell = /** @type {?} */ (event.cell);
643
+ if (_cell.isOtherMonth || _cell.isDisabled) {
644
+ return;
645
+ }
646
+ _this._store.dispatch(_this._actions.hoverDay(event));
647
+ _cell.isHovered = event.isHovered;
648
+ };
649
+ container.monthHoverHandler = function (event) {
650
+ event.cell.isHovered = event.isHovered;
651
+ };
652
+ container.yearHoverHandler = function (event) {
653
+ event.cell.isHovered = event.isHovered;
654
+ };
655
+ container.monthSelectHandler = function (event) {
656
+ if (event.isDisabled) {
657
+ return;
658
+ }
659
+ _this._store.dispatch(_this._actions.navigateTo({
660
+ unit: {
661
+ month: getMonth(event.date),
662
+ year: getFullYear(event.date)
663
+ },
664
+ viewMode: 'day'
665
+ }));
666
+ };
667
+ container.yearSelectHandler = function (event) {
668
+ if (event.isDisabled) {
669
+ return;
670
+ }
671
+ _this._store.dispatch(_this._actions.navigateTo({
672
+ unit: {
673
+ year: getFullYear(event.date)
674
+ },
675
+ viewMode: 'month'
676
+ }));
677
+ };
678
+ return this;
679
+ };
680
+ /**
681
+ * @return {?}
682
+ */
683
+ BsDatepickerEffects.prototype.registerDatepickerSideEffects = /**
684
+ * @return {?}
685
+ */
686
+ function () {
687
+ var _this = this;
688
+ this._subs.push(this._store.select(function (state) { return state.view; }).subscribe(function (view) {
689
+ _this._store.dispatch(_this._actions.calculate());
690
+ }));
691
+ // format calendar values on month model change
692
+ this._subs.push(this._store
693
+ .select(function (state) { return state.monthsModel; })
694
+ .pipe(filter(function (monthModel) { return !!monthModel; }))
695
+ .subscribe(function (month) { return _this._store.dispatch(_this._actions.format()); }));
696
+ // flag day values
697
+ this._subs.push(this._store
698
+ .select(function (state) { return state.formattedMonths; })
699
+ .pipe(filter(function (month) { return !!month; }))
700
+ .subscribe(function (month) { return _this._store.dispatch(_this._actions.flag()); }));
701
+ // flag day values
702
+ this._subs.push(this._store
703
+ .select(function (state) { return state.selectedDate; })
704
+ .pipe(filter(function (selectedDate) { return !!selectedDate; }))
705
+ .subscribe(function (selectedDate) { return _this._store.dispatch(_this._actions.flag()); }));
706
+ // flag for date range picker
707
+ this._subs.push(this._store
708
+ .select(function (state) { return state.selectedRange; })
709
+ .pipe(filter(function (selectedRange) { return !!selectedRange; }))
710
+ .subscribe(function (selectedRange) { return _this._store.dispatch(_this._actions.flag()); }));
711
+ // monthsCalendar
712
+ this._subs.push(this._store
713
+ .select(function (state) { return state.monthsCalendar; })
714
+ .subscribe(function () { return _this._store.dispatch(_this._actions.flag()); }));
715
+ // years calendar
716
+ this._subs.push(this._store
717
+ .select(function (state) { return state.yearsCalendarModel; })
718
+ .pipe(filter(function (state) { return !!state; }))
719
+ .subscribe(function () { return _this._store.dispatch(_this._actions.flag()); }));
720
+ // on hover
721
+ this._subs.push(this._store
722
+ .select(function (state) { return state.hoveredDate; })
723
+ .pipe(filter(function (hoveredDate) { return !!hoveredDate; }))
724
+ .subscribe(function (hoveredDate) { return _this._store.dispatch(_this._actions.flag()); }));
725
+ // on locale change
726
+ this._subs.push(this._localeService.localeChange
727
+ .subscribe(function (locale) { return _this._store.dispatch(_this._actions.setLocale(locale)); }));
728
+ return this;
729
+ };
730
+ /**
731
+ * @return {?}
732
+ */
733
+ BsDatepickerEffects.prototype.destroy = /**
734
+ * @return {?}
735
+ */
736
+ function () {
737
+ try {
738
+ for (var _a = __values(this._subs), _b = _a.next(); !_b.done; _b = _a.next()) {
739
+ var sub = _b.value;
740
+ sub.unsubscribe();
741
+ }
742
+ }
743
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
744
+ finally {
745
+ try {
746
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
747
+ }
748
+ finally { if (e_1) throw e_1.error; }
749
+ }
750
+ var e_1, _c;
751
+ };
752
+ BsDatepickerEffects.decorators = [
753
+ { type: Injectable }
754
+ ];
755
+ /** @nocollapse */
756
+ BsDatepickerEffects.ctorParameters = function () { return [
757
+ { type: BsDatepickerActions, },
758
+ { type: BsLocaleService, },
759
+ ]; };
760
+ return BsDatepickerEffects;
761
+ }());
762
+
763
+ /**
764
+ * @fileoverview added by tsickle
765
+ * @suppress {checkTypes} checked by tsc
766
+ */
767
+ var /** @type {?} */ defaultMonthOptions = {
768
+ width: 7,
769
+ height: 6
770
+ };
771
+
772
+ /**
773
+ * @fileoverview added by tsickle
774
+ * @suppress {checkTypes} checked by tsc
775
+ */
776
+ var /** @type {?} */ _initialView = { date: new Date(), mode: 'day' };
777
+ var /** @type {?} */ initialDatepickerState = Object.assign(new BsDatepickerConfig(), {
778
+ locale: 'en',
779
+ view: _initialView,
780
+ selectedRange: [],
781
+ monthViewOptions: defaultMonthOptions
782
+ });
783
+
784
+ /**
785
+ * @fileoverview added by tsickle
786
+ * @suppress {checkTypes} checked by tsc
787
+ */
788
+ /**
789
+ * @param {?} date
790
+ * @param {?} options
791
+ * @return {?}
792
+ */
793
+ function getStartingDayOfCalendar(date, options) {
794
+ if (isFirstDayOfWeek(date, options.firstDayOfWeek)) {
795
+ return date;
796
+ }
797
+ var /** @type {?} */ weekDay = getDay(date);
798
+ var /** @type {?} */ offset = calculateDateOffset(weekDay, options.firstDayOfWeek);
799
+ return shiftDate(date, { day: -offset });
800
+ }
801
+ /**
802
+ * @param {?} weekday
803
+ * @param {?} startingDayOffset
804
+ * @return {?}
805
+ */
806
+ function calculateDateOffset(weekday, startingDayOffset) {
807
+ if (startingDayOffset === 0) {
808
+ return weekday;
809
+ }
810
+ var /** @type {?} */ offset = weekday - startingDayOffset % 7;
811
+ return offset < 0 ? offset + 7 : offset;
812
+ }
813
+ /**
814
+ * @param {?} date
815
+ * @param {?} min
816
+ * @param {?} max
817
+ * @return {?}
818
+ */
819
+ function isMonthDisabled(date, min, max) {
820
+ var /** @type {?} */ minBound = min && isBefore(endOf(date, 'month'), min, 'day');
821
+ var /** @type {?} */ maxBound = max && isAfter(startOf(date, 'month'), max, 'day');
822
+ return minBound || maxBound;
823
+ }
824
+ /**
825
+ * @param {?} date
826
+ * @param {?} min
827
+ * @param {?} max
828
+ * @return {?}
829
+ */
830
+ function isYearDisabled(date, min, max) {
831
+ var /** @type {?} */ minBound = min && isBefore(endOf(date, 'year'), min, 'day');
832
+ var /** @type {?} */ maxBound = max && isAfter(startOf(date, 'year'), max, 'day');
833
+ return minBound || maxBound;
834
+ }
835
+
836
+ /**
837
+ * @fileoverview added by tsickle
838
+ * @suppress {checkTypes} checked by tsc
839
+ */
840
+ /**
841
+ * @template T
842
+ * @param {?} options
843
+ * @param {?} fn
844
+ * @return {?}
845
+ */
846
+ function createMatrix(options, fn) {
847
+ var /** @type {?} */ prevValue = options.initialDate;
848
+ var /** @type {?} */ matrix = new Array(options.height);
849
+ for (var /** @type {?} */ i = 0; i < options.height; i++) {
850
+ matrix[i] = new Array(options.width);
851
+ for (var /** @type {?} */ j = 0; j < options.width; j++) {
852
+ matrix[i][j] = fn(prevValue);
853
+ prevValue = shiftDate(prevValue, options.shift);
854
+ }
855
+ }
856
+ return matrix;
857
+ }
858
+
859
+ /**
860
+ * @fileoverview added by tsickle
861
+ * @suppress {checkTypes} checked by tsc
862
+ */
863
+ /**
864
+ * @param {?} startingDate
865
+ * @param {?} options
866
+ * @return {?}
867
+ */
868
+ function calcDaysCalendar(startingDate, options) {
869
+ var /** @type {?} */ firstDay = getFirstDayOfMonth(startingDate);
870
+ var /** @type {?} */ initialDate = getStartingDayOfCalendar(firstDay, options);
871
+ var /** @type {?} */ matrixOptions = {
872
+ width: options.width,
873
+ height: options.height,
874
+ initialDate: initialDate,
875
+ shift: { day: 1 }
876
+ };
877
+ var /** @type {?} */ daysMatrix = createMatrix(matrixOptions, function (date) { return date; });
878
+ return {
879
+ daysMatrix: daysMatrix,
880
+ month: firstDay
881
+ };
882
+ }
883
+
884
+ /**
885
+ * @fileoverview added by tsickle
886
+ * @suppress {checkTypes} checked by tsc
887
+ */
888
+ /**
889
+ * @param {?} daysCalendar
890
+ * @param {?} formatOptions
891
+ * @param {?} monthIndex
892
+ * @return {?}
893
+ */
894
+ function formatDaysCalendar(daysCalendar, formatOptions, monthIndex) {
895
+ return {
896
+ month: daysCalendar.month,
897
+ monthTitle: formatDate(daysCalendar.month, formatOptions.monthTitle, formatOptions.locale),
898
+ yearTitle: formatDate(daysCalendar.month, formatOptions.yearTitle, formatOptions.locale),
899
+ weekNumbers: getWeekNumbers(daysCalendar.daysMatrix, formatOptions.weekNumbers, formatOptions.locale),
900
+ weekdays: getShiftedWeekdays(formatOptions.locale),
901
+ weeks: daysCalendar.daysMatrix.map(function (week, weekIndex) {
902
+ return ({
903
+ days: week.map(function (date, dayIndex) {
904
+ return ({
905
+ date: date,
906
+ label: formatDate(date, formatOptions.dayLabel, formatOptions.locale),
907
+ monthIndex: monthIndex,
908
+ weekIndex: weekIndex,
909
+ dayIndex: dayIndex
910
+ });
911
+ })
912
+ });
913
+ })
914
+ };
915
+ }
916
+ /**
917
+ * @param {?} daysMatrix
918
+ * @param {?} format
919
+ * @param {?} locale
920
+ * @return {?}
921
+ */
922
+ function getWeekNumbers(daysMatrix, format, locale) {
923
+ return daysMatrix.map(function (days) { return (days[0] ? formatDate(days[0], format, locale) : ''); });
924
+ }
925
+ /**
926
+ * @param {?} locale
927
+ * @return {?}
928
+ */
929
+ function getShiftedWeekdays(locale) {
930
+ var /** @type {?} */ _locale = getLocale(locale);
931
+ var /** @type {?} */ weekdays = /** @type {?} */ (_locale.weekdaysShort());
932
+ var /** @type {?} */ firstDayOfWeek = _locale.firstDayOfWeek();
933
+ return __spread(weekdays.slice(firstDayOfWeek), weekdays.slice(0, firstDayOfWeek));
934
+ }
935
+
936
+ /**
937
+ * @fileoverview added by tsickle
938
+ * @suppress {checkTypes} checked by tsc
939
+ */
940
+ /**
941
+ * @param {?} formattedMonth
942
+ * @param {?} options
943
+ * @return {?}
944
+ */
945
+ function flagDaysCalendar(formattedMonth, options) {
946
+ formattedMonth.weeks.forEach(function (week) {
947
+ /* tslint:disable-next-line: cyclomatic-complexity */
948
+ week.days.forEach(function (day, dayIndex) {
949
+ // datepicker
950
+ var /** @type {?} */ isOtherMonth = !isSameMonth(day.date, formattedMonth.month);
951
+ var /** @type {?} */ isHovered = !isOtherMonth && isSameDay(day.date, options.hoveredDate);
952
+ // date range picker
953
+ var /** @type {?} */ isSelectionStart = !isOtherMonth &&
954
+ options.selectedRange &&
955
+ isSameDay(day.date, options.selectedRange[0]);
956
+ var /** @type {?} */ isSelectionEnd = !isOtherMonth &&
957
+ options.selectedRange &&
958
+ isSameDay(day.date, options.selectedRange[1]);
959
+ var /** @type {?} */ isSelected = (!isOtherMonth && isSameDay(day.date, options.selectedDate)) ||
960
+ isSelectionStart ||
961
+ isSelectionEnd;
962
+ var /** @type {?} */ isInRange = !isOtherMonth &&
963
+ options.selectedRange &&
964
+ isDateInRange(day.date, options.selectedRange, options.hoveredDate);
965
+ var /** @type {?} */ isDisabled = options.isDisabled ||
966
+ isBefore(day.date, options.minDate, 'day') ||
967
+ isAfter(day.date, options.maxDate, 'day') ||
968
+ isDisabledDay(day.date, options.daysDisabled);
969
+ var /** @type {?} */ currentDate = new Date();
970
+ var /** @type {?} */ isToday = !isOtherMonth && isSameDay(day.date, currentDate);
971
+ // decide update or not
972
+ var /** @type {?} */ newDay = Object.assign({}, day, {
973
+ isOtherMonth: isOtherMonth,
974
+ isHovered: isHovered,
975
+ isSelected: isSelected,
976
+ isSelectionStart: isSelectionStart,
977
+ isSelectionEnd: isSelectionEnd,
978
+ isInRange: isInRange,
979
+ isDisabled: isDisabled,
980
+ isToday: isToday
981
+ });
982
+ if (day.isOtherMonth !== newDay.isOtherMonth ||
983
+ day.isHovered !== newDay.isHovered ||
984
+ day.isSelected !== newDay.isSelected ||
985
+ day.isSelectionStart !== newDay.isSelectionStart ||
986
+ day.isSelectionEnd !== newDay.isSelectionEnd ||
987
+ day.isDisabled !== newDay.isDisabled ||
988
+ day.isInRange !== newDay.isInRange) {
989
+ week.days[dayIndex] = newDay;
990
+ }
991
+ });
992
+ });
993
+ // todo: add check for linked calendars
994
+ formattedMonth.hideLeftArrow =
995
+ options.isDisabled ||
996
+ (options.monthIndex > 0 && options.monthIndex !== options.displayMonths);
997
+ formattedMonth.hideRightArrow =
998
+ options.isDisabled ||
999
+ (options.monthIndex < options.displayMonths &&
1000
+ options.monthIndex + 1 !== options.displayMonths);
1001
+ formattedMonth.disableLeftArrow = isMonthDisabled(shiftDate(formattedMonth.month, { month: -1 }), options.minDate, options.maxDate);
1002
+ formattedMonth.disableRightArrow = isMonthDisabled(shiftDate(formattedMonth.month, { month: 1 }), options.minDate, options.maxDate);
1003
+ return formattedMonth;
1004
+ }
1005
+ /**
1006
+ * @param {?} date
1007
+ * @param {?} selectedRange
1008
+ * @param {?} hoveredDate
1009
+ * @return {?}
1010
+ */
1011
+ function isDateInRange(date, selectedRange, hoveredDate) {
1012
+ if (!date || !selectedRange[0]) {
1013
+ return false;
1014
+ }
1015
+ if (selectedRange[1]) {
1016
+ return date > selectedRange[0] && date <= selectedRange[1];
1017
+ }
1018
+ if (hoveredDate) {
1019
+ return date > selectedRange[0] && date <= hoveredDate;
1020
+ }
1021
+ return false;
1022
+ }
1023
+
1024
+ /**
1025
+ * @fileoverview added by tsickle
1026
+ * @suppress {checkTypes} checked by tsc
1027
+ */
1028
+ /**
1029
+ * @param {?} mode
1030
+ * @param {?=} minMode
1031
+ * @return {?}
1032
+ */
1033
+ function canSwitchMode(mode, minMode) {
1034
+ return minMode ? mode >= minMode : true;
1035
+ }
1036
+
1037
+ /**
1038
+ * @fileoverview added by tsickle
1039
+ * @suppress {checkTypes} checked by tsc
1040
+ */
1041
+ var /** @type {?} */ height = 4;
1042
+ var /** @type {?} */ width = 3;
1043
+ var /** @type {?} */ shift = { month: 1 };
1044
+ /**
1045
+ * @param {?} viewDate
1046
+ * @param {?} formatOptions
1047
+ * @return {?}
1048
+ */
1049
+ function formatMonthsCalendar(viewDate, formatOptions) {
1050
+ var /** @type {?} */ initialDate = startOf(viewDate, 'year');
1051
+ var /** @type {?} */ matrixOptions = { width: width, height: height, initialDate: initialDate, shift: shift };
1052
+ var /** @type {?} */ monthMatrix = createMatrix(matrixOptions, function (date) {
1053
+ return ({
1054
+ date: date,
1055
+ label: formatDate(date, formatOptions.monthLabel, formatOptions.locale)
1056
+ });
1057
+ });
1058
+ return {
1059
+ months: monthMatrix,
1060
+ monthTitle: '',
1061
+ yearTitle: formatDate(viewDate, formatOptions.yearTitle, formatOptions.locale)
1062
+ };
1063
+ }
1064
+
1065
+ /**
1066
+ * @fileoverview added by tsickle
1067
+ * @suppress {checkTypes} checked by tsc
1068
+ */
1069
+ /**
1070
+ * @param {?} monthCalendar
1071
+ * @param {?} options
1072
+ * @return {?}
1073
+ */
1074
+ function flagMonthsCalendar(monthCalendar, options) {
1075
+ monthCalendar.months.forEach(function (months, rowIndex) {
1076
+ months.forEach(function (month, monthIndex) {
1077
+ var /** @type {?} */ isHovered = isSameMonth(month.date, options.hoveredMonth);
1078
+ var /** @type {?} */ isDisabled = options.isDisabled ||
1079
+ isMonthDisabled(month.date, options.minDate, options.maxDate);
1080
+ var /** @type {?} */ newMonth = Object.assign(/*{},*/ month, {
1081
+ isHovered: isHovered,
1082
+ isDisabled: isDisabled
1083
+ });
1084
+ if (month.isHovered !== newMonth.isHovered ||
1085
+ month.isDisabled !== newMonth.isDisabled) {
1086
+ monthCalendar.months[rowIndex][monthIndex] = newMonth;
1087
+ }
1088
+ });
1089
+ });
1090
+ // todo: add check for linked calendars
1091
+ monthCalendar.hideLeftArrow =
1092
+ options.monthIndex > 0 && options.monthIndex !== options.displayMonths;
1093
+ monthCalendar.hideRightArrow =
1094
+ options.monthIndex < options.displayMonths &&
1095
+ options.monthIndex + 1 !== options.displayMonths;
1096
+ monthCalendar.disableLeftArrow = isYearDisabled(shiftDate(monthCalendar.months[0][0].date, { year: -1 }), options.minDate, options.maxDate);
1097
+ monthCalendar.disableRightArrow = isYearDisabled(shiftDate(monthCalendar.months[0][0].date, { year: 1 }), options.minDate, options.maxDate);
1098
+ return monthCalendar;
1099
+ }
1100
+
1101
+ /**
1102
+ * @fileoverview added by tsickle
1103
+ * @suppress {checkTypes} checked by tsc
1104
+ */
1105
+ var /** @type {?} */ height$1 = 4;
1106
+ var /** @type {?} */ width$1 = 4;
1107
+ var /** @type {?} */ yearsPerCalendar = height$1 * width$1;
1108
+ var /** @type {?} */ initialShift = (Math.floor(yearsPerCalendar / 2) - 1) * -1;
1109
+ var /** @type {?} */ shift$1 = { year: 1 };
1110
+ /**
1111
+ * @param {?} viewDate
1112
+ * @param {?} formatOptions
1113
+ * @return {?}
1114
+ */
1115
+ function formatYearsCalendar(viewDate, formatOptions) {
1116
+ var /** @type {?} */ initialDate = shiftDate(viewDate, { year: initialShift });
1117
+ var /** @type {?} */ matrixOptions = { width: width$1, height: height$1, initialDate: initialDate, shift: shift$1 };
1118
+ var /** @type {?} */ yearsMatrix = createMatrix(matrixOptions, function (date) {
1119
+ return ({
1120
+ date: date,
1121
+ label: formatDate(date, formatOptions.yearLabel, formatOptions.locale)
1122
+ });
1123
+ });
1124
+ var /** @type {?} */ yearTitle = formatYearRangeTitle(yearsMatrix, formatOptions);
1125
+ return {
1126
+ years: yearsMatrix,
1127
+ monthTitle: '',
1128
+ yearTitle: yearTitle
1129
+ };
1130
+ }
1131
+ /**
1132
+ * @param {?} yearsMatrix
1133
+ * @param {?} formatOptions
1134
+ * @return {?}
1135
+ */
1136
+ function formatYearRangeTitle(yearsMatrix, formatOptions) {
1137
+ var /** @type {?} */ from = formatDate(yearsMatrix[0][0].date, formatOptions.yearTitle, formatOptions.locale);
1138
+ var /** @type {?} */ to = formatDate(yearsMatrix[height$1 - 1][width$1 - 1].date, formatOptions.yearTitle, formatOptions.locale);
1139
+ return from + " - " + to;
1140
+ }
1141
+
1142
+ /**
1143
+ * @fileoverview added by tsickle
1144
+ * @suppress {checkTypes} checked by tsc
1145
+ */
1146
+ /**
1147
+ * @param {?} yearsCalendar
1148
+ * @param {?} options
1149
+ * @return {?}
1150
+ */
1151
+ function flagYearsCalendar(yearsCalendar, options) {
1152
+ yearsCalendar.years.forEach(function (years, rowIndex) {
1153
+ years.forEach(function (year, yearIndex) {
1154
+ var /** @type {?} */ isHovered = isSameYear(year.date, options.hoveredYear);
1155
+ var /** @type {?} */ isDisabled = options.isDisabled ||
1156
+ isYearDisabled(year.date, options.minDate, options.maxDate);
1157
+ var /** @type {?} */ newMonth = Object.assign(/*{},*/ year, { isHovered: isHovered, isDisabled: isDisabled });
1158
+ if (year.isHovered !== newMonth.isHovered ||
1159
+ year.isDisabled !== newMonth.isDisabled) {
1160
+ yearsCalendar.years[rowIndex][yearIndex] = newMonth;
1161
+ }
1162
+ });
1163
+ });
1164
+ // todo: add check for linked calendars
1165
+ yearsCalendar.hideLeftArrow =
1166
+ options.yearIndex > 0 && options.yearIndex !== options.displayMonths;
1167
+ yearsCalendar.hideRightArrow =
1168
+ options.yearIndex < options.displayMonths &&
1169
+ options.yearIndex + 1 !== options.displayMonths;
1170
+ yearsCalendar.disableLeftArrow = isYearDisabled(shiftDate(yearsCalendar.years[0][0].date, { year: -1 }), options.minDate, options.maxDate);
1171
+ var /** @type {?} */ i = yearsCalendar.years.length - 1;
1172
+ var /** @type {?} */ j = yearsCalendar.years[i].length - 1;
1173
+ yearsCalendar.disableRightArrow = isYearDisabled(shiftDate(yearsCalendar.years[i][j].date, { year: 1 }), options.minDate, options.maxDate);
1174
+ return yearsCalendar;
1175
+ }
1176
+
1177
+ /**
1178
+ * @fileoverview added by tsickle
1179
+ * @suppress {checkTypes} checked by tsc
1180
+ */
1181
+ /**
1182
+ * @param {?=} state
1183
+ * @param {?=} action
1184
+ * @return {?}
1185
+ */
1186
+ function bsDatepickerReducer(state, action) {
1187
+ if (state === void 0) { state = initialDatepickerState; }
1188
+ switch (action.type) {
1189
+ case BsDatepickerActions.CALCULATE: {
1190
+ return calculateReducer(state);
1191
+ }
1192
+ case BsDatepickerActions.FORMAT: {
1193
+ return formatReducer(state, action);
1194
+ }
1195
+ case BsDatepickerActions.FLAG: {
1196
+ return flagReducer(state, action);
1197
+ }
1198
+ case BsDatepickerActions.NAVIGATE_OFFSET: {
1199
+ var /** @type {?} */ date = shiftDate(startOf(state.view.date, 'month'), action.payload);
1200
+ var /** @type {?} */ newState = {
1201
+ view: {
1202
+ mode: state.view.mode,
1203
+ date: date
1204
+ }
1205
+ };
1206
+ return Object.assign({}, state, newState);
1207
+ }
1208
+ case BsDatepickerActions.NAVIGATE_TO: {
1209
+ var /** @type {?} */ payload = action.payload;
1210
+ var /** @type {?} */ date = setFullDate(state.view.date, payload.unit);
1211
+ var /** @type {?} */ newState = void 0;
1212
+ var /** @type {?} */ mode = void 0;
1213
+ if (canSwitchMode(payload.viewMode, state.minMode)) {
1214
+ mode = payload.viewMode;
1215
+ newState = { view: { date: date, mode: mode } };
1216
+ }
1217
+ else {
1218
+ mode = state.view.mode;
1219
+ newState = { selectedDate: date, view: { date: date, mode: mode } };
1220
+ }
1221
+ return Object.assign({}, state, newState);
1222
+ }
1223
+ case BsDatepickerActions.CHANGE_VIEWMODE: {
1224
+ if (!canSwitchMode(action.payload, state.minMode)) {
1225
+ return state;
1226
+ }
1227
+ var /** @type {?} */ date = state.view.date;
1228
+ var /** @type {?} */ mode = action.payload;
1229
+ var /** @type {?} */ newState = { view: { date: date, mode: mode } };
1230
+ return Object.assign({}, state, newState);
1231
+ }
1232
+ case BsDatepickerActions.HOVER: {
1233
+ return Object.assign({}, state, { hoveredDate: action.payload });
1234
+ }
1235
+ case BsDatepickerActions.SELECT: {
1236
+ var /** @type {?} */ newState = {
1237
+ selectedDate: action.payload,
1238
+ view: state.view
1239
+ };
1240
+ var /** @type {?} */ mode = state.view.mode;
1241
+ var /** @type {?} */ _date = action.payload || state.view.date;
1242
+ var /** @type {?} */ date = getViewDate(_date, state.minDate, state.maxDate);
1243
+ newState.view = { mode: mode, date: date };
1244
+ return Object.assign({}, state, newState);
1245
+ }
1246
+ case BsDatepickerActions.SET_OPTIONS: {
1247
+ var /** @type {?} */ newState = action.payload;
1248
+ // preserve view mode
1249
+ var /** @type {?} */ mode = newState.minMode ? newState.minMode : state.view.mode;
1250
+ var /** @type {?} */ _viewDate = isDateValid(newState.value) && newState.value
1251
+ || isArray(newState.value) && isDateValid(newState.value[0]) && newState.value[0]
1252
+ || state.view.date;
1253
+ var /** @type {?} */ date = getViewDate(_viewDate, newState.minDate, newState.maxDate);
1254
+ newState.view = { mode: mode, date: date };
1255
+ // update selected value
1256
+ if (newState.value) {
1257
+ // if new value is array we work with date range
1258
+ if (isArray(newState.value)) {
1259
+ newState.selectedRange = newState.value;
1260
+ }
1261
+ // if new value is a date -> datepicker
1262
+ if (newState.value instanceof Date) {
1263
+ newState.selectedDate = newState.value;
1264
+ }
1265
+ // provided value is not supported :)
1266
+ // need to report it somehow
1267
+ }
1268
+ return Object.assign({}, state, newState);
1269
+ }
1270
+ // date range picker
1271
+ case BsDatepickerActions.SELECT_RANGE: {
1272
+ var /** @type {?} */ newState = {
1273
+ selectedRange: action.payload,
1274
+ view: state.view
1275
+ };
1276
+ var /** @type {?} */ mode = state.view.mode;
1277
+ var /** @type {?} */ _date = action.payload && action.payload[0] || state.view.date;
1278
+ var /** @type {?} */ date = getViewDate(_date, state.minDate, state.maxDate);
1279
+ newState.view = { mode: mode, date: date };
1280
+ return Object.assign({}, state, newState);
1281
+ }
1282
+ case BsDatepickerActions.SET_MIN_DATE: {
1283
+ return Object.assign({}, state, {
1284
+ minDate: action.payload
1285
+ });
1286
+ }
1287
+ case BsDatepickerActions.SET_MAX_DATE: {
1288
+ return Object.assign({}, state, {
1289
+ maxDate: action.payload
1290
+ });
1291
+ }
1292
+ case BsDatepickerActions.SET_IS_DISABLED: {
1293
+ return Object.assign({}, state, {
1294
+ isDisabled: action.payload
1295
+ });
1296
+ }
1297
+ default:
1298
+ return state;
1299
+ }
1300
+ }
1301
+ /**
1302
+ * @param {?} state
1303
+ * @return {?}
1304
+ */
1305
+ function calculateReducer(state) {
1306
+ // how many calendars
1307
+ var /** @type {?} */ displayMonths = state.displayMonths;
1308
+ // use selected date on initial rendering if set
1309
+ var /** @type {?} */ viewDate = state.view.date;
1310
+ if (state.view.mode === 'day') {
1311
+ state.monthViewOptions.firstDayOfWeek = getLocale(state.locale).firstDayOfWeek();
1312
+ var /** @type {?} */ monthsModel = new Array(displayMonths);
1313
+ for (var /** @type {?} */ monthIndex = 0; monthIndex < displayMonths; monthIndex++) {
1314
+ // todo: for unlinked calendars it will be harder
1315
+ monthsModel[monthIndex] = calcDaysCalendar(viewDate, state.monthViewOptions);
1316
+ viewDate = shiftDate(viewDate, { month: 1 });
1317
+ }
1318
+ return Object.assign({}, state, { monthsModel: monthsModel });
1319
+ }
1320
+ if (state.view.mode === 'month') {
1321
+ var /** @type {?} */ monthsCalendar = new Array(displayMonths);
1322
+ for (var /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1323
+ // todo: for unlinked calendars it will be harder
1324
+ monthsCalendar[calendarIndex] = formatMonthsCalendar(viewDate, getFormatOptions(state));
1325
+ viewDate = shiftDate(viewDate, { year: 1 });
1326
+ }
1327
+ return Object.assign({}, state, { monthsCalendar: monthsCalendar });
1328
+ }
1329
+ if (state.view.mode === 'year') {
1330
+ var /** @type {?} */ yearsCalendarModel = new Array(displayMonths);
1331
+ for (var /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1332
+ // todo: for unlinked calendars it will be harder
1333
+ yearsCalendarModel[calendarIndex] = formatYearsCalendar(viewDate, getFormatOptions(state));
1334
+ viewDate = shiftDate(viewDate, { year: yearsPerCalendar });
1335
+ }
1336
+ return Object.assign({}, state, { yearsCalendarModel: yearsCalendarModel });
1337
+ }
1338
+ return state;
1339
+ }
1340
+ /**
1341
+ * @param {?} state
1342
+ * @param {?} action
1343
+ * @return {?}
1344
+ */
1345
+ function formatReducer(state, action) {
1346
+ if (state.view.mode === 'day') {
1347
+ var /** @type {?} */ formattedMonths = state.monthsModel.map(function (month, monthIndex) {
1348
+ return formatDaysCalendar(month, getFormatOptions(state), monthIndex);
1349
+ });
1350
+ return Object.assign({}, state, { formattedMonths: formattedMonths });
1351
+ }
1352
+ // how many calendars
1353
+ var /** @type {?} */ displayMonths = state.displayMonths;
1354
+ // check initial rendering
1355
+ // use selected date on initial rendering if set
1356
+ var /** @type {?} */ viewDate = state.view.date;
1357
+ if (state.view.mode === 'month') {
1358
+ var /** @type {?} */ monthsCalendar = new Array(displayMonths);
1359
+ for (var /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1360
+ // todo: for unlinked calendars it will be harder
1361
+ monthsCalendar[calendarIndex] = formatMonthsCalendar(viewDate, getFormatOptions(state));
1362
+ viewDate = shiftDate(viewDate, { year: 1 });
1363
+ }
1364
+ return Object.assign({}, state, { monthsCalendar: monthsCalendar });
1365
+ }
1366
+ if (state.view.mode === 'year') {
1367
+ var /** @type {?} */ yearsCalendarModel = new Array(displayMonths);
1368
+ for (var /** @type {?} */ calendarIndex = 0; calendarIndex < displayMonths; calendarIndex++) {
1369
+ // todo: for unlinked calendars it will be harder
1370
+ yearsCalendarModel[calendarIndex] = formatYearsCalendar(viewDate, getFormatOptions(state));
1371
+ viewDate = shiftDate(viewDate, { year: 16 });
1372
+ }
1373
+ return Object.assign({}, state, { yearsCalendarModel: yearsCalendarModel });
1374
+ }
1375
+ return state;
1376
+ }
1377
+ /**
1378
+ * @param {?} state
1379
+ * @param {?} action
1380
+ * @return {?}
1381
+ */
1382
+ function flagReducer(state, action) {
1383
+ if (state.view.mode === 'day') {
1384
+ var /** @type {?} */ flaggedMonths = state.formattedMonths.map(function (formattedMonth, monthIndex) {
1385
+ return flagDaysCalendar(formattedMonth, {
1386
+ isDisabled: state.isDisabled,
1387
+ minDate: state.minDate,
1388
+ maxDate: state.maxDate,
1389
+ daysDisabled: state.daysDisabled,
1390
+ hoveredDate: state.hoveredDate,
1391
+ selectedDate: state.selectedDate,
1392
+ selectedRange: state.selectedRange,
1393
+ displayMonths: state.displayMonths,
1394
+ monthIndex: monthIndex
1395
+ });
1396
+ });
1397
+ return Object.assign({}, state, { flaggedMonths: flaggedMonths });
1398
+ }
1399
+ if (state.view.mode === 'month') {
1400
+ var /** @type {?} */ flaggedMonthsCalendar = state.monthsCalendar.map(function (formattedMonth, monthIndex) {
1401
+ return flagMonthsCalendar(formattedMonth, {
1402
+ isDisabled: state.isDisabled,
1403
+ minDate: state.minDate,
1404
+ maxDate: state.maxDate,
1405
+ hoveredMonth: state.hoveredMonth,
1406
+ displayMonths: state.displayMonths,
1407
+ monthIndex: monthIndex
1408
+ });
1409
+ });
1410
+ return Object.assign({}, state, { flaggedMonthsCalendar: flaggedMonthsCalendar });
1411
+ }
1412
+ if (state.view.mode === 'year') {
1413
+ var /** @type {?} */ yearsCalendarFlagged = state.yearsCalendarModel.map(function (formattedMonth, yearIndex) {
1414
+ return flagYearsCalendar(formattedMonth, {
1415
+ isDisabled: state.isDisabled,
1416
+ minDate: state.minDate,
1417
+ maxDate: state.maxDate,
1418
+ hoveredYear: state.hoveredYear,
1419
+ displayMonths: state.displayMonths,
1420
+ yearIndex: yearIndex
1421
+ });
1422
+ });
1423
+ return Object.assign({}, state, { yearsCalendarFlagged: yearsCalendarFlagged });
1424
+ }
1425
+ return state;
1426
+ }
1427
+ /**
1428
+ * @param {?} state
1429
+ * @return {?}
1430
+ */
1431
+ function getFormatOptions(state) {
1432
+ return {
1433
+ locale: state.locale,
1434
+ monthTitle: state.monthTitle,
1435
+ yearTitle: state.yearTitle,
1436
+ dayLabel: state.dayLabel,
1437
+ monthLabel: state.monthLabel,
1438
+ yearLabel: state.yearLabel,
1439
+ weekNumbers: state.weekNumbers
1440
+ };
1441
+ }
1442
+ /**
1443
+ * if view date is provided (bsValue|ngModel) it should be shown
1444
+ * if view date is not provider:
1445
+ * if minDate>currentDate (default view value), show minDate
1446
+ * if maxDate<currentDate(default view value) show maxDate
1447
+ * @param {?} viewDate
1448
+ * @param {?} minDate
1449
+ * @param {?} maxDate
1450
+ * @return {?}
1451
+ */
1452
+ function getViewDate(viewDate, minDate, maxDate) {
1453
+ var /** @type {?} */ _date = Array.isArray(viewDate) ? viewDate[0] : viewDate;
1454
+ if (minDate && isAfter(minDate, _date, 'day')) {
1455
+ return minDate;
1456
+ }
1457
+ if (maxDate && isBefore(maxDate, _date, 'day')) {
1458
+ return maxDate;
1459
+ }
1460
+ return _date;
1461
+ }
1462
+
1463
+ /**
1464
+ * @fileoverview added by tsickle
1465
+ * @suppress {checkTypes} checked by tsc
1466
+ */
1467
+ var BsDatepickerStore = /** @class */ (function (_super) {
1468
+ __extends(BsDatepickerStore, _super);
1469
+ function BsDatepickerStore() {
1470
+ var _this = this;
1471
+ var /** @type {?} */ _dispatcher = new BehaviorSubject({
1472
+ type: '[datepicker] dispatcher init'
1473
+ });
1474
+ var /** @type {?} */ state = new MiniState(initialDatepickerState, _dispatcher, bsDatepickerReducer);
1475
+ _this = _super.call(this, _dispatcher, bsDatepickerReducer, state) || this;
1476
+ return _this;
1477
+ }
1478
+ BsDatepickerStore.decorators = [
1479
+ { type: Injectable }
1480
+ ];
1481
+ /** @nocollapse */
1482
+ BsDatepickerStore.ctorParameters = function () { return []; };
1483
+ return BsDatepickerStore;
1484
+ }(MiniStore));
1485
+
1486
+ /**
1487
+ * @fileoverview added by tsickle
1488
+ * @suppress {checkTypes} checked by tsc
1489
+ */
1490
+ var BsDatepickerContainerComponent = /** @class */ (function (_super) {
1491
+ __extends(BsDatepickerContainerComponent, _super);
1492
+ function BsDatepickerContainerComponent(_config, _store, _actions, _effects) {
1493
+ var _this = _super.call(this) || this;
1494
+ _this._config = _config;
1495
+ _this._store = _store;
1496
+ _this._actions = _actions;
1497
+ _this.valueChange = new EventEmitter();
1498
+ _this._subs = [];
1499
+ _this._effects = _effects;
1500
+ return _this;
1501
+ }
1502
+ Object.defineProperty(BsDatepickerContainerComponent.prototype, "value", {
1503
+ set: /**
1504
+ * @param {?} value
1505
+ * @return {?}
1506
+ */
1507
+ function (value) {
1508
+ this._effects.setValue(value);
1509
+ },
1510
+ enumerable: true,
1511
+ configurable: true
1512
+ });
1513
+ /**
1514
+ * @return {?}
1515
+ */
1516
+ BsDatepickerContainerComponent.prototype.ngOnInit = /**
1517
+ * @return {?}
1518
+ */
1519
+ function () {
1520
+ var _this = this;
1521
+ this.isOtherMonthsActive = this._config.selectFromOtherMonth;
1522
+ this.containerClass = this._config.containerClass;
1523
+ this._effects
1524
+ .init(this._store)
1525
+ .setOptions(this._config)
1526
+ .setBindings(this)
1527
+ .setEventHandlers(this)
1528
+ .registerDatepickerSideEffects();
1529
+ // todo: move it somewhere else
1530
+ // on selected date change
1531
+ this._subs.push(this._store
1532
+ .select(function (state) { return state.selectedDate; })
1533
+ .subscribe(function (date) { return _this.valueChange.emit(date); }));
1534
+ };
1535
+ /**
1536
+ * @param {?} day
1537
+ * @return {?}
1538
+ */
1539
+ BsDatepickerContainerComponent.prototype.daySelectHandler = /**
1540
+ * @param {?} day
1541
+ * @return {?}
1542
+ */
1543
+ function (day) {
1544
+ var /** @type {?} */ isDisabled = this.isOtherMonthsActive ? day.isDisabled : (day.isOtherMonth || day.isDisabled);
1545
+ if (isDisabled) {
1546
+ return;
1547
+ }
1548
+ this._store.dispatch(this._actions.select(day.date));
1549
+ };
1550
+ /**
1551
+ * @return {?}
1552
+ */
1553
+ BsDatepickerContainerComponent.prototype.ngOnDestroy = /**
1554
+ * @return {?}
1555
+ */
1556
+ function () {
1557
+ try {
1558
+ for (var _a = __values(this._subs), _b = _a.next(); !_b.done; _b = _a.next()) {
1559
+ var sub = _b.value;
1560
+ sub.unsubscribe();
1561
+ }
1562
+ }
1563
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1564
+ finally {
1565
+ try {
1566
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
1567
+ }
1568
+ finally { if (e_1) throw e_1.error; }
1569
+ }
1570
+ this._effects.destroy();
1571
+ var e_1, _c;
1572
+ };
1573
+ BsDatepickerContainerComponent.decorators = [
1574
+ { type: Component, args: [{
1575
+ selector: 'bs-datepicker-container',
1576
+ providers: [BsDatepickerStore, BsDatepickerEffects],
1577
+ template: "<!-- days calendar view mode -->\n<div class=\"bs-datepicker\" [ngClass]=\"containerClass\" *ngIf=\"viewMode | async\">\n <div class=\"bs-datepicker-container\">\n\n <!--calendars-->\n <div class=\"bs-calendar-container\" [ngSwitch]=\"viewMode | async\" role=\"application\">\n <!--days calendar-->\n <div *ngSwitchCase=\"'day'\" class=\"bs-media-container\">\n <bs-days-calendar-view\n *ngFor=\"let calendar of (daysCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n [options]=\"options | async\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"dayHoverHandler($event)\"\n (onSelect)=\"daySelectHandler($event)\"\n ></bs-days-calendar-view>\n </div>\n\n <!--months calendar-->\n <div *ngSwitchCase=\"'month'\" class=\"bs-media-container\">\n <bs-month-calendar-view\n *ngFor=\"let calendar of (monthsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"monthHoverHandler($event)\"\n (onSelect)=\"monthSelectHandler($event)\"\n ></bs-month-calendar-view>\n </div>\n\n <!--years calendar-->\n <div *ngSwitchCase=\"'year'\" class=\"bs-media-container\">\n <bs-years-calendar-view\n *ngFor=\"let calendar of (yearsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async )?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"yearHoverHandler($event)\"\n (onSelect)=\"yearSelectHandler($event)\"\n ></bs-years-calendar-view>\n </div>\n\n </div>\n\n <!--applycancel buttons-->\n <div class=\"bs-datepicker-buttons\" *ngIf=\"false\">\n <button class=\"btn btn-success\">Apply</button>\n <button class=\"btn btn-default\">Cancel</button>\n </div>\n\n </div>\n\n <!--custom dates or date ranges picker-->\n <div class=\"bs-datepicker-custom-range\" *ngIf=\"false\">\n <bs-custom-date-view [ranges]=\"_customRangesFish\"></bs-custom-date-view>\n </div>\n</div>\n",
1578
+ host: {
1579
+ '(click)': '_stopPropagation($event)',
1580
+ style: 'position: absolute; display: block;',
1581
+ role: 'dialog',
1582
+ 'aria-label': 'calendar'
1583
+ }
1584
+ }] }
1585
+ ];
1586
+ /** @nocollapse */
1587
+ BsDatepickerContainerComponent.ctorParameters = function () { return [
1588
+ { type: BsDatepickerConfig, },
1589
+ { type: BsDatepickerStore, },
1590
+ { type: BsDatepickerActions, },
1591
+ { type: BsDatepickerEffects, },
1592
+ ]; };
1593
+ return BsDatepickerContainerComponent;
1594
+ }(BsDatepickerAbstractComponent));
1595
+
1596
+ /**
1597
+ * @fileoverview added by tsickle
1598
+ * @suppress {checkTypes} checked by tsc
1599
+ */
1600
+ var BsDatepickerDirective = /** @class */ (function () {
1601
+ function BsDatepickerDirective(_config, _elementRef, _renderer, _viewContainerRef, cis) {
1602
+ this._config = _config;
1603
+ /**
1604
+ * Placement of a datepicker. Accepts: "top", "bottom", "left", "right"
1605
+ */
1606
+ this.placement = 'bottom';
1607
+ /**
1608
+ * Specifies events that should trigger. Supports a space separated list of
1609
+ * event names.
1610
+ */
1611
+ this.triggers = 'click';
1612
+ /**
1613
+ * Close datepicker on outside click
1614
+ */
1615
+ this.outsideClick = true;
1616
+ /**
1617
+ * A selector specifying the element the datepicker should be appended to.
1618
+ * Currently only supports "body".
1619
+ */
1620
+ this.container = 'body';
1621
+ this.outsideEsc = true;
1622
+ /**
1623
+ * Emits when datepicker value has been changed
1624
+ */
1625
+ this.bsValueChange = new EventEmitter();
1626
+ this._subs = [];
1627
+ // todo: assign only subset of fields
1628
+ Object.assign(this, this._config);
1629
+ this._datepicker = cis.createLoader(_elementRef, _viewContainerRef, _renderer);
1630
+ this.onShown = this._datepicker.onShown;
1631
+ this.onHidden = this._datepicker.onHidden;
1632
+ }
1633
+ Object.defineProperty(BsDatepickerDirective.prototype, "isOpen", {
1634
+ get: /**
1635
+ * Returns whether or not the datepicker is currently being shown
1636
+ * @return {?}
1637
+ */
1638
+ function () {
1639
+ return this._datepicker.isShown;
1640
+ },
1641
+ set: /**
1642
+ * @param {?} value
1643
+ * @return {?}
1644
+ */
1645
+ function (value) {
1646
+ if (value) {
1647
+ this.show();
1648
+ }
1649
+ else {
1650
+ this.hide();
1651
+ }
1652
+ },
1653
+ enumerable: true,
1654
+ configurable: true
1655
+ });
1656
+ Object.defineProperty(BsDatepickerDirective.prototype, "bsValue", {
1657
+ set: /**
1658
+ * Initial value of datepicker
1659
+ * @param {?} value
1660
+ * @return {?}
1661
+ */
1662
+ function (value) {
1663
+ if (this._bsValue === value) {
1664
+ return;
1665
+ }
1666
+ this._bsValue = value;
1667
+ this.bsValueChange.emit(value);
1668
+ },
1669
+ enumerable: true,
1670
+ configurable: true
1671
+ });
1672
+ /**
1673
+ * @return {?}
1674
+ */
1675
+ BsDatepickerDirective.prototype.ngOnInit = /**
1676
+ * @return {?}
1677
+ */
1678
+ function () {
1679
+ var _this = this;
1680
+ this._datepicker.listen({
1681
+ outsideClick: this.outsideClick,
1682
+ outsideEsc: this.outsideEsc,
1683
+ triggers: this.triggers,
1684
+ show: function () { return _this.show(); }
1685
+ });
1686
+ this.setConfig();
1687
+ };
1688
+ /**
1689
+ * @param {?} changes
1690
+ * @return {?}
1691
+ */
1692
+ BsDatepickerDirective.prototype.ngOnChanges = /**
1693
+ * @param {?} changes
1694
+ * @return {?}
1695
+ */
1696
+ function (changes) {
1697
+ if (!this._datepickerRef || !this._datepickerRef.instance) {
1698
+ return;
1699
+ }
1700
+ if (changes["minDate"]) {
1701
+ this._datepickerRef.instance.minDate = this.minDate;
1702
+ }
1703
+ if (changes["maxDate"]) {
1704
+ this._datepickerRef.instance.maxDate = this.maxDate;
1705
+ }
1706
+ if (changes["daysDisabled"]) {
1707
+ this._datepickerRef.instance.daysDisabled = this.daysDisabled;
1708
+ }
1709
+ if (changes["isDisabled"]) {
1710
+ this._datepickerRef.instance.isDisabled = this.isDisabled;
1711
+ }
1712
+ };
1713
+ /**
1714
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
1715
+ * the datepicker.
1716
+ */
1717
+ /**
1718
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
1719
+ * the datepicker.
1720
+ * @return {?}
1721
+ */
1722
+ BsDatepickerDirective.prototype.show = /**
1723
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
1724
+ * the datepicker.
1725
+ * @return {?}
1726
+ */
1727
+ function () {
1728
+ var _this = this;
1729
+ if (this._datepicker.isShown) {
1730
+ return;
1731
+ }
1732
+ this.setConfig();
1733
+ this._datepickerRef = this._datepicker
1734
+ .provide({ provide: BsDatepickerConfig, useValue: this._config })
1735
+ .attach(BsDatepickerContainerComponent)
1736
+ .to(this.container)
1737
+ .position({ attachment: this.placement })
1738
+ .show({ placement: this.placement });
1739
+ // if date changes from external source (model -> view)
1740
+ this._subs.push(this.bsValueChange.subscribe(function (value) {
1741
+ _this._datepickerRef.instance.value = value;
1742
+ }));
1743
+ // if date changes from picker (view -> model)
1744
+ this._subs.push(this._datepickerRef.instance.valueChange.subscribe(function (value) {
1745
+ _this.bsValue = value;
1746
+ _this.hide();
1747
+ }));
1748
+ };
1749
+ /**
1750
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
1751
+ * the datepicker.
1752
+ */
1753
+ /**
1754
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
1755
+ * the datepicker.
1756
+ * @return {?}
1757
+ */
1758
+ BsDatepickerDirective.prototype.hide = /**
1759
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
1760
+ * the datepicker.
1761
+ * @return {?}
1762
+ */
1763
+ function () {
1764
+ if (this.isOpen) {
1765
+ this._datepicker.hide();
1766
+ }
1767
+ try {
1768
+ for (var _a = __values(this._subs), _b = _a.next(); !_b.done; _b = _a.next()) {
1769
+ var sub = _b.value;
1770
+ sub.unsubscribe();
1771
+ }
1772
+ }
1773
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1774
+ finally {
1775
+ try {
1776
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
1777
+ }
1778
+ finally { if (e_1) throw e_1.error; }
1779
+ }
1780
+ var e_1, _c;
1781
+ };
1782
+ /**
1783
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
1784
+ * of the datepicker.
1785
+ */
1786
+ /**
1787
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
1788
+ * of the datepicker.
1789
+ * @return {?}
1790
+ */
1791
+ BsDatepickerDirective.prototype.toggle = /**
1792
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
1793
+ * of the datepicker.
1794
+ * @return {?}
1795
+ */
1796
+ function () {
1797
+ if (this.isOpen) {
1798
+ return this.hide();
1799
+ }
1800
+ this.show();
1801
+ };
1802
+ /**
1803
+ * Set config for datepicker
1804
+ */
1805
+ /**
1806
+ * Set config for datepicker
1807
+ * @return {?}
1808
+ */
1809
+ BsDatepickerDirective.prototype.setConfig = /**
1810
+ * Set config for datepicker
1811
+ * @return {?}
1812
+ */
1813
+ function () {
1814
+ this._config = Object.assign({}, this._config, this.bsConfig, {
1815
+ value: this._bsValue,
1816
+ isDisabled: this.isDisabled,
1817
+ minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
1818
+ maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate,
1819
+ daysDisabled: this.daysDisabled || this.bsConfig && this.bsConfig.daysDisabled,
1820
+ minMode: this.minMode || this.bsConfig && this.bsConfig.minMode
1821
+ });
1822
+ };
1823
+ /**
1824
+ * @return {?}
1825
+ */
1826
+ BsDatepickerDirective.prototype.ngOnDestroy = /**
1827
+ * @return {?}
1828
+ */
1829
+ function () {
1830
+ this._datepicker.dispose();
1831
+ };
1832
+ BsDatepickerDirective.decorators = [
1833
+ { type: Directive, args: [{
1834
+ selector: '[bsDatepicker]',
1835
+ exportAs: 'bsDatepicker'
1836
+ },] }
1837
+ ];
1838
+ /** @nocollapse */
1839
+ BsDatepickerDirective.ctorParameters = function () { return [
1840
+ { type: BsDatepickerConfig, },
1841
+ { type: ElementRef, },
1842
+ { type: Renderer2, },
1843
+ { type: ViewContainerRef, },
1844
+ { type: ComponentLoaderFactory, },
1845
+ ]; };
1846
+ BsDatepickerDirective.propDecorators = {
1847
+ "placement": [{ type: Input },],
1848
+ "triggers": [{ type: Input },],
1849
+ "outsideClick": [{ type: Input },],
1850
+ "container": [{ type: Input },],
1851
+ "outsideEsc": [{ type: Input },],
1852
+ "isOpen": [{ type: Input },],
1853
+ "onShown": [{ type: Output },],
1854
+ "onHidden": [{ type: Output },],
1855
+ "bsValue": [{ type: Input },],
1856
+ "bsConfig": [{ type: Input },],
1857
+ "isDisabled": [{ type: Input },],
1858
+ "minDate": [{ type: Input },],
1859
+ "maxDate": [{ type: Input },],
1860
+ "minMode": [{ type: Input },],
1861
+ "daysDisabled": [{ type: Input },],
1862
+ "bsValueChange": [{ type: Output },],
1863
+ };
1864
+ return BsDatepickerDirective;
1865
+ }());
1866
+
1867
+ /**
1868
+ * @fileoverview added by tsickle
1869
+ * @suppress {checkTypes} checked by tsc
1870
+ */
1871
+ var /** @type {?} */ BS_DATEPICKER_VALUE_ACCESSOR = {
1872
+ provide: NG_VALUE_ACCESSOR,
1873
+ /* tslint:disable-next-line: no-use-before-declare */
1874
+ useExisting: forwardRef(function () { return BsDatepickerInputDirective; }),
1875
+ multi: true
1876
+ };
1877
+ var /** @type {?} */ BS_DATEPICKER_VALIDATOR = {
1878
+ provide: NG_VALIDATORS,
1879
+ /* tslint:disable-next-line: no-use-before-declare */
1880
+ useExisting: forwardRef(function () { return BsDatepickerInputDirective; }),
1881
+ multi: true
1882
+ };
1883
+ var BsDatepickerInputDirective = /** @class */ (function () {
1884
+ function BsDatepickerInputDirective(_picker, _localeService, _renderer, _elRef, changeDetection) {
1885
+ var _this = this;
1886
+ this._picker = _picker;
1887
+ this._localeService = _localeService;
1888
+ this._renderer = _renderer;
1889
+ this._elRef = _elRef;
1890
+ this.changeDetection = changeDetection;
1891
+ this._onChange = Function.prototype;
1892
+ this._onTouched = Function.prototype;
1893
+ this._validatorChange = Function.prototype;
1894
+ // update input value on datepicker value update
1895
+ this._picker.bsValueChange.subscribe(function (value) {
1896
+ _this._setInputValue(value);
1897
+ if (_this._value !== value) {
1898
+ _this._value = value;
1899
+ _this._onChange(value);
1900
+ _this._onTouched();
1901
+ }
1902
+ _this.changeDetection.markForCheck();
1903
+ });
1904
+ // update input value on locale change
1905
+ this._localeService.localeChange.subscribe(function () {
1906
+ _this._setInputValue(_this._value);
1907
+ });
1908
+ }
1909
+ /**
1910
+ * @param {?} value
1911
+ * @return {?}
1912
+ */
1913
+ BsDatepickerInputDirective.prototype._setInputValue = /**
1914
+ * @param {?} value
1915
+ * @return {?}
1916
+ */
1917
+ function (value) {
1918
+ var /** @type {?} */ initialDate = !value ? ''
1919
+ : formatDate(value, this._picker._config.dateInputFormat, this._localeService.currentLocale);
1920
+ this._renderer.setProperty(this._elRef.nativeElement, 'value', initialDate);
1921
+ };
1922
+ /**
1923
+ * @param {?} event
1924
+ * @return {?}
1925
+ */
1926
+ BsDatepickerInputDirective.prototype.onChange = /**
1927
+ * @param {?} event
1928
+ * @return {?}
1929
+ */
1930
+ function (event) {
1931
+ /* tslint:disable-next-line: no-any*/
1932
+ this.writeValue((/** @type {?} */ (event.target)).value);
1933
+ this._onChange(this._value);
1934
+ this._onTouched();
1935
+ };
1936
+ /**
1937
+ * @param {?} c
1938
+ * @return {?}
1939
+ */
1940
+ BsDatepickerInputDirective.prototype.validate = /**
1941
+ * @param {?} c
1942
+ * @return {?}
1943
+ */
1944
+ function (c) {
1945
+ var /** @type {?} */ _value = c.value;
1946
+ /* tslint:disable-next-line: prefer-switch */
1947
+ if (_value === null || _value === undefined || _value === '') {
1948
+ return null;
1949
+ }
1950
+ if (isDate(_value)) {
1951
+ var /** @type {?} */ _isDateValid = isDateValid(_value);
1952
+ if (!_isDateValid) {
1953
+ return { bsDate: { invalid: _value } };
1954
+ }
1955
+ if (this._picker && this._picker.minDate && isBefore(_value, this._picker.minDate, 'date')) {
1956
+ return { bsDate: { minDate: this._picker.minDate } };
1957
+ }
1958
+ if (this._picker && this._picker.maxDate && isAfter(_value, this._picker.maxDate, 'date')) {
1959
+ return { bsDate: { maxDate: this._picker.maxDate } };
1960
+ }
1961
+ }
1962
+ };
1963
+ /**
1964
+ * @param {?} fn
1965
+ * @return {?}
1966
+ */
1967
+ BsDatepickerInputDirective.prototype.registerOnValidatorChange = /**
1968
+ * @param {?} fn
1969
+ * @return {?}
1970
+ */
1971
+ function (fn) {
1972
+ this._validatorChange = fn;
1973
+ };
1974
+ /**
1975
+ * @param {?} value
1976
+ * @return {?}
1977
+ */
1978
+ BsDatepickerInputDirective.prototype.writeValue = /**
1979
+ * @param {?} value
1980
+ * @return {?}
1981
+ */
1982
+ function (value) {
1983
+ if (!value) {
1984
+ this._value = null;
1985
+ }
1986
+ else {
1987
+ var /** @type {?} */ _localeKey = this._localeService.currentLocale;
1988
+ var /** @type {?} */ _locale = getLocale(_localeKey);
1989
+ if (!_locale) {
1990
+ throw new Error("Locale \"" + _localeKey + "\" is not defined, please add it with \"defineLocale(...)\"");
1991
+ }
1992
+ this._value = parseDate(value, this._picker._config.dateInputFormat, this._localeService.currentLocale);
1993
+ }
1994
+ this._picker.bsValue = this._value;
1995
+ };
1996
+ /**
1997
+ * @param {?} isDisabled
1998
+ * @return {?}
1999
+ */
2000
+ BsDatepickerInputDirective.prototype.setDisabledState = /**
2001
+ * @param {?} isDisabled
2002
+ * @return {?}
2003
+ */
2004
+ function (isDisabled) {
2005
+ this._picker.isDisabled = isDisabled;
2006
+ if (isDisabled) {
2007
+ this._renderer.setAttribute(this._elRef.nativeElement, 'disabled', 'disabled');
2008
+ return;
2009
+ }
2010
+ this._renderer.removeAttribute(this._elRef.nativeElement, 'disabled');
2011
+ };
2012
+ /**
2013
+ * @param {?} fn
2014
+ * @return {?}
2015
+ */
2016
+ BsDatepickerInputDirective.prototype.registerOnChange = /**
2017
+ * @param {?} fn
2018
+ * @return {?}
2019
+ */
2020
+ function (fn) {
2021
+ this._onChange = fn;
2022
+ };
2023
+ /**
2024
+ * @param {?} fn
2025
+ * @return {?}
2026
+ */
2027
+ BsDatepickerInputDirective.prototype.registerOnTouched = /**
2028
+ * @param {?} fn
2029
+ * @return {?}
2030
+ */
2031
+ function (fn) {
2032
+ this._onTouched = fn;
2033
+ };
2034
+ /**
2035
+ * @return {?}
2036
+ */
2037
+ BsDatepickerInputDirective.prototype.onBlur = /**
2038
+ * @return {?}
2039
+ */
2040
+ function () {
2041
+ this._onTouched();
2042
+ };
2043
+ /**
2044
+ * @return {?}
2045
+ */
2046
+ BsDatepickerInputDirective.prototype.hide = /**
2047
+ * @return {?}
2048
+ */
2049
+ function () {
2050
+ this._picker.hide();
2051
+ this._renderer.selectRootElement(this._elRef.nativeElement).blur();
2052
+ };
2053
+ BsDatepickerInputDirective.decorators = [
2054
+ { type: Directive, args: [{
2055
+ selector: "input[bsDatepicker]",
2056
+ host: {
2057
+ '(change)': 'onChange($event)',
2058
+ '(keyup.esc)': 'hide()',
2059
+ '(blur)': 'onBlur()'
2060
+ },
2061
+ providers: [BS_DATEPICKER_VALUE_ACCESSOR, BS_DATEPICKER_VALIDATOR]
2062
+ },] }
2063
+ ];
2064
+ /** @nocollapse */
2065
+ BsDatepickerInputDirective.ctorParameters = function () { return [
2066
+ { type: BsDatepickerDirective, decorators: [{ type: Host },] },
2067
+ { type: BsLocaleService, },
2068
+ { type: Renderer2, },
2069
+ { type: ElementRef, },
2070
+ { type: ChangeDetectorRef, },
2071
+ ]; };
2072
+ return BsDatepickerInputDirective;
2073
+ }());
2074
+
2075
+ /**
2076
+ * @fileoverview added by tsickle
2077
+ * @suppress {checkTypes} checked by tsc
2078
+ */
2079
+ var BsDaterangepickerConfig = /** @class */ (function (_super) {
2080
+ __extends(BsDaterangepickerConfig, _super);
2081
+ function BsDaterangepickerConfig() {
2082
+ var _this = _super !== null && _super.apply(this, arguments) || this;
2083
+ // DatepickerRenderOptions
2084
+ _this.displayMonths = 2;
2085
+ return _this;
2086
+ }
2087
+ BsDaterangepickerConfig.decorators = [
2088
+ { type: Injectable }
2089
+ ];
2090
+ return BsDaterangepickerConfig;
2091
+ }(BsDatepickerConfig));
2092
+
2093
+ /**
2094
+ * @fileoverview added by tsickle
2095
+ * @suppress {checkTypes} checked by tsc
2096
+ */
2097
+ var BsDaterangepickerContainerComponent = /** @class */ (function (_super) {
2098
+ __extends(BsDaterangepickerContainerComponent, _super);
2099
+ function BsDaterangepickerContainerComponent(_config, _store, _actions, _effects) {
2100
+ var _this = _super.call(this) || this;
2101
+ _this._config = _config;
2102
+ _this._store = _store;
2103
+ _this._actions = _actions;
2104
+ _this.valueChange = new EventEmitter();
2105
+ _this._rangeStack = [];
2106
+ _this._subs = [];
2107
+ _this._effects = _effects;
2108
+ return _this;
2109
+ }
2110
+ Object.defineProperty(BsDaterangepickerContainerComponent.prototype, "value", {
2111
+ set: /**
2112
+ * @param {?} value
2113
+ * @return {?}
2114
+ */
2115
+ function (value) {
2116
+ this._effects.setRangeValue(value);
2117
+ },
2118
+ enumerable: true,
2119
+ configurable: true
2120
+ });
2121
+ /**
2122
+ * @return {?}
2123
+ */
2124
+ BsDaterangepickerContainerComponent.prototype.ngOnInit = /**
2125
+ * @return {?}
2126
+ */
2127
+ function () {
2128
+ var _this = this;
2129
+ this.containerClass = this._config.containerClass;
2130
+ this.isOtherMonthsActive = this._config.selectFromOtherMonth;
2131
+ this._effects
2132
+ .init(this._store)
2133
+ .setOptions(this._config)
2134
+ .setBindings(this)
2135
+ .setEventHandlers(this)
2136
+ .registerDatepickerSideEffects();
2137
+ // todo: move it somewhere else
2138
+ // on selected date change
2139
+ this._subs.push(this._store
2140
+ .select(function (state) { return state.selectedRange; })
2141
+ .subscribe(function (date) { return _this.valueChange.emit(date); }));
2142
+ };
2143
+ /**
2144
+ * @param {?} day
2145
+ * @return {?}
2146
+ */
2147
+ BsDaterangepickerContainerComponent.prototype.daySelectHandler = /**
2148
+ * @param {?} day
2149
+ * @return {?}
2150
+ */
2151
+ function (day) {
2152
+ var /** @type {?} */ isDisabled = this.isOtherMonthsActive ? day.isDisabled : (day.isOtherMonth || day.isDisabled);
2153
+ if (isDisabled) {
2154
+ return;
2155
+ }
2156
+ // if only one date is already selected
2157
+ // and user clicks on previous date
2158
+ // start selection from new date
2159
+ // but if new date is after initial one
2160
+ // than finish selection
2161
+ if (this._rangeStack.length === 1) {
2162
+ this._rangeStack =
2163
+ day.date >= this._rangeStack[0]
2164
+ ? [this._rangeStack[0], day.date]
2165
+ : [day.date];
2166
+ }
2167
+ if (this._rangeStack.length === 0) {
2168
+ this._rangeStack = [day.date];
2169
+ }
2170
+ this._store.dispatch(this._actions.selectRange(this._rangeStack));
2171
+ if (this._rangeStack.length === 2) {
2172
+ this._rangeStack = [];
2173
+ }
2174
+ };
2175
+ /**
2176
+ * @return {?}
2177
+ */
2178
+ BsDaterangepickerContainerComponent.prototype.ngOnDestroy = /**
2179
+ * @return {?}
2180
+ */
2181
+ function () {
2182
+ try {
2183
+ for (var _a = __values(this._subs), _b = _a.next(); !_b.done; _b = _a.next()) {
2184
+ var sub = _b.value;
2185
+ sub.unsubscribe();
2186
+ }
2187
+ }
2188
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2189
+ finally {
2190
+ try {
2191
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
2192
+ }
2193
+ finally { if (e_1) throw e_1.error; }
2194
+ }
2195
+ this._effects.destroy();
2196
+ var e_1, _c;
2197
+ };
2198
+ BsDaterangepickerContainerComponent.decorators = [
2199
+ { type: Component, args: [{
2200
+ selector: 'bs-daterangepicker-container',
2201
+ providers: [BsDatepickerStore, BsDatepickerEffects],
2202
+ template: "<!-- days calendar view mode -->\n<div class=\"bs-datepicker\" [ngClass]=\"containerClass\" *ngIf=\"viewMode | async\">\n <div class=\"bs-datepicker-container\">\n\n <!--calendars-->\n <div class=\"bs-calendar-container\" [ngSwitch]=\"viewMode | async\" role=\"application\">\n <!--days calendar-->\n <div *ngSwitchCase=\"'day'\" class=\"bs-media-container\">\n <bs-days-calendar-view\n *ngFor=\"let calendar of (daysCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n [options]=\"options | async\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"dayHoverHandler($event)\"\n (onSelect)=\"daySelectHandler($event)\"\n ></bs-days-calendar-view>\n </div>\n\n <!--months calendar-->\n <div *ngSwitchCase=\"'month'\" class=\"bs-media-container\">\n <bs-month-calendar-view\n *ngFor=\"let calendar of (monthsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async)?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"monthHoverHandler($event)\"\n (onSelect)=\"monthSelectHandler($event)\"\n ></bs-month-calendar-view>\n </div>\n\n <!--years calendar-->\n <div *ngSwitchCase=\"'year'\" class=\"bs-media-container\">\n <bs-years-calendar-view\n *ngFor=\"let calendar of (yearsCalendar | async)\"\n [class.bs-datepicker-multiple]=\"(daysCalendar | async )?.length > 1\"\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"setViewMode($event)\"\n (onHover)=\"yearHoverHandler($event)\"\n (onSelect)=\"yearSelectHandler($event)\"\n ></bs-years-calendar-view>\n </div>\n\n </div>\n\n <!--applycancel buttons-->\n <div class=\"bs-datepicker-buttons\" *ngIf=\"false\">\n <button class=\"btn btn-success\">Apply</button>\n <button class=\"btn btn-default\">Cancel</button>\n </div>\n\n </div>\n\n <!--custom dates or date ranges picker-->\n <div class=\"bs-datepicker-custom-range\" *ngIf=\"false\">\n <bs-custom-date-view [ranges]=\"_customRangesFish\"></bs-custom-date-view>\n </div>\n</div>\n",
2203
+ host: {
2204
+ '(click)': '_stopPropagation($event)',
2205
+ style: 'position: absolute; display: block;',
2206
+ role: 'dialog',
2207
+ 'aria-label': 'calendar'
2208
+ }
2209
+ }] }
2210
+ ];
2211
+ /** @nocollapse */
2212
+ BsDaterangepickerContainerComponent.ctorParameters = function () { return [
2213
+ { type: BsDatepickerConfig, },
2214
+ { type: BsDatepickerStore, },
2215
+ { type: BsDatepickerActions, },
2216
+ { type: BsDatepickerEffects, },
2217
+ ]; };
2218
+ return BsDaterangepickerContainerComponent;
2219
+ }(BsDatepickerAbstractComponent));
2220
+
2221
+ /**
2222
+ * @fileoverview added by tsickle
2223
+ * @suppress {checkTypes} checked by tsc
2224
+ */
2225
+ var BsDaterangepickerDirective = /** @class */ (function () {
2226
+ function BsDaterangepickerDirective(_config, _elementRef, _renderer, _viewContainerRef, cis) {
2227
+ this._config = _config;
2228
+ /**
2229
+ * Placement of a daterangepicker. Accepts: "top", "bottom", "left", "right"
2230
+ */
2231
+ this.placement = 'bottom';
2232
+ /**
2233
+ * Specifies events that should trigger. Supports a space separated list of
2234
+ * event names.
2235
+ */
2236
+ this.triggers = 'click';
2237
+ /**
2238
+ * Close daterangepicker on outside click
2239
+ */
2240
+ this.outsideClick = true;
2241
+ /**
2242
+ * A selector specifying the element the daterangepicker should be appended
2243
+ * to. Currently only supports "body".
2244
+ */
2245
+ this.container = 'body';
2246
+ this.outsideEsc = true;
2247
+ /**
2248
+ * Emits when daterangepicker value has been changed
2249
+ */
2250
+ this.bsValueChange = new EventEmitter();
2251
+ this._subs = [];
2252
+ this._datepicker = cis.createLoader(_elementRef, _viewContainerRef, _renderer);
2253
+ Object.assign(this, _config);
2254
+ this.onShown = this._datepicker.onShown;
2255
+ this.onHidden = this._datepicker.onHidden;
2256
+ }
2257
+ Object.defineProperty(BsDaterangepickerDirective.prototype, "isOpen", {
2258
+ get: /**
2259
+ * Returns whether or not the daterangepicker is currently being shown
2260
+ * @return {?}
2261
+ */
2262
+ function () {
2263
+ return this._datepicker.isShown;
2264
+ },
2265
+ set: /**
2266
+ * @param {?} value
2267
+ * @return {?}
2268
+ */
2269
+ function (value) {
2270
+ if (value) {
2271
+ this.show();
2272
+ }
2273
+ else {
2274
+ this.hide();
2275
+ }
2276
+ },
2277
+ enumerable: true,
2278
+ configurable: true
2279
+ });
2280
+ Object.defineProperty(BsDaterangepickerDirective.prototype, "bsValue", {
2281
+ set: /**
2282
+ * Initial value of daterangepicker
2283
+ * @param {?} value
2284
+ * @return {?}
2285
+ */
2286
+ function (value) {
2287
+ if (this._bsValue === value) {
2288
+ return;
2289
+ }
2290
+ this._bsValue = value;
2291
+ this.bsValueChange.emit(value);
2292
+ },
2293
+ enumerable: true,
2294
+ configurable: true
2295
+ });
2296
+ /**
2297
+ * @return {?}
2298
+ */
2299
+ BsDaterangepickerDirective.prototype.ngOnInit = /**
2300
+ * @return {?}
2301
+ */
2302
+ function () {
2303
+ var _this = this;
2304
+ this._datepicker.listen({
2305
+ outsideClick: this.outsideClick,
2306
+ outsideEsc: this.outsideEsc,
2307
+ triggers: this.triggers,
2308
+ show: function () { return _this.show(); }
2309
+ });
2310
+ this.setConfig();
2311
+ };
2312
+ /**
2313
+ * @param {?} changes
2314
+ * @return {?}
2315
+ */
2316
+ BsDaterangepickerDirective.prototype.ngOnChanges = /**
2317
+ * @param {?} changes
2318
+ * @return {?}
2319
+ */
2320
+ function (changes) {
2321
+ if (!this._datepickerRef || !this._datepickerRef.instance) {
2322
+ return;
2323
+ }
2324
+ if (changes["minDate"]) {
2325
+ this._datepickerRef.instance.minDate = this.minDate;
2326
+ }
2327
+ if (changes["maxDate"]) {
2328
+ this._datepickerRef.instance.maxDate = this.maxDate;
2329
+ }
2330
+ if (changes["isDisabled"]) {
2331
+ this._datepickerRef.instance.isDisabled = this.isDisabled;
2332
+ }
2333
+ };
2334
+ /**
2335
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
2336
+ * the datepicker.
2337
+ */
2338
+ /**
2339
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
2340
+ * the datepicker.
2341
+ * @return {?}
2342
+ */
2343
+ BsDaterangepickerDirective.prototype.show = /**
2344
+ * Opens an element’s datepicker. This is considered a “manual” triggering of
2345
+ * the datepicker.
2346
+ * @return {?}
2347
+ */
2348
+ function () {
2349
+ var _this = this;
2350
+ if (this._datepicker.isShown) {
2351
+ return;
2352
+ }
2353
+ this.setConfig();
2354
+ this._datepickerRef = this._datepicker
2355
+ .provide({ provide: BsDatepickerConfig, useValue: this._config })
2356
+ .attach(BsDaterangepickerContainerComponent)
2357
+ .to(this.container)
2358
+ .position({ attachment: this.placement })
2359
+ .show({ placement: this.placement });
2360
+ // if date changes from external source (model -> view)
2361
+ this._subs.push(this.bsValueChange.subscribe(function (value) {
2362
+ _this._datepickerRef.instance.value = value;
2363
+ }));
2364
+ // if date changes from picker (view -> model)
2365
+ this._subs.push(this._datepickerRef.instance.valueChange
2366
+ .pipe(filter(function (range) { return range && range[0] && !!range[1]; }))
2367
+ .subscribe(function (value) {
2368
+ _this.bsValue = value;
2369
+ _this.hide();
2370
+ }));
2371
+ };
2372
+ /**
2373
+ * Set config for daterangepicker
2374
+ */
2375
+ /**
2376
+ * Set config for daterangepicker
2377
+ * @return {?}
2378
+ */
2379
+ BsDaterangepickerDirective.prototype.setConfig = /**
2380
+ * Set config for daterangepicker
2381
+ * @return {?}
2382
+ */
2383
+ function () {
2384
+ this._config = Object.assign({}, this._config, this.bsConfig, {
2385
+ value: this._bsValue,
2386
+ isDisabled: this.isDisabled,
2387
+ minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
2388
+ maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate
2389
+ });
2390
+ };
2391
+ /**
2392
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
2393
+ * the datepicker.
2394
+ */
2395
+ /**
2396
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
2397
+ * the datepicker.
2398
+ * @return {?}
2399
+ */
2400
+ BsDaterangepickerDirective.prototype.hide = /**
2401
+ * Closes an element’s datepicker. This is considered a “manual” triggering of
2402
+ * the datepicker.
2403
+ * @return {?}
2404
+ */
2405
+ function () {
2406
+ if (this.isOpen) {
2407
+ this._datepicker.hide();
2408
+ }
2409
+ try {
2410
+ for (var _a = __values(this._subs), _b = _a.next(); !_b.done; _b = _a.next()) {
2411
+ var sub = _b.value;
2412
+ sub.unsubscribe();
2413
+ }
2414
+ }
2415
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2416
+ finally {
2417
+ try {
2418
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
2419
+ }
2420
+ finally { if (e_1) throw e_1.error; }
2421
+ }
2422
+ var e_1, _c;
2423
+ };
2424
+ /**
2425
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
2426
+ * of the datepicker.
2427
+ */
2428
+ /**
2429
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
2430
+ * of the datepicker.
2431
+ * @return {?}
2432
+ */
2433
+ BsDaterangepickerDirective.prototype.toggle = /**
2434
+ * Toggles an element’s datepicker. This is considered a “manual” triggering
2435
+ * of the datepicker.
2436
+ * @return {?}
2437
+ */
2438
+ function () {
2439
+ if (this.isOpen) {
2440
+ return this.hide();
2441
+ }
2442
+ this.show();
2443
+ };
2444
+ /**
2445
+ * @return {?}
2446
+ */
2447
+ BsDaterangepickerDirective.prototype.ngOnDestroy = /**
2448
+ * @return {?}
2449
+ */
2450
+ function () {
2451
+ this._datepicker.dispose();
2452
+ };
2453
+ BsDaterangepickerDirective.decorators = [
2454
+ { type: Directive, args: [{
2455
+ selector: '[bsDaterangepicker]',
2456
+ exportAs: 'bsDaterangepicker'
2457
+ },] }
2458
+ ];
2459
+ /** @nocollapse */
2460
+ BsDaterangepickerDirective.ctorParameters = function () { return [
2461
+ { type: BsDaterangepickerConfig, },
2462
+ { type: ElementRef, },
2463
+ { type: Renderer2, },
2464
+ { type: ViewContainerRef, },
2465
+ { type: ComponentLoaderFactory, },
2466
+ ]; };
2467
+ BsDaterangepickerDirective.propDecorators = {
2468
+ "placement": [{ type: Input },],
2469
+ "triggers": [{ type: Input },],
2470
+ "outsideClick": [{ type: Input },],
2471
+ "container": [{ type: Input },],
2472
+ "outsideEsc": [{ type: Input },],
2473
+ "isOpen": [{ type: Input },],
2474
+ "onShown": [{ type: Output },],
2475
+ "onHidden": [{ type: Output },],
2476
+ "bsValue": [{ type: Input },],
2477
+ "bsConfig": [{ type: Input },],
2478
+ "isDisabled": [{ type: Input },],
2479
+ "minDate": [{ type: Input },],
2480
+ "maxDate": [{ type: Input },],
2481
+ "bsValueChange": [{ type: Output },],
2482
+ };
2483
+ return BsDaterangepickerDirective;
2484
+ }());
2485
+
2486
+ /**
2487
+ * @fileoverview added by tsickle
2488
+ * @suppress {checkTypes} checked by tsc
2489
+ */
2490
+ var /** @type {?} */ BS_DATERANGEPICKER_VALUE_ACCESSOR = {
2491
+ provide: NG_VALUE_ACCESSOR,
2492
+ /* tslint:disable-next-line: no-use-before-declare */
2493
+ useExisting: forwardRef(function () { return BsDaterangepickerInputDirective; }),
2494
+ multi: true
2495
+ };
2496
+ var /** @type {?} */ BS_DATERANGEPICKER_VALIDATOR = {
2497
+ provide: NG_VALIDATORS,
2498
+ /* tslint:disable-next-line: no-use-before-declare */
2499
+ useExisting: forwardRef(function () { return BsDaterangepickerInputDirective; }),
2500
+ multi: true
2501
+ };
2502
+ var BsDaterangepickerInputDirective = /** @class */ (function () {
2503
+ function BsDaterangepickerInputDirective(_picker, _localeService, _renderer, _elRef, changeDetection) {
2504
+ var _this = this;
2505
+ this._picker = _picker;
2506
+ this._localeService = _localeService;
2507
+ this._renderer = _renderer;
2508
+ this._elRef = _elRef;
2509
+ this.changeDetection = changeDetection;
2510
+ this._onChange = Function.prototype;
2511
+ this._onTouched = Function.prototype;
2512
+ this._validatorChange = Function.prototype;
2513
+ // update input value on datepicker value update
2514
+ this._picker.bsValueChange.subscribe(function (value) {
2515
+ _this._setInputValue(value);
2516
+ if (_this._value !== value) {
2517
+ _this._value = value;
2518
+ _this._onChange(value);
2519
+ _this._onTouched();
2520
+ }
2521
+ _this.changeDetection.markForCheck();
2522
+ });
2523
+ // update input value on locale change
2524
+ this._localeService.localeChange.subscribe(function () {
2525
+ _this._setInputValue(_this._value);
2526
+ });
2527
+ }
2528
+ /**
2529
+ * @param {?} date
2530
+ * @return {?}
2531
+ */
2532
+ BsDaterangepickerInputDirective.prototype._setInputValue = /**
2533
+ * @param {?} date
2534
+ * @return {?}
2535
+ */
2536
+ function (date) {
2537
+ var /** @type {?} */ range = '';
2538
+ if (date) {
2539
+ var /** @type {?} */ start = !date[0] ? ''
2540
+ : formatDate(date[0], this._picker._config.rangeInputFormat, this._localeService.currentLocale);
2541
+ var /** @type {?} */ end = !date[1] ? ''
2542
+ : formatDate(date[1], this._picker._config.rangeInputFormat, this._localeService.currentLocale);
2543
+ range = (start && end) ? start + this._picker._config.rangeSeparator + end : '';
2544
+ }
2545
+ this._renderer.setProperty(this._elRef.nativeElement, 'value', range);
2546
+ };
2547
+ /**
2548
+ * @param {?} event
2549
+ * @return {?}
2550
+ */
2551
+ BsDaterangepickerInputDirective.prototype.onChange = /**
2552
+ * @param {?} event
2553
+ * @return {?}
2554
+ */
2555
+ function (event) {
2556
+ /* tslint:disable-next-line: no-any*/
2557
+ this.writeValue((/** @type {?} */ (event.target)).value);
2558
+ this._onChange(this._value);
2559
+ this._onTouched();
2560
+ };
2561
+ /**
2562
+ * @param {?} c
2563
+ * @return {?}
2564
+ */
2565
+ BsDaterangepickerInputDirective.prototype.validate = /**
2566
+ * @param {?} c
2567
+ * @return {?}
2568
+ */
2569
+ function (c) {
2570
+ var /** @type {?} */ _value = c.value;
2571
+ if (_value === null || _value === undefined || !isArray(_value)) {
2572
+ return null;
2573
+ }
2574
+ var /** @type {?} */ _isFirstDateValid = isDateValid(_value[0]);
2575
+ var /** @type {?} */ _isSecondDateValid = isDateValid(_value[1]);
2576
+ if (!_isFirstDateValid) {
2577
+ return { bsDate: { invalid: _value[0] } };
2578
+ }
2579
+ if (!_isSecondDateValid) {
2580
+ return { bsDate: { invalid: _value[1] } };
2581
+ }
2582
+ if (this._picker && this._picker.minDate && isBefore(_value[0], this._picker.minDate, 'date')) {
2583
+ return { bsDate: { minDate: this._picker.minDate } };
2584
+ }
2585
+ if (this._picker && this._picker.maxDate && isAfter(_value[1], this._picker.maxDate, 'date')) {
2586
+ return { bsDate: { maxDate: this._picker.maxDate } };
2587
+ }
2588
+ };
2589
+ /**
2590
+ * @param {?} fn
2591
+ * @return {?}
2592
+ */
2593
+ BsDaterangepickerInputDirective.prototype.registerOnValidatorChange = /**
2594
+ * @param {?} fn
2595
+ * @return {?}
2596
+ */
2597
+ function (fn) {
2598
+ this._validatorChange = fn;
2599
+ };
2600
+ /**
2601
+ * @param {?} value
2602
+ * @return {?}
2603
+ */
2604
+ BsDaterangepickerInputDirective.prototype.writeValue = /**
2605
+ * @param {?} value
2606
+ * @return {?}
2607
+ */
2608
+ function (value) {
2609
+ var _this = this;
2610
+ if (!value) {
2611
+ this._value = null;
2612
+ }
2613
+ else {
2614
+ var /** @type {?} */ _localeKey = this._localeService.currentLocale;
2615
+ var /** @type {?} */ _locale = getLocale(_localeKey);
2616
+ if (!_locale) {
2617
+ throw new Error("Locale \"" + _localeKey + "\" is not defined, please add it with \"defineLocale(...)\"");
2618
+ }
2619
+ var /** @type {?} */ _input = [];
2620
+ if (typeof value === 'string') {
2621
+ _input = value.split(this._picker._config.rangeSeparator);
2622
+ }
2623
+ if (Array.isArray(value)) {
2624
+ _input = value;
2625
+ }
2626
+ this._value = (/** @type {?} */ (_input))
2627
+ .map(function (_val) {
2628
+ return parseDate(_val, _this._picker._config.dateInputFormat, _this._localeService.currentLocale);
2629
+ })
2630
+ .map(function (date) { return (isNaN(date.valueOf()) ? null : date); });
2631
+ }
2632
+ this._picker.bsValue = this._value;
2633
+ };
2634
+ /**
2635
+ * @param {?} isDisabled
2636
+ * @return {?}
2637
+ */
2638
+ BsDaterangepickerInputDirective.prototype.setDisabledState = /**
2639
+ * @param {?} isDisabled
2640
+ * @return {?}
2641
+ */
2642
+ function (isDisabled) {
2643
+ this._picker.isDisabled = isDisabled;
2644
+ if (isDisabled) {
2645
+ this._renderer.setAttribute(this._elRef.nativeElement, 'disabled', 'disabled');
2646
+ return;
2647
+ }
2648
+ this._renderer.removeAttribute(this._elRef.nativeElement, 'disabled');
2649
+ };
2650
+ /* tslint:disable-next-line: no-any*/
2651
+ /**
2652
+ * @param {?} fn
2653
+ * @return {?}
2654
+ */
2655
+ BsDaterangepickerInputDirective.prototype.registerOnChange = /**
2656
+ * @param {?} fn
2657
+ * @return {?}
2658
+ */
2659
+ function (fn) {
2660
+ this._onChange = fn;
2661
+ };
2662
+ /* tslint:disable-next-line: no-any*/
2663
+ /**
2664
+ * @param {?} fn
2665
+ * @return {?}
2666
+ */
2667
+ BsDaterangepickerInputDirective.prototype.registerOnTouched = /**
2668
+ * @param {?} fn
2669
+ * @return {?}
2670
+ */
2671
+ function (fn) {
2672
+ this._onTouched = fn;
2673
+ };
2674
+ /**
2675
+ * @return {?}
2676
+ */
2677
+ BsDaterangepickerInputDirective.prototype.onBlur = /**
2678
+ * @return {?}
2679
+ */
2680
+ function () {
2681
+ this._onTouched();
2682
+ };
2683
+ /**
2684
+ * @return {?}
2685
+ */
2686
+ BsDaterangepickerInputDirective.prototype.hide = /**
2687
+ * @return {?}
2688
+ */
2689
+ function () {
2690
+ this._picker.hide();
2691
+ this._renderer.selectRootElement(this._elRef.nativeElement).blur();
2692
+ };
2693
+ BsDaterangepickerInputDirective.decorators = [
2694
+ { type: Directive, args: [{
2695
+ selector: "input[bsDaterangepicker]",
2696
+ host: {
2697
+ '(change)': 'onChange($event)',
2698
+ '(keyup.esc)': 'hide()',
2699
+ '(blur)': 'onBlur()'
2700
+ },
2701
+ providers: [BS_DATERANGEPICKER_VALUE_ACCESSOR, BS_DATERANGEPICKER_VALIDATOR]
2702
+ },] }
2703
+ ];
2704
+ /** @nocollapse */
2705
+ BsDaterangepickerInputDirective.ctorParameters = function () { return [
2706
+ { type: BsDaterangepickerDirective, decorators: [{ type: Host },] },
2707
+ { type: BsLocaleService, },
2708
+ { type: Renderer2, },
2709
+ { type: ElementRef, },
2710
+ { type: ChangeDetectorRef, },
2711
+ ]; };
2712
+ return BsDaterangepickerInputDirective;
2713
+ }());
2714
+
2715
+ /**
2716
+ * @fileoverview added by tsickle
2717
+ * @suppress {checkTypes} checked by tsc
2718
+ */
2719
+ var BsCalendarLayoutComponent = /** @class */ (function () {
2720
+ function BsCalendarLayoutComponent() {
2721
+ }
2722
+ BsCalendarLayoutComponent.decorators = [
2723
+ { type: Component, args: [{
2724
+ selector: 'bs-calendar-layout',
2725
+ template: "\n <!-- current date, will be added in nearest releases -->\n <bs-current-date title=\"hey there\" *ngIf=\"false\"></bs-current-date>\n\n <!--navigation-->\n <div class=\"bs-datepicker-head\">\n <ng-content select=\"bs-datepicker-navigation-view\"></ng-content>\n </div>\n\n <div class=\"bs-datepicker-body\">\n <ng-content></ng-content>\n </div>\n\n <!--timepicker-->\n <bs-timepicker *ngIf=\"false\"></bs-timepicker>\n "
2726
+ }] }
2727
+ ];
2728
+ return BsCalendarLayoutComponent;
2729
+ }());
2730
+
2731
+ /**
2732
+ * @fileoverview added by tsickle
2733
+ * @suppress {checkTypes} checked by tsc
2734
+ */
2735
+ var BsCurrentDateViewComponent = /** @class */ (function () {
2736
+ function BsCurrentDateViewComponent() {
2737
+ }
2738
+ BsCurrentDateViewComponent.decorators = [
2739
+ { type: Component, args: [{
2740
+ selector: 'bs-current-date',
2741
+ template: "<div class=\"current-timedate\"><span>{{ title }}</span></div>"
2742
+ }] }
2743
+ ];
2744
+ /** @nocollapse */
2745
+ BsCurrentDateViewComponent.propDecorators = {
2746
+ "title": [{ type: Input },],
2747
+ };
2748
+ return BsCurrentDateViewComponent;
2749
+ }());
2750
+
2751
+ /**
2752
+ * @fileoverview added by tsickle
2753
+ * @suppress {checkTypes} checked by tsc
2754
+ */
2755
+ var BsCustomDatesViewComponent = /** @class */ (function () {
2756
+ function BsCustomDatesViewComponent() {
2757
+ }
2758
+ BsCustomDatesViewComponent.decorators = [
2759
+ { type: Component, args: [{
2760
+ selector: 'bs-custom-date-view',
2761
+ template: "\n <div class=\"bs-datepicker-predefined-btns\">\n <button *ngFor=\"let range of ranges\">{{ range.label }}</button>\n <button *ngIf=\"isCustomRangeShown\">Custom Range</button>\n </div>\n ",
2762
+ changeDetection: ChangeDetectionStrategy.OnPush
2763
+ }] }
2764
+ ];
2765
+ /** @nocollapse */
2766
+ BsCustomDatesViewComponent.propDecorators = {
2767
+ "isCustomRangeShown": [{ type: Input },],
2768
+ "ranges": [{ type: Input },],
2769
+ };
2770
+ return BsCustomDatesViewComponent;
2771
+ }());
2772
+
2773
+ /**
2774
+ * @fileoverview added by tsickle
2775
+ * @suppress {checkTypes} checked by tsc
2776
+ */
2777
+ var BsDatepickerDayDecoratorComponent = /** @class */ (function () {
2778
+ function BsDatepickerDayDecoratorComponent(_config, _elRef, _renderer) {
2779
+ this._config = _config;
2780
+ this._elRef = _elRef;
2781
+ this._renderer = _renderer;
2782
+ }
2783
+ /**
2784
+ * @return {?}
2785
+ */
2786
+ BsDatepickerDayDecoratorComponent.prototype.ngOnInit = /**
2787
+ * @return {?}
2788
+ */
2789
+ function () {
2790
+ if (this.day.isToday && this._config && this._config.customTodayClass) {
2791
+ this._renderer.addClass(this._elRef.nativeElement, this._config.customTodayClass);
2792
+ }
2793
+ };
2794
+ BsDatepickerDayDecoratorComponent.decorators = [
2795
+ { type: Component, args: [{
2796
+ selector: '[bsDatepickerDayDecorator]',
2797
+ changeDetection: ChangeDetectionStrategy.OnPush,
2798
+ host: {
2799
+ '[class.disabled]': 'day.isDisabled',
2800
+ '[class.is-highlighted]': 'day.isHovered',
2801
+ '[class.is-other-month]': 'day.isOtherMonth',
2802
+ '[class.is-active-other-month]': 'day.isOtherMonthHovered',
2803
+ '[class.in-range]': 'day.isInRange',
2804
+ '[class.select-start]': 'day.isSelectionStart',
2805
+ '[class.select-end]': 'day.isSelectionEnd',
2806
+ '[class.selected]': 'day.isSelected'
2807
+ },
2808
+ template: "{{ day.label }}"
2809
+ }] }
2810
+ ];
2811
+ /** @nocollapse */
2812
+ BsDatepickerDayDecoratorComponent.ctorParameters = function () { return [
2813
+ { type: BsDatepickerConfig, },
2814
+ { type: ElementRef, },
2815
+ { type: Renderer2, },
2816
+ ]; };
2817
+ BsDatepickerDayDecoratorComponent.propDecorators = {
2818
+ "day": [{ type: Input },],
2819
+ };
2820
+ return BsDatepickerDayDecoratorComponent;
2821
+ }());
2822
+
2823
+ /**
2824
+ * @fileoverview added by tsickle
2825
+ * @suppress {checkTypes} checked by tsc
2826
+ */
2827
+ /** @enum {number} */
2828
+ var BsNavigationDirection = {
2829
+ UP: 0,
2830
+ DOWN: 1,
2831
+ };
2832
+ BsNavigationDirection[BsNavigationDirection.UP] = "UP";
2833
+ BsNavigationDirection[BsNavigationDirection.DOWN] = "DOWN";
2834
+
2835
+ /**
2836
+ * @fileoverview added by tsickle
2837
+ * @suppress {checkTypes} checked by tsc
2838
+ */
2839
+ var BsDatepickerNavigationViewComponent = /** @class */ (function () {
2840
+ function BsDatepickerNavigationViewComponent() {
2841
+ this.onNavigate = new EventEmitter();
2842
+ this.onViewMode = new EventEmitter();
2843
+ }
2844
+ /**
2845
+ * @param {?} down
2846
+ * @return {?}
2847
+ */
2848
+ BsDatepickerNavigationViewComponent.prototype.navTo = /**
2849
+ * @param {?} down
2850
+ * @return {?}
2851
+ */
2852
+ function (down) {
2853
+ this.onNavigate.emit(down ? BsNavigationDirection.DOWN : BsNavigationDirection.UP);
2854
+ };
2855
+ /**
2856
+ * @param {?} viewMode
2857
+ * @return {?}
2858
+ */
2859
+ BsDatepickerNavigationViewComponent.prototype.view = /**
2860
+ * @param {?} viewMode
2861
+ * @return {?}
2862
+ */
2863
+ function (viewMode) {
2864
+ this.onViewMode.emit(viewMode);
2865
+ };
2866
+ BsDatepickerNavigationViewComponent.decorators = [
2867
+ { type: Component, args: [{
2868
+ selector: 'bs-datepicker-navigation-view',
2869
+ changeDetection: ChangeDetectionStrategy.OnPush,
2870
+ template: "\n <button class=\"previous\"\n [disabled]=\"calendar.disableLeftArrow\"\n [style.visibility]=\"calendar.hideLeftArrow ? 'hidden' : 'visible'\"\n (click)=\"navTo(true)\"><span>&lsaquo;</span>\n </button>\n\n &#8203; <!-- zero-width space needed for correct alignement\n with preserveWhitespaces: false in Angular -->\n\n <button class=\"current\"\n *ngIf=\"calendar.monthTitle\"\n (click)=\"view('month')\"\n ><span>{{ calendar.monthTitle }}</span>\n </button>\n\n &#8203; <!-- zero-width space needed for correct alignement\n with preserveWhitespaces: false in Angular -->\n\n <button class=\"current\" (click)=\"view('year')\"\n ><span>{{ calendar.yearTitle }}</span></button>\n\n &#8203; <!-- zero-width space needed for correct alignement\n with preserveWhitespaces: false in Angular -->\n\n <button class=\"next\"\n [disabled]=\"calendar.disableRightArrow\"\n [style.visibility]=\"calendar.hideRightArrow ? 'hidden' : 'visible'\"\n (click)=\"navTo(false)\"><span>&rsaquo;</span>\n </button>\n "
2871
+ }] }
2872
+ ];
2873
+ /** @nocollapse */
2874
+ BsDatepickerNavigationViewComponent.propDecorators = {
2875
+ "calendar": [{ type: Input },],
2876
+ "onNavigate": [{ type: Output },],
2877
+ "onViewMode": [{ type: Output },],
2878
+ };
2879
+ return BsDatepickerNavigationViewComponent;
2880
+ }());
2881
+
2882
+ /**
2883
+ * @fileoverview added by tsickle
2884
+ * @suppress {checkTypes} checked by tsc
2885
+ */
2886
+ var BsDaysCalendarViewComponent = /** @class */ (function () {
2887
+ function BsDaysCalendarViewComponent(_config) {
2888
+ this._config = _config;
2889
+ this.onNavigate = new EventEmitter();
2890
+ this.onViewMode = new EventEmitter();
2891
+ this.onSelect = new EventEmitter();
2892
+ this.onHover = new EventEmitter();
2893
+ }
2894
+ /**
2895
+ * @param {?} event
2896
+ * @return {?}
2897
+ */
2898
+ BsDaysCalendarViewComponent.prototype.navigateTo = /**
2899
+ * @param {?} event
2900
+ * @return {?}
2901
+ */
2902
+ function (event) {
2903
+ var /** @type {?} */ step = BsNavigationDirection.DOWN === event ? -1 : 1;
2904
+ this.onNavigate.emit({ step: { month: step } });
2905
+ };
2906
+ /**
2907
+ * @param {?} event
2908
+ * @return {?}
2909
+ */
2910
+ BsDaysCalendarViewComponent.prototype.changeViewMode = /**
2911
+ * @param {?} event
2912
+ * @return {?}
2913
+ */
2914
+ function (event) {
2915
+ this.onViewMode.emit(event);
2916
+ };
2917
+ /**
2918
+ * @param {?} event
2919
+ * @return {?}
2920
+ */
2921
+ BsDaysCalendarViewComponent.prototype.selectDay = /**
2922
+ * @param {?} event
2923
+ * @return {?}
2924
+ */
2925
+ function (event) {
2926
+ this.onSelect.emit(event);
2927
+ };
2928
+ /**
2929
+ * @param {?} cell
2930
+ * @param {?} isHovered
2931
+ * @return {?}
2932
+ */
2933
+ BsDaysCalendarViewComponent.prototype.hoverDay = /**
2934
+ * @param {?} cell
2935
+ * @param {?} isHovered
2936
+ * @return {?}
2937
+ */
2938
+ function (cell, isHovered) {
2939
+ if (this._config.selectFromOtherMonth && cell.isOtherMonth) {
2940
+ cell.isOtherMonthHovered = isHovered;
2941
+ }
2942
+ this.onHover.emit({ cell: cell, isHovered: isHovered });
2943
+ };
2944
+ BsDaysCalendarViewComponent.decorators = [
2945
+ { type: Component, args: [{
2946
+ selector: 'bs-days-calendar-view',
2947
+ // changeDetection: ChangeDetectionStrategy.OnPush,
2948
+ template: "\n <bs-calendar-layout>\n <bs-datepicker-navigation-view\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"changeViewMode($event)\"\n ></bs-datepicker-navigation-view>\n\n <!--days matrix-->\n <table role=\"grid\" class=\"days weeks\">\n <thead>\n <tr>\n <!--if show weeks-->\n <th *ngIf=\"options.showWeekNumbers\"></th>\n <th *ngFor=\"let weekday of calendar.weekdays; let i = index\"\n aria-label=\"weekday\">{{ calendar.weekdays[i] }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let week of calendar.weeks; let i = index\">\n <td class=\"week\" *ngIf=\"options.showWeekNumbers\">\n <span>{{ calendar.weekNumbers[i] }}</span>\n </td>\n <td *ngFor=\"let day of week.days\" role=\"gridcell\">\n <span bsDatepickerDayDecorator\n [day]=\"day\"\n (click)=\"selectDay(day)\"\n (mouseenter)=\"hoverDay(day, true)\"\n (mouseleave)=\"hoverDay(day, false)\">{{ day.label }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n\n </bs-calendar-layout>\n "
2949
+ }] }
2950
+ ];
2951
+ /** @nocollapse */
2952
+ BsDaysCalendarViewComponent.ctorParameters = function () { return [
2953
+ { type: BsDatepickerConfig, },
2954
+ ]; };
2955
+ BsDaysCalendarViewComponent.propDecorators = {
2956
+ "calendar": [{ type: Input },],
2957
+ "options": [{ type: Input },],
2958
+ "onNavigate": [{ type: Output },],
2959
+ "onViewMode": [{ type: Output },],
2960
+ "onSelect": [{ type: Output },],
2961
+ "onHover": [{ type: Output },],
2962
+ };
2963
+ return BsDaysCalendarViewComponent;
2964
+ }());
2965
+
2966
+ /**
2967
+ * @fileoverview added by tsickle
2968
+ * @suppress {checkTypes} checked by tsc
2969
+ */
2970
+ var BsMonthCalendarViewComponent = /** @class */ (function () {
2971
+ function BsMonthCalendarViewComponent() {
2972
+ this.onNavigate = new EventEmitter();
2973
+ this.onViewMode = new EventEmitter();
2974
+ this.onSelect = new EventEmitter();
2975
+ this.onHover = new EventEmitter();
2976
+ }
2977
+ /**
2978
+ * @param {?} event
2979
+ * @return {?}
2980
+ */
2981
+ BsMonthCalendarViewComponent.prototype.navigateTo = /**
2982
+ * @param {?} event
2983
+ * @return {?}
2984
+ */
2985
+ function (event) {
2986
+ var /** @type {?} */ step = BsNavigationDirection.DOWN === event ? -1 : 1;
2987
+ this.onNavigate.emit({ step: { year: step } });
2988
+ };
2989
+ /**
2990
+ * @param {?} month
2991
+ * @return {?}
2992
+ */
2993
+ BsMonthCalendarViewComponent.prototype.viewMonth = /**
2994
+ * @param {?} month
2995
+ * @return {?}
2996
+ */
2997
+ function (month) {
2998
+ this.onSelect.emit(month);
2999
+ };
3000
+ /**
3001
+ * @param {?} cell
3002
+ * @param {?} isHovered
3003
+ * @return {?}
3004
+ */
3005
+ BsMonthCalendarViewComponent.prototype.hoverMonth = /**
3006
+ * @param {?} cell
3007
+ * @param {?} isHovered
3008
+ * @return {?}
3009
+ */
3010
+ function (cell, isHovered) {
3011
+ this.onHover.emit({ cell: cell, isHovered: isHovered });
3012
+ };
3013
+ /**
3014
+ * @param {?} event
3015
+ * @return {?}
3016
+ */
3017
+ BsMonthCalendarViewComponent.prototype.changeViewMode = /**
3018
+ * @param {?} event
3019
+ * @return {?}
3020
+ */
3021
+ function (event) {
3022
+ this.onViewMode.emit(event);
3023
+ };
3024
+ BsMonthCalendarViewComponent.decorators = [
3025
+ { type: Component, args: [{
3026
+ selector: 'bs-month-calendar-view',
3027
+ template: "\n <bs-calendar-layout>\n <bs-datepicker-navigation-view\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"changeViewMode($event)\"\n ></bs-datepicker-navigation-view>\n\n <table role=\"grid\" class=\"months\">\n <tbody>\n <tr *ngFor=\"let row of calendar.months\">\n <td *ngFor=\"let month of row\" role=\"gridcell\"\n (click)=\"viewMonth(month)\"\n (mouseenter)=\"hoverMonth(month, true)\"\n (mouseleave)=\"hoverMonth(month, false)\"\n [class.disabled]=\"month.isDisabled\"\n [class.is-highlighted]=\"month.isHovered\">\n <span>{{ month.label }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </bs-calendar-layout>\n "
3028
+ }] }
3029
+ ];
3030
+ /** @nocollapse */
3031
+ BsMonthCalendarViewComponent.propDecorators = {
3032
+ "calendar": [{ type: Input },],
3033
+ "onNavigate": [{ type: Output },],
3034
+ "onViewMode": [{ type: Output },],
3035
+ "onSelect": [{ type: Output },],
3036
+ "onHover": [{ type: Output },],
3037
+ };
3038
+ return BsMonthCalendarViewComponent;
3039
+ }());
3040
+
3041
+ /**
3042
+ * @fileoverview added by tsickle
3043
+ * @suppress {checkTypes} checked by tsc
3044
+ */
3045
+ var BsTimepickerViewComponent = /** @class */ (function () {
3046
+ function BsTimepickerViewComponent() {
3047
+ this.ampm = 'ok';
3048
+ this.hours = 0;
3049
+ this.minutes = 0;
3050
+ }
3051
+ BsTimepickerViewComponent.decorators = [
3052
+ { type: Component, args: [{
3053
+ selector: 'bs-timepicker',
3054
+ template: "\n <div class=\"bs-timepicker-container\">\n <div class=\"bs-timepicker-controls\">\n <button class=\"bs-decrease\">-</button>\n <input type=\"text\" [value]=\"hours\" placeholder=\"00\">\n <button class=\"bs-increase\">+</button>\n </div>\n <div class=\"bs-timepicker-controls\">\n <button class=\"bs-decrease\">-</button>\n <input type=\"text\" [value]=\"minutes\" placeholder=\"00\">\n <button class=\"bs-increase\">+</button>\n </div>\n <button class=\"switch-time-format\">{{ ampm }}\n <img\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAABSElEQVQYV3XQPUvDUBQG4HNuagtVqc6KgouCv6GIuIntYBLB9hcIQpLStCAIV7DYmpTcRWcXqZio3Vwc/UCc/QEqfgyKGbr0I7nS1EiHeqYzPO/h5SD0jaxUZjmSLCB+OFb+UFINFwASAEAdpu9gaGXVyAHHFQBkHpKHc6a9dzECvADyY9sqlAMsK9W0jzxDXqeytr3mhQckxSji27TJJ5/rPmIpwJJq3HrtduriYOurv1a4i1p5HnhkG9OFymi0ReoO05cGwb+ayv4dysVygjeFmsP05f8wpZQ8fsdvfmuY9zjWSNqUtgYFVnOVReILYoBFzdQI5/GGFzNHhGbeZnopDGU29sZbscgldmC99w35VOATTycIMMcBXIfpSVGzZhA6C8hh00conln6VQ9TGgV32OEAKQC4DrBq7CJwd0ggR7Vq/rPrfgB+C3sGypY5DAAAAABJRU5ErkJggg==\"\n alt=\"\">\n </button>\n </div>\n "
3055
+ }] }
3056
+ ];
3057
+ return BsTimepickerViewComponent;
3058
+ }());
3059
+
3060
+ /**
3061
+ * @fileoverview added by tsickle
3062
+ * @suppress {checkTypes} checked by tsc
3063
+ */
3064
+ var BsYearsCalendarViewComponent = /** @class */ (function () {
3065
+ function BsYearsCalendarViewComponent() {
3066
+ this.onNavigate = new EventEmitter();
3067
+ this.onViewMode = new EventEmitter();
3068
+ this.onSelect = new EventEmitter();
3069
+ this.onHover = new EventEmitter();
3070
+ }
3071
+ /**
3072
+ * @param {?} event
3073
+ * @return {?}
3074
+ */
3075
+ BsYearsCalendarViewComponent.prototype.navigateTo = /**
3076
+ * @param {?} event
3077
+ * @return {?}
3078
+ */
3079
+ function (event) {
3080
+ var /** @type {?} */ step = BsNavigationDirection.DOWN === event ? -1 : 1;
3081
+ this.onNavigate.emit({ step: { year: step * yearsPerCalendar } });
3082
+ };
3083
+ /**
3084
+ * @param {?} year
3085
+ * @return {?}
3086
+ */
3087
+ BsYearsCalendarViewComponent.prototype.viewYear = /**
3088
+ * @param {?} year
3089
+ * @return {?}
3090
+ */
3091
+ function (year) {
3092
+ this.onSelect.emit(year);
3093
+ };
3094
+ /**
3095
+ * @param {?} cell
3096
+ * @param {?} isHovered
3097
+ * @return {?}
3098
+ */
3099
+ BsYearsCalendarViewComponent.prototype.hoverYear = /**
3100
+ * @param {?} cell
3101
+ * @param {?} isHovered
3102
+ * @return {?}
3103
+ */
3104
+ function (cell, isHovered) {
3105
+ this.onHover.emit({ cell: cell, isHovered: isHovered });
3106
+ };
3107
+ /**
3108
+ * @param {?} event
3109
+ * @return {?}
3110
+ */
3111
+ BsYearsCalendarViewComponent.prototype.changeViewMode = /**
3112
+ * @param {?} event
3113
+ * @return {?}
3114
+ */
3115
+ function (event) {
3116
+ this.onViewMode.emit(event);
3117
+ };
3118
+ BsYearsCalendarViewComponent.decorators = [
3119
+ { type: Component, args: [{
3120
+ selector: 'bs-years-calendar-view',
3121
+ template: "\n <bs-calendar-layout>\n <bs-datepicker-navigation-view\n [calendar]=\"calendar\"\n (onNavigate)=\"navigateTo($event)\"\n (onViewMode)=\"changeViewMode($event)\"\n ></bs-datepicker-navigation-view>\n\n <table role=\"grid\" class=\"years\">\n <tbody>\n <tr *ngFor=\"let row of calendar.years\">\n <td *ngFor=\"let year of row\" role=\"gridcell\"\n (click)=\"viewYear(year)\"\n (mouseenter)=\"hoverYear(year, true)\"\n (mouseleave)=\"hoverYear(year, false)\"\n [class.disabled]=\"year.isDisabled\"\n [class.is-highlighted]=\"year.isHovered\">\n <span>{{ year.label }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </bs-calendar-layout>\n "
3122
+ }] }
3123
+ ];
3124
+ /** @nocollapse */
3125
+ BsYearsCalendarViewComponent.propDecorators = {
3126
+ "calendar": [{ type: Input },],
3127
+ "onNavigate": [{ type: Output },],
3128
+ "onViewMode": [{ type: Output },],
3129
+ "onSelect": [{ type: Output },],
3130
+ "onHover": [{ type: Output },],
3131
+ };
3132
+ return BsYearsCalendarViewComponent;
3133
+ }());
3134
+
3135
+ /**
3136
+ * @fileoverview added by tsickle
3137
+ * @suppress {checkTypes} checked by tsc
3138
+ */
3139
+ var /** @type {?} */ _exports = [
3140
+ BsDatepickerContainerComponent,
3141
+ BsDaterangepickerContainerComponent,
3142
+ BsDatepickerDirective,
3143
+ BsDatepickerInputDirective,
3144
+ BsDaterangepickerInputDirective,
3145
+ BsDaterangepickerDirective
3146
+ ];
3147
+ var BsDatepickerModule = /** @class */ (function () {
3148
+ function BsDatepickerModule() {
3149
+ }
3150
+ /**
3151
+ * @return {?}
3152
+ */
3153
+ BsDatepickerModule.forRoot = /**
3154
+ * @return {?}
3155
+ */
3156
+ function () {
3157
+ return {
3158
+ ngModule: BsDatepickerModule,
3159
+ providers: [
3160
+ ComponentLoaderFactory,
3161
+ PositioningService,
3162
+ BsDatepickerStore,
3163
+ BsDatepickerActions,
3164
+ BsDatepickerConfig,
3165
+ BsDaterangepickerConfig,
3166
+ BsDatepickerEffects,
3167
+ BsLocaleService
3168
+ ]
3169
+ };
3170
+ };
3171
+ BsDatepickerModule.decorators = [
3172
+ { type: NgModule, args: [{
3173
+ imports: [CommonModule],
3174
+ declarations: __spread([
3175
+ BsDatepickerDayDecoratorComponent,
3176
+ BsCurrentDateViewComponent,
3177
+ BsDatepickerNavigationViewComponent,
3178
+ BsTimepickerViewComponent,
3179
+ BsCalendarLayoutComponent,
3180
+ BsDaysCalendarViewComponent,
3181
+ BsMonthCalendarViewComponent,
3182
+ BsYearsCalendarViewComponent,
3183
+ BsCustomDatesViewComponent
3184
+ ], _exports),
3185
+ entryComponents: [
3186
+ BsDatepickerContainerComponent,
3187
+ BsDaterangepickerContainerComponent
3188
+ ],
3189
+ exports: _exports
3190
+ },] }
3191
+ ];
3192
+ return BsDatepickerModule;
3193
+ }());
3194
+
3195
+ /**
3196
+ * @fileoverview added by tsickle
3197
+ * @suppress {checkTypes} checked by tsc
3198
+ */
3199
+ var DateFormatter = /** @class */ (function () {
3200
+ function DateFormatter() {
3201
+ }
3202
+ /**
3203
+ * @param {?} date
3204
+ * @param {?} format
3205
+ * @param {?} locale
3206
+ * @return {?}
3207
+ */
3208
+ DateFormatter.prototype.format = /**
3209
+ * @param {?} date
3210
+ * @param {?} format
3211
+ * @param {?} locale
3212
+ * @return {?}
3213
+ */
3214
+ function (date, format, locale) {
3215
+ return formatDate(date, format, locale);
3216
+ };
3217
+ return DateFormatter;
3218
+ }());
3219
+
3220
+ /**
3221
+ * @fileoverview added by tsickle
3222
+ * @suppress {checkTypes} checked by tsc
3223
+ */
3224
+ var DatePickerInnerComponent = /** @class */ (function () {
3225
+ function DatePickerInnerComponent() {
3226
+ this.selectionDone = new EventEmitter(undefined);
3227
+ this.update = new EventEmitter(false);
3228
+ this.activeDateChange = new EventEmitter(undefined);
3229
+ /* tslint:disable-next-line: no-any*/
3230
+ this.stepDay = {};
3231
+ /* tslint:disable-next-line: no-any*/
3232
+ this.stepMonth = {};
3233
+ /* tslint:disable-next-line: no-any*/
3234
+ this.stepYear = {};
3235
+ this.modes = ['day', 'month', 'year'];
3236
+ this.dateFormatter = new DateFormatter();
3237
+ }
3238
+ Object.defineProperty(DatePickerInnerComponent.prototype, "activeDate", {
3239
+ get: /**
3240
+ * @return {?}
3241
+ */
3242
+ function () {
3243
+ return this._activeDate;
3244
+ },
3245
+ set: /**
3246
+ * @param {?} value
3247
+ * @return {?}
3248
+ */
3249
+ function (value) {
3250
+ this._activeDate = value;
3251
+ },
3252
+ enumerable: true,
3253
+ configurable: true
3254
+ });
3255
+ // todo: add formatter value to Date object
3256
+ /**
3257
+ * @return {?}
3258
+ */
3259
+ DatePickerInnerComponent.prototype.ngOnInit = /**
3260
+ * @return {?}
3261
+ */
3262
+ function () {
3263
+ // todo: use date for unique value
3264
+ this.uniqueId = "datepicker--" + Math.floor(Math.random() * 10000);
3265
+ if (this.initDate) {
3266
+ this.activeDate = this.initDate;
3267
+ this.selectedDate = new Date(this.activeDate.valueOf());
3268
+ this.update.emit(this.activeDate);
3269
+ }
3270
+ else if (this.activeDate === undefined) {
3271
+ this.activeDate = new Date();
3272
+ }
3273
+ };
3274
+ // this.refreshView should be called here to reflect the changes on the fly
3275
+ // tslint:disable-next-line:no-unused-variable
3276
+ /**
3277
+ * @param {?} changes
3278
+ * @return {?}
3279
+ */
3280
+ DatePickerInnerComponent.prototype.ngOnChanges = /**
3281
+ * @param {?} changes
3282
+ * @return {?}
3283
+ */
3284
+ function (changes) {
3285
+ this.refreshView();
3286
+ this.checkIfActiveDateGotUpdated(changes["activeDate"]);
3287
+ };
3288
+ // Check if activeDate has been update and then emit the activeDateChange with the new date
3289
+ /* tslint:disable-next-line: no-any */
3290
+ /**
3291
+ * @param {?} activeDate
3292
+ * @return {?}
3293
+ */
3294
+ DatePickerInnerComponent.prototype.checkIfActiveDateGotUpdated = /**
3295
+ * @param {?} activeDate
3296
+ * @return {?}
3297
+ */
3298
+ function (activeDate) {
3299
+ if (activeDate && !activeDate.firstChange) {
3300
+ var /** @type {?} */ previousValue = activeDate.previousValue;
3301
+ if (previousValue &&
3302
+ previousValue instanceof Date &&
3303
+ previousValue.getTime() !== activeDate.currentValue.getTime()) {
3304
+ this.activeDateChange.emit(this.activeDate);
3305
+ }
3306
+ }
3307
+ };
3308
+ /**
3309
+ * @param {?} handler
3310
+ * @param {?} type
3311
+ * @return {?}
3312
+ */
3313
+ DatePickerInnerComponent.prototype.setCompareHandler = /**
3314
+ * @param {?} handler
3315
+ * @param {?} type
3316
+ * @return {?}
3317
+ */
3318
+ function (handler, type) {
3319
+ if (type === 'day') {
3320
+ this.compareHandlerDay = handler;
3321
+ }
3322
+ if (type === 'month') {
3323
+ this.compareHandlerMonth = handler;
3324
+ }
3325
+ if (type === 'year') {
3326
+ this.compareHandlerYear = handler;
3327
+ }
3328
+ };
3329
+ /**
3330
+ * @param {?} date1
3331
+ * @param {?} date2
3332
+ * @return {?}
3333
+ */
3334
+ DatePickerInnerComponent.prototype.compare = /**
3335
+ * @param {?} date1
3336
+ * @param {?} date2
3337
+ * @return {?}
3338
+ */
3339
+ function (date1, date2) {
3340
+ if (date1 === undefined || date2 === undefined) {
3341
+ return undefined;
3342
+ }
3343
+ if (this.datepickerMode === 'day' && this.compareHandlerDay) {
3344
+ return this.compareHandlerDay(date1, date2);
3345
+ }
3346
+ if (this.datepickerMode === 'month' && this.compareHandlerMonth) {
3347
+ return this.compareHandlerMonth(date1, date2);
3348
+ }
3349
+ if (this.datepickerMode === 'year' && this.compareHandlerYear) {
3350
+ return this.compareHandlerYear(date1, date2);
3351
+ }
3352
+ return void 0;
3353
+ };
3354
+ /**
3355
+ * @param {?} handler
3356
+ * @param {?} type
3357
+ * @return {?}
3358
+ */
3359
+ DatePickerInnerComponent.prototype.setRefreshViewHandler = /**
3360
+ * @param {?} handler
3361
+ * @param {?} type
3362
+ * @return {?}
3363
+ */
3364
+ function (handler, type) {
3365
+ if (type === 'day') {
3366
+ this.refreshViewHandlerDay = handler;
3367
+ }
3368
+ if (type === 'month') {
3369
+ this.refreshViewHandlerMonth = handler;
3370
+ }
3371
+ if (type === 'year') {
3372
+ this.refreshViewHandlerYear = handler;
3373
+ }
3374
+ };
3375
+ /**
3376
+ * @return {?}
3377
+ */
3378
+ DatePickerInnerComponent.prototype.refreshView = /**
3379
+ * @return {?}
3380
+ */
3381
+ function () {
3382
+ if (this.datepickerMode === 'day' && this.refreshViewHandlerDay) {
3383
+ this.refreshViewHandlerDay();
3384
+ }
3385
+ if (this.datepickerMode === 'month' && this.refreshViewHandlerMonth) {
3386
+ this.refreshViewHandlerMonth();
3387
+ }
3388
+ if (this.datepickerMode === 'year' && this.refreshViewHandlerYear) {
3389
+ this.refreshViewHandlerYear();
3390
+ }
3391
+ };
3392
+ /**
3393
+ * @param {?} date
3394
+ * @param {?} format
3395
+ * @return {?}
3396
+ */
3397
+ DatePickerInnerComponent.prototype.dateFilter = /**
3398
+ * @param {?} date
3399
+ * @param {?} format
3400
+ * @return {?}
3401
+ */
3402
+ function (date, format) {
3403
+ return this.dateFormatter.format(date, format, this.locale);
3404
+ };
3405
+ /* tslint:disable-next-line: no-any*/
3406
+ /**
3407
+ * @param {?} dateObject
3408
+ * @return {?}
3409
+ */
3410
+ DatePickerInnerComponent.prototype.isActive = /**
3411
+ * @param {?} dateObject
3412
+ * @return {?}
3413
+ */
3414
+ function (dateObject) {
3415
+ if (this.compare(dateObject.date, this.activeDate) === 0) {
3416
+ this.activeDateId = dateObject.uid;
3417
+ return true;
3418
+ }
3419
+ return false;
3420
+ };
3421
+ /* tslint:disable-next-line: no-any*/
3422
+ /**
3423
+ * @param {?} date
3424
+ * @param {?} format
3425
+ * @return {?}
3426
+ */
3427
+ DatePickerInnerComponent.prototype.createDateObject = /**
3428
+ * @param {?} date
3429
+ * @param {?} format
3430
+ * @return {?}
3431
+ */
3432
+ function (date, format) {
3433
+ /* tslint:disable-next-line: no-any*/
3434
+ var /** @type {?} */ dateObject = {};
3435
+ dateObject.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
3436
+ dateObject.date = this.fixTimeZone(dateObject.date);
3437
+ dateObject.label = this.dateFilter(date, format);
3438
+ dateObject.selected = this.compare(date, this.selectedDate) === 0;
3439
+ dateObject.disabled = this.isDisabled(date);
3440
+ dateObject.current = this.compare(date, new Date()) === 0;
3441
+ dateObject.customClass = this.getCustomClassForDate(dateObject.date);
3442
+ return dateObject;
3443
+ };
3444
+ /* tslint:disable-next-line: no-any*/
3445
+ /**
3446
+ * @param {?} arr
3447
+ * @param {?} size
3448
+ * @return {?}
3449
+ */
3450
+ DatePickerInnerComponent.prototype.split = /**
3451
+ * @param {?} arr
3452
+ * @param {?} size
3453
+ * @return {?}
3454
+ */
3455
+ function (arr, size) {
3456
+ /* tslint:disable-next-line: no-any*/
3457
+ var /** @type {?} */ arrays = [];
3458
+ while (arr.length > 0) {
3459
+ arrays.push(arr.splice(0, size));
3460
+ }
3461
+ return arrays;
3462
+ };
3463
+ // Fix a hard-reproducible bug with timezones
3464
+ // The bug depends on OS, browser, current timezone and current date
3465
+ // i.e.
3466
+ // var date = new Date(2014, 0, 1);
3467
+ // console.log(date.getFullYear(), date.getMonth(), date.getDate(),
3468
+ // date.getHours()); can result in "2013 11 31 23" because of the bug.
3469
+ /**
3470
+ * @param {?} date
3471
+ * @return {?}
3472
+ */
3473
+ DatePickerInnerComponent.prototype.fixTimeZone = /**
3474
+ * @param {?} date
3475
+ * @return {?}
3476
+ */
3477
+ function (date) {
3478
+ var /** @type {?} */ hours = date.getHours();
3479
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours === 23 ? hours + 2 : 0);
3480
+ };
3481
+ /**
3482
+ * @param {?} date
3483
+ * @param {?=} isManual
3484
+ * @return {?}
3485
+ */
3486
+ DatePickerInnerComponent.prototype.select = /**
3487
+ * @param {?} date
3488
+ * @param {?=} isManual
3489
+ * @return {?}
3490
+ */
3491
+ function (date, isManual) {
3492
+ if (isManual === void 0) { isManual = true; }
3493
+ if (this.datepickerMode === this.minMode) {
3494
+ if (!this.activeDate) {
3495
+ this.activeDate = new Date(0, 0, 0, 0, 0, 0, 0);
3496
+ }
3497
+ this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
3498
+ this.activeDate = this.fixTimeZone(this.activeDate);
3499
+ if (isManual) {
3500
+ this.selectionDone.emit(this.activeDate);
3501
+ }
3502
+ }
3503
+ else {
3504
+ this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
3505
+ this.activeDate = this.fixTimeZone(this.activeDate);
3506
+ if (isManual) {
3507
+ this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) - 1];
3508
+ }
3509
+ }
3510
+ this.selectedDate = new Date(this.activeDate.valueOf());
3511
+ this.update.emit(this.activeDate);
3512
+ this.refreshView();
3513
+ };
3514
+ /**
3515
+ * @param {?} direction
3516
+ * @return {?}
3517
+ */
3518
+ DatePickerInnerComponent.prototype.move = /**
3519
+ * @param {?} direction
3520
+ * @return {?}
3521
+ */
3522
+ function (direction) {
3523
+ /* tslint:disable-next-line: no-any*/
3524
+ var /** @type {?} */ expectedStep;
3525
+ if (this.datepickerMode === 'day') {
3526
+ expectedStep = this.stepDay;
3527
+ }
3528
+ if (this.datepickerMode === 'month') {
3529
+ expectedStep = this.stepMonth;
3530
+ }
3531
+ if (this.datepickerMode === 'year') {
3532
+ expectedStep = this.stepYear;
3533
+ }
3534
+ if (expectedStep) {
3535
+ var /** @type {?} */ year = this.activeDate.getFullYear() + direction * (expectedStep.years || 0);
3536
+ var /** @type {?} */ month = this.activeDate.getMonth() + direction * (expectedStep.months || 0);
3537
+ this.activeDate = new Date(year, month, 1);
3538
+ this.refreshView();
3539
+ this.activeDateChange.emit(this.activeDate);
3540
+ }
3541
+ };
3542
+ /**
3543
+ * @param {?} _direction
3544
+ * @return {?}
3545
+ */
3546
+ DatePickerInnerComponent.prototype.toggleMode = /**
3547
+ * @param {?} _direction
3548
+ * @return {?}
3549
+ */
3550
+ function (_direction) {
3551
+ var /** @type {?} */ direction = _direction || 1;
3552
+ if ((this.datepickerMode === this.maxMode && direction === 1) ||
3553
+ (this.datepickerMode === this.minMode && direction === -1)) {
3554
+ return;
3555
+ }
3556
+ this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) + direction];
3557
+ this.refreshView();
3558
+ };
3559
+ /**
3560
+ * @param {?} date
3561
+ * @return {?}
3562
+ */
3563
+ DatePickerInnerComponent.prototype.getCustomClassForDate = /**
3564
+ * @param {?} date
3565
+ * @return {?}
3566
+ */
3567
+ function (date) {
3568
+ var _this = this;
3569
+ if (!this.customClass) {
3570
+ return '';
3571
+ }
3572
+ // todo: build a hash of custom classes, it will work faster
3573
+ var /** @type {?} */ customClassObject = this.customClass.find(function (customClass) {
3574
+ return (customClass.date.valueOf() === date.valueOf() &&
3575
+ customClass.mode === _this.datepickerMode);
3576
+ }, this);
3577
+ return customClassObject === undefined ? '' : customClassObject.clazz;
3578
+ };
3579
+ /**
3580
+ * @param {?} date1Disabled
3581
+ * @param {?} date2
3582
+ * @return {?}
3583
+ */
3584
+ DatePickerInnerComponent.prototype.compareDateDisabled = /**
3585
+ * @param {?} date1Disabled
3586
+ * @param {?} date2
3587
+ * @return {?}
3588
+ */
3589
+ function (date1Disabled, date2) {
3590
+ if (date1Disabled === undefined || date2 === undefined) {
3591
+ return undefined;
3592
+ }
3593
+ if (date1Disabled.mode === 'day' && this.compareHandlerDay) {
3594
+ return this.compareHandlerDay(date1Disabled.date, date2);
3595
+ }
3596
+ if (date1Disabled.mode === 'month' && this.compareHandlerMonth) {
3597
+ return this.compareHandlerMonth(date1Disabled.date, date2);
3598
+ }
3599
+ if (date1Disabled.mode === 'year' && this.compareHandlerYear) {
3600
+ return this.compareHandlerYear(date1Disabled.date, date2);
3601
+ }
3602
+ return undefined;
3603
+ };
3604
+ /**
3605
+ * @param {?} date
3606
+ * @return {?}
3607
+ */
3608
+ DatePickerInnerComponent.prototype.isDisabled = /**
3609
+ * @param {?} date
3610
+ * @return {?}
3611
+ */
3612
+ function (date) {
3613
+ var _this = this;
3614
+ var /** @type {?} */ isDateDisabled = false;
3615
+ if (this.dateDisabled) {
3616
+ this.dateDisabled.forEach(function (disabledDate) {
3617
+ if (_this.compareDateDisabled(disabledDate, date) === 0) {
3618
+ isDateDisabled = true;
3619
+ }
3620
+ });
3621
+ }
3622
+ if (this.dayDisabled) {
3623
+ isDateDisabled =
3624
+ isDateDisabled ||
3625
+ this.dayDisabled.indexOf(date.getDay()) > -1;
3626
+ }
3627
+ return (isDateDisabled ||
3628
+ (this.minDate && this.compare(date, this.minDate) < 0) ||
3629
+ (this.maxDate && this.compare(date, this.maxDate) > 0));
3630
+ };
3631
+ DatePickerInnerComponent.decorators = [
3632
+ { type: Component, args: [{
3633
+ selector: 'datepicker-inner',
3634
+ template: "\n <!--&lt;!&ndash;ng-keydown=\"keydown($event)\"&ndash;&gt;-->\n <div *ngIf=\"datepickerMode\" class=\"well well-sm bg-faded p-a card\" role=\"application\" >\n <ng-content></ng-content>\n </div>\n "
3635
+ }] }
3636
+ ];
3637
+ /** @nocollapse */
3638
+ DatePickerInnerComponent.propDecorators = {
3639
+ "locale": [{ type: Input },],
3640
+ "datepickerMode": [{ type: Input },],
3641
+ "startingDay": [{ type: Input },],
3642
+ "yearRange": [{ type: Input },],
3643
+ "minDate": [{ type: Input },],
3644
+ "maxDate": [{ type: Input },],
3645
+ "minMode": [{ type: Input },],
3646
+ "maxMode": [{ type: Input },],
3647
+ "showWeeks": [{ type: Input },],
3648
+ "formatDay": [{ type: Input },],
3649
+ "formatMonth": [{ type: Input },],
3650
+ "formatYear": [{ type: Input },],
3651
+ "formatDayHeader": [{ type: Input },],
3652
+ "formatDayTitle": [{ type: Input },],
3653
+ "formatMonthTitle": [{ type: Input },],
3654
+ "onlyCurrentMonth": [{ type: Input },],
3655
+ "shortcutPropagation": [{ type: Input },],
3656
+ "customClass": [{ type: Input },],
3657
+ "monthColLimit": [{ type: Input },],
3658
+ "yearColLimit": [{ type: Input },],
3659
+ "dateDisabled": [{ type: Input },],
3660
+ "dayDisabled": [{ type: Input },],
3661
+ "initDate": [{ type: Input },],
3662
+ "selectionDone": [{ type: Output },],
3663
+ "update": [{ type: Output },],
3664
+ "activeDateChange": [{ type: Output },],
3665
+ "activeDate": [{ type: Input },],
3666
+ };
3667
+ return DatePickerInnerComponent;
3668
+ }());
3669
+
3670
+ /**
3671
+ * @fileoverview added by tsickle
3672
+ * @suppress {checkTypes} checked by tsc
3673
+ */
3674
+ var DatepickerConfig = /** @class */ (function () {
3675
+ function DatepickerConfig() {
3676
+ this.locale = 'en';
3677
+ this.datepickerMode = 'day';
3678
+ this.startingDay = 0;
3679
+ this.yearRange = 20;
3680
+ this.minMode = 'day';
3681
+ this.maxMode = 'year';
3682
+ this.showWeeks = true;
3683
+ this.formatDay = 'DD';
3684
+ this.formatMonth = 'MMMM';
3685
+ this.formatYear = 'YYYY';
3686
+ this.formatDayHeader = 'dd';
3687
+ this.formatDayTitle = 'MMMM YYYY';
3688
+ this.formatMonthTitle = 'YYYY';
3689
+ this.onlyCurrentMonth = false;
3690
+ this.monthColLimit = 3;
3691
+ this.yearColLimit = 5;
3692
+ this.shortcutPropagation = false;
3693
+ }
3694
+ DatepickerConfig.decorators = [
3695
+ { type: Injectable }
3696
+ ];
3697
+ return DatepickerConfig;
3698
+ }());
3699
+
3700
+ /**
3701
+ * @fileoverview added by tsickle
3702
+ * @suppress {checkTypes} checked by tsc
3703
+ */
3704
+ var /** @type {?} */ DATEPICKER_CONTROL_VALUE_ACCESSOR = {
3705
+ provide: NG_VALUE_ACCESSOR,
3706
+ /* tslint:disable-next-line: no-use-before-declare */
3707
+ useExisting: forwardRef(function () { return DatePickerComponent; }),
3708
+ multi: true
3709
+ };
3710
+ var DatePickerComponent = /** @class */ (function () {
3711
+ function DatePickerComponent(config) {
3712
+ /**
3713
+ * sets datepicker mode, supports: `day`, `month`, `year`
3714
+ */
3715
+ this.datepickerMode = 'day';
3716
+ /**
3717
+ * if false week numbers will be hidden
3718
+ */
3719
+ this.showWeeks = true;
3720
+ this.selectionDone = new EventEmitter(undefined);
3721
+ /**
3722
+ * callback to invoke when the activeDate is changed.
3723
+ */
3724
+ this.activeDateChange = new EventEmitter(undefined);
3725
+ /* tslint:disable-next-line: no-any*/
3726
+ this.onChange = Function.prototype;
3727
+ /* tslint:disable-next-line: no-any*/
3728
+ this.onTouched = Function.prototype;
3729
+ this._now = new Date();
3730
+ this.config = config;
3731
+ this.configureOptions();
3732
+ }
3733
+ Object.defineProperty(DatePickerComponent.prototype, "activeDate", {
3734
+ get: /**
3735
+ * currently active date
3736
+ * @return {?}
3737
+ */
3738
+ function () {
3739
+ return this._activeDate || this._now;
3740
+ },
3741
+ set: /**
3742
+ * @param {?} value
3743
+ * @return {?}
3744
+ */
3745
+ function (value) {
3746
+ this._activeDate = value;
3747
+ },
3748
+ enumerable: true,
3749
+ configurable: true
3750
+ });
3751
+ /**
3752
+ * @return {?}
3753
+ */
3754
+ DatePickerComponent.prototype.configureOptions = /**
3755
+ * @return {?}
3756
+ */
3757
+ function () {
3758
+ Object.assign(this, this.config);
3759
+ };
3760
+ /**
3761
+ * @param {?} event
3762
+ * @return {?}
3763
+ */
3764
+ DatePickerComponent.prototype.onUpdate = /**
3765
+ * @param {?} event
3766
+ * @return {?}
3767
+ */
3768
+ function (event) {
3769
+ this.activeDate = event;
3770
+ this.onChange(event);
3771
+ };
3772
+ /**
3773
+ * @param {?} event
3774
+ * @return {?}
3775
+ */
3776
+ DatePickerComponent.prototype.onSelectionDone = /**
3777
+ * @param {?} event
3778
+ * @return {?}
3779
+ */
3780
+ function (event) {
3781
+ this.selectionDone.emit(event);
3782
+ };
3783
+ /**
3784
+ * @param {?} event
3785
+ * @return {?}
3786
+ */
3787
+ DatePickerComponent.prototype.onActiveDateChange = /**
3788
+ * @param {?} event
3789
+ * @return {?}
3790
+ */
3791
+ function (event) {
3792
+ this.activeDateChange.emit(event);
3793
+ };
3794
+ // todo: support null value
3795
+ /* tslint:disable-next-line: no-any*/
3796
+ /**
3797
+ * @param {?} value
3798
+ * @return {?}
3799
+ */
3800
+ DatePickerComponent.prototype.writeValue = /**
3801
+ * @param {?} value
3802
+ * @return {?}
3803
+ */
3804
+ function (value) {
3805
+ if (this._datePicker.compare(value, this._activeDate) === 0) {
3806
+ return;
3807
+ }
3808
+ if (value && value instanceof Date) {
3809
+ this.activeDate = value;
3810
+ this._datePicker.select(value, false);
3811
+ return;
3812
+ }
3813
+ this.activeDate = value ? new Date(value) : void 0;
3814
+ };
3815
+ /**
3816
+ * @param {?} fn
3817
+ * @return {?}
3818
+ */
3819
+ DatePickerComponent.prototype.registerOnChange = /**
3820
+ * @param {?} fn
3821
+ * @return {?}
3822
+ */
3823
+ function (fn) {
3824
+ this.onChange = fn;
3825
+ };
3826
+ /**
3827
+ * @param {?} fn
3828
+ * @return {?}
3829
+ */
3830
+ DatePickerComponent.prototype.registerOnTouched = /**
3831
+ * @param {?} fn
3832
+ * @return {?}
3833
+ */
3834
+ function (fn) {
3835
+ this.onTouched = fn;
3836
+ };
3837
+ DatePickerComponent.decorators = [
3838
+ { type: Component, args: [{
3839
+ selector: 'datepicker',
3840
+ template: "\n <datepicker-inner [activeDate]=\"activeDate\"\n (update)=\"onUpdate($event)\"\n [locale]=\"config.locale\"\n [datepickerMode]=\"datepickerMode\"\n [initDate]=\"initDate\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minMode]=\"minMode\"\n [maxMode]=\"maxMode\"\n [showWeeks]=\"showWeeks\"\n [formatDay]=\"formatDay\"\n [formatMonth]=\"formatMonth\"\n [formatYear]=\"formatYear\"\n [formatDayHeader]=\"formatDayHeader\"\n [formatDayTitle]=\"formatDayTitle\"\n [formatMonthTitle]=\"formatMonthTitle\"\n [startingDay]=\"startingDay\"\n [yearRange]=\"yearRange\"\n [customClass]=\"customClass\"\n [dateDisabled]=\"dateDisabled\"\n [dayDisabled]=\"dayDisabled\"\n [onlyCurrentMonth]=\"onlyCurrentMonth\"\n [shortcutPropagation]=\"shortcutPropagation\"\n [monthColLimit]=\"monthColLimit\"\n [yearColLimit]=\"yearColLimit\"\n (selectionDone)=\"onSelectionDone($event)\"\n (activeDateChange)=\"onActiveDateChange($event)\">\n <daypicker tabindex=\"0\"></daypicker>\n <monthpicker tabindex=\"0\"></monthpicker>\n <yearpicker tabindex=\"0\"></yearpicker>\n </datepicker-inner>\n ",
3841
+ providers: [DATEPICKER_CONTROL_VALUE_ACCESSOR]
3842
+ }] }
3843
+ ];
3844
+ /** @nocollapse */
3845
+ DatePickerComponent.ctorParameters = function () { return [
3846
+ { type: DatepickerConfig, },
3847
+ ]; };
3848
+ DatePickerComponent.propDecorators = {
3849
+ "datepickerMode": [{ type: Input },],
3850
+ "initDate": [{ type: Input },],
3851
+ "minDate": [{ type: Input },],
3852
+ "maxDate": [{ type: Input },],
3853
+ "minMode": [{ type: Input },],
3854
+ "maxMode": [{ type: Input },],
3855
+ "showWeeks": [{ type: Input },],
3856
+ "formatDay": [{ type: Input },],
3857
+ "formatMonth": [{ type: Input },],
3858
+ "formatYear": [{ type: Input },],
3859
+ "formatDayHeader": [{ type: Input },],
3860
+ "formatDayTitle": [{ type: Input },],
3861
+ "formatMonthTitle": [{ type: Input },],
3862
+ "startingDay": [{ type: Input },],
3863
+ "yearRange": [{ type: Input },],
3864
+ "onlyCurrentMonth": [{ type: Input },],
3865
+ "shortcutPropagation": [{ type: Input },],
3866
+ "monthColLimit": [{ type: Input },],
3867
+ "yearColLimit": [{ type: Input },],
3868
+ "customClass": [{ type: Input },],
3869
+ "dateDisabled": [{ type: Input },],
3870
+ "dayDisabled": [{ type: Input },],
3871
+ "activeDate": [{ type: Input },],
3872
+ "selectionDone": [{ type: Output },],
3873
+ "activeDateChange": [{ type: Output },],
3874
+ "_datePicker": [{ type: ViewChild, args: [DatePickerInnerComponent,] },],
3875
+ };
3876
+ return DatePickerComponent;
3877
+ }());
3878
+
3879
+ /**
3880
+ * @fileoverview added by tsickle
3881
+ * @suppress {checkTypes} checked by tsc
3882
+ */
3883
+ var DayPickerComponent = /** @class */ (function () {
3884
+ function DayPickerComponent(datePicker) {
3885
+ this.labels = [];
3886
+ this.rows = [];
3887
+ this.weekNumbers = [];
3888
+ this.datePicker = datePicker;
3889
+ }
3890
+ Object.defineProperty(DayPickerComponent.prototype, "isBs4", {
3891
+ get: /**
3892
+ * @return {?}
3893
+ */
3894
+ function () {
3895
+ return !isBs3();
3896
+ },
3897
+ enumerable: true,
3898
+ configurable: true
3899
+ });
3900
+ /*protected getDaysInMonth(year:number, month:number) {
3901
+ return ((month === 1) && (year % 4 === 0) &&
3902
+ ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month];
3903
+ }*/
3904
+ /**
3905
+ * @return {?}
3906
+ */
3907
+ DayPickerComponent.prototype.ngOnInit = /**
3908
+ * @return {?}
3909
+ */
3910
+ function () {
3911
+ var /** @type {?} */ self = this;
3912
+ this.datePicker.stepDay = { months: 1 };
3913
+ this.datePicker.setRefreshViewHandler(function () {
3914
+ var /** @type {?} */ year = this.activeDate.getFullYear();
3915
+ var /** @type {?} */ month = this.activeDate.getMonth();
3916
+ var /** @type {?} */ firstDayOfMonth = new Date(year, month, 1);
3917
+ var /** @type {?} */ difference = this.startingDay - firstDayOfMonth.getDay();
3918
+ var /** @type {?} */ numDisplayedFromPreviousMonth = difference > 0 ? 7 - difference : -difference;
3919
+ var /** @type {?} */ firstDate = new Date(firstDayOfMonth.getTime());
3920
+ if (numDisplayedFromPreviousMonth > 0) {
3921
+ firstDate.setDate(-numDisplayedFromPreviousMonth + 1);
3922
+ }
3923
+ // 42 is the number of days on a six-week calendar
3924
+ var /** @type {?} */ _days = self.getDates(firstDate, 42);
3925
+ var /** @type {?} */ days = [];
3926
+ for (var /** @type {?} */ i = 0; i < 42; i++) {
3927
+ var /** @type {?} */ _dateObject = this.createDateObject(_days[i], this.formatDay);
3928
+ _dateObject.secondary = _days[i].getMonth() !== month;
3929
+ _dateObject.uid = this.uniqueId + '-' + i;
3930
+ days[i] = _dateObject;
3931
+ }
3932
+ self.labels = [];
3933
+ for (var /** @type {?} */ j = 0; j < 7; j++) {
3934
+ self.labels[j] = {};
3935
+ self.labels[j].abbr = this.dateFilter(days[j].date, this.formatDayHeader);
3936
+ self.labels[j].full = this.dateFilter(days[j].date, 'EEEE');
3937
+ }
3938
+ self.title = this.dateFilter(this.activeDate, this.formatDayTitle);
3939
+ self.rows = this.split(days, 7);
3940
+ if (this.showWeeks) {
3941
+ self.weekNumbers = [];
3942
+ var /** @type {?} */ thursdayIndex = (4 + 7 - this.startingDay) % 7;
3943
+ var /** @type {?} */ numWeeks = self.rows.length;
3944
+ for (var /** @type {?} */ curWeek = 0; curWeek < numWeeks; curWeek++) {
3945
+ self.weekNumbers.push(self.getISO8601WeekNumber(self.rows[curWeek][thursdayIndex].date));
3946
+ }
3947
+ }
3948
+ }, 'day');
3949
+ this.datePicker.setCompareHandler(function (date1, date2) {
3950
+ var /** @type {?} */ d1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());
3951
+ var /** @type {?} */ d2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
3952
+ return d1.getTime() - d2.getTime();
3953
+ }, 'day');
3954
+ this.datePicker.refreshView();
3955
+ };
3956
+ /**
3957
+ * @param {?} startDate
3958
+ * @param {?} n
3959
+ * @return {?}
3960
+ */
3961
+ DayPickerComponent.prototype.getDates = /**
3962
+ * @param {?} startDate
3963
+ * @param {?} n
3964
+ * @return {?}
3965
+ */
3966
+ function (startDate, n) {
3967
+ var /** @type {?} */ dates = new Array(n);
3968
+ var /** @type {?} */ current = new Date(startDate.getTime());
3969
+ var /** @type {?} */ i = 0;
3970
+ var /** @type {?} */ date;
3971
+ while (i < n) {
3972
+ date = new Date(current.getTime());
3973
+ date = this.datePicker.fixTimeZone(date);
3974
+ dates[i++] = date;
3975
+ current = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1);
3976
+ }
3977
+ return dates;
3978
+ };
3979
+ /**
3980
+ * @param {?} date
3981
+ * @return {?}
3982
+ */
3983
+ DayPickerComponent.prototype.getISO8601WeekNumber = /**
3984
+ * @param {?} date
3985
+ * @return {?}
3986
+ */
3987
+ function (date) {
3988
+ var /** @type {?} */ checkDate = new Date(date.getTime());
3989
+ // Thursday
3990
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
3991
+ var /** @type {?} */ time = checkDate.getTime();
3992
+ // Compare with Jan 1
3993
+ checkDate.setMonth(0);
3994
+ checkDate.setDate(1);
3995
+ return (Math.floor(Math.round((time - checkDate.getTime()) / 86400000) / 7) + 1);
3996
+ };
3997
+ DayPickerComponent.decorators = [
3998
+ { type: Component, args: [{
3999
+ selector: 'daypicker',
4000
+ template: "\n<table *ngIf=\"datePicker.datepickerMode === 'day'\" role=\"grid\" [attr.aria-labelledby]=\"datePicker.uniqueId + '-title'\" aria-activedescendant=\"activeDateId\">\n <thead>\n <tr>\n <th>\n <button *ngIf=\"!isBs4\"\n type=\"button\"\n class=\"btn btn-default btn-secondary btn-sm pull-left float-left\"\n (click)=\"datePicker.move(-1)\"\n tabindex=\"-1\">\u2039</button>\n <button *ngIf=\"isBs4\"\n type=\"button\"\n class=\"btn btn-default btn-secondary btn-sm pull-left float-left\"\n (click)=\"datePicker.move(-1)\"\n tabindex=\"-1\">&lt;</button>\n </th>\n <th [attr.colspan]=\"5 + (datePicker.showWeeks ? 1 : 0)\">\n <button [id]=\"datePicker.uniqueId + '-title'\"\n type=\"button\" class=\"btn btn-default btn-secondary btn-sm\"\n (click)=\"datePicker.toggleMode(0)\"\n [disabled]=\"datePicker.datepickerMode === datePicker.maxMode\"\n [ngClass]=\"{disabled: datePicker.datepickerMode === datePicker.maxMode}\" tabindex=\"-1\" style=\"width:100%;\">\n <strong>{{ title }}</strong>\n </button>\n </th>\n <th>\n <button *ngIf=\"!isBs4\"\n type=\"button\"\n class=\"btn btn-default btn-secondary btn-sm pull-right float-right\"\n (click)=\"datePicker.move(1)\"\n tabindex=\"-1\">\u203A</button>\n <button *ngIf=\"isBs4\"\n type=\"button\"\n class=\"btn btn-default btn-secondary btn-sm pull-right float-right\"\n (click)=\"datePicker.move(1)\"\n tabindex=\"-1\">&gt;\n </button>\n </th>\n </tr>\n <tr>\n <th *ngIf=\"datePicker.showWeeks\"></th>\n <th *ngFor=\"let labelz of labels\" class=\"text-center\">\n <small aria-label=\"labelz.full\"><b>{{ labelz.abbr }}</b></small>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-template ngFor [ngForOf]=\"rows\" let-rowz=\"$implicit\" let-index=\"index\">\n <tr *ngIf=\"!(datePicker.onlyCurrentMonth && rowz[0].secondary && rowz[6].secondary)\">\n <td *ngIf=\"datePicker.showWeeks\" class=\"h6\" class=\"text-center\">\n <em>{{ weekNumbers[index] }}</em>\n </td>\n <td *ngFor=\"let dtz of rowz\" class=\"text-center\" role=\"gridcell\" [id]=\"dtz.uid\">\n <button type=\"button\" style=\"min-width:100%;\" class=\"btn btn-sm {{dtz.customClass}}\"\n *ngIf=\"!(datePicker.onlyCurrentMonth && dtz.secondary)\"\n [ngClass]=\"{'btn-secondary': isBs4 && !dtz.selected && !datePicker.isActive(dtz), 'btn-info': dtz.selected, disabled: dtz.disabled, active: !isBs4 && datePicker.isActive(dtz), 'btn-default': !isBs4}\"\n [disabled]=\"dtz.disabled\"\n (click)=\"datePicker.select(dtz.date)\" tabindex=\"-1\">\n <span [ngClass]=\"{'text-muted': dtz.secondary || dtz.current, 'text-info': !isBs4 && dtz.current}\">{{ dtz.label }}</span>\n </button>\n </td>\n </tr>\n </ng-template>\n </tbody>\n</table>\n ",
4001
+ styles: ["\n :host .btn-secondary {\n color: #292b2c;\n background-color: #fff;\n border-color: #ccc;\n }\n :host .btn-info .text-muted {\n color: #292b2c !important;\n }\n "]
4002
+ }] }
4003
+ ];
4004
+ // todo: key events implementation
4005
+ /** @nocollapse */
4006
+ DayPickerComponent.ctorParameters = function () { return [
4007
+ { type: DatePickerInnerComponent, },
4008
+ ]; };
4009
+ return DayPickerComponent;
4010
+ }());
4011
+
4012
+ /**
4013
+ * @fileoverview added by tsickle
4014
+ * @suppress {checkTypes} checked by tsc
4015
+ */
4016
+ var MonthPickerComponent = /** @class */ (function () {
4017
+ function MonthPickerComponent(datePicker) {
4018
+ this.rows = [];
4019
+ this.datePicker = datePicker;
4020
+ }
4021
+ Object.defineProperty(MonthPickerComponent.prototype, "isBs4", {
4022
+ get: /**
4023
+ * @return {?}
4024
+ */
4025
+ function () {
4026
+ return !isBs3();
4027
+ },
4028
+ enumerable: true,
4029
+ configurable: true
4030
+ });
4031
+ /**
4032
+ * @return {?}
4033
+ */
4034
+ MonthPickerComponent.prototype.ngOnInit = /**
4035
+ * @return {?}
4036
+ */
4037
+ function () {
4038
+ var /** @type {?} */ self = this;
4039
+ this.datePicker.stepMonth = { years: 1 };
4040
+ this.datePicker.setRefreshViewHandler(function () {
4041
+ var /** @type {?} */ months = new Array(12);
4042
+ var /** @type {?} */ year = this.activeDate.getFullYear();
4043
+ var /** @type {?} */ date;
4044
+ for (var /** @type {?} */ i = 0; i < 12; i++) {
4045
+ date = new Date(year, i, 1);
4046
+ date = this.fixTimeZone(date);
4047
+ months[i] = this.createDateObject(date, this.formatMonth);
4048
+ months[i].uid = this.uniqueId + '-' + i;
4049
+ }
4050
+ self.title = this.dateFilter(this.activeDate, this.formatMonthTitle);
4051
+ self.rows = this.split(months, self.datePicker.monthColLimit);
4052
+ }, 'month');
4053
+ this.datePicker.setCompareHandler(function (date1, date2) {
4054
+ var /** @type {?} */ d1 = new Date(date1.getFullYear(), date1.getMonth());
4055
+ var /** @type {?} */ d2 = new Date(date2.getFullYear(), date2.getMonth());
4056
+ return d1.getTime() - d2.getTime();
4057
+ }, 'month');
4058
+ this.datePicker.refreshView();
4059
+ };
4060
+ MonthPickerComponent.decorators = [
4061
+ { type: Component, args: [{
4062
+ selector: 'monthpicker',
4063
+ template: "\n<table *ngIf=\"datePicker.datepickerMode==='month'\" role=\"grid\">\n <thead>\n <tr>\n <th>\n <button type=\"button\" class=\"btn btn-default btn-sm pull-left float-left\"\n (click)=\"datePicker.move(-1)\" tabindex=\"-1\">\u2039</button></th>\n <th [attr.colspan]=\"((datePicker.monthColLimit - 2) <= 0) ? 1 : datePicker.monthColLimit - 2\">\n <button [id]=\"datePicker.uniqueId + '-title'\"\n type=\"button\" class=\"btn btn-default btn-sm\"\n (click)=\"datePicker.toggleMode(0)\"\n [disabled]=\"datePicker.datepickerMode === maxMode\"\n [ngClass]=\"{disabled: datePicker.datepickerMode === maxMode}\" tabindex=\"-1\" style=\"width:100%;\">\n <strong>{{ title }}</strong> \n </button>\n </th>\n <th>\n <button type=\"button\" class=\"btn btn-default btn-sm pull-right float-right\"\n (click)=\"datePicker.move(1)\" tabindex=\"-1\">\u203A</button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let rowz of rows\">\n <td *ngFor=\"let dtz of rowz\" class=\"text-center\" role=\"gridcell\" [attr.id]=\"dtz.uid\" [ngClass]=\"dtz.customClass\">\n <button type=\"button\" style=\"min-width:100%;\" class=\"btn btn-default\"\n [ngClass]=\"{'btn-link': isBs4 && !dtz.selected && !datePicker.isActive(dtz), 'btn-info': dtz.selected || (isBs4 && !dtz.selected && datePicker.isActive(dtz)), disabled: dtz.disabled, active: !isBs4 && datePicker.isActive(dtz)}\"\n [disabled]=\"dtz.disabled\"\n (click)=\"datePicker.select(dtz.date)\" tabindex=\"-1\">\n <span [ngClass]=\"{'text-success': isBs4 && dtz.current, 'text-info': !isBs4 && dtz.current}\">{{ dtz.label }}</span>\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n ",
4064
+ styles: ["\n :host .btn-info .text-success {\n color: #fff !important;\n }\n "]
4065
+ }] }
4066
+ ];
4067
+ // todo: key events implementation
4068
+ /** @nocollapse */
4069
+ MonthPickerComponent.ctorParameters = function () { return [
4070
+ { type: DatePickerInnerComponent, },
4071
+ ]; };
4072
+ return MonthPickerComponent;
4073
+ }());
4074
+
4075
+ /**
4076
+ * @fileoverview added by tsickle
4077
+ * @suppress {checkTypes} checked by tsc
4078
+ */
4079
+ var YearPickerComponent = /** @class */ (function () {
4080
+ function YearPickerComponent(datePicker) {
4081
+ this.rows = [];
4082
+ this.datePicker = datePicker;
4083
+ }
4084
+ Object.defineProperty(YearPickerComponent.prototype, "isBs4", {
4085
+ get: /**
4086
+ * @return {?}
4087
+ */
4088
+ function () {
4089
+ return !isBs3();
4090
+ },
4091
+ enumerable: true,
4092
+ configurable: true
4093
+ });
4094
+ /**
4095
+ * @return {?}
4096
+ */
4097
+ YearPickerComponent.prototype.ngOnInit = /**
4098
+ * @return {?}
4099
+ */
4100
+ function () {
4101
+ var /** @type {?} */ self = this;
4102
+ this.datePicker.stepYear = { years: this.datePicker.yearRange };
4103
+ this.datePicker.setRefreshViewHandler(function () {
4104
+ var /** @type {?} */ years = new Array(this.yearRange);
4105
+ var /** @type {?} */ date;
4106
+ var /** @type {?} */ start = self.getStartingYear(this.activeDate.getFullYear());
4107
+ for (var /** @type {?} */ i = 0; i < this.yearRange; i++) {
4108
+ date = new Date(start + i, 0, 1);
4109
+ date = this.fixTimeZone(date);
4110
+ years[i] = this.createDateObject(date, this.formatYear);
4111
+ years[i].uid = this.uniqueId + '-' + i;
4112
+ }
4113
+ self.title = [years[0].label, years[this.yearRange - 1].label].join(' - ');
4114
+ self.rows = this.split(years, self.datePicker.yearColLimit);
4115
+ }, 'year');
4116
+ this.datePicker.setCompareHandler(function (date1, date2) {
4117
+ return date1.getFullYear() - date2.getFullYear();
4118
+ }, 'year');
4119
+ this.datePicker.refreshView();
4120
+ };
4121
+ /**
4122
+ * @param {?} year
4123
+ * @return {?}
4124
+ */
4125
+ YearPickerComponent.prototype.getStartingYear = /**
4126
+ * @param {?} year
4127
+ * @return {?}
4128
+ */
4129
+ function (year) {
4130
+ // todo: parseInt
4131
+ return ((year - 1) / this.datePicker.yearRange * this.datePicker.yearRange + 1);
4132
+ };
4133
+ YearPickerComponent.decorators = [
4134
+ { type: Component, args: [{
4135
+ selector: 'yearpicker',
4136
+ template: "\n<table *ngIf=\"datePicker.datepickerMode==='year'\" role=\"grid\">\n <thead>\n <tr>\n <th>\n <button type=\"button\" class=\"btn btn-default btn-sm pull-left float-left\"\n (click)=\"datePicker.move(-1)\" tabindex=\"-1\">\u2039</button>\n </th>\n <th [attr.colspan]=\"((datePicker.yearColLimit - 2) <= 0) ? 1 : datePicker.yearColLimit - 2\">\n <button [id]=\"datePicker.uniqueId + '-title'\" role=\"heading\"\n type=\"button\" class=\"btn btn-default btn-sm\"\n (click)=\"datePicker.toggleMode(0)\"\n [disabled]=\"datePicker.datepickerMode === datePicker.maxMode\"\n [ngClass]=\"{disabled: datePicker.datepickerMode === datePicker.maxMode}\" tabindex=\"-1\" style=\"width:100%;\">\n <strong>{{ title }}</strong>\n </button>\n </th>\n <th>\n <button type=\"button\" class=\"btn btn-default btn-sm pull-right float-right\"\n (click)=\"datePicker.move(1)\" tabindex=\"-1\">\u203A</button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let rowz of rows\">\n <td *ngFor=\"let dtz of rowz\" class=\"text-center\" role=\"gridcell\" [attr.id]=\"dtz.uid\">\n <button type=\"button\" style=\"min-width:100%;\" class=\"btn btn-default\"\n [ngClass]=\"{'btn-link': isBs4 && !dtz.selected && !datePicker.isActive(dtz), 'btn-info': dtz.selected || (isBs4 && !dtz.selected && datePicker.isActive(dtz)), disabled: dtz.disabled, active: !isBs4 && datePicker.isActive(dtz)}\"\n [disabled]=\"dtz.disabled\"\n (click)=\"datePicker.select(dtz.date)\" tabindex=\"-1\">\n <span [ngClass]=\"{'text-success': isBs4 && dtz.current, 'text-info': !isBs4 && dtz.current}\">{{ dtz.label }}</span>\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n ",
4137
+ styles: ["\n :host .btn-info .text-success {\n color: #fff !important;\n }\n "]
4138
+ }] }
4139
+ ];
4140
+ /** @nocollapse */
4141
+ YearPickerComponent.ctorParameters = function () { return [
4142
+ { type: DatePickerInnerComponent, },
4143
+ ]; };
4144
+ return YearPickerComponent;
4145
+ }());
4146
+
4147
+ /**
4148
+ * @fileoverview added by tsickle
4149
+ * @suppress {checkTypes} checked by tsc
4150
+ */
4151
+ var DatepickerModule = /** @class */ (function () {
4152
+ function DatepickerModule() {
4153
+ }
4154
+ /**
4155
+ * @return {?}
4156
+ */
4157
+ DatepickerModule.forRoot = /**
4158
+ * @return {?}
4159
+ */
4160
+ function () {
4161
+ return { ngModule: DatepickerModule, providers: [DatepickerConfig] };
4162
+ };
4163
+ DatepickerModule.decorators = [
4164
+ { type: NgModule, args: [{
4165
+ imports: [CommonModule, FormsModule],
4166
+ declarations: [
4167
+ DatePickerComponent,
4168
+ DatePickerInnerComponent,
4169
+ DayPickerComponent,
4170
+ MonthPickerComponent,
4171
+ YearPickerComponent
4172
+ ],
4173
+ exports: [
4174
+ DatePickerComponent,
4175
+ DatePickerInnerComponent,
4176
+ DayPickerComponent,
4177
+ MonthPickerComponent,
4178
+ YearPickerComponent
4179
+ ],
4180
+ entryComponents: [DatePickerComponent]
4181
+ },] }
4182
+ ];
4183
+ return DatepickerModule;
4184
+ }());
4185
+
4186
+ /**
4187
+ * @fileoverview added by tsickle
4188
+ * @suppress {checkTypes} checked by tsc
4189
+ */
4190
+
4191
+ /**
4192
+ * @fileoverview added by tsickle
4193
+ * @suppress {checkTypes} checked by tsc
4194
+ */
4195
+
4196
+ export { BsDatepickerConfig, BsDatepickerDirective, BsDatepickerModule, BsDaterangepickerConfig, BsDaterangepickerDirective, BsLocaleService, DateFormatter, DatePickerComponent, DatepickerConfig, DatepickerModule, DayPickerComponent, MonthPickerComponent, YearPickerComponent, BsDatepickerAbstractComponent as ɵl, BsDatepickerInputDirective as ɵq, BsDaterangepickerInputDirective as ɵr, DatePickerInnerComponent as ɵs, DATEPICKER_CONTROL_VALUE_ACCESSOR as ɵa, BsDatepickerActions as ɵo, BsDatepickerEffects as ɵn, BsDatepickerStore as ɵm, BsCalendarLayoutComponent as ɵf, BsCurrentDateViewComponent as ɵc, BsCustomDatesViewComponent as ɵj, BsDatepickerContainerComponent as ɵk, BsDatepickerDayDecoratorComponent as ɵb, BsDatepickerNavigationViewComponent as ɵd, BsDaterangepickerContainerComponent as ɵp, BsDaysCalendarViewComponent as ɵg, BsMonthCalendarViewComponent as ɵh, BsTimepickerViewComponent as ɵe, BsYearsCalendarViewComponent as ɵi };
4197
+
4198
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC1kYXRlcGlja2VyLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvYnMtZGF0ZXBpY2tlci5jb25maWcudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9iYXNlL2JzLWRhdGVwaWNrZXItY29udGFpbmVyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvcmVkdWNlci9icy1kYXRlcGlja2VyLmFjdGlvbnMudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9icy1sb2NhbGUuc2VydmljZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvcmVkdWNlci9fZGVmYXVsdHMudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RhdGUudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci91dGlscy9icy1jYWxlbmRhci11dGlscy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3V0aWxzL21hdHJpeC11dGlscy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2VuZ2luZS9jYWxjLWRheXMtY2FsZW5kYXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9lbmdpbmUvZm9ybWF0LWRheXMtY2FsZW5kYXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9lbmdpbmUvZmxhZy1kYXlzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZW5naW5lL3ZpZXctbW9kZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2VuZ2luZS9mb3JtYXQtbW9udGhzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZW5naW5lL2ZsYWctbW9udGhzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZW5naW5lL2Zvcm1hdC15ZWFycy1jYWxlbmRhci50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2VuZ2luZS9mbGFnLXllYXJzLWNhbGVuZGFyLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvcmVkdWNlci9icy1kYXRlcGlja2VyLnJlZHVjZXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RvcmUudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF0ZXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvYnMtZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9icy1kYXRlcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2JzLWRhdGVyYW5nZXBpY2tlci5jb25maWcudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9icy1kYXRlcmFuZ2VwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvYnMtZGF0ZXJhbmdlcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1jYWxlbmRhci1sYXlvdXQuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvdGhlbWVzL2JzL2JzLWN1cnJlbnQtZGF0ZS12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1jdXN0b20tZGF0ZXMtdmlldy5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF0ZXBpY2tlci1kYXktZGVjb3JhdG9yLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlldy5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtZGF5cy1jYWxlbmRhci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy1tb250aHMtY2FsZW5kYXItdmlldy5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci90aGVtZXMvYnMvYnMtdGltZXBpY2tlci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL3RoZW1lcy9icy9icy15ZWFycy1jYWxlbmRhci12aWV3LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2JzLWRhdGVwaWNrZXIubW9kdWxlLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZGF0ZS1mb3JtYXR0ZXIudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29uZmlnLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9kYXlwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIvbW9udGhwaWNrZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXIveWVhcnBpY2tlci5jb21wb25lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvZGF0ZXBpY2tlci9kYXRlcGlja2VyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyxcbiAgQnNEYXRlcGlja2VyVmlld01vZGVcbn0gZnJvbSAnLi9tb2RlbHMnO1xuXG5cbi8qKlxuICogRm9yIGRhdGUgcmFuZ2UgcGlja2VyIHRoZXJlIGFyZSBgQnNEYXRlcmFuZ2VwaWNrZXJDb25maWdgIHdoaWNoIGluaGVyaXRzIGFsbCBwcm9wZXJ0aWVzLFxuICogZXhjZXB0IGBkaXNwbGF5TW9udGhzYCwgZm9yIHJhbmdlIHBpY2tlciBpdCBkZWZhdWx0IHRvIGAyYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyQ29uZmlnIGltcGxlbWVudHMgRGF0ZXBpY2tlclJlbmRlck9wdGlvbnMge1xuICB2YWx1ZT86IERhdGUgfCBEYXRlW107XG4gIGlzRGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBtaW4gZGF0ZSBmb3IgYWxsIGRhdGUvcmFuZ2UgcGlja2Vyc1xuICAgKi9cbiAgbWluRGF0ZT86IERhdGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heCBkYXRlIGZvciBhbGwgZGF0ZS9yYW5nZSBwaWNrZXJzXG4gICAqL1xuICBtYXhEYXRlPzogRGF0ZTtcblxuICBkYXlzRGlzYWJsZWQ/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIE1ha2VzIGRhdGVzIGZyb20gb3RoZXIgbW9udGhzIGFjdGl2ZVxuICAgKi9cbiAgc2VsZWN0RnJvbU90aGVyTW9udGg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGQgY2xhc3MgdG8gY3VycmVudCBkYXlcbiAgICovXG4gIGN1c3RvbVRvZGF5Q2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1dCBtb2RlIGZvciBhbGwgZGF0ZSBwaWNrZXJzXG4gICAqL1xuICBtaW5Nb2RlPzogQnNEYXRlcGlja2VyVmlld01vZGU7XG5cbiAgLyoqIENTUyBjbGFzcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gZGF0ZXBpY2tlciBjb250YWluZXIsXG4gICAqIHVzdWFsbHkgdXNlZCB0byBzZXQgY29sb3IgdGhlbWVcbiAgICovXG4gIGNvbnRhaW5lckNsYXNzID0gJ3RoZW1lLWdyZWVuJztcblxuICAvLyBEYXRlcGlja2VyUmVuZGVyT3B0aW9uc1xuICBkaXNwbGF5TW9udGhzID0gMTtcbiAgLyoqXG4gICAqIEFsbG93cyB0byBoaWRlIHdlZWsgbnVtYmVycyBpbiBkYXRlcGlja2VyXG4gICAqL1xuICBzaG93V2Vla051bWJlcnMgPSB0cnVlO1xuXG4gIGRhdGVJbnB1dEZvcm1hdCA9ICdMJztcbiAgLy8gcmFuZ2UgcGlja2VyXG4gIHJhbmdlU2VwYXJhdG9yID0gJyAtICc7XG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCBmb3IgZGF0ZSByYW5nZSBpbnB1dCBmaWVsZFxuICAgKi9cbiAgcmFuZ2VJbnB1dEZvcm1hdCA9ICdMJztcblxuICAvLyBEYXRlcGlja2VyRm9ybWF0T3B0aW9uc1xuICBtb250aFRpdGxlID0gJ01NTU0nO1xuICB5ZWFyVGl0bGUgPSAnWVlZWSc7XG4gIGRheUxhYmVsID0gJ0QnO1xuICBtb250aExhYmVsID0gJ01NTU0nO1xuICB5ZWFyTGFiZWwgPSAnWVlZWSc7XG4gIHdlZWtOdW1iZXJzID0gJ3cnO1xufVxuIiwiLy8gZGF0ZXBpY2tlciBjb250YWluZXIgY29tcG9uZW50XG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby1lbXB0eSAqL1xuaW1wb3J0IHsgQnNDdXN0b21EYXRlcyB9IGZyb20gJy4uL3RoZW1lcy9icy9icy1jdXN0b20tZGF0ZXMtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyRWZmZWN0cyB9IGZyb20gJy4uL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEJzRGF0ZXBpY2tlclZpZXdNb2RlLFxuICBCc05hdmlnYXRpb25FdmVudCxcbiAgQ2FsZW5kYXJDZWxsVmlld01vZGVsLFxuICBDZWxsSG92ZXJFdmVudCxcbiAgRGF0ZXBpY2tlclJlbmRlck9wdGlvbnMsXG4gIERheXNDYWxlbmRhclZpZXdNb2RlbCxcbiAgRGF5Vmlld01vZGVsLFxuICBNb250aHNDYWxlbmRhclZpZXdNb2RlbCxcbiAgWWVhcnNDYWxlbmRhclZpZXdNb2RlbFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnQge1xuICBjb250YWluZXJDbGFzczogc3RyaW5nO1xuICBpc090aGVyTW9udGhzQWN0aXZlOiBib29sZWFuO1xuXG4gIF9lZmZlY3RzOiBCc0RhdGVwaWNrZXJFZmZlY3RzO1xuICBfY3VzdG9tUmFuZ2VzRmlzaDogQnNDdXN0b21EYXRlc1tdID0gW107XG5cbiAgc2V0IG1pbkRhdGUodmFsdWU6IERhdGUpIHtcbiAgICB0aGlzLl9lZmZlY3RzLnNldE1pbkRhdGUodmFsdWUpO1xuICB9XG5cbiAgc2V0IG1heERhdGUodmFsdWU6IERhdGUpIHtcbiAgICB0aGlzLl9lZmZlY3RzLnNldE1heERhdGUodmFsdWUpO1xuICB9XG4gIHNldCBkYXlzRGlzYWJsZWQodmFsdWU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5fZWZmZWN0cy5zZXREYXlzRGlzYWJsZWQodmFsdWUpO1xuICB9XG5cbiAgc2V0IGlzRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZmZlY3RzLnNldERpc2FibGVkKHZhbHVlKTtcbiAgfVxuXG4gIHZpZXdNb2RlOiBPYnNlcnZhYmxlPEJzRGF0ZXBpY2tlclZpZXdNb2RlPjtcbiAgZGF5c0NhbGVuZGFyOiBPYnNlcnZhYmxlPERheXNDYWxlbmRhclZpZXdNb2RlbFtdPjtcbiAgbW9udGhzQ2FsZW5kYXI6IE9ic2VydmFibGU8TW9udGhzQ2FsZW5kYXJWaWV3TW9kZWxbXT47XG4gIHllYXJzQ2FsZW5kYXI6IE9ic2VydmFibGU8WWVhcnNDYWxlbmRhclZpZXdNb2RlbFtdPjtcbiAgb3B0aW9uczogT2JzZXJ2YWJsZTxEYXRlcGlja2VyUmVuZGVyT3B0aW9ucz47XG5cbiAgc2V0Vmlld01vZGUoZXZlbnQ6IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogdm9pZCB7fVxuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzTmF2aWdhdGlvbkV2ZW50KTogdm9pZCB7fVxuXG4gIGRheUhvdmVySGFuZGxlcihldmVudDogQ2VsbEhvdmVyRXZlbnQpOiB2b2lkIHt9XG5cbiAgbW9udGhIb3ZlckhhbmRsZXIoZXZlbnQ6IENlbGxIb3ZlckV2ZW50KTogdm9pZCB7fVxuXG4gIHllYXJIb3ZlckhhbmRsZXIoZXZlbnQ6IENlbGxIb3ZlckV2ZW50KTogdm9pZCB7fVxuXG4gIGRheVNlbGVjdEhhbmRsZXIoZGF5OiBEYXlWaWV3TW9kZWwpOiB2b2lkIHt9XG5cbiAgbW9udGhTZWxlY3RIYW5kbGVyKGV2ZW50OiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpOiB2b2lkIHt9XG5cbiAgeWVhclNlbGVjdEhhbmRsZXIoZXZlbnQ6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbCk6IHZvaWQge31cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSAqL1xuICBfc3RvcFByb3BhZ2F0aW9uKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGltZVVuaXQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9taW5pLW5ncngnO1xuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzVmlld05hdmlnYXRpb25FdmVudCxcbiAgQ2VsbEhvdmVyRXZlbnQsXG4gIERhdGVwaWNrZXJSZW5kZXJPcHRpb25zXG59IGZyb20gJy4uL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCc0RhdGVwaWNrZXJBY3Rpb25zIHtcbiAgc3RhdGljIHJlYWRvbmx5IENBTENVTEFURSA9ICdbZGF0ZXBpY2tlcl0gY2FsY3VsYXRlIGRhdGVzIG1hdHJpeCc7XG4gIHN0YXRpYyByZWFkb25seSBGT1JNQVQgPSAnW2RhdGVwaWNrZXJdIGZvcm1hdCBkYXRlcGlja2VyIHZhbHVlcyc7XG4gIHN0YXRpYyByZWFkb25seSBGTEFHID0gJ1tkYXRlcGlja2VyXSBzZXQgZmxhZ3MnO1xuICBzdGF0aWMgcmVhZG9ubHkgU0VMRUNUID0gJ1tkYXRlcGlja2VyXSBzZWxlY3QgZGF0ZSc7XG4gIHN0YXRpYyByZWFkb25seSBOQVZJR0FURV9PRkZTRVQgPSAnW2RhdGVwaWNrZXJdIHNoaWZ0IHZpZXcgZGF0ZSc7XG4gIHN0YXRpYyByZWFkb25seSBOQVZJR0FURV9UTyA9ICdbZGF0ZXBpY2tlcl0gY2hhbmdlIHZpZXcgZGF0ZSc7XG4gIHN0YXRpYyByZWFkb25seSBTRVRfT1BUSU9OUyA9ICdbZGF0ZXBpY2tlcl0gdXBkYXRlIHJlbmRlciBvcHRpb25zJztcbiAgc3RhdGljIHJlYWRvbmx5IEhPVkVSID0gJ1tkYXRlcGlja2VyXSBob3ZlciBkYXRlJztcbiAgc3RhdGljIHJlYWRvbmx5IENIQU5HRV9WSUVXTU9ERSA9ICdbZGF0ZXBpY2tlcl0gc3dpdGNoIHZpZXcgbW9kZSc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9NSU5fREFURSA9ICdbZGF0ZXBpY2tlcl0gc2V0IG1pbiBkYXRlJztcbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9NQVhfREFURSA9ICdbZGF0ZXBpY2tlcl0gc2V0IG1heCBkYXRlJztcbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9EQVlTRElTQUJMRUQgPSAnW2RhdGVwaWNrZXJdIHNldCBkYXlzIGRpc2FibGVkJztcbiAgc3RhdGljIHJlYWRvbmx5IFNFVF9JU19ESVNBQkxFRCA9ICdbZGF0ZXBpY2tlcl0gc2V0IGlzIGRpc2FibGVkJztcblxuICBzdGF0aWMgcmVhZG9ubHkgU0VUX0xPQ0FMRSA9ICdbZGF0ZXBpY2tlcl0gc2V0IGRhdGVwaWNrZXIgbG9jYWxlJztcblxuICBzdGF0aWMgcmVhZG9ubHkgU0VMRUNUX1JBTkdFID0gJ1tkYXRlcmFuZ2VwaWNrZXJdIHNlbGVjdCBkYXRlcyByYW5nZSc7XG5cbiAgY2FsY3VsYXRlKCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5DQUxDVUxBVEUgfTtcbiAgfVxuXG4gIGZvcm1hdCgpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuRk9STUFUIH07XG4gIH1cblxuICBmbGFnKCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5GTEFHIH07XG4gIH1cblxuICBzZWxlY3QoZGF0ZTogRGF0ZSk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VMRUNULFxuICAgICAgcGF5bG9hZDogZGF0ZVxuICAgIH07XG4gIH1cblxuICBjaGFuZ2VWaWV3TW9kZShldmVudDogQnNEYXRlcGlja2VyVmlld01vZGUpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLkNIQU5HRV9WSUVXTU9ERSxcbiAgICAgIHBheWxvYWQ6IGV2ZW50XG4gICAgfTtcbiAgfVxuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzVmlld05hdmlnYXRpb25FdmVudCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuTkFWSUdBVEVfVE8sXG4gICAgICBwYXlsb2FkOiBldmVudFxuICAgIH07XG4gIH1cblxuICBuYXZpZ2F0ZVN0ZXAoc3RlcDogVGltZVVuaXQpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLk5BVklHQVRFX09GRlNFVCxcbiAgICAgIHBheWxvYWQ6IHN0ZXBcbiAgICB9O1xuICB9XG5cbiAgc2V0T3B0aW9ucyhvcHRpb25zOiBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VUX09QVElPTlMsXG4gICAgICBwYXlsb2FkOiBvcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIC8vIGRhdGUgcmFuZ2UgcGlja2VyXG4gIHNlbGVjdFJhbmdlKHZhbHVlOiBEYXRlW10pOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFTEVDVF9SQU5HRSxcbiAgICAgIHBheWxvYWQ6IHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIGhvdmVyRGF5KGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuSE9WRVIsXG4gICAgICBwYXlsb2FkOiBldmVudC5pc0hvdmVyZWQgPyBldmVudC5jZWxsLmRhdGUgOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIG1pbkRhdGUoZGF0ZTogRGF0ZSk6IEFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VUX01JTl9EQVRFLFxuICAgICAgcGF5bG9hZDogZGF0ZVxuICAgIH07XG4gIH1cblxuICBtYXhEYXRlKGRhdGU6IERhdGUpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFVF9NQVhfREFURSxcbiAgICAgIHBheWxvYWQ6IGRhdGVcbiAgICB9O1xuICB9XG5cbiAgZGF5c0Rpc2FibGVkKGRheXM6IG51bWJlcltdKTogQWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfREFZU0RJU0FCTEVELFxuICAgICAgcGF5bG9hZDogZGF5c1xuICAgIH07XG4gIH1cblxuICBpc0Rpc2FibGVkKHZhbHVlOiBib29sZWFuKTogQWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfSVNfRElTQUJMRUQsXG4gICAgICBwYXlsb2FkOiB2YWx1ZVxuICAgIH07XG4gIH1cblxuICBzZXRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBBY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFVF9MT0NBTEUsXG4gICAgICBwYXlsb2FkOiBsb2NhbGVcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJzTG9jYWxlU2VydmljZSB7XG4gIHByaXZhdGUgX2RlZmF1bHRMb2NhbGUgPSAnZW4nO1xuICBwcml2YXRlIF9sb2NhbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5fZGVmYXVsdExvY2FsZSk7XG4gIHByaXZhdGUgX2xvY2FsZUNoYW5nZTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5fbG9jYWxlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGdldCBsb2NhbGUoKTogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gIH1cblxuICBnZXQgbG9jYWxlQ2hhbmdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZUNoYW5nZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgdXNlKGxvY2FsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGxvY2FsZSA9PT0gdGhpcy5jdXJyZW50TG9jYWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9jYWxlLm5leHQobG9jYWxlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBnZXRGdWxsWWVhciwgZ2V0TW9udGggfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBYnN0cmFjdENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UvYnMtZGF0ZXBpY2tlci1jb250YWluZXInO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQWN0aW9ucyB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5hY3Rpb25zJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0b3JlIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLnN0b3JlJztcbmltcG9ydCB7IEJzTG9jYWxlU2VydmljZSB9IGZyb20gJy4uL2JzLWxvY2FsZS5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzTmF2aWdhdGlvbkV2ZW50LFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWwsXG4gIENlbGxIb3ZlckV2ZW50LFxuICBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyxcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBEYXlWaWV3TW9kZWwsXG4gIE1vbnRoc0NhbGVuZGFyVmlld01vZGVsLFxuICBZZWFyc0NhbGVuZGFyVmlld01vZGVsXG59IGZyb20gJy4uL21vZGVscyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICB2aWV3TW9kZTogT2JzZXJ2YWJsZTxCc0RhdGVwaWNrZXJWaWV3TW9kZT47XG4gIGRheXNDYWxlbmRhcjogT2JzZXJ2YWJsZTxEYXlzQ2FsZW5kYXJWaWV3TW9kZWxbXT47XG4gIG1vbnRoc0NhbGVuZGFyOiBPYnNlcnZhYmxlPE1vbnRoc0NhbGVuZGFyVmlld01vZGVsW10+O1xuICB5ZWFyc0NhbGVuZGFyOiBPYnNlcnZhYmxlPFllYXJzQ2FsZW5kYXJWaWV3TW9kZWxbXT47XG4gIG9wdGlvbnM6IE9ic2VydmFibGU8RGF0ZXBpY2tlclJlbmRlck9wdGlvbnM+O1xuXG4gIHByaXZhdGUgX3N0b3JlOiBCc0RhdGVwaWNrZXJTdG9yZTtcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hY3Rpb25zOiBCc0RhdGVwaWNrZXJBY3Rpb25zLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2NhbGVTZXJ2aWNlOiBCc0xvY2FsZVNlcnZpY2UpIHt9XG5cbiAgaW5pdChfYnNEYXRlcGlja2VyU3RvcmU6IEJzRGF0ZXBpY2tlclN0b3JlKTogQnNEYXRlcGlja2VyRWZmZWN0cyB7XG4gICAgdGhpcy5fc3RvcmUgPSBfYnNEYXRlcGlja2VyU3RvcmU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBzZXR0ZXJzICovXG5cbiAgc2V0VmFsdWUodmFsdWU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLnNlbGVjdCh2YWx1ZSkpO1xuICB9XG5cbiAgc2V0UmFuZ2VWYWx1ZSh2YWx1ZTogRGF0ZVtdKTogdm9pZCB7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZWxlY3RSYW5nZSh2YWx1ZSkpO1xuICB9XG5cbiAgc2V0TWluRGF0ZSh2YWx1ZTogRGF0ZSk6IEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMubWluRGF0ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNYXhEYXRlKHZhbHVlOiBEYXRlKTogQnNEYXRlcGlja2VyRWZmZWN0cyB7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5tYXhEYXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERheXNEaXNhYmxlZCh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmRheXNEaXNhYmxlZCh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREaXNhYmxlZCh2YWx1ZTogYm9vbGVhbik6IEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuaXNEaXNhYmxlZCh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiBTZXQgcmVuZGVyaW5nIG9wdGlvbnMgKi9cbiAgc2V0T3B0aW9ucyhfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcpOiBCc0RhdGVwaWNrZXJFZmZlY3RzIHtcbiAgICBjb25zdCBfb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe2xvY2FsZTogdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlfSwgX2NvbmZpZyk7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZXRPcHRpb25zKF9vcHRpb25zKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiB2aWV3IHRvIG1vZGUgYmluZGluZ3MgKi9cbiAgc2V0QmluZGluZ3MoY29udGFpbmVyOiBCc0RhdGVwaWNrZXJBYnN0cmFjdENvbXBvbmVudCk6IEJzRGF0ZXBpY2tlckVmZmVjdHMge1xuICAgIGNvbnRhaW5lci5kYXlzQ2FsZW5kYXIgPSB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5mbGFnZ2VkTW9udGhzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihtb250aHMgPT4gISFtb250aHMpXG4gICAgICApO1xuXG4gICAgLy8gbW9udGggY2FsZW5kYXJcbiAgICBjb250YWluZXIubW9udGhzQ2FsZW5kYXIgPSB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5mbGFnZ2VkTW9udGhzQ2FsZW5kYXIpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKG1vbnRocyA9PiAhIW1vbnRocylcbiAgICAgICk7XG5cbiAgICAvLyB5ZWFyIGNhbGVuZGFyXG4gICAgY29udGFpbmVyLnllYXJzQ2FsZW5kYXIgPSB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS55ZWFyc0NhbGVuZGFyRmxhZ2dlZClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoeWVhcnMgPT4gISF5ZWFycylcbiAgICAgICk7XG5cbiAgICBjb250YWluZXIudmlld01vZGUgPSB0aGlzLl9zdG9yZS5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudmlldy5tb2RlKTtcblxuICAgIGNvbnRhaW5lci5vcHRpb25zID0gdGhpcy5fc3RvcmVcbiAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuc2hvd1dlZWtOdW1iZXJzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChzaG93V2Vla051bWJlcnMgPT4gKHtzaG93V2Vla051bWJlcnN9KSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBldmVudCBoYW5kbGVycyAqL1xuICBzZXRFdmVudEhhbmRsZXJzKGNvbnRhaW5lcjogQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnQpOiBCc0RhdGVwaWNrZXJFZmZlY3RzIHtcbiAgICBjb250YWluZXIuc2V0Vmlld01vZGUgPSAoZXZlbnQ6IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmNoYW5nZVZpZXdNb2RlKGV2ZW50KSk7XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci5uYXZpZ2F0ZVRvID0gKGV2ZW50OiBCc05hdmlnYXRpb25FdmVudCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5uYXZpZ2F0ZVN0ZXAoZXZlbnQuc3RlcCkpO1xuICAgIH07XG5cbiAgICBjb250YWluZXIuZGF5SG92ZXJIYW5kbGVyID0gKGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgX2NlbGwgPSBldmVudC5jZWxsIGFzIERheVZpZXdNb2RlbDtcbiAgICAgIGlmIChfY2VsbC5pc090aGVyTW9udGggfHwgX2NlbGwuaXNEaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuaG92ZXJEYXkoZXZlbnQpKTtcbiAgICAgIF9jZWxsLmlzSG92ZXJlZCA9IGV2ZW50LmlzSG92ZXJlZDtcbiAgICB9O1xuXG4gICAgY29udGFpbmVyLm1vbnRoSG92ZXJIYW5kbGVyID0gKGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZXZlbnQuY2VsbC5pc0hvdmVyZWQgPSBldmVudC5pc0hvdmVyZWQ7XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci55ZWFySG92ZXJIYW5kbGVyID0gKGV2ZW50OiBDZWxsSG92ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZXZlbnQuY2VsbC5pc0hvdmVyZWQgPSBldmVudC5pc0hvdmVyZWQ7XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci5tb250aFNlbGVjdEhhbmRsZXIgPSAoZXZlbnQ6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmlzRGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgIHRoaXMuX2FjdGlvbnMubmF2aWdhdGVUbyh7XG4gICAgICAgICAgdW5pdDoge1xuICAgICAgICAgICAgbW9udGg6IGdldE1vbnRoKGV2ZW50LmRhdGUpLFxuICAgICAgICAgICAgeWVhcjogZ2V0RnVsbFllYXIoZXZlbnQuZGF0ZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpZXdNb2RlOiAnZGF5J1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29udGFpbmVyLnllYXJTZWxlY3RIYW5kbGVyID0gKGV2ZW50OiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5pc0Rpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKFxuICAgICAgICB0aGlzLl9hY3Rpb25zLm5hdmlnYXRlVG8oe1xuICAgICAgICAgIHVuaXQ6IHtcbiAgICAgICAgICAgIHllYXI6IGdldEZ1bGxZZWFyKGV2ZW50LmRhdGUpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3TW9kZTogJ21vbnRoJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZWdpc3RlckRhdGVwaWNrZXJTaWRlRWZmZWN0cygpOiBCc0RhdGVwaWNrZXJFZmZlY3RzIHtcbiAgICB0aGlzLl9zdWJzLnB1c2goXG4gICAgICB0aGlzLl9zdG9yZS5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudmlldykuc3Vic2NyaWJlKHZpZXcgPT4ge1xuICAgICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmNhbGN1bGF0ZSgpKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGZvcm1hdCBjYWxlbmRhciB2YWx1ZXMgb24gbW9udGggbW9kZWwgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5tb250aHNNb2RlbClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKG1vbnRoTW9kZWwgPT4gISFtb250aE1vZGVsKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUobW9udGggPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mb3JtYXQoKSkpXG4gICAgKTtcblxuICAgIC8vIGZsYWcgZGF5IHZhbHVlc1xuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX3N0b3JlXG4gICAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZm9ybWF0dGVkTW9udGhzKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIobW9udGggPT4gISFtb250aClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKG1vbnRoID0+IHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuZmxhZygpKSlcbiAgICApO1xuXG4gICAgLy8gZmxhZyBkYXkgdmFsdWVzXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZERhdGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihzZWxlY3RlZERhdGUgPT4gISFzZWxlY3RlZERhdGUpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShzZWxlY3RlZERhdGUgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mbGFnKCkpKVxuICAgICk7XG5cbiAgICAvLyBmbGFnIGZvciBkYXRlIHJhbmdlIHBpY2tlclxuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX3N0b3JlXG4gICAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuc2VsZWN0ZWRSYW5nZSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKHNlbGVjdGVkUmFuZ2UgPT4gISFzZWxlY3RlZFJhbmdlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoc2VsZWN0ZWRSYW5nZSA9PiB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmZsYWcoKSkpXG4gICAgKTtcblxuICAgIC8vIG1vbnRoc0NhbGVuZGFyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5tb250aHNDYWxlbmRhcilcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9zdG9yZS5kaXNwYXRjaCh0aGlzLl9hY3Rpb25zLmZsYWcoKSkpXG4gICAgKTtcblxuICAgIC8vIHllYXJzIGNhbGVuZGFyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS55ZWFyc0NhbGVuZGFyTW9kZWwpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihzdGF0ZSA9PiAhIXN0YXRlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mbGFnKCkpKVxuICAgICk7XG5cbiAgICAvLyBvbiBob3ZlclxuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX3N0b3JlXG4gICAgICAgIC5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuaG92ZXJlZERhdGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihob3ZlcmVkRGF0ZSA9PiAhIWhvdmVyZWREYXRlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoaG92ZXJlZERhdGUgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5mbGFnKCkpKVxuICAgICk7XG5cbiAgICAvLyBvbiBsb2NhbGUgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fbG9jYWxlU2VydmljZS5sb2NhbGVDaGFuZ2VcbiAgICAgICAgLnN1YnNjcmliZShsb2NhbGUgPT4gdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZXRMb2NhbGUobG9jYWxlKSkpXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLl9zdWJzKSB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIE1vbnRoVmlld09wdGlvbnNcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNb250aE9wdGlvbnM6IE1vbnRoVmlld09wdGlvbnMgPSB7XG4gIHdpZHRoOiA3LFxuICBoZWlnaHQ6IDZcbn07XG4iLCJpbXBvcnQge1xuICBCc0RhdGVwaWNrZXJWaWV3TW9kZSxcbiAgRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnMsXG4gIERhdGVwaWNrZXJSZW5kZXJPcHRpb25zLFxuICBEYXlzQ2FsZW5kYXJNb2RlbCxcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBNb250aHNDYWxlbmRhclZpZXdNb2RlbCxcbiAgTW9udGhWaWV3T3B0aW9ucyxcbiAgWWVhcnNDYWxlbmRhclZpZXdNb2RlbFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgZGVmYXVsdE1vbnRoT3B0aW9ucyB9IGZyb20gJy4vX2RlZmF1bHRzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBCc0RhdGVwaWNrZXJWaWV3U3RhdGUge1xuICBkYXRlOiBEYXRlO1xuICBtb2RlOiBCc0RhdGVwaWNrZXJWaWV3TW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlclN0YXRlXG4gIGltcGxlbWVudHMgRGF0ZXBpY2tlclJlbmRlck9wdGlvbnMsIERhdGVwaWNrZXJGb3JtYXRPcHRpb25zIHtcbiAgLy8gZGF0ZSBwaWNrZXJcbiAgc2VsZWN0ZWREYXRlPzogRGF0ZTtcbiAgLy8gZGF0ZXJhbmdlIHBpY2tlclxuICBzZWxlY3RlZFJhbmdlPzogRGF0ZVtdO1xuXG4gIC8vIGluaXRpYWwgZGF0ZSBvZiBjYWxlbmRhciwgdG9kYXkgYnkgZGVmYXVsdFxuICB2aWV3OiBCc0RhdGVwaWNrZXJWaWV3U3RhdGU7XG5cbiAgaXNEaXNhYmxlZD86IGJvb2xlYW47XG4gIC8vIGJvdW5kc1xuICBtaW5EYXRlPzogRGF0ZTtcbiAgbWF4RGF0ZT86IERhdGU7XG4gIGRheXNEaXNhYmxlZD86IG51bWJlcltdO1xuICBtaW5Nb2RlPzogQnNEYXRlcGlja2VyVmlld01vZGU7XG5cbiAgaG92ZXJlZERhdGU/OiBEYXRlO1xuICBob3ZlcmVkTW9udGg/OiBEYXRlO1xuICBob3ZlcmVkWWVhcj86IERhdGU7XG5cbiAgLy8gZGF5cyBjYWxlbmRhclxuICBtb250aHNNb2RlbD86IERheXNDYWxlbmRhck1vZGVsW107XG4gIGZvcm1hdHRlZE1vbnRocz86IERheXNDYWxlbmRhclZpZXdNb2RlbFtdO1xuICBmbGFnZ2VkTW9udGhzPzogRGF5c0NhbGVuZGFyVmlld01vZGVsW107XG5cbiAgLy8gbW9udGhzIGNhbGVuZGFyXG4gIG1vbnRoc0NhbGVuZGFyPzogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWxbXTtcbiAgZmxhZ2dlZE1vbnRoc0NhbGVuZGFyPzogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWxbXTtcblxuICAvLyB5ZWFycyBjYWxlbmRhclxuICB5ZWFyc0NhbGVuZGFyTW9kZWw/OiBZZWFyc0NhbGVuZGFyVmlld01vZGVsW107XG4gIHllYXJzQ2FsZW5kYXJGbGFnZ2VkPzogWWVhcnNDYWxlbmRhclZpZXdNb2RlbFtdO1xuXG4gIC8vIG9wdGlvbnNcbiAgbW9udGhWaWV3T3B0aW9uczogTW9udGhWaWV3T3B0aW9ucztcblxuICAvLyBEYXRlcGlja2VyUmVuZGVyT3B0aW9uc1xuICBzaG93V2Vla051bWJlcnM/OiBib29sZWFuO1xuICBkaXNwbGF5TW9udGhzPzogbnVtYmVyO1xuICBzZWxlY3RGcm9tT3RoZXJNb250aD86IGJvb2xlYW47XG5cbiAgLy8gRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnNcbiAgbG9jYWxlOiBzdHJpbmc7XG5cbiAgbW9udGhUaXRsZTogc3RyaW5nO1xuICB5ZWFyVGl0bGU6IHN0cmluZztcblxuICBkYXlMYWJlbDogc3RyaW5nO1xuICBtb250aExhYmVsOiBzdHJpbmc7XG4gIHllYXJMYWJlbDogc3RyaW5nO1xuXG4gIHdlZWtOdW1iZXJzOiBzdHJpbmc7XG59XG5cbmNvbnN0IF9pbml0aWFsVmlldzogQnNEYXRlcGlja2VyVmlld1N0YXRlID0geyBkYXRlOiBuZXcgRGF0ZSgpLCBtb2RlOiAnZGF5JyB9O1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbERhdGVwaWNrZXJTdGF0ZTogQnNEYXRlcGlja2VyU3RhdGUgPSBPYmplY3QuYXNzaWduKFxuICBuZXcgQnNEYXRlcGlja2VyQ29uZmlnKCksXG4gIHtcbiAgICBsb2NhbGU6ICdlbicsXG4gICAgdmlldzogX2luaXRpYWxWaWV3LFxuICAgIHNlbGVjdGVkUmFuZ2U6IFtdLFxuICAgIG1vbnRoVmlld09wdGlvbnM6IGRlZmF1bHRNb250aE9wdGlvbnNcbiAgfVxuKTtcbiIsImltcG9ydCB7XG4gIGdldERheSxcbiAgaXNGaXJzdERheU9mV2VlayxcbiAgaXNBZnRlcixcbiAgaXNCZWZvcmUsXG4gIHNoaWZ0RGF0ZSxcbiAgZW5kT2YsXG4gIHN0YXJ0T2Zcbn0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0aW5nRGF5T2ZDYWxlbmRhcihkYXRlOiBEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7IGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyIH0pOiBEYXRlIHtcbiAgaWYgKGlzRmlyc3REYXlPZldlZWsoZGF0ZSwgb3B0aW9ucy5maXJzdERheU9mV2VlaykpIHtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHdlZWtEYXkgPSBnZXREYXkoZGF0ZSk7XG4gIGNvbnN0IG9mZnNldCA9IGNhbGN1bGF0ZURhdGVPZmZzZXQod2Vla0RheSwgb3B0aW9ucy5maXJzdERheU9mV2Vlayk7XG5cbiAgcmV0dXJuIHNoaWZ0RGF0ZShkYXRlLCB7ZGF5OiAtb2Zmc2V0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVEYXRlT2Zmc2V0KHdlZWtkYXk6IG51bWJlciwgc3RhcnRpbmdEYXlPZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChzdGFydGluZ0RheU9mZnNldCA9PT0gMCkge1xuICAgIHJldHVybiB3ZWVrZGF5O1xuICB9XG5cbiAgY29uc3Qgb2Zmc2V0ID0gd2Vla2RheSAtIHN0YXJ0aW5nRGF5T2Zmc2V0ICUgNztcblxuICByZXR1cm4gb2Zmc2V0IDwgMCA/IG9mZnNldCArIDcgOiBvZmZzZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vbnRoRGlzYWJsZWQoZGF0ZTogRGF0ZSwgbWluOiBEYXRlLCBtYXg6IERhdGUpOiBib29sZWFuIHtcbiAgY29uc3QgbWluQm91bmQgPSBtaW4gJiYgaXNCZWZvcmUoZW5kT2YoZGF0ZSwgJ21vbnRoJyksIG1pbiwgJ2RheScpO1xuICBjb25zdCBtYXhCb3VuZCA9IG1heCAmJiBpc0FmdGVyKHN0YXJ0T2YoZGF0ZSwgJ21vbnRoJyksIG1heCwgJ2RheScpO1xuXG4gIHJldHVybiBtaW5Cb3VuZCB8fCBtYXhCb3VuZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWWVhckRpc2FibGVkKGRhdGU6IERhdGUsIG1pbjogRGF0ZSwgbWF4OiBEYXRlKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1pbkJvdW5kID0gbWluICYmIGlzQmVmb3JlKGVuZE9mKGRhdGUsICd5ZWFyJyksIG1pbiwgJ2RheScpO1xuICBjb25zdCBtYXhCb3VuZCA9IG1heCAmJiBpc0FmdGVyKHN0YXJ0T2YoZGF0ZSwgJ3llYXInKSwgbWF4LCAnZGF5Jyk7XG5cbiAgcmV0dXJuIG1pbkJvdW5kIHx8IG1heEJvdW5kO1xufVxuIiwiaW1wb3J0IHsgVGltZVVuaXQsIHNoaWZ0RGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5cbmV4cG9ydCB0eXBlIENyZWF0ZU1hdHJpeENiPFQ+ID0gKGRhdGU6IERhdGUpID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0cml4T3B0aW9ucyB7XG4gIGhlaWdodDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBpbml0aWFsRGF0ZTogRGF0ZTtcbiAgc2hpZnQ6IFRpbWVVbml0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWF0cml4PFQ+KFxuICBvcHRpb25zOiBNYXRyaXhPcHRpb25zLFxuICBmbjogQ3JlYXRlTWF0cml4Q2I8VD5cbik6IFRbXVtdIHtcbiAgbGV0IHByZXZWYWx1ZSA9IG9wdGlvbnMuaW5pdGlhbERhdGU7XG4gIGNvbnN0IG1hdHJpeDogVFtdW10gPSBuZXcgQXJyYXkob3B0aW9ucy5oZWlnaHQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuaGVpZ2h0OyBpKyspIHtcbiAgICBtYXRyaXhbaV0gPSBuZXcgQXJyYXkob3B0aW9ucy53aWR0aCk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBvcHRpb25zLndpZHRoOyBqKyspIHtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IGZuKHByZXZWYWx1ZSk7XG4gICAgICBwcmV2VmFsdWUgPSBzaGlmdERhdGUocHJldlZhbHVlLCBvcHRpb25zLnNoaWZ0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0cml4O1xufVxuIiwiLy8gdXNlciBhbmQgbW9kZWwgaW5wdXQgc2hvdWxkIGhhbmRsZSBwYXJzaW5nIGFuZCB2YWxpZGF0aW5nIGlucHV0IHZhbHVlc1xuLy8gc2hvdWxkIGFjY2VwdCBzb21lIG9wdGlvbnNcbi8vIHRvZG86IHNwbGl0IG91dCBmb3JtYXR0aW5nXG5pbXBvcnQgeyBEYXlzQ2FsZW5kYXJNb2RlbCwgTW9udGhWaWV3T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBnZXRGaXJzdERheU9mTW9udGggfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuaW1wb3J0IHsgZ2V0U3RhcnRpbmdEYXlPZkNhbGVuZGFyIH0gZnJvbSAnLi4vdXRpbHMvYnMtY2FsZW5kYXItdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlTWF0cml4IH0gZnJvbSAnLi4vdXRpbHMvbWF0cml4LXV0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEYXlzQ2FsZW5kYXIoXG4gIHN0YXJ0aW5nRGF0ZTogRGF0ZSxcbiAgb3B0aW9uczogTW9udGhWaWV3T3B0aW9uc1xuKTogRGF5c0NhbGVuZGFyTW9kZWwge1xuICBjb25zdCBmaXJzdERheSA9IGdldEZpcnN0RGF5T2ZNb250aChzdGFydGluZ0RhdGUpO1xuICBjb25zdCBpbml0aWFsRGF0ZSA9IGdldFN0YXJ0aW5nRGF5T2ZDYWxlbmRhcihmaXJzdERheSwgb3B0aW9ucyk7XG5cbiAgY29uc3QgbWF0cml4T3B0aW9ucyA9IHtcbiAgICB3aWR0aDogb3B0aW9ucy53aWR0aCxcbiAgICBoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0LFxuICAgIGluaXRpYWxEYXRlLFxuICAgIHNoaWZ0OiB7IGRheTogMSB9XG4gIH07XG4gIGNvbnN0IGRheXNNYXRyaXggPSBjcmVhdGVNYXRyaXg8RGF0ZT4obWF0cml4T3B0aW9ucywgZGF0ZSA9PiBkYXRlKTtcblxuICByZXR1cm4ge1xuICAgIGRheXNNYXRyaXgsXG4gICAgbW9udGg6IGZpcnN0RGF5XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEYXRlcGlja2VyRm9ybWF0T3B0aW9ucyxcbiAgRGF5c0NhbGVuZGFyTW9kZWwsXG4gIERheXNDYWxlbmRhclZpZXdNb2RlbFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSwgZ2V0TG9jYWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERheXNDYWxlbmRhcihkYXlzQ2FsZW5kYXI6IERheXNDYWxlbmRhck1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRPcHRpb25zOiBEYXRlcGlja2VyRm9ybWF0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhJbmRleDogbnVtYmVyKTogRGF5c0NhbGVuZGFyVmlld01vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBtb250aDogZGF5c0NhbGVuZGFyLm1vbnRoLFxuICAgIG1vbnRoVGl0bGU6IGZvcm1hdERhdGUoXG4gICAgICBkYXlzQ2FsZW5kYXIubW9udGgsXG4gICAgICBmb3JtYXRPcHRpb25zLm1vbnRoVGl0bGUsXG4gICAgICBmb3JtYXRPcHRpb25zLmxvY2FsZVxuICAgICksXG4gICAgeWVhclRpdGxlOiBmb3JtYXREYXRlKFxuICAgICAgZGF5c0NhbGVuZGFyLm1vbnRoLFxuICAgICAgZm9ybWF0T3B0aW9ucy55ZWFyVGl0bGUsXG4gICAgICBmb3JtYXRPcHRpb25zLmxvY2FsZVxuICAgICksXG4gICAgd2Vla051bWJlcnM6IGdldFdlZWtOdW1iZXJzKFxuICAgICAgZGF5c0NhbGVuZGFyLmRheXNNYXRyaXgsXG4gICAgICBmb3JtYXRPcHRpb25zLndlZWtOdW1iZXJzLFxuICAgICAgZm9ybWF0T3B0aW9ucy5sb2NhbGVcbiAgICApLFxuICAgIHdlZWtkYXlzOiBnZXRTaGlmdGVkV2Vla2RheXMoZm9ybWF0T3B0aW9ucy5sb2NhbGUpLFxuICAgIHdlZWtzOiBkYXlzQ2FsZW5kYXIuZGF5c01hdHJpeC5tYXAoKHdlZWs6IERhdGVbXSwgd2Vla0luZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICBkYXlzOiB3ZWVrLm1hcCgoZGF0ZTogRGF0ZSwgZGF5SW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgZGF0ZSxcbiAgICAgICAgbGFiZWw6IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3B0aW9ucy5kYXlMYWJlbCwgZm9ybWF0T3B0aW9ucy5sb2NhbGUpLFxuICAgICAgICBtb250aEluZGV4LFxuICAgICAgICB3ZWVrSW5kZXgsXG4gICAgICAgIGRheUluZGV4XG4gICAgICB9KSlcbiAgICB9KSlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtOdW1iZXJzKGRheXNNYXRyaXg6IERhdGVbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gZGF5c01hdHJpeC5tYXAoXG4gICAgKGRheXM6IERhdGVbXSkgPT4gKGRheXNbMF0gPyBmb3JtYXREYXRlKGRheXNbMF0sIGZvcm1hdCwgbG9jYWxlKSA6ICcnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hpZnRlZFdlZWtkYXlzKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBfbG9jYWxlID0gZ2V0TG9jYWxlKGxvY2FsZSk7XG4gIGNvbnN0IHdlZWtkYXlzID0gX2xvY2FsZS53ZWVrZGF5c1Nob3J0KCkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZpcnN0RGF5T2ZXZWVrID0gX2xvY2FsZS5maXJzdERheU9mV2VlaygpO1xuXG4gIHJldHVybiBbLi4ud2Vla2RheXMuc2xpY2UoZmlyc3REYXlPZldlZWspLCAuLi53ZWVrZGF5cy5zbGljZSgwLCBmaXJzdERheU9mV2VlayldO1xufVxuIiwiaW1wb3J0IHtcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBEYXlWaWV3TW9kZWwsXG4gIFdlZWtWaWV3TW9kZWxcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuaW1wb3J0IHtcbiAgaXNBZnRlcixcbiAgaXNCZWZvcmUsXG4gIGlzRGlzYWJsZWREYXksXG4gIGlzU2FtZURheSxcbiAgaXNTYW1lTW9udGgsXG4gIHNoaWZ0RGF0ZVxufSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5pbXBvcnQgeyBpc01vbnRoRGlzYWJsZWQgfSBmcm9tICcuLi91dGlscy9icy1jYWxlbmRhci11dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxhZ0RheXNDYWxlbmRhck9wdGlvbnMge1xuICBpc0Rpc2FibGVkOiBib29sZWFuO1xuICBtaW5EYXRlOiBEYXRlO1xuICBtYXhEYXRlOiBEYXRlO1xuICBkYXlzRGlzYWJsZWQ6IG51bWJlcltdO1xuICBob3ZlcmVkRGF0ZTogRGF0ZTtcbiAgc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBzZWxlY3RlZFJhbmdlOiBEYXRlW107XG4gIGRpc3BsYXlNb250aHM6IG51bWJlcjtcbiAgbW9udGhJbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhZ0RheXNDYWxlbmRhcihcbiAgZm9ybWF0dGVkTW9udGg6IERheXNDYWxlbmRhclZpZXdNb2RlbCxcbiAgb3B0aW9uczogRmxhZ0RheXNDYWxlbmRhck9wdGlvbnNcbik6IERheXNDYWxlbmRhclZpZXdNb2RlbCB7XG4gIGZvcm1hdHRlZE1vbnRoLndlZWtzLmZvckVhY2goKHdlZWs6IFdlZWtWaWV3TW9kZWwpID0+IHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGN5Y2xvbWF0aWMtY29tcGxleGl0eSAqL1xuICAgIHdlZWsuZGF5cy5mb3JFYWNoKChkYXk6IERheVZpZXdNb2RlbCwgZGF5SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gZGF0ZXBpY2tlclxuICAgICAgY29uc3QgaXNPdGhlck1vbnRoID0gIWlzU2FtZU1vbnRoKGRheS5kYXRlLCBmb3JtYXR0ZWRNb250aC5tb250aCk7XG5cbiAgICAgIGNvbnN0IGlzSG92ZXJlZCA9XG4gICAgICAgICFpc090aGVyTW9udGggJiYgaXNTYW1lRGF5KGRheS5kYXRlLCBvcHRpb25zLmhvdmVyZWREYXRlKTtcbiAgICAgIC8vIGRhdGUgcmFuZ2UgcGlja2VyXG4gICAgICBjb25zdCBpc1NlbGVjdGlvblN0YXJ0ID1cbiAgICAgICAgIWlzT3RoZXJNb250aCAmJlxuICAgICAgICBvcHRpb25zLnNlbGVjdGVkUmFuZ2UgJiZcbiAgICAgICAgaXNTYW1lRGF5KGRheS5kYXRlLCBvcHRpb25zLnNlbGVjdGVkUmFuZ2VbMF0pO1xuICAgICAgY29uc3QgaXNTZWxlY3Rpb25FbmQgPVxuICAgICAgICAhaXNPdGhlck1vbnRoICYmXG4gICAgICAgIG9wdGlvbnMuc2VsZWN0ZWRSYW5nZSAmJlxuICAgICAgICBpc1NhbWVEYXkoZGF5LmRhdGUsIG9wdGlvbnMuc2VsZWN0ZWRSYW5nZVsxXSk7XG5cbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPVxuICAgICAgICAoIWlzT3RoZXJNb250aCAmJiBpc1NhbWVEYXkoZGF5LmRhdGUsIG9wdGlvbnMuc2VsZWN0ZWREYXRlKSkgfHxcbiAgICAgICAgaXNTZWxlY3Rpb25TdGFydCB8fFxuICAgICAgICBpc1NlbGVjdGlvbkVuZDtcblxuICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgIWlzT3RoZXJNb250aCAmJlxuICAgICAgICBvcHRpb25zLnNlbGVjdGVkUmFuZ2UgJiZcbiAgICAgICAgaXNEYXRlSW5SYW5nZShkYXkuZGF0ZSwgb3B0aW9ucy5zZWxlY3RlZFJhbmdlLCBvcHRpb25zLmhvdmVyZWREYXRlKTtcblxuICAgICAgY29uc3QgaXNEaXNhYmxlZCA9XG4gICAgICAgIG9wdGlvbnMuaXNEaXNhYmxlZCB8fFxuICAgICAgICBpc0JlZm9yZShkYXkuZGF0ZSwgb3B0aW9ucy5taW5EYXRlLCAnZGF5JykgfHxcbiAgICAgICAgaXNBZnRlcihkYXkuZGF0ZSwgb3B0aW9ucy5tYXhEYXRlLCAnZGF5JykgfHxcbiAgICAgICAgaXNEaXNhYmxlZERheShkYXkuZGF0ZSwgb3B0aW9ucy5kYXlzRGlzYWJsZWQpO1xuXG4gICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBpc1RvZGF5ID0gIWlzT3RoZXJNb250aCAmJiBpc1NhbWVEYXkoZGF5LmRhdGUsIGN1cnJlbnREYXRlKTtcblxuICAgICAgLy8gZGVjaWRlIHVwZGF0ZSBvciBub3RcbiAgICAgIGNvbnN0IG5ld0RheSA9IE9iamVjdC5hc3NpZ24oe30sIGRheSwge1xuICAgICAgICBpc090aGVyTW9udGgsXG4gICAgICAgIGlzSG92ZXJlZCxcbiAgICAgICAgaXNTZWxlY3RlZCxcbiAgICAgICAgaXNTZWxlY3Rpb25TdGFydCxcbiAgICAgICAgaXNTZWxlY3Rpb25FbmQsXG4gICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgaXNEaXNhYmxlZCxcbiAgICAgICAgaXNUb2RheVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGF5LmlzT3RoZXJNb250aCAhPT0gbmV3RGF5LmlzT3RoZXJNb250aCB8fFxuICAgICAgICBkYXkuaXNIb3ZlcmVkICE9PSBuZXdEYXkuaXNIb3ZlcmVkIHx8XG4gICAgICAgIGRheS5pc1NlbGVjdGVkICE9PSBuZXdEYXkuaXNTZWxlY3RlZCB8fFxuICAgICAgICBkYXkuaXNTZWxlY3Rpb25TdGFydCAhPT0gbmV3RGF5LmlzU2VsZWN0aW9uU3RhcnQgfHxcbiAgICAgICAgZGF5LmlzU2VsZWN0aW9uRW5kICE9PSBuZXdEYXkuaXNTZWxlY3Rpb25FbmQgfHxcbiAgICAgICAgZGF5LmlzRGlzYWJsZWQgIT09IG5ld0RheS5pc0Rpc2FibGVkIHx8XG4gICAgICAgIGRheS5pc0luUmFuZ2UgIT09IG5ld0RheS5pc0luUmFuZ2VcbiAgICAgICkge1xuICAgICAgICB3ZWVrLmRheXNbZGF5SW5kZXhdID0gbmV3RGF5O1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyB0b2RvOiBhZGQgY2hlY2sgZm9yIGxpbmtlZCBjYWxlbmRhcnNcbiAgZm9ybWF0dGVkTW9udGguaGlkZUxlZnRBcnJvdyA9XG4gICAgb3B0aW9ucy5pc0Rpc2FibGVkIHx8XG4gICAgKG9wdGlvbnMubW9udGhJbmRleCA+IDAgJiYgb3B0aW9ucy5tb250aEluZGV4ICE9PSBvcHRpb25zLmRpc3BsYXlNb250aHMpO1xuICBmb3JtYXR0ZWRNb250aC5oaWRlUmlnaHRBcnJvdyA9XG4gICAgb3B0aW9ucy5pc0Rpc2FibGVkIHx8XG4gICAgKG9wdGlvbnMubW9udGhJbmRleCA8IG9wdGlvbnMuZGlzcGxheU1vbnRocyAmJlxuICAgICAgb3B0aW9ucy5tb250aEluZGV4ICsgMSAhPT0gb3B0aW9ucy5kaXNwbGF5TW9udGhzKTtcblxuICBmb3JtYXR0ZWRNb250aC5kaXNhYmxlTGVmdEFycm93ID0gaXNNb250aERpc2FibGVkKFxuICAgIHNoaWZ0RGF0ZShmb3JtYXR0ZWRNb250aC5tb250aCwgeyBtb250aDogLTEgfSksXG4gICAgb3B0aW9ucy5taW5EYXRlLFxuICAgIG9wdGlvbnMubWF4RGF0ZVxuICApO1xuICBmb3JtYXR0ZWRNb250aC5kaXNhYmxlUmlnaHRBcnJvdyA9IGlzTW9udGhEaXNhYmxlZChcbiAgICBzaGlmdERhdGUoZm9ybWF0dGVkTW9udGgubW9udGgsIHsgbW9udGg6IDEgfSksXG4gICAgb3B0aW9ucy5taW5EYXRlLFxuICAgIG9wdGlvbnMubWF4RGF0ZVxuICApO1xuXG4gIHJldHVybiBmb3JtYXR0ZWRNb250aDtcbn1cblxuZnVuY3Rpb24gaXNEYXRlSW5SYW5nZShcbiAgZGF0ZTogRGF0ZSxcbiAgc2VsZWN0ZWRSYW5nZTogRGF0ZVtdLFxuICBob3ZlcmVkRGF0ZTogRGF0ZVxuKTogYm9vbGVhbiB7XG4gIGlmICghZGF0ZSB8fCAhc2VsZWN0ZWRSYW5nZVswXSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZWxlY3RlZFJhbmdlWzFdKSB7XG4gICAgcmV0dXJuIGRhdGUgPiBzZWxlY3RlZFJhbmdlWzBdICYmIGRhdGUgPD0gc2VsZWN0ZWRSYW5nZVsxXTtcbiAgfVxuXG4gIGlmIChob3ZlcmVkRGF0ZSkge1xuICAgIHJldHVybiBkYXRlID4gc2VsZWN0ZWRSYW5nZVswXSAmJiBkYXRlIDw9IGhvdmVyZWREYXRlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW1wb3J0IHsgQnNEYXRlcGlja2VyVmlld01vZGUgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FuU3dpdGNoTW9kZShtb2RlOiBCc0RhdGVwaWNrZXJWaWV3TW9kZSwgbWluTW9kZT86IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBtaW5Nb2RlID8gbW9kZSA+PSBtaW5Nb2RlIDogdHJ1ZTtcbn1cbiIsImltcG9ydCB7XG4gIERhdGVwaWNrZXJGb3JtYXRPcHRpb25zLFxuICBNb250aHNDYWxlbmRhclZpZXdNb2RlbCxcbiAgQ2FsZW5kYXJDZWxsVmlld01vZGVsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBzdGFydE9mLCBmb3JtYXREYXRlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IGNyZWF0ZU1hdHJpeCB9IGZyb20gJy4uL3V0aWxzL21hdHJpeC11dGlscyc7XG5cbmNvbnN0IGhlaWdodCA9IDQ7XG5jb25zdCB3aWR0aCA9IDM7XG5jb25zdCBzaGlmdCA9IHsgbW9udGg6IDEgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE1vbnRoc0NhbGVuZGFyKFxuICB2aWV3RGF0ZTogRGF0ZSxcbiAgZm9ybWF0T3B0aW9uczogRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnNcbik6IE1vbnRoc0NhbGVuZGFyVmlld01vZGVsIHtcbiAgY29uc3QgaW5pdGlhbERhdGUgPSBzdGFydE9mKHZpZXdEYXRlLCAneWVhcicpO1xuICBjb25zdCBtYXRyaXhPcHRpb25zID0geyB3aWR0aCwgaGVpZ2h0LCBpbml0aWFsRGF0ZSwgc2hpZnQgfTtcbiAgY29uc3QgbW9udGhNYXRyaXggPSBjcmVhdGVNYXRyaXg8XG4gICAgQ2FsZW5kYXJDZWxsVmlld01vZGVsXG4gID4obWF0cml4T3B0aW9ucywgZGF0ZSA9PiAoe1xuICAgIGRhdGUsXG4gICAgbGFiZWw6IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3B0aW9ucy5tb250aExhYmVsLCBmb3JtYXRPcHRpb25zLmxvY2FsZSlcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgbW9udGhzOiBtb250aE1hdHJpeCxcbiAgICBtb250aFRpdGxlOiAnJyxcbiAgICB5ZWFyVGl0bGU6IGZvcm1hdERhdGUoXG4gICAgICB2aWV3RGF0ZSxcbiAgICAgIGZvcm1hdE9wdGlvbnMueWVhclRpdGxlLFxuICAgICAgZm9ybWF0T3B0aW9ucy5sb2NhbGVcbiAgICApXG4gIH07XG59XG4iLCJpbXBvcnQgeyBpc1NhbWVNb250aCwgc2hpZnREYXRlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7XG4gIE1vbnRoc0NhbGVuZGFyVmlld01vZGVsLFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IGlzTW9udGhEaXNhYmxlZCwgaXNZZWFyRGlzYWJsZWQgfSBmcm9tICcuLi91dGlscy9icy1jYWxlbmRhci11dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxhZ01vbnRoQ2FsZW5kYXJPcHRpb25zIHtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgbWluRGF0ZTogRGF0ZTtcbiAgbWF4RGF0ZTogRGF0ZTtcbiAgaG92ZXJlZE1vbnRoOiBEYXRlO1xuICBkaXNwbGF5TW9udGhzOiBudW1iZXI7XG4gIG1vbnRoSW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYWdNb250aHNDYWxlbmRhcihcbiAgbW9udGhDYWxlbmRhcjogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWwsXG4gIG9wdGlvbnM6IEZsYWdNb250aENhbGVuZGFyT3B0aW9uc1xuKTogTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWwge1xuICBtb250aENhbGVuZGFyLm1vbnRocy5mb3JFYWNoKFxuICAgIChtb250aHM6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbFtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBtb250aHMuZm9yRWFjaCgobW9udGg6IENhbGVuZGFyQ2VsbFZpZXdNb2RlbCwgbW9udGhJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzSG92ZXJlZCA9IGlzU2FtZU1vbnRoKG1vbnRoLmRhdGUsIG9wdGlvbnMuaG92ZXJlZE1vbnRoKTtcbiAgICAgICAgY29uc3QgaXNEaXNhYmxlZCA9XG4gICAgICAgICAgb3B0aW9ucy5pc0Rpc2FibGVkIHx8XG4gICAgICAgICAgaXNNb250aERpc2FibGVkKG1vbnRoLmRhdGUsIG9wdGlvbnMubWluRGF0ZSwgb3B0aW9ucy5tYXhEYXRlKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGggPSBPYmplY3QuYXNzaWduKC8qe30sKi8gbW9udGgsIHtcbiAgICAgICAgICBpc0hvdmVyZWQsXG4gICAgICAgICAgaXNEaXNhYmxlZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1vbnRoLmlzSG92ZXJlZCAhPT0gbmV3TW9udGguaXNIb3ZlcmVkIHx8XG4gICAgICAgICAgbW9udGguaXNEaXNhYmxlZCAhPT0gbmV3TW9udGguaXNEaXNhYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICBtb250aENhbGVuZGFyLm1vbnRoc1tyb3dJbmRleF1bbW9udGhJbmRleF0gPSBuZXdNb250aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIC8vIHRvZG86IGFkZCBjaGVjayBmb3IgbGlua2VkIGNhbGVuZGFyc1xuICBtb250aENhbGVuZGFyLmhpZGVMZWZ0QXJyb3cgPVxuICAgIG9wdGlvbnMubW9udGhJbmRleCA+IDAgJiYgb3B0aW9ucy5tb250aEluZGV4ICE9PSBvcHRpb25zLmRpc3BsYXlNb250aHM7XG4gIG1vbnRoQ2FsZW5kYXIuaGlkZVJpZ2h0QXJyb3cgPVxuICAgIG9wdGlvbnMubW9udGhJbmRleCA8IG9wdGlvbnMuZGlzcGxheU1vbnRocyAmJlxuICAgIG9wdGlvbnMubW9udGhJbmRleCArIDEgIT09IG9wdGlvbnMuZGlzcGxheU1vbnRocztcblxuICBtb250aENhbGVuZGFyLmRpc2FibGVMZWZ0QXJyb3cgPSBpc1llYXJEaXNhYmxlZChcbiAgICBzaGlmdERhdGUobW9udGhDYWxlbmRhci5tb250aHNbMF1bMF0uZGF0ZSwgeyB5ZWFyOiAtMSB9KSxcbiAgICBvcHRpb25zLm1pbkRhdGUsXG4gICAgb3B0aW9ucy5tYXhEYXRlXG4gICk7XG4gIG1vbnRoQ2FsZW5kYXIuZGlzYWJsZVJpZ2h0QXJyb3cgPSBpc1llYXJEaXNhYmxlZChcbiAgICBzaGlmdERhdGUobW9udGhDYWxlbmRhci5tb250aHNbMF1bMF0uZGF0ZSwgeyB5ZWFyOiAxIH0pLFxuICAgIG9wdGlvbnMubWluRGF0ZSxcbiAgICBvcHRpb25zLm1heERhdGVcbiAgKTtcblxuICByZXR1cm4gbW9udGhDYWxlbmRhcjtcbn1cbiIsImltcG9ydCB7XG4gIERhdGVwaWNrZXJGb3JtYXRPcHRpb25zLFxuICBZZWFyc0NhbGVuZGFyVmlld01vZGVsLFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IHNoaWZ0RGF0ZSwgZm9ybWF0RGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBjcmVhdGVNYXRyaXggfSBmcm9tICcuLi91dGlscy9tYXRyaXgtdXRpbHMnO1xuXG5jb25zdCBoZWlnaHQgPSA0O1xuY29uc3Qgd2lkdGggPSA0O1xuZXhwb3J0IGNvbnN0IHllYXJzUGVyQ2FsZW5kYXIgPSBoZWlnaHQgKiB3aWR0aDtcbmNvbnN0IGluaXRpYWxTaGlmdCA9IChNYXRoLmZsb29yKHllYXJzUGVyQ2FsZW5kYXIgLyAyKSAtIDEpICogLTE7XG5jb25zdCBzaGlmdCA9IHsgeWVhcjogMSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0WWVhcnNDYWxlbmRhcihcbiAgdmlld0RhdGU6IERhdGUsXG4gIGZvcm1hdE9wdGlvbnM6IERhdGVwaWNrZXJGb3JtYXRPcHRpb25zXG4pOiBZZWFyc0NhbGVuZGFyVmlld01vZGVsIHtcbiAgY29uc3QgaW5pdGlhbERhdGUgPSBzaGlmdERhdGUodmlld0RhdGUsIHsgeWVhcjogaW5pdGlhbFNoaWZ0IH0pO1xuICBjb25zdCBtYXRyaXhPcHRpb25zID0geyB3aWR0aCwgaGVpZ2h0LCBpbml0aWFsRGF0ZSwgc2hpZnQgfTtcbiAgY29uc3QgeWVhcnNNYXRyaXggPSBjcmVhdGVNYXRyaXg8XG4gICAgQ2FsZW5kYXJDZWxsVmlld01vZGVsXG4gID4obWF0cml4T3B0aW9ucywgZGF0ZSA9PiAoe1xuICAgIGRhdGUsXG4gICAgbGFiZWw6IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3B0aW9ucy55ZWFyTGFiZWwsIGZvcm1hdE9wdGlvbnMubG9jYWxlKVxuICB9KSk7XG4gIGNvbnN0IHllYXJUaXRsZSA9IGZvcm1hdFllYXJSYW5nZVRpdGxlKHllYXJzTWF0cml4LCBmb3JtYXRPcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIHllYXJzOiB5ZWFyc01hdHJpeCxcbiAgICBtb250aFRpdGxlOiAnJyxcbiAgICB5ZWFyVGl0bGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhclJhbmdlVGl0bGUoXG4gIHllYXJzTWF0cml4OiBDYWxlbmRhckNlbGxWaWV3TW9kZWxbXVtdLFxuICBmb3JtYXRPcHRpb25zOiBEYXRlcGlja2VyRm9ybWF0T3B0aW9uc1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbSA9IGZvcm1hdERhdGUoXG4gICAgeWVhcnNNYXRyaXhbMF1bMF0uZGF0ZSxcbiAgICBmb3JtYXRPcHRpb25zLnllYXJUaXRsZSxcbiAgICBmb3JtYXRPcHRpb25zLmxvY2FsZVxuICApO1xuICBjb25zdCB0byA9IGZvcm1hdERhdGUoXG4gICAgeWVhcnNNYXRyaXhbaGVpZ2h0IC0gMV1bd2lkdGggLSAxXS5kYXRlLFxuICAgIGZvcm1hdE9wdGlvbnMueWVhclRpdGxlLFxuICAgIGZvcm1hdE9wdGlvbnMubG9jYWxlXG4gICk7XG5cbiAgcmV0dXJuIGAke2Zyb219IC0gJHt0b31gO1xufVxuIiwiaW1wb3J0IHsgaXNTYW1lWWVhciwgc2hpZnREYXRlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFllYXJzQ2FsZW5kYXJWaWV3TW9kZWwsIENhbGVuZGFyQ2VsbFZpZXdNb2RlbCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBpc1llYXJEaXNhYmxlZCB9IGZyb20gJy4uL3V0aWxzL2JzLWNhbGVuZGFyLXV0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBGbGFnWWVhcnNDYWxlbmRhck9wdGlvbnMge1xuICBpc0Rpc2FibGVkOiBib29sZWFuO1xuICBtaW5EYXRlOiBEYXRlO1xuICBtYXhEYXRlOiBEYXRlO1xuICBob3ZlcmVkWWVhcjogRGF0ZTtcbiAgZGlzcGxheU1vbnRoczogbnVtYmVyO1xuICB5ZWFySW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYWdZZWFyc0NhbGVuZGFyKFxuICB5ZWFyc0NhbGVuZGFyOiBZZWFyc0NhbGVuZGFyVmlld01vZGVsLFxuICBvcHRpb25zOiBGbGFnWWVhcnNDYWxlbmRhck9wdGlvbnNcbik6IFllYXJzQ2FsZW5kYXJWaWV3TW9kZWwge1xuICB5ZWFyc0NhbGVuZGFyLnllYXJzLmZvckVhY2goXG4gICAgKHllYXJzOiBDYWxlbmRhckNlbGxWaWV3TW9kZWxbXSwgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgeWVhcnMuZm9yRWFjaCgoeWVhcjogQ2FsZW5kYXJDZWxsVmlld01vZGVsLCB5ZWFySW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBpc0hvdmVyZWQgPSBpc1NhbWVZZWFyKHllYXIuZGF0ZSwgb3B0aW9ucy5ob3ZlcmVkWWVhcik7XG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPVxuICAgICAgICAgIG9wdGlvbnMuaXNEaXNhYmxlZCB8fFxuICAgICAgICAgIGlzWWVhckRpc2FibGVkKHllYXIuZGF0ZSwgb3B0aW9ucy5taW5EYXRlLCBvcHRpb25zLm1heERhdGUpO1xuXG4gICAgICAgIGNvbnN0IG5ld01vbnRoID0gT2JqZWN0LmFzc2lnbigvKnt9LCovIHllYXIsIHsgaXNIb3ZlcmVkLCBpc0Rpc2FibGVkIH0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeWVhci5pc0hvdmVyZWQgIT09IG5ld01vbnRoLmlzSG92ZXJlZCB8fFxuICAgICAgICAgIHllYXIuaXNEaXNhYmxlZCAhPT0gbmV3TW9udGguaXNEaXNhYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICB5ZWFyc0NhbGVuZGFyLnllYXJzW3Jvd0luZGV4XVt5ZWFySW5kZXhdID0gbmV3TW9udGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcblxuICAvLyB0b2RvOiBhZGQgY2hlY2sgZm9yIGxpbmtlZCBjYWxlbmRhcnNcbiAgeWVhcnNDYWxlbmRhci5oaWRlTGVmdEFycm93ID1cbiAgICBvcHRpb25zLnllYXJJbmRleCA+IDAgJiYgb3B0aW9ucy55ZWFySW5kZXggIT09IG9wdGlvbnMuZGlzcGxheU1vbnRocztcbiAgeWVhcnNDYWxlbmRhci5oaWRlUmlnaHRBcnJvdyA9XG4gICAgb3B0aW9ucy55ZWFySW5kZXggPCBvcHRpb25zLmRpc3BsYXlNb250aHMgJiZcbiAgICBvcHRpb25zLnllYXJJbmRleCArIDEgIT09IG9wdGlvbnMuZGlzcGxheU1vbnRocztcblxuICB5ZWFyc0NhbGVuZGFyLmRpc2FibGVMZWZ0QXJyb3cgPSBpc1llYXJEaXNhYmxlZChcbiAgICBzaGlmdERhdGUoeWVhcnNDYWxlbmRhci55ZWFyc1swXVswXS5kYXRlLCB7IHllYXI6IC0xIH0pLFxuICAgIG9wdGlvbnMubWluRGF0ZSxcbiAgICBvcHRpb25zLm1heERhdGVcbiAgKTtcbiAgY29uc3QgaSA9IHllYXJzQ2FsZW5kYXIueWVhcnMubGVuZ3RoIC0gMTtcbiAgY29uc3QgaiA9IHllYXJzQ2FsZW5kYXIueWVhcnNbaV0ubGVuZ3RoIC0gMTtcbiAgeWVhcnNDYWxlbmRhci5kaXNhYmxlUmlnaHRBcnJvdyA9IGlzWWVhckRpc2FibGVkKFxuICAgIHNoaWZ0RGF0ZSh5ZWFyc0NhbGVuZGFyLnllYXJzW2ldW2pdLmRhdGUsIHsgeWVhcjogMSB9KSxcbiAgICBvcHRpb25zLm1pbkRhdGUsXG4gICAgb3B0aW9ucy5tYXhEYXRlXG4gICk7XG5cbiAgcmV0dXJuIHllYXJzQ2FsZW5kYXI7XG59XG4iLCIvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtZmlsZS1saW5lLWNvdW50XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJTdGF0ZSwgaW5pdGlhbERhdGVwaWNrZXJTdGF0ZSB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5zdGF0ZSc7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICduZ3gtYm9vdHN0cmFwL21pbmktbmdyeCc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBY3Rpb25zIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLmFjdGlvbnMnO1xuaW1wb3J0IHsgY2FsY0RheXNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9jYWxjLWRheXMtY2FsZW5kYXInO1xuaW1wb3J0IHsgZm9ybWF0RGF5c0NhbGVuZGFyIH0gZnJvbSAnLi4vZW5naW5lL2Zvcm1hdC1kYXlzLWNhbGVuZGFyJztcbmltcG9ydCB7IGZsYWdEYXlzQ2FsZW5kYXIgfSBmcm9tICcuLi9lbmdpbmUvZmxhZy1kYXlzLWNhbGVuZGFyJztcbmltcG9ydCB7XG4gIHNldEZ1bGxEYXRlLFxuICBzaGlmdERhdGUsXG4gIGlzQXJyYXksXG4gIGlzRGF0ZVZhbGlkLFxuICBzdGFydE9mLFxuICBnZXRMb2NhbGUsXG4gIGlzQWZ0ZXIsXG4gIGlzQmVmb3JlXG59IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBjYW5Td2l0Y2hNb2RlIH0gZnJvbSAnLi4vZW5naW5lL3ZpZXctbW9kZSc7XG5pbXBvcnQgeyBmb3JtYXRNb250aHNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9mb3JtYXQtbW9udGhzLWNhbGVuZGFyJztcbmltcG9ydCB7IGZsYWdNb250aHNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9mbGFnLW1vbnRocy1jYWxlbmRhcic7XG5pbXBvcnQgeyBmb3JtYXRZZWFyc0NhbGVuZGFyLCB5ZWFyc1BlckNhbGVuZGFyIH0gZnJvbSAnLi4vZW5naW5lL2Zvcm1hdC15ZWFycy1jYWxlbmRhcic7XG5pbXBvcnQgeyBmbGFnWWVhcnNDYWxlbmRhciB9IGZyb20gJy4uL2VuZ2luZS9mbGFnLXllYXJzLWNhbGVuZGFyJztcbmltcG9ydCB7IEJzVmlld05hdmlnYXRpb25FdmVudCwgRGF0ZXBpY2tlckZvcm1hdE9wdGlvbnMsIEJzRGF0ZXBpY2tlclZpZXdNb2RlIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuXG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGN5Y2xvbWF0aWMtY29tcGxleGl0eSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJzRGF0ZXBpY2tlclJlZHVjZXIoc3RhdGUgPSBpbml0aWFsRGF0ZXBpY2tlclN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24pOiBCc0RhdGVwaWNrZXJTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuQ0FMQ1VMQVRFOiB7XG4gICAgICByZXR1cm4gY2FsY3VsYXRlUmVkdWNlcihzdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLkZPUk1BVDoge1xuICAgICAgcmV0dXJuIGZvcm1hdFJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLkZMQUc6IHtcbiAgICAgIHJldHVybiBmbGFnUmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICB9XG5cbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuTkFWSUdBVEVfT0ZGU0VUOiB7XG4gICAgICBjb25zdCBkYXRlID0gc2hpZnREYXRlKHN0YXJ0T2Yoc3RhdGUudmlldy5kYXRlLCAnbW9udGgnKSwgYWN0aW9uLnBheWxvYWQpO1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIHZpZXc6IHtcbiAgICAgICAgICBtb2RlOiBzdGF0ZS52aWV3Lm1vZGUsXG4gICAgICAgICAgZGF0ZVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuTkFWSUdBVEVfVE86IHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IEJzVmlld05hdmlnYXRpb25FdmVudCA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gICAgICBjb25zdCBkYXRlID0gc2V0RnVsbERhdGUoc3RhdGUudmlldy5kYXRlLCBwYXlsb2FkLnVuaXQpO1xuICAgICAgbGV0IG5ld1N0YXRlO1xuICAgICAgbGV0IG1vZGU6IEJzRGF0ZXBpY2tlclZpZXdNb2RlO1xuICAgICAgaWYgKGNhblN3aXRjaE1vZGUocGF5bG9hZC52aWV3TW9kZSwgc3RhdGUubWluTW9kZSkpIHtcbiAgICAgICAgbW9kZSA9IHBheWxvYWQudmlld01vZGU7XG4gICAgICAgIG5ld1N0YXRlID0geyB2aWV3OiB7IGRhdGUsIG1vZGUgfSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZSA9IHN0YXRlLnZpZXcubW9kZTtcbiAgICAgICAgbmV3U3RhdGUgPSB7IHNlbGVjdGVkRGF0ZTogZGF0ZSwgdmlldzogeyBkYXRlLCBtb2RlIH0gfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLkNIQU5HRV9WSUVXTU9ERToge1xuICAgICAgaWYgKCFjYW5Td2l0Y2hNb2RlKGFjdGlvbi5wYXlsb2FkLCBzdGF0ZS5taW5Nb2RlKSkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRlID0gc3RhdGUudmlldy5kYXRlO1xuICAgICAgY29uc3QgbW9kZSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSB7IHZpZXc6IHsgZGF0ZSwgbW9kZSB9IH07XG5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5IT1ZFUjoge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7IGhvdmVyZWREYXRlOiBhY3Rpb24ucGF5bG9hZCB9KTtcbiAgICB9XG5cbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VMRUNUOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc2VsZWN0ZWREYXRlOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgdmlldzogc3RhdGUudmlld1xuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9kZSA9IHN0YXRlLnZpZXcubW9kZTtcbiAgICAgIGNvbnN0IF9kYXRlID0gYWN0aW9uLnBheWxvYWQgfHwgc3RhdGUudmlldy5kYXRlO1xuICAgICAgY29uc3QgZGF0ZSA9IGdldFZpZXdEYXRlKF9kYXRlLCBzdGF0ZS5taW5EYXRlLCBzdGF0ZS5tYXhEYXRlKTtcbiAgICAgIG5ld1N0YXRlLnZpZXcgPSB7IG1vZGUsIGRhdGUgfTtcblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FzZSBCc0RhdGVwaWNrZXJBY3Rpb25zLlNFVF9PUFRJT05TOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgLy8gcHJlc2VydmUgdmlldyBtb2RlXG4gICAgICBjb25zdCBtb2RlID0gbmV3U3RhdGUubWluTW9kZSA/IG5ld1N0YXRlLm1pbk1vZGUgOiBzdGF0ZS52aWV3Lm1vZGU7XG4gICAgICBjb25zdCBfdmlld0RhdGUgPSBpc0RhdGVWYWxpZChuZXdTdGF0ZS52YWx1ZSkgJiYgbmV3U3RhdGUudmFsdWVcbiAgICAgICAgfHwgaXNBcnJheShuZXdTdGF0ZS52YWx1ZSkgJiYgaXNEYXRlVmFsaWQobmV3U3RhdGUudmFsdWVbMF0pICYmIG5ld1N0YXRlLnZhbHVlWzBdXG4gICAgICAgIHx8IHN0YXRlLnZpZXcuZGF0ZTtcbiAgICAgIGNvbnN0IGRhdGUgPSBnZXRWaWV3RGF0ZShfdmlld0RhdGUsIG5ld1N0YXRlLm1pbkRhdGUsIG5ld1N0YXRlLm1heERhdGUpO1xuICAgICAgbmV3U3RhdGUudmlldyA9IHsgbW9kZSwgZGF0ZSB9O1xuICAgICAgLy8gdXBkYXRlIHNlbGVjdGVkIHZhbHVlXG4gICAgICBpZiAobmV3U3RhdGUudmFsdWUpIHtcbiAgICAgICAgLy8gaWYgbmV3IHZhbHVlIGlzIGFycmF5IHdlIHdvcmsgd2l0aCBkYXRlIHJhbmdlXG4gICAgICAgIGlmIChpc0FycmF5KG5ld1N0YXRlLnZhbHVlKSkge1xuICAgICAgICAgIG5ld1N0YXRlLnNlbGVjdGVkUmFuZ2UgPSBuZXdTdGF0ZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5ldyB2YWx1ZSBpcyBhIGRhdGUgLT4gZGF0ZXBpY2tlclxuICAgICAgICBpZiAobmV3U3RhdGUudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgbmV3U3RhdGUuc2VsZWN0ZWREYXRlID0gbmV3U3RhdGUudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcm92aWRlZCB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkIDopXG4gICAgICAgIC8vIG5lZWQgdG8gcmVwb3J0IGl0IHNvbWVob3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gZGF0ZSByYW5nZSBwaWNrZXJcbiAgICBjYXNlIEJzRGF0ZXBpY2tlckFjdGlvbnMuU0VMRUNUX1JBTkdFOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc2VsZWN0ZWRSYW5nZTogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIHZpZXc6IHN0YXRlLnZpZXdcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vZGUgPSBzdGF0ZS52aWV3Lm1vZGU7XG4gICAgICBjb25zdCBfZGF0ZSA9IGFjdGlvbi5wYXlsb2FkICYmIGFjdGlvbi5wYXlsb2FkWzBdIHx8IHN0YXRlLnZpZXcuZGF0ZTtcbiAgICAgIGNvbnN0IGRhdGUgPSBnZXRWaWV3RGF0ZShfZGF0ZSwgc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG4gICAgICBuZXdTdGF0ZS52aWV3ID0geyBtb2RlLCBkYXRlIH07XG5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfTUlOX0RBVEU6IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBtaW5EYXRlOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfTUFYX0RBVEU6IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBtYXhEYXRlOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgQnNEYXRlcGlja2VyQWN0aW9ucy5TRVRfSVNfRElTQUJMRUQ6IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Rpc2FibGVkOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVSZWR1Y2VyKHN0YXRlOiBCc0RhdGVwaWNrZXJTdGF0ZSk6IEJzRGF0ZXBpY2tlclN0YXRlIHtcbiAgLy8gaG93IG1hbnkgY2FsZW5kYXJzXG4gIGNvbnN0IGRpc3BsYXlNb250aHMgPSBzdGF0ZS5kaXNwbGF5TW9udGhzO1xuICAvLyB1c2Ugc2VsZWN0ZWQgZGF0ZSBvbiBpbml0aWFsIHJlbmRlcmluZyBpZiBzZXRcbiAgbGV0IHZpZXdEYXRlID0gc3RhdGUudmlldy5kYXRlO1xuXG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICdkYXknKSB7XG4gICAgc3RhdGUubW9udGhWaWV3T3B0aW9ucy5maXJzdERheU9mV2VlayA9IGdldExvY2FsZShzdGF0ZS5sb2NhbGUpLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgY29uc3QgbW9udGhzTW9kZWwgPSBuZXcgQXJyYXkoZGlzcGxheU1vbnRocyk7XG4gICAgZm9yIChsZXQgbW9udGhJbmRleCA9IDA7IG1vbnRoSW5kZXggPCBkaXNwbGF5TW9udGhzOyBtb250aEluZGV4KyspIHtcbiAgICAgIC8vIHRvZG86IGZvciB1bmxpbmtlZCBjYWxlbmRhcnMgaXQgd2lsbCBiZSBoYXJkZXJcbiAgICAgIG1vbnRoc01vZGVsW21vbnRoSW5kZXhdID0gY2FsY0RheXNDYWxlbmRhcihcbiAgICAgICAgdmlld0RhdGUsXG4gICAgICAgIHN0YXRlLm1vbnRoVmlld09wdGlvbnNcbiAgICAgICk7XG4gICAgICB2aWV3RGF0ZSA9IHNoaWZ0RGF0ZSh2aWV3RGF0ZSwgeyBtb250aDogMSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgbW9udGhzTW9kZWwgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUudmlldy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgY29uc3QgbW9udGhzQ2FsZW5kYXIgPSBuZXcgQXJyYXkoZGlzcGxheU1vbnRocyk7XG4gICAgZm9yIChcbiAgICAgIGxldCBjYWxlbmRhckluZGV4ID0gMDtcbiAgICAgIGNhbGVuZGFySW5kZXggPCBkaXNwbGF5TW9udGhzO1xuICAgICAgY2FsZW5kYXJJbmRleCsrXG4gICAgKSB7XG4gICAgICAvLyB0b2RvOiBmb3IgdW5saW5rZWQgY2FsZW5kYXJzIGl0IHdpbGwgYmUgaGFyZGVyXG4gICAgICBtb250aHNDYWxlbmRhcltjYWxlbmRhckluZGV4XSA9IGZvcm1hdE1vbnRoc0NhbGVuZGFyKFxuICAgICAgICB2aWV3RGF0ZSxcbiAgICAgICAgZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZSlcbiAgICAgICk7XG4gICAgICB2aWV3RGF0ZSA9IHNoaWZ0RGF0ZSh2aWV3RGF0ZSwgeyB5ZWFyOiAxIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyBtb250aHNDYWxlbmRhciB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICd5ZWFyJykge1xuICAgIGNvbnN0IHllYXJzQ2FsZW5kYXJNb2RlbCA9IG5ldyBBcnJheShkaXNwbGF5TW9udGhzKTtcblxuICAgIGZvciAoXG4gICAgICBsZXQgY2FsZW5kYXJJbmRleCA9IDA7XG4gICAgICBjYWxlbmRhckluZGV4IDwgZGlzcGxheU1vbnRocztcbiAgICAgIGNhbGVuZGFySW5kZXgrK1xuICAgICkge1xuICAgICAgLy8gdG9kbzogZm9yIHVubGlua2VkIGNhbGVuZGFycyBpdCB3aWxsIGJlIGhhcmRlclxuICAgICAgeWVhcnNDYWxlbmRhck1vZGVsW2NhbGVuZGFySW5kZXhdID0gZm9ybWF0WWVhcnNDYWxlbmRhcihcbiAgICAgICAgdmlld0RhdGUsXG4gICAgICAgIGdldEZvcm1hdE9wdGlvbnMoc3RhdGUpXG4gICAgICApO1xuICAgICAgdmlld0RhdGUgPSBzaGlmdERhdGUodmlld0RhdGUsIHsgeWVhcjogeWVhcnNQZXJDYWxlbmRhciB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgeWVhcnNDYWxlbmRhck1vZGVsIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZWR1Y2VyKHN0YXRlOiBCc0RhdGVwaWNrZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24pOiBCc0RhdGVwaWNrZXJTdGF0ZSB7XG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICdkYXknKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkTW9udGhzID0gc3RhdGUubW9udGhzTW9kZWwubWFwKChtb250aCwgbW9udGhJbmRleCkgPT5cbiAgICAgIGZvcm1hdERheXNDYWxlbmRhcihtb250aCwgZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZSksIG1vbnRoSW5kZXgpXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyBmb3JtYXR0ZWRNb250aHMgfSk7XG4gIH1cblxuICAvLyBob3cgbWFueSBjYWxlbmRhcnNcbiAgY29uc3QgZGlzcGxheU1vbnRocyA9IHN0YXRlLmRpc3BsYXlNb250aHM7XG4gIC8vIGNoZWNrIGluaXRpYWwgcmVuZGVyaW5nXG4gIC8vIHVzZSBzZWxlY3RlZCBkYXRlIG9uIGluaXRpYWwgcmVuZGVyaW5nIGlmIHNldFxuICBsZXQgdmlld0RhdGUgPSBzdGF0ZS52aWV3LmRhdGU7XG5cbiAgaWYgKHN0YXRlLnZpZXcubW9kZSA9PT0gJ21vbnRoJykge1xuICAgIGNvbnN0IG1vbnRoc0NhbGVuZGFyID0gbmV3IEFycmF5KGRpc3BsYXlNb250aHMpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY2FsZW5kYXJJbmRleCA9IDA7XG4gICAgICBjYWxlbmRhckluZGV4IDwgZGlzcGxheU1vbnRocztcbiAgICAgIGNhbGVuZGFySW5kZXgrK1xuICAgICkge1xuICAgICAgLy8gdG9kbzogZm9yIHVubGlua2VkIGNhbGVuZGFycyBpdCB3aWxsIGJlIGhhcmRlclxuICAgICAgbW9udGhzQ2FsZW5kYXJbY2FsZW5kYXJJbmRleF0gPSBmb3JtYXRNb250aHNDYWxlbmRhcihcbiAgICAgICAgdmlld0RhdGUsXG4gICAgICAgIGdldEZvcm1hdE9wdGlvbnMoc3RhdGUpXG4gICAgICApO1xuICAgICAgdmlld0RhdGUgPSBzaGlmdERhdGUodmlld0RhdGUsIHsgeWVhcjogMSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgbW9udGhzQ2FsZW5kYXIgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUudmlldy5tb2RlID09PSAneWVhcicpIHtcbiAgICBjb25zdCB5ZWFyc0NhbGVuZGFyTW9kZWwgPSBuZXcgQXJyYXkoZGlzcGxheU1vbnRocyk7XG4gICAgZm9yIChcbiAgICAgIGxldCBjYWxlbmRhckluZGV4ID0gMDtcbiAgICAgIGNhbGVuZGFySW5kZXggPCBkaXNwbGF5TW9udGhzO1xuICAgICAgY2FsZW5kYXJJbmRleCsrXG4gICAgKSB7XG4gICAgICAvLyB0b2RvOiBmb3IgdW5saW5rZWQgY2FsZW5kYXJzIGl0IHdpbGwgYmUgaGFyZGVyXG4gICAgICB5ZWFyc0NhbGVuZGFyTW9kZWxbY2FsZW5kYXJJbmRleF0gPSBmb3JtYXRZZWFyc0NhbGVuZGFyKFxuICAgICAgICB2aWV3RGF0ZSxcbiAgICAgICAgZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZSlcbiAgICAgICk7XG4gICAgICB2aWV3RGF0ZSA9IHNoaWZ0RGF0ZSh2aWV3RGF0ZSwgeyB5ZWFyOiAxNiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgeWVhcnNDYWxlbmRhck1vZGVsIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBmbGFnUmVkdWNlcihzdGF0ZTogQnNEYXRlcGlja2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbik6IEJzRGF0ZXBpY2tlclN0YXRlIHtcbiAgaWYgKHN0YXRlLnZpZXcubW9kZSA9PT0gJ2RheScpIHtcbiAgICBjb25zdCBmbGFnZ2VkTW9udGhzID0gc3RhdGUuZm9ybWF0dGVkTW9udGhzLm1hcChcbiAgICAgIChmb3JtYXR0ZWRNb250aCwgbW9udGhJbmRleCkgPT5cbiAgICAgICAgZmxhZ0RheXNDYWxlbmRhcihmb3JtYXR0ZWRNb250aCwge1xuICAgICAgICAgIGlzRGlzYWJsZWQ6IHN0YXRlLmlzRGlzYWJsZWQsXG4gICAgICAgICAgbWluRGF0ZTogc3RhdGUubWluRGF0ZSxcbiAgICAgICAgICBtYXhEYXRlOiBzdGF0ZS5tYXhEYXRlLFxuICAgICAgICAgIGRheXNEaXNhYmxlZDogc3RhdGUuZGF5c0Rpc2FibGVkLFxuICAgICAgICAgIGhvdmVyZWREYXRlOiBzdGF0ZS5ob3ZlcmVkRGF0ZSxcbiAgICAgICAgICBzZWxlY3RlZERhdGU6IHN0YXRlLnNlbGVjdGVkRGF0ZSxcbiAgICAgICAgICBzZWxlY3RlZFJhbmdlOiBzdGF0ZS5zZWxlY3RlZFJhbmdlLFxuICAgICAgICAgIGRpc3BsYXlNb250aHM6IHN0YXRlLmRpc3BsYXlNb250aHMsXG4gICAgICAgICAgbW9udGhJbmRleFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgZmxhZ2dlZE1vbnRocyB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS52aWV3Lm1vZGUgPT09ICdtb250aCcpIHtcbiAgICBjb25zdCBmbGFnZ2VkTW9udGhzQ2FsZW5kYXIgPSBzdGF0ZS5tb250aHNDYWxlbmRhci5tYXAoXG4gICAgICAoZm9ybWF0dGVkTW9udGgsIG1vbnRoSW5kZXgpID0+XG4gICAgICAgIGZsYWdNb250aHNDYWxlbmRhcihmb3JtYXR0ZWRNb250aCwge1xuICAgICAgICAgIGlzRGlzYWJsZWQ6IHN0YXRlLmlzRGlzYWJsZWQsXG4gICAgICAgICAgbWluRGF0ZTogc3RhdGUubWluRGF0ZSxcbiAgICAgICAgICBtYXhEYXRlOiBzdGF0ZS5tYXhEYXRlLFxuICAgICAgICAgIGhvdmVyZWRNb250aDogc3RhdGUuaG92ZXJlZE1vbnRoLFxuICAgICAgICAgIGRpc3BsYXlNb250aHM6IHN0YXRlLmRpc3BsYXlNb250aHMsXG4gICAgICAgICAgbW9udGhJbmRleFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHsgZmxhZ2dlZE1vbnRoc0NhbGVuZGFyIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnZpZXcubW9kZSA9PT0gJ3llYXInKSB7XG4gICAgY29uc3QgeWVhcnNDYWxlbmRhckZsYWdnZWQgPSBzdGF0ZS55ZWFyc0NhbGVuZGFyTW9kZWwubWFwKFxuICAgICAgKGZvcm1hdHRlZE1vbnRoLCB5ZWFySW5kZXgpID0+XG4gICAgICAgIGZsYWdZZWFyc0NhbGVuZGFyKGZvcm1hdHRlZE1vbnRoLCB7XG4gICAgICAgICAgaXNEaXNhYmxlZDogc3RhdGUuaXNEaXNhYmxlZCxcbiAgICAgICAgICBtaW5EYXRlOiBzdGF0ZS5taW5EYXRlLFxuICAgICAgICAgIG1heERhdGU6IHN0YXRlLm1heERhdGUsXG4gICAgICAgICAgaG92ZXJlZFllYXI6IHN0YXRlLmhvdmVyZWRZZWFyLFxuICAgICAgICAgIGRpc3BsYXlNb250aHM6IHN0YXRlLmRpc3BsYXlNb250aHMsXG4gICAgICAgICAgeWVhckluZGV4XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyB5ZWFyc0NhbGVuZGFyRmxhZ2dlZCB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9ybWF0T3B0aW9ucyhzdGF0ZTogQnNEYXRlcGlja2VyU3RhdGUpOiBEYXRlcGlja2VyRm9ybWF0T3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxlOiBzdGF0ZS5sb2NhbGUsXG5cbiAgICBtb250aFRpdGxlOiBzdGF0ZS5tb250aFRpdGxlLFxuICAgIHllYXJUaXRsZTogc3RhdGUueWVhclRpdGxlLFxuXG4gICAgZGF5TGFiZWw6IHN0YXRlLmRheUxhYmVsLFxuICAgIG1vbnRoTGFiZWw6IHN0YXRlLm1vbnRoTGFiZWwsXG4gICAgeWVhckxhYmVsOiBzdGF0ZS55ZWFyTGFiZWwsXG5cbiAgICB3ZWVrTnVtYmVyczogc3RhdGUud2Vla051bWJlcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBpZiB2aWV3IGRhdGUgaXMgcHJvdmlkZWQgKGJzVmFsdWV8bmdNb2RlbCkgaXQgc2hvdWxkIGJlIHNob3duXG4gKiBpZiB2aWV3IGRhdGUgaXMgbm90IHByb3ZpZGVyOlxuICogaWYgbWluRGF0ZT5jdXJyZW50RGF0ZSAoZGVmYXVsdCB2aWV3IHZhbHVlKSwgc2hvdyBtaW5EYXRlXG4gKiBpZiBtYXhEYXRlPGN1cnJlbnREYXRlKGRlZmF1bHQgdmlldyB2YWx1ZSkgc2hvdyBtYXhEYXRlXG4gKi9cbmZ1bmN0aW9uIGdldFZpZXdEYXRlKHZpZXdEYXRlOiBEYXRlIHwgRGF0ZVtdLCBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gQXJyYXkuaXNBcnJheSh2aWV3RGF0ZSkgPyB2aWV3RGF0ZVswXSA6IHZpZXdEYXRlO1xuXG4gIGlmIChtaW5EYXRlICYmIGlzQWZ0ZXIobWluRGF0ZSwgX2RhdGUsICdkYXknKSkge1xuICAgIHJldHVybiBtaW5EYXRlO1xuICB9XG5cbiAgaWYgKG1heERhdGUgJiYgaXNCZWZvcmUobWF4RGF0ZSwgX2RhdGUsICdkYXknKSkge1xuICAgIHJldHVybiBtYXhEYXRlO1xuICB9XG5cbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWluaVN0b3JlLCBBY3Rpb24sIE1pbmlTdGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvbWluaS1uZ3J4JztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0YXRlLCBpbml0aWFsRGF0ZXBpY2tlclN0YXRlIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLnN0YXRlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYnNEYXRlcGlja2VyUmVkdWNlciB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5yZWR1Y2VyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlclN0b3JlIGV4dGVuZHMgTWluaVN0b3JlPEJzRGF0ZXBpY2tlclN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IF9kaXNwYXRjaGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb24+KHtcbiAgICAgIHR5cGU6ICdbZGF0ZXBpY2tlcl0gZGlzcGF0Y2hlciBpbml0J1xuICAgIH0pO1xuICAgIGNvbnN0IHN0YXRlID0gbmV3IE1pbmlTdGF0ZTxCc0RhdGVwaWNrZXJTdGF0ZT4oXG4gICAgICBpbml0aWFsRGF0ZXBpY2tlclN0YXRlLFxuICAgICAgX2Rpc3BhdGNoZXIsXG4gICAgICBic0RhdGVwaWNrZXJSZWR1Y2VyXG4gICAgKTtcbiAgICBzdXBlcihfZGlzcGF0Y2hlciwgYnNEYXRlcGlja2VyUmVkdWNlciwgc3RhdGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckFic3RyYWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS9icy1kYXRlcGlja2VyLWNvbnRhaW5lcic7XG5cbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uLy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IERheVZpZXdNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBY3Rpb25zIH0gZnJvbSAnLi4vLi4vcmVkdWNlci9icy1kYXRlcGlja2VyLmFjdGlvbnMnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyRWZmZWN0cyB9IGZyb20gJy4uLy4uL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0b3JlIH0gZnJvbSAnLi4vLi4vcmVkdWNlci9icy1kYXRlcGlja2VyLnN0b3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1kYXRlcGlja2VyLWNvbnRhaW5lcicsXG4gIHByb3ZpZGVyczogW0JzRGF0ZXBpY2tlclN0b3JlLCBCc0RhdGVwaWNrZXJFZmZlY3RzXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2JzLWRhdGVwaWNrZXItdmlldy5odG1sJyxcbiAgaG9zdDoge1xuICAgICcoY2xpY2spJzogJ19zdG9wUHJvcGFnYXRpb24oJGV2ZW50KScsXG4gICAgc3R5bGU6ICdwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IGJsb2NrOycsXG4gICAgcm9sZTogJ2RpYWxvZycsXG4gICAgJ2FyaWEtbGFiZWwnOiAnY2FsZW5kYXInXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSkge1xuICAgIHRoaXMuX2VmZmVjdHMuc2V0VmFsdWUodmFsdWUpO1xuICB9XG4gIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbmZpZzogQnNEYXRlcGlja2VyQ29uZmlnLFxuICAgIHByaXZhdGUgX3N0b3JlOiBCc0RhdGVwaWNrZXJTdG9yZSxcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBCc0RhdGVwaWNrZXJBY3Rpb25zLFxuICAgIF9lZmZlY3RzOiBCc0RhdGVwaWNrZXJFZmZlY3RzXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZWZmZWN0cyA9IF9lZmZlY3RzO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc090aGVyTW9udGhzQWN0aXZlID0gdGhpcy5fY29uZmlnLnNlbGVjdEZyb21PdGhlck1vbnRoO1xuICAgIHRoaXMuY29udGFpbmVyQ2xhc3MgPSB0aGlzLl9jb25maWcuY29udGFpbmVyQ2xhc3M7XG4gICAgdGhpcy5fZWZmZWN0c1xuICAgICAgLmluaXQodGhpcy5fc3RvcmUpXG4gICAgICAvLyBpbnRpYWwgc3RhdGUgb3B0aW9uc1xuICAgICAgLnNldE9wdGlvbnModGhpcy5fY29uZmlnKVxuICAgICAgLy8gZGF0YSBiaW5kaW5nIHZpZXcgLS0+IG1vZGVsXG4gICAgICAuc2V0QmluZGluZ3ModGhpcylcbiAgICAgIC8vIHNldCBldmVudCBoYW5kbGVyc1xuICAgICAgLnNldEV2ZW50SGFuZGxlcnModGhpcylcbiAgICAgIC5yZWdpc3RlckRhdGVwaWNrZXJTaWRlRWZmZWN0cygpO1xuXG4gICAgLy8gdG9kbzogbW92ZSBpdCBzb21ld2hlcmUgZWxzZVxuICAgIC8vIG9uIHNlbGVjdGVkIGRhdGUgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkgKi9cbiAgICAgICAgLnNlbGVjdCgoc3RhdGU6IGFueSkgPT4gc3RhdGUuc2VsZWN0ZWREYXRlKVxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSAqL1xuICAgICAgICAuc3Vic2NyaWJlKChkYXRlOiBhbnkpID0+IHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkYXRlKSlcbiAgICApO1xuICB9XG5cbiAgZGF5U2VsZWN0SGFuZGxlcihkYXk6IERheVZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzT3RoZXJNb250aHNBY3RpdmUgPyBkYXkuaXNEaXNhYmxlZCA6IChkYXkuaXNPdGhlck1vbnRoIHx8IGRheS5pc0Rpc2FibGVkKTtcblxuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2godGhpcy5fYWN0aW9ucy5zZWxlY3QoZGF5LmRhdGUpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLl9lZmZlY3RzLmRlc3Ryb3koKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGVyLCBDb21wb25lbnRMb2FkZXJGYWN0b3J5IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jb21wb25lbnQtbG9hZGVyJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWRhdGVwaWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyVmlld01vZGUgfSBmcm9tICcuL21vZGVscyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tic0RhdGVwaWNrZXJdJyxcbiAgZXhwb3J0QXM6ICdic0RhdGVwaWNrZXInXG59KVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICAvKipcbiAgICogUGxhY2VtZW50IG9mIGEgZGF0ZXBpY2tlci4gQWNjZXB0czogXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdib3R0b20nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyLiBTdXBwb3J0cyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4gICAqIGV2ZW50IG5hbWVzLlxuICAgKi9cbiAgQElucHV0KCkgdHJpZ2dlcnMgPSAnY2xpY2snO1xuICAvKipcbiAgICogQ2xvc2UgZGF0ZXBpY2tlciBvbiBvdXRzaWRlIGNsaWNrXG4gICAqL1xuICBASW5wdXQoKSBvdXRzaWRlQ2xpY2sgPSB0cnVlO1xuICAvKipcbiAgICogQSBzZWxlY3RvciBzcGVjaWZ5aW5nIHRoZSBlbGVtZW50IHRoZSBkYXRlcGlja2VyIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgXCJib2R5XCIuXG4gICAqL1xuICBASW5wdXQoKSBjb250YWluZXIgPSAnYm9keSc7XG5cbiAgQElucHV0KCkgb3V0c2lkZUVzYyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGRhdGVwaWNrZXIgaXMgY3VycmVudGx5IGJlaW5nIHNob3duXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRlcGlja2VyLmlzU2hvd247XG4gIH1cblxuICBzZXQgaXNPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGRhdGVwaWNrZXIgaXMgc2hvd25cbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgQE91dHB1dCgpIG9uU2hvd246IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgZGF0ZXBpY2tlciBpcyBoaWRkZW5cbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgQE91dHB1dCgpIG9uSGlkZGVuOiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBfYnNWYWx1ZTogRGF0ZTtcbiAgLyoqXG4gICAqIEluaXRpYWwgdmFsdWUgb2YgZGF0ZXBpY2tlclxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGJzVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5fYnNWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYnNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYnNWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWcgb2JqZWN0IGZvciBkYXRlcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBic0NvbmZpZzogUGFydGlhbDxCc0RhdGVwaWNrZXJDb25maWc+O1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGF0ZXBpY2tlcidzIGNvbnRlbnQgaXMgZW5hYmxlZCBvciBub3RcbiAgICovXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNaW5pbXVtIGRhdGUgd2hpY2ggaXMgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb25cbiAgICovXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGRhdGUgd2hpY2ggaXMgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb25cbiAgICovXG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdmlldyBtb2RlIDogZGF5LCBtb250aCwgb3IgeWVhclxuICAgKi9cbiAgQElucHV0KCkgbWluTW9kZTogQnNEYXRlcGlja2VyVmlld01vZGU7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgQ2VydGFpbiBkYXlzIGluIHRoZSB3ZWVrXG4gICAqL1xuICBASW5wdXQoKSBkYXlzRGlzYWJsZWQ6IG51bWJlcltdO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBkYXRlcGlja2VyIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWRcbiAgICovXG4gIEBPdXRwdXQoKSBic1ZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2RhdGVwaWNrZXI6IENvbXBvbmVudExvYWRlcjxCc0RhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xuICBwcml2YXRlIF9kYXRlcGlja2VyUmVmOiBDb21wb25lbnRSZWY8QnNEYXRlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50PjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgX2NvbmZpZzogQnNEYXRlcGlja2VyQ29uZmlnLFxuICAgICAgICAgICAgICBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICBjaXM6IENvbXBvbmVudExvYWRlckZhY3RvcnkpIHtcbiAgICAvLyB0b2RvOiBhc3NpZ24gb25seSBzdWJzZXQgb2YgZmllbGRzXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB0aGlzLl9jb25maWcpO1xuICAgIHRoaXMuX2RhdGVwaWNrZXIgPSBjaXMuY3JlYXRlTG9hZGVyPEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudD4oXG4gICAgICBfZWxlbWVudFJlZixcbiAgICAgIF92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgX3JlbmRlcmVyXG4gICAgKTtcbiAgICB0aGlzLm9uU2hvd24gPSB0aGlzLl9kYXRlcGlja2VyLm9uU2hvd247XG4gICAgdGhpcy5vbkhpZGRlbiA9IHRoaXMuX2RhdGVwaWNrZXIub25IaWRkZW47XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmxpc3Rlbih7XG4gICAgICBvdXRzaWRlQ2xpY2s6IHRoaXMub3V0c2lkZUNsaWNrLFxuICAgICAgb3V0c2lkZUVzYzogdGhpcy5vdXRzaWRlRXNjLFxuICAgICAgdHJpZ2dlcnM6IHRoaXMudHJpZ2dlcnMsXG4gICAgICBzaG93OiAoKSA9PiB0aGlzLnNob3coKVxuICAgIH0pO1xuICAgIHRoaXMuc2V0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRlcGlja2VyUmVmIHx8ICF0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWluRGF0ZSkge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS5taW5EYXRlID0gdGhpcy5taW5EYXRlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1heERhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYuaW5zdGFuY2UubWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5kYXlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYuaW5zdGFuY2UuZGF5c0Rpc2FibGVkID0gdGhpcy5kYXlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS5pc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBlbGVtZW50w6LCgMKZcyBkYXRlcGlja2VyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDDosKAwpxtYW51YWzDosKAwp0gdHJpZ2dlcmluZyBvZlxuICAgKiB0aGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIHNob3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RhdGVwaWNrZXIuaXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0Q29uZmlnKCk7XG5cbiAgICB0aGlzLl9kYXRlcGlja2VyUmVmID0gdGhpcy5fZGF0ZXBpY2tlclxuICAgICAgLnByb3ZpZGUoe3Byb3ZpZGU6IEJzRGF0ZXBpY2tlckNvbmZpZywgdXNlVmFsdWU6IHRoaXMuX2NvbmZpZ30pXG4gICAgICAuYXR0YWNoKEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudClcbiAgICAgIC50byh0aGlzLmNvbnRhaW5lcilcbiAgICAgIC5wb3NpdGlvbih7YXR0YWNobWVudDogdGhpcy5wbGFjZW1lbnR9KVxuICAgICAgLnNob3coe3BsYWNlbWVudDogdGhpcy5wbGFjZW1lbnR9KTtcblxuICAgIC8vIGlmIGRhdGUgY2hhbmdlcyBmcm9tIGV4dGVybmFsIHNvdXJjZSAobW9kZWwgLT4gdmlldylcbiAgICB0aGlzLl9zdWJzLnB1c2goXG4gICAgICB0aGlzLmJzVmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogRGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlLnZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBpZiBkYXRlIGNoYW5nZXMgZnJvbSBwaWNrZXIgKHZpZXcgLT4gbW9kZWwpXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS52YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBEYXRlKSA9PiB7XG4gICAgICAgIHRoaXMuYnNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYW4gZWxlbWVudMOiwoDCmXMgZGF0ZXBpY2tlci4gVGhpcyBpcyBjb25zaWRlcmVkIGEgw6LCgMKcbWFudWFsw6LCgMKdIHRyaWdnZXJpbmcgb2ZcbiAgICogdGhlIGRhdGVwaWNrZXIuXG4gICAqL1xuICBoaWRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlci5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIGFuIGVsZW1lbnTDosKAwplzIGRhdGVwaWNrZXIuIFRoaXMgaXMgY29uc2lkZXJlZCBhIMOiwoDCnG1hbnVhbMOiwoDCnSB0cmlnZ2VyaW5nXG4gICAqIG9mIHRoZSBkYXRlcGlja2VyLlxuICAgKi9cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjb25maWcgZm9yIGRhdGVwaWNrZXJcbiAgICovXG4gIHNldENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcsIHRoaXMuYnNDb25maWcsIHtcbiAgICAgIHZhbHVlOiB0aGlzLl9ic1ZhbHVlLFxuICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0Rpc2FibGVkLFxuICAgICAgbWluRGF0ZTogdGhpcy5taW5EYXRlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5taW5EYXRlLFxuICAgICAgbWF4RGF0ZTogdGhpcy5tYXhEYXRlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5tYXhEYXRlLFxuICAgICAgZGF5c0Rpc2FibGVkOiB0aGlzLmRheXNEaXNhYmxlZCB8fCB0aGlzLmJzQ29uZmlnICYmIHRoaXMuYnNDb25maWcuZGF5c0Rpc2FibGVkLFxuICAgICAgbWluTW9kZTogdGhpcy5taW5Nb2RlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5taW5Nb2RlXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmRpc3Bvc2UoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gIHBhcnNlRGF0ZSxcbiAgZm9ybWF0RGF0ZSxcbiAgZ2V0TG9jYWxlLFxuICBpc0FmdGVyLFxuICBpc0JlZm9yZSxcbiAgaXNEYXRlLFxuICBpc0RhdGVWYWxpZFxufSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJEaXJlY3RpdmUgfSBmcm9tICcuL2JzLWRhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTG9jYWxlU2VydmljZSB9IGZyb20gJy4vYnMtbG9jYWxlLnNlcnZpY2UnO1xuXG5jb25zdCBCU19EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJzRGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbmNvbnN0IEJTX0RBVEVQSUNLRVJfVkFMSURBVE9SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmUgKi9cbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQnNEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgaW5wdXRbYnNEYXRlcGlja2VyXWAsXG4gIGhvc3Q6IHtcbiAgICAnKGNoYW5nZSknOiAnb25DaGFuZ2UoJGV2ZW50KScsXG4gICAgJyhrZXl1cC5lc2MpJzogJ2hpZGUoKScsXG4gICAgJyhibHVyKSc6ICdvbkJsdXIoKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbQlNfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUiwgQlNfREFURVBJQ0tFUl9WQUxJREFUT1JdXG59KVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlXG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICBwcml2YXRlIF9vblRvdWNoZWQgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLXZhcmlhYmxlICovXG4gIHByaXZhdGUgX3ZhbGlkYXRvckNoYW5nZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfdmFsdWU6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBwcml2YXRlIF9waWNrZXI6IEJzRGF0ZXBpY2tlckRpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9jYWxlU2VydmljZTogQnNMb2NhbGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgLy8gdXBkYXRlIGlucHV0IHZhbHVlIG9uIGRhdGVwaWNrZXIgdmFsdWUgdXBkYXRlXG4gICAgdGhpcy5fcGlja2VyLmJzVmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogRGF0ZSkgPT4ge1xuICAgICAgdGhpcy5fc2V0SW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZSBpbnB1dCB2YWx1ZSBvbiBsb2NhbGUgY2hhbmdlXG4gICAgdGhpcy5fbG9jYWxlU2VydmljZS5sb2NhbGVDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX3NldElucHV0VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgX3NldElucHV0VmFsdWUodmFsdWU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsRGF0ZSA9ICF2YWx1ZSA/ICcnXG4gICAgICA6IGZvcm1hdERhdGUodmFsdWUsIHRoaXMuX3BpY2tlci5fY29uZmlnLmRhdGVJbnB1dEZvcm1hdCwgdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlKTtcblxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIGluaXRpYWxEYXRlKTtcbiAgfVxuXG4gIG9uQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgICB0aGlzLndyaXRlVmFsdWUoKGV2ZW50LnRhcmdldCBhcyBhbnkpLnZhbHVlKTtcbiAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gIH1cblxuICB2YWxpZGF0ZShjOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgX3ZhbHVlOiBEYXRlIHwgc3RyaW5nID0gYy52YWx1ZTtcblxuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXN3aXRjaCAqL1xuICAgIGlmIChfdmFsdWUgPT09IG51bGwgfHwgX3ZhbHVlID09PSB1bmRlZmluZWQgfHwgX3ZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGlzRGF0ZShfdmFsdWUpKSB7XG4gICAgICBjb25zdCBfaXNEYXRlVmFsaWQgPSBpc0RhdGVWYWxpZChfdmFsdWUpO1xuICAgICAgaWYgKCFfaXNEYXRlVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgYnNEYXRlOiB7IGludmFsaWQ6IF92YWx1ZSB9IH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9waWNrZXIgJiYgdGhpcy5fcGlja2VyLm1pbkRhdGUgJiYgaXNCZWZvcmUoX3ZhbHVlLCB0aGlzLl9waWNrZXIubWluRGF0ZSwgJ2RhdGUnKSkge1xuICAgICAgICByZXR1cm4geyBic0RhdGU6IHsgbWluRGF0ZTogdGhpcy5fcGlja2VyLm1pbkRhdGUgfSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcGlja2VyICYmIHRoaXMuX3BpY2tlci5tYXhEYXRlICYmIGlzQWZ0ZXIoX3ZhbHVlLCB0aGlzLl9waWNrZXIubWF4RGF0ZSwgJ2RhdGUnKSkge1xuICAgICAgICByZXR1cm4geyBic0RhdGU6IHsgbWF4RGF0ZTogdGhpcy5fcGlja2VyLm1heERhdGUgfSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IF9sb2NhbGVLZXkgPSB0aGlzLl9sb2NhbGVTZXJ2aWNlLmN1cnJlbnRMb2NhbGU7XG4gICAgICBjb25zdCBfbG9jYWxlID0gZ2V0TG9jYWxlKF9sb2NhbGVLZXkpO1xuICAgICAgaWYgKCFfbG9jYWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTG9jYWxlIFwiJHtfbG9jYWxlS2V5fVwiIGlzIG5vdCBkZWZpbmVkLCBwbGVhc2UgYWRkIGl0IHdpdGggXCJkZWZpbmVMb2NhbGUoLi4uKVwiYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuX3BpY2tlci5fY29uZmlnLmRhdGVJbnB1dEZvcm1hdCwgdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9waWNrZXIuYnNWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fcGlja2VyLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLl9waWNrZXIuaGlkZSgpO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQpLmJsdXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLmNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyBleHRlbmRzIEJzRGF0ZXBpY2tlckNvbmZpZyB7XG4gIC8vIERhdGVwaWNrZXJSZW5kZXJPcHRpb25zXG4gIGRpc3BsYXlNb250aHMgPSAyO1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJBYnN0cmFjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Jhc2UvYnMtZGF0ZXBpY2tlci1jb250YWluZXInO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi4vLi4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgRGF5Vmlld01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuYWN0aW9ucyc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJFZmZlY3RzIH0gZnJvbSAnLi4vLi4vcmVkdWNlci9icy1kYXRlcGlja2VyLmVmZmVjdHMnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyU3RvcmUgfSBmcm9tICcuLi8uLi9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRhdGVyYW5nZXBpY2tlci1jb250YWluZXInLFxuICBwcm92aWRlcnM6IFtCc0RhdGVwaWNrZXJTdG9yZSwgQnNEYXRlcGlja2VyRWZmZWN0c10sXG4gIHRlbXBsYXRlVXJsOiAnLi9icy1kYXRlcGlja2VyLXZpZXcuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICAnKGNsaWNrKSc6ICdfc3RvcFByb3BhZ2F0aW9uKCRldmVudCknLFxuICAgIHN0eWxlOiAncG9zaXRpb246IGFic29sdXRlOyBkaXNwbGF5OiBibG9jazsnLFxuICAgIHJvbGU6ICdkaWFsb2cnLFxuICAgICdhcmlhLWxhYmVsJzogJ2NhbGVuZGFyJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIEJzRGF0ZXJhbmdlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgQnNEYXRlcGlja2VyQWJzdHJhY3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZVtdKSB7XG4gICAgdGhpcy5fZWZmZWN0cy5zZXRSYW5nZVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlW10+KCk7XG5cbiAgX3JhbmdlU3RhY2s6IERhdGVbXSA9IFtdO1xuICBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcsXG4gICAgcHJpdmF0ZSBfc3RvcmU6IEJzRGF0ZXBpY2tlclN0b3JlLFxuICAgIHByaXZhdGUgX2FjdGlvbnM6IEJzRGF0ZXBpY2tlckFjdGlvbnMsXG4gICAgX2VmZmVjdHM6IEJzRGF0ZXBpY2tlckVmZmVjdHNcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9lZmZlY3RzID0gX2VmZmVjdHM7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzID0gdGhpcy5fY29uZmlnLmNvbnRhaW5lckNsYXNzO1xuICAgIHRoaXMuaXNPdGhlck1vbnRoc0FjdGl2ZSA9IHRoaXMuX2NvbmZpZy5zZWxlY3RGcm9tT3RoZXJNb250aDtcbiAgICB0aGlzLl9lZmZlY3RzXG4gICAgICAuaW5pdCh0aGlzLl9zdG9yZSlcbiAgICAgIC8vIGludGlhbCBzdGF0ZSBvcHRpb25zXG4gICAgICAvLyB0b2RvOiBmaXggdGhpcywgc3BsaXQgY29uZmlnc1xuICAgICAgLnNldE9wdGlvbnModGhpcy5fY29uZmlnKVxuICAgICAgLy8gZGF0YSBiaW5kaW5nIHZpZXcgLS0+IG1vZGVsXG4gICAgICAuc2V0QmluZGluZ3ModGhpcylcbiAgICAgIC8vIHNldCBldmVudCBoYW5kbGVyc1xuICAgICAgLnNldEV2ZW50SGFuZGxlcnModGhpcylcbiAgICAgIC5yZWdpc3RlckRhdGVwaWNrZXJTaWRlRWZmZWN0cygpO1xuXG4gICAgLy8gdG9kbzogbW92ZSBpdCBzb21ld2hlcmUgZWxzZVxuICAgIC8vIG9uIHNlbGVjdGVkIGRhdGUgY2hhbmdlXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fc3RvcmVcbiAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZFJhbmdlKVxuICAgICAgICAuc3Vic2NyaWJlKGRhdGUgPT4gdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGUpKVxuICAgICk7XG4gIH1cblxuICBkYXlTZWxlY3RIYW5kbGVyKGRheTogRGF5Vmlld01vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaXNPdGhlck1vbnRoc0FjdGl2ZSA/IGRheS5pc0Rpc2FibGVkIDogKGRheS5pc090aGVyTW9udGggfHwgZGF5LmlzRGlzYWJsZWQpO1xuXG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiBvbmx5IG9uZSBkYXRlIGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAvLyBhbmQgdXNlciBjbGlja3Mgb24gcHJldmlvdXMgZGF0ZVxuICAgIC8vIHN0YXJ0IHNlbGVjdGlvbiBmcm9tIG5ldyBkYXRlXG4gICAgLy8gYnV0IGlmIG5ldyBkYXRlIGlzIGFmdGVyIGluaXRpYWwgb25lXG4gICAgLy8gdGhhbiBmaW5pc2ggc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMuX3JhbmdlU3RhY2subGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLl9yYW5nZVN0YWNrID1cbiAgICAgICAgZGF5LmRhdGUgPj0gdGhpcy5fcmFuZ2VTdGFja1swXVxuICAgICAgICAgID8gW3RoaXMuX3JhbmdlU3RhY2tbMF0sIGRheS5kYXRlXVxuICAgICAgICAgIDogW2RheS5kYXRlXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmFuZ2VTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlU3RhY2sgPSBbZGF5LmRhdGVdO1xuICAgIH1cblxuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHRoaXMuX2FjdGlvbnMuc2VsZWN0UmFuZ2UodGhpcy5fcmFuZ2VTdGFjaykpO1xuXG4gICAgaWYgKHRoaXMuX3JhbmdlU3RhY2subGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLl9yYW5nZVN0YWNrID0gW107XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5fc3Vicykge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuX2VmZmVjdHMuZGVzdHJveSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyB9IGZyb20gJy4vYnMtZGF0ZXJhbmdlcGlja2VyLmNvbmZpZyc7XG5pbXBvcnQgeyBCc0RhdGVyYW5nZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWRhdGVyYW5nZXBpY2tlci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGVyRmFjdG9yeSwgQ29tcG9uZW50TG9hZGVyIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jb21wb25lbnQtbG9hZGVyJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYnNEYXRlcmFuZ2VwaWNrZXJdJyxcbiAgZXhwb3J0QXM6ICdic0RhdGVyYW5nZXBpY2tlcidcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIFBsYWNlbWVudCBvZiBhIGRhdGVyYW5nZXBpY2tlci4gQWNjZXB0czogXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdib3R0b20nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyLiBTdXBwb3J0cyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4gICAqIGV2ZW50IG5hbWVzLlxuICAgKi9cbiAgQElucHV0KCkgdHJpZ2dlcnMgPSAnY2xpY2snO1xuICAvKipcbiAgICogQ2xvc2UgZGF0ZXJhbmdlcGlja2VyIG9uIG91dHNpZGUgY2xpY2tcbiAgICovXG4gIEBJbnB1dCgpIG91dHNpZGVDbGljayA9IHRydWU7XG4gIC8qKlxuICAgKiBBIHNlbGVjdG9yIHNwZWNpZnlpbmcgdGhlIGVsZW1lbnQgdGhlIGRhdGVyYW5nZXBpY2tlciBzaG91bGQgYmUgYXBwZW5kZWRcbiAgICogdG8uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIFwiYm9keVwiLlxuICAgKi9cbiAgQElucHV0KCkgY29udGFpbmVyID0gJ2JvZHknO1xuXG4gIEBJbnB1dCgpIG91dHNpZGVFc2MgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRlcmFuZ2VwaWNrZXIgaXMgY3VycmVudGx5IGJlaW5nIHNob3duXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRlcGlja2VyLmlzU2hvd247XG4gIH1cblxuICBzZXQgaXNPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGRhdGVyYW5nZXBpY2tlciBpcyBzaG93blxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBAT3V0cHV0KCkgb25TaG93bjogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBkYXRlcmFuZ2VwaWNrZXIgaXMgaGlkZGVuXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIEBPdXRwdXQoKSBvbkhpZGRlbjogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgX2JzVmFsdWU6IERhdGVbXTtcbiAgLyoqXG4gICAqIEluaXRpYWwgdmFsdWUgb2YgZGF0ZXJhbmdlcGlja2VyXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgYnNWYWx1ZSh2YWx1ZTogRGF0ZVtdKSB7XG4gICAgaWYgKHRoaXMuX2JzVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2JzVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmJzVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlnIG9iamVjdCBmb3IgZGF0ZXJhbmdlcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBic0NvbmZpZzogUGFydGlhbDxCc0RhdGVyYW5nZXBpY2tlckNvbmZpZz47XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkYXRlcmFuZ2VwaWNrZXIncyBjb250ZW50IGlzIGVuYWJsZWQgb3Igbm90XG4gICAqL1xuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogTWluaW11bSBkYXRlIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uXG4gICAqL1xuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlO1xuICAvKipcbiAgICogTWF4aW11bSBkYXRlIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uXG4gICAqL1xuICBASW5wdXQoKSBtYXhEYXRlOiBEYXRlO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBkYXRlcmFuZ2VwaWNrZXIgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZFxuICAgKi9cbiAgQE91dHB1dCgpIGJzVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByb3RlY3RlZCBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9kYXRlcGlja2VyOiBDb21wb25lbnRMb2FkZXI8QnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xuICBwcml2YXRlIF9kYXRlcGlja2VyUmVmOiBDb21wb25lbnRSZWY8QnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBfY29uZmlnOiBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyxcbiAgICAgICAgICAgICAgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgICAgY2lzOiBDb21wb25lbnRMb2FkZXJGYWN0b3J5KSB7XG4gICAgdGhpcy5fZGF0ZXBpY2tlciA9IGNpcy5jcmVhdGVMb2FkZXI8QnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQ+KFxuICAgICAgX2VsZW1lbnRSZWYsXG4gICAgICBfdmlld0NvbnRhaW5lclJlZixcbiAgICAgIF9yZW5kZXJlclxuICAgICk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBfY29uZmlnKTtcbiAgICB0aGlzLm9uU2hvd24gPSB0aGlzLl9kYXRlcGlja2VyLm9uU2hvd247XG4gICAgdGhpcy5vbkhpZGRlbiA9IHRoaXMuX2RhdGVwaWNrZXIub25IaWRkZW47XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmxpc3Rlbih7XG4gICAgICBvdXRzaWRlQ2xpY2s6IHRoaXMub3V0c2lkZUNsaWNrLFxuICAgICAgb3V0c2lkZUVzYzogdGhpcy5vdXRzaWRlRXNjLFxuICAgICAgdHJpZ2dlcnM6IHRoaXMudHJpZ2dlcnMsXG4gICAgICBzaG93OiAoKSA9PiB0aGlzLnNob3coKVxuICAgIH0pO1xuICAgIHRoaXMuc2V0Q29uZmlnKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRlcGlja2VyUmVmIHx8ICF0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWluRGF0ZSkge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS5taW5EYXRlID0gdGhpcy5taW5EYXRlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1heERhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYuaW5zdGFuY2UubWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5pc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlLmlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuIGVsZW1lbnTDosKAwplzIGRhdGVwaWNrZXIuIFRoaXMgaXMgY29uc2lkZXJlZCBhIMOiwoDCnG1hbnVhbMOiwoDCnSB0cmlnZ2VyaW5nIG9mXG4gICAqIHRoZSBkYXRlcGlja2VyLlxuICAgKi9cbiAgc2hvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGF0ZXBpY2tlci5pc1Nob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRDb25maWcoKTtcblxuICAgIHRoaXMuX2RhdGVwaWNrZXJSZWYgPSB0aGlzLl9kYXRlcGlja2VyXG4gICAgICAucHJvdmlkZSh7cHJvdmlkZTogQnNEYXRlcGlja2VyQ29uZmlnLCB1c2VWYWx1ZTogdGhpcy5fY29uZmlnfSlcbiAgICAgIC5hdHRhY2goQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQpXG4gICAgICAudG8odGhpcy5jb250YWluZXIpXG4gICAgICAucG9zaXRpb24oe2F0dGFjaG1lbnQ6IHRoaXMucGxhY2VtZW50fSlcbiAgICAgIC5zaG93KHtwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50fSk7XG5cbiAgICAvLyBpZiBkYXRlIGNoYW5nZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgKG1vZGVsIC0+IHZpZXcpXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5ic1ZhbHVlQ2hhbmdlLnN1YnNjcmliZSgodmFsdWU6IERhdGVbXSkgPT4ge1xuICAgICAgICB0aGlzLl9kYXRlcGlja2VyUmVmLmluc3RhbmNlLnZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBpZiBkYXRlIGNoYW5nZXMgZnJvbSBwaWNrZXIgKHZpZXcgLT4gbW9kZWwpXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fZGF0ZXBpY2tlclJlZi5pbnN0YW5jZS52YWx1ZUNoYW5nZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKHJhbmdlOiBEYXRlW10pID0+IHJhbmdlICYmIHJhbmdlWzBdICYmICEhcmFuZ2VbMV0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IERhdGVbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuYnNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNvbmZpZyBmb3IgZGF0ZXJhbmdlcGlja2VyXG4gICAqL1xuICBzZXRDb25maWcoKSB7XG4gICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgdGhpcy5fY29uZmlnLFxuICAgICAgdGhpcy5ic0NvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuX2JzVmFsdWUsXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgbWluRGF0ZTogdGhpcy5taW5EYXRlIHx8IHRoaXMuYnNDb25maWcgJiYgdGhpcy5ic0NvbmZpZy5taW5EYXRlLFxuICAgICAgICBtYXhEYXRlOiB0aGlzLm1heERhdGUgfHwgdGhpcy5ic0NvbmZpZyAmJiB0aGlzLmJzQ29uZmlnLm1heERhdGVcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBhbiBlbGVtZW50w6LCgMKZcyBkYXRlcGlja2VyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDDosKAwpxtYW51YWzDosKAwp0gdHJpZ2dlcmluZyBvZlxuICAgKiB0aGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLl9kYXRlcGlja2VyLmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5fc3Vicykge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gZWxlbWVudMOiwoDCmXMgZGF0ZXBpY2tlci4gVGhpcyBpcyBjb25zaWRlcmVkIGEgw6LCgMKcbWFudWFsw6LCgMKdIHRyaWdnZXJpbmdcbiAgICogb2YgdGhlIGRhdGVwaWNrZXIuXG4gICAqL1xuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlcGlja2VyLmRpc3Bvc2UoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBmb3JtYXREYXRlLCBnZXRMb2NhbGUsIGlzQWZ0ZXIsIGlzQmVmb3JlLCBpc0FycmF5LCBpc0RhdGVWYWxpZCB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBCc0RhdGVyYW5nZXBpY2tlckRpcmVjdGl2ZSB9IGZyb20gJy4vYnMtZGF0ZXJhbmdlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc0xvY2FsZVNlcnZpY2UgfSBmcm9tICcuL2JzLWxvY2FsZS5zZXJ2aWNlJztcblxuY29uc3QgQlNfREFURVJBTkdFUElDS0VSX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJzRGF0ZXJhbmdlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuY29uc3QgQlNfREFURVJBTkdFUElDS0VSX1ZBTElEQVRPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJzRGF0ZXJhbmdlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBpbnB1dFtic0RhdGVyYW5nZXBpY2tlcl1gLFxuICBob3N0OiB7XG4gICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudCknLFxuICAgICcoa2V5dXAuZXNjKSc6ICdoaWRlKCknLFxuICAgICcoYmx1ciknOiAnb25CbHVyKCknXG4gIH0sXG4gIHByb3ZpZGVyczogW0JTX0RBVEVSQU5HRVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUiwgQlNfREFURVJBTkdFUElDS0VSX1ZBTElEQVRPUl1cbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcmFuZ2VwaWNrZXJJbnB1dERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICBwcml2YXRlIF9vbkNoYW5nZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC12YXJpYWJsZSAqL1xuICBwcml2YXRlIF92YWxpZGF0b3JDaGFuZ2UgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4gIHByaXZhdGUgX3ZhbHVlOiBEYXRlW107XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBwcml2YXRlIF9waWNrZXI6IEJzRGF0ZXJhbmdlcGlja2VyRGlyZWN0aXZlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2NhbGVTZXJ2aWNlOiBCc0xvY2FsZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2VsUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAvLyB1cGRhdGUgaW5wdXQgdmFsdWUgb24gZGF0ZXBpY2tlciB2YWx1ZSB1cGRhdGVcbiAgICB0aGlzLl9waWNrZXIuYnNWYWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBEYXRlW10pID0+IHtcbiAgICAgIHRoaXMuX3NldElucHV0VmFsdWUodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24ubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGUgaW5wdXQgdmFsdWUgb24gbG9jYWxlIGNoYW5nZVxuICAgIHRoaXMuX2xvY2FsZVNlcnZpY2UubG9jYWxlQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9zZXRJbnB1dFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRJbnB1dFZhbHVlKGRhdGU6IERhdGVbXSk6IHZvaWQge1xuICAgIGxldCByYW5nZSA9ICcnO1xuICAgIGlmIChkYXRlKSB7XG4gICAgICBjb25zdCBzdGFydDogc3RyaW5nID0gIWRhdGVbMF0gPyAnJ1xuICAgICAgICA6IGZvcm1hdERhdGUoZGF0ZVswXSxcbiAgICAgICAgICB0aGlzLl9waWNrZXIuX2NvbmZpZy5yYW5nZUlucHV0Rm9ybWF0LFxuICAgICAgICAgIHRoaXMuX2xvY2FsZVNlcnZpY2UuY3VycmVudExvY2FsZVxuICAgICAgICApO1xuICAgICAgY29uc3QgZW5kOiBzdHJpbmcgPSAhZGF0ZVsxXSA/ICcnXG4gICAgICAgIDogZm9ybWF0RGF0ZShcbiAgICAgICAgICBkYXRlWzFdLFxuICAgICAgICAgIHRoaXMuX3BpY2tlci5fY29uZmlnLnJhbmdlSW5wdXRGb3JtYXQsXG4gICAgICAgICAgdGhpcy5fbG9jYWxlU2VydmljZS5jdXJyZW50TG9jYWxlXG4gICAgICAgICk7XG4gICAgICByYW5nZSA9IChzdGFydCAmJiBlbmQpID8gc3RhcnQgKyB0aGlzLl9waWNrZXIuX2NvbmZpZy5yYW5nZVNlcGFyYXRvciArIGVuZCA6ICcnO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCByYW5nZSk7XG4gIH1cblxuICBvbkNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gICAgdGhpcy53cml0ZVZhbHVlKChldmVudC50YXJnZXQgYXMgYW55KS52YWx1ZSk7XG4gICAgdGhpcy5fb25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICB9XG5cbiAgdmFsaWRhdGUoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IF92YWx1ZTogW0RhdGUsIERhdGVdID0gYy52YWx1ZTtcblxuICAgIGlmIChfdmFsdWUgPT09IG51bGwgfHwgX3ZhbHVlID09PSB1bmRlZmluZWQgfHwgIWlzQXJyYXkoX3ZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgX2lzRmlyc3REYXRlVmFsaWQgPSBpc0RhdGVWYWxpZChfdmFsdWVbMF0pO1xuICAgIGNvbnN0IF9pc1NlY29uZERhdGVWYWxpZCA9IGlzRGF0ZVZhbGlkKF92YWx1ZVsxXSk7XG5cbiAgICBpZiAoIV9pc0ZpcnN0RGF0ZVZhbGlkKSB7XG4gICAgICByZXR1cm4geyBic0RhdGU6IHsgaW52YWxpZDogX3ZhbHVlWzBdIH0gfTtcbiAgICB9XG5cbiAgICBpZiAoIV9pc1NlY29uZERhdGVWYWxpZCkge1xuICAgICAgcmV0dXJuIHsgYnNEYXRlOiB7IGludmFsaWQ6IF92YWx1ZVsxXSB9IH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BpY2tlciAmJiB0aGlzLl9waWNrZXIubWluRGF0ZSAmJiBpc0JlZm9yZShfdmFsdWVbMF0sIHRoaXMuX3BpY2tlci5taW5EYXRlLCAnZGF0ZScpKSB7XG4gICAgICByZXR1cm4geyBic0RhdGU6IHsgbWluRGF0ZTogdGhpcy5fcGlja2VyLm1pbkRhdGUgfSB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9waWNrZXIgJiYgdGhpcy5fcGlja2VyLm1heERhdGUgJiYgaXNBZnRlcihfdmFsdWVbMV0sIHRoaXMuX3BpY2tlci5tYXhEYXRlLCAnZGF0ZScpKSB7XG4gICAgICByZXR1cm4geyBic0RhdGU6IHsgbWF4RGF0ZTogdGhpcy5fcGlja2VyLm1heERhdGUgfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGVbXSB8IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgX2xvY2FsZUtleSA9IHRoaXMuX2xvY2FsZVNlcnZpY2UuY3VycmVudExvY2FsZTtcbiAgICAgIGNvbnN0IF9sb2NhbGUgPSBnZXRMb2NhbGUoX2xvY2FsZUtleSk7XG4gICAgICBpZiAoIV9sb2NhbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBMb2NhbGUgXCIke19sb2NhbGVLZXl9XCIgaXMgbm90IGRlZmluZWQsIHBsZWFzZSBhZGQgaXQgd2l0aCBcImRlZmluZUxvY2FsZSguLi4pXCJgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBfaW5wdXQ6IChzdHJpbmdbXSB8IERhdGVbXSkgPSBbXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIF9pbnB1dCA9IHZhbHVlLnNwbGl0KHRoaXMuX3BpY2tlci5fY29uZmlnLnJhbmdlU2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIF9pbnB1dCA9IHZhbHVlO1xuICAgICAgfVxuXG5cbiAgICAgIHRoaXMuX3ZhbHVlID0gKF9pbnB1dCBhcyBzdHJpbmdbXSlcbiAgICAgICAgLm1hcCgoX3ZhbDogc3RyaW5nKTogRGF0ZSA9PlxuICAgICAgICAgIHBhcnNlRGF0ZShfdmFsLCB0aGlzLl9waWNrZXIuX2NvbmZpZy5kYXRlSW5wdXRGb3JtYXQsIHRoaXMuX2xvY2FsZVNlcnZpY2UuY3VycmVudExvY2FsZSkpXG4gICAgICAgIC5tYXAoKGRhdGU6IERhdGUpID0+IChpc05hTihkYXRlLnZhbHVlT2YoKSkgPyBudWxsIDogZGF0ZSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BpY2tlci5ic1ZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9waWNrZXIuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJyk7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLl9waWNrZXIuaGlkZSgpO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQpLmJsdXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWNhbGVuZGFyLWxheW91dCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSBjdXJyZW50IGRhdGUsIHdpbGwgYmUgYWRkZWQgaW4gbmVhcmVzdCByZWxlYXNlcyAtLT5cbiAgICA8YnMtY3VycmVudC1kYXRlIHRpdGxlPVwiaGV5IHRoZXJlXCIgKm5nSWY9XCJmYWxzZVwiPjwvYnMtY3VycmVudC1kYXRlPlxuXG4gICAgPCEtLW5hdmlnYXRpb24tLT5cbiAgICA8ZGl2IGNsYXNzPVwiYnMtZGF0ZXBpY2tlci1oZWFkXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJicy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlld1wiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJicy1kYXRlcGlja2VyLWJvZHlcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS10aW1lcGlja2VyLS0+XG4gICAgPGJzLXRpbWVwaWNrZXIgKm5nSWY9XCJmYWxzZVwiPjwvYnMtdGltZXBpY2tlcj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBCc0NhbGVuZGFyTGF5b3V0Q29tcG9uZW50IHt9XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWN1cnJlbnQtZGF0ZScsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImN1cnJlbnQtdGltZWRhdGVcIj48c3Bhbj57eyB0aXRsZSB9fTwvc3Bhbj48L2Rpdj5gXG59KVxuZXhwb3J0IGNsYXNzIEJzQ3VycmVudERhdGVWaWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnNDdXN0b21EYXRlcyB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBEYXRlIHwgRGF0ZVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1jdXN0b20tZGF0ZS12aWV3JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYnMtZGF0ZXBpY2tlci1wcmVkZWZpbmVkLWJ0bnNcIj5cbiAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHJhbmdlIG9mIHJhbmdlc1wiPnt7IHJhbmdlLmxhYmVsIH19PC9idXR0b24+XG4gICAgICA8YnV0dG9uICpuZ0lmPVwiaXNDdXN0b21SYW5nZVNob3duXCI+Q3VzdG9tIFJhbmdlPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEJzQ3VzdG9tRGF0ZXNWaWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNDdXN0b21SYW5nZVNob3duOiB0cnVlO1xuICBASW5wdXQoKSByYW5nZXM6IEJzQ3VzdG9tRGF0ZXNbXTtcbn1cbiIsImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi4vLi4vYnMtZGF0ZXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgRGF5Vmlld01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW2JzRGF0ZXBpY2tlckRheURlY29yYXRvcl0nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZGlzYWJsZWRdJzogJ2RheS5pc0Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLmlzLWhpZ2hsaWdodGVkXSc6ICdkYXkuaXNIb3ZlcmVkJyxcbiAgICAnW2NsYXNzLmlzLW90aGVyLW1vbnRoXSc6ICdkYXkuaXNPdGhlck1vbnRoJyxcbiAgICAnW2NsYXNzLmlzLWFjdGl2ZS1vdGhlci1tb250aF0nOiAnZGF5LmlzT3RoZXJNb250aEhvdmVyZWQnLFxuICAgICdbY2xhc3MuaW4tcmFuZ2VdJzogJ2RheS5pc0luUmFuZ2UnLFxuICAgICdbY2xhc3Muc2VsZWN0LXN0YXJ0XSc6ICdkYXkuaXNTZWxlY3Rpb25TdGFydCcsXG4gICAgJ1tjbGFzcy5zZWxlY3QtZW5kXSc6ICdkYXkuaXNTZWxlY3Rpb25FbmQnLFxuICAgICdbY2xhc3Muc2VsZWN0ZWRdJzogJ2RheS5pc1NlbGVjdGVkJ1xuICB9LFxuICB0ZW1wbGF0ZTogYHt7IGRheS5sYWJlbCB9fWBcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyRGF5RGVjb3JhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGF5OiBEYXlWaWV3TW9kZWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcsXG4gICAgcHJpdmF0ZSBfZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRheS5pc1RvZGF5ICYmIHRoaXMuX2NvbmZpZyAmJiB0aGlzLl9jb25maWcuY3VzdG9tVG9kYXlDbGFzcykge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fY29uZmlnLmN1c3RvbVRvZGF5Q2xhc3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzTmF2aWdhdGlvbkRpcmVjdGlvbixcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLWRhdGVwaWNrZXItbmF2aWdhdGlvbi12aWV3JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvbiBjbGFzcz1cInByZXZpb3VzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjYWxlbmRhci5kaXNhYmxlTGVmdEFycm93XCJcbiAgICAgICAgICAgIFtzdHlsZS52aXNpYmlsaXR5XT1cImNhbGVuZGFyLmhpZGVMZWZ0QXJyb3cgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibmF2VG8odHJ1ZSlcIj48c3Bhbj4mbHNhcXVvOzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgICYjODIwMzsgIDwhLS0gemVyby13aWR0aCBzcGFjZSBuZWVkZWQgZm9yIGNvcnJlY3QgYWxpZ25lbWVudFxuICAgICAgICAgICAgICAgICAgd2l0aCBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSBpbiBBbmd1bGFyIC0tPlxuXG4gICAgPGJ1dHRvbiBjbGFzcz1cImN1cnJlbnRcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYWxlbmRhci5tb250aFRpdGxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ2aWV3KCdtb250aCcpXCJcbiAgICA+PHNwYW4+e3sgY2FsZW5kYXIubW9udGhUaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgICYjODIwMzsgIDwhLS0gemVyby13aWR0aCBzcGFjZSBuZWVkZWQgZm9yIGNvcnJlY3QgYWxpZ25lbWVudFxuICAgICAgICAgICAgICAgICAgd2l0aCBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSBpbiBBbmd1bGFyIC0tPlxuXG4gICAgPGJ1dHRvbiBjbGFzcz1cImN1cnJlbnRcIiAoY2xpY2spPVwidmlldygneWVhcicpXCJcbiAgICA+PHNwYW4+e3sgY2FsZW5kYXIueWVhclRpdGxlIH19PC9zcGFuPjwvYnV0dG9uPlxuXG4gICAgJiM4MjAzOyAgPCEtLSB6ZXJvLXdpZHRoIHNwYWNlIG5lZWRlZCBmb3IgY29ycmVjdCBhbGlnbmVtZW50XG4gICAgICAgICAgICAgICAgICB3aXRoIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlIGluIEFuZ3VsYXIgLS0+XG5cbiAgICA8YnV0dG9uIGNsYXNzPVwibmV4dFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FsZW5kYXIuZGlzYWJsZVJpZ2h0QXJyb3dcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwiY2FsZW5kYXIuaGlkZVJpZ2h0QXJyb3cgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibmF2VG8oZmFsc2UpXCI+PHNwYW4+JnJzYXF1bzs8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyTmF2aWdhdGlvblZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBjYWxlbmRhcjogRGF5c0NhbGVuZGFyVmlld01vZGVsO1xuXG4gIEBPdXRwdXQoKSBvbk5hdmlnYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxCc05hdmlnYXRpb25EaXJlY3Rpb24+KCk7XG4gIEBPdXRwdXQoKSBvblZpZXdNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxCc0RhdGVwaWNrZXJWaWV3TW9kZT4oKTtcblxuICBuYXZUbyhkb3duOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vbk5hdmlnYXRlLmVtaXQoXG4gICAgICBkb3duID8gQnNOYXZpZ2F0aW9uRGlyZWN0aW9uLkRPV04gOiBCc05hdmlnYXRpb25EaXJlY3Rpb24uVVBcbiAgICApO1xuICB9XG5cbiAgdmlldyh2aWV3TW9kZTogQnNEYXRlcGlja2VyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmlld01vZGUuZW1pdCh2aWV3TW9kZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQnNEYXRlcGlja2VyVmlld01vZGUsXG4gIEJzTmF2aWdhdGlvbkRpcmVjdGlvbixcbiAgQnNOYXZpZ2F0aW9uRXZlbnQsXG4gIENlbGxIb3ZlckV2ZW50LFxuICBEYXRlcGlja2VyUmVuZGVyT3B0aW9ucyxcbiAgRGF5c0NhbGVuZGFyVmlld01vZGVsLFxuICBEYXlWaWV3TW9kZWxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uLy4uL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnMtZGF5cy1jYWxlbmRhci12aWV3JyxcbiAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJzLWNhbGVuZGFyLWxheW91dD5cbiAgICAgIDxicy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlld1xuICAgICAgICBbY2FsZW5kYXJdPVwiY2FsZW5kYXJcIlxuICAgICAgICAob25OYXZpZ2F0ZSk9XCJuYXZpZ2F0ZVRvKCRldmVudClcIlxuICAgICAgICAob25WaWV3TW9kZSk9XCJjaGFuZ2VWaWV3TW9kZSgkZXZlbnQpXCJcbiAgICAgID48L2JzLWRhdGVwaWNrZXItbmF2aWdhdGlvbi12aWV3PlxuXG4gICAgICA8IS0tZGF5cyBtYXRyaXgtLT5cbiAgICAgIDx0YWJsZSByb2xlPVwiZ3JpZFwiIGNsYXNzPVwiZGF5cyB3ZWVrc1wiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8IS0taWYgc2hvdyB3ZWVrcy0tPlxuICAgICAgICAgIDx0aCAqbmdJZj1cIm9wdGlvbnMuc2hvd1dlZWtOdW1iZXJzXCI+PC90aD5cbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHdlZWtkYXkgb2YgY2FsZW5kYXIud2Vla2RheXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwid2Vla2RheVwiPnt7IGNhbGVuZGFyLndlZWtkYXlzW2ldIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHdlZWsgb2YgY2FsZW5kYXIud2Vla3M7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ3ZWVrXCIgKm5nSWY9XCJvcHRpb25zLnNob3dXZWVrTnVtYmVyc1wiPlxuICAgICAgICAgICAgPHNwYW4+e3sgY2FsZW5kYXIud2Vla051bWJlcnNbaV0gfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrLmRheXNcIiByb2xlPVwiZ3JpZGNlbGxcIj5cbiAgICAgICAgICA8c3BhbiBic0RhdGVwaWNrZXJEYXlEZWNvcmF0b3JcbiAgICAgICAgICAgICAgICBbZGF5XT1cImRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheShkYXkpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJob3ZlckRheShkYXksIHRydWUpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlckRheShkYXksIGZhbHNlKVwiPnt7IGRheS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cblxuICAgIDwvYnMtY2FsZW5kYXItbGF5b3V0PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEJzRGF5c0NhbGVuZGFyVmlld0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNhbGVuZGFyOiBEYXlzQ2FsZW5kYXJWaWV3TW9kZWw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IERhdGVwaWNrZXJSZW5kZXJPcHRpb25zO1xuXG4gIEBPdXRwdXQoKSBvbk5hdmlnYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxCc05hdmlnYXRpb25FdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uVmlld01vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEJzRGF0ZXBpY2tlclZpZXdNb2RlPigpO1xuXG4gIEBPdXRwdXQoKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5Vmlld01vZGVsPigpO1xuICBAT3V0cHV0KCkgb25Ib3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEhvdmVyRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29uZmlnOiBCc0RhdGVwaWNrZXJDb25maWcpIHsgfVxuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzTmF2aWdhdGlvbkRpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSBCc05hdmlnYXRpb25EaXJlY3Rpb24uRE9XTiA9PT0gZXZlbnQgPyAtMSA6IDE7XG4gICAgdGhpcy5vbk5hdmlnYXRlLmVtaXQoeyBzdGVwOiB7IG1vbnRoOiBzdGVwIH0gfSk7XG4gIH1cblxuICBjaGFuZ2VWaWV3TW9kZShldmVudDogQnNEYXRlcGlja2VyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmlld01vZGUuZW1pdChldmVudCk7XG4gIH1cblxuICBzZWxlY3REYXkoZXZlbnQ6IERheVZpZXdNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICBob3ZlckRheShjZWxsOiBEYXlWaWV3TW9kZWwsIGlzSG92ZXJlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb25maWcuc2VsZWN0RnJvbU90aGVyTW9udGggJiYgY2VsbC5pc090aGVyTW9udGgpIHtcbiAgICAgIGNlbGwuaXNPdGhlck1vbnRoSG92ZXJlZCA9IGlzSG92ZXJlZDtcbiAgICB9XG5cbiAgICB0aGlzLm9uSG92ZXIuZW1pdCh7IGNlbGwsIGlzSG92ZXJlZCB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJzRGF0ZXBpY2tlclZpZXdNb2RlLFxuICBCc05hdmlnYXRpb25EaXJlY3Rpb24sXG4gIEJzTmF2aWdhdGlvbkV2ZW50LFxuICBDZWxsSG92ZXJFdmVudCxcbiAgTW9udGhzQ2FsZW5kYXJWaWV3TW9kZWwsXG4gIENhbGVuZGFyQ2VsbFZpZXdNb2RlbFxufSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy1tb250aC1jYWxlbmRhci12aWV3JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnMtY2FsZW5kYXItbGF5b3V0PlxuICAgICAgPGJzLWRhdGVwaWNrZXItbmF2aWdhdGlvbi12aWV3XG4gICAgICAgIFtjYWxlbmRhcl09XCJjYWxlbmRhclwiXG4gICAgICAgIChvbk5hdmlnYXRlKT1cIm5hdmlnYXRlVG8oJGV2ZW50KVwiXG4gICAgICAgIChvblZpZXdNb2RlKT1cImNoYW5nZVZpZXdNb2RlKCRldmVudClcIlxuICAgICAgPjwvYnMtZGF0ZXBpY2tlci1uYXZpZ2F0aW9uLXZpZXc+XG5cbiAgICAgIDx0YWJsZSByb2xlPVwiZ3JpZFwiIGNsYXNzPVwibW9udGhzXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgY2FsZW5kYXIubW9udGhzXCI+XG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBtb250aCBvZiByb3dcIiByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidmlld01vbnRoKG1vbnRoKVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyTW9udGgobW9udGgsIHRydWUpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJNb250aChtb250aCwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIm1vbnRoLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtaGlnaGxpZ2h0ZWRdPVwibW9udGguaXNIb3ZlcmVkXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBtb250aC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2JzLWNhbGVuZGFyLWxheW91dD5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBCc01vbnRoQ2FsZW5kYXJWaWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY2FsZW5kYXI6IE1vbnRoc0NhbGVuZGFyVmlld01vZGVsO1xuXG4gIEBPdXRwdXQoKSBvbk5hdmlnYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxCc05hdmlnYXRpb25FdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uVmlld01vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEJzRGF0ZXBpY2tlclZpZXdNb2RlPigpO1xuXG4gIEBPdXRwdXQoKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJDZWxsVmlld01vZGVsPigpO1xuICBAT3V0cHV0KCkgb25Ib3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEhvdmVyRXZlbnQ+KCk7XG5cbiAgbmF2aWdhdGVUbyhldmVudDogQnNOYXZpZ2F0aW9uRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcCA9IEJzTmF2aWdhdGlvbkRpcmVjdGlvbi5ET1dOID09PSBldmVudCA/IC0xIDogMTtcbiAgICB0aGlzLm9uTmF2aWdhdGUuZW1pdCh7IHN0ZXA6IHsgeWVhcjogc3RlcCB9IH0pO1xuICB9XG5cbiAgdmlld01vbnRoKG1vbnRoOiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQobW9udGgpO1xuICB9XG5cbiAgaG92ZXJNb250aChjZWxsOiBDYWxlbmRhckNlbGxWaWV3TW9kZWwsIGlzSG92ZXJlZDogYm9vbGVhbikge1xuICAgIHRoaXMub25Ib3Zlci5lbWl0KHsgY2VsbCwgaXNIb3ZlcmVkIH0pO1xuICB9XG5cbiAgY2hhbmdlVmlld01vZGUoZXZlbnQ6IEJzRGF0ZXBpY2tlclZpZXdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5vblZpZXdNb2RlLmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCIvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicy10aW1lcGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYnMtdGltZXBpY2tlci1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJicy10aW1lcGlja2VyLWNvbnRyb2xzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJicy1kZWNyZWFzZVwiPi08L2J1dHRvbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImhvdXJzXCIgcGxhY2Vob2xkZXI9XCIwMFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnMtaW5jcmVhc2VcIj4rPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJicy10aW1lcGlja2VyLWNvbnRyb2xzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJicy1kZWNyZWFzZVwiPi08L2J1dHRvbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cIm1pbnV0ZXNcIiBwbGFjZWhvbGRlcj1cIjAwXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJicy1pbmNyZWFzZVwiPis8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInN3aXRjaC10aW1lLWZvcm1hdFwiPnt7IGFtcG0gfX1cbiAgICAgICAgPGltZ1xuICAgICAgICAgIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBS0NBWUFBQUJpOEtTREFBQUJTRWxFUVZRWVYzWFFQVXZEVUJRRzRITnVhZ3RWcWM2S2dvdUN2NkdJdUludFlCTEI5aGNJUXBMU3RDQUlWN0RZbXBUY1JXY1hxWmlvM1Z3Yy9VQ2MvUUVxZmd5S0dicjBJN25TMUVpSGVxWXpQTy9oNVNEMGpheFVaam1TTENCK09GYitVRklORndBU0FFQWRwdTlnYUdYVnlBSEhGUUJrSHBLSGM2YTlkekVDdkFEeVk5c3FsQU1zSzlXMGp6eERYcWV5dHIzbWhRY2t4U2ppMjdUSko1L3JQbUlwd0pKcTNIcnRkdXJpWU91cnYxYTRpMXA1SG5oa0c5T0Z5bWkwUmVvTzA1Y0d3YitheXY0ZHlzVnlnamVGbXNQMDVmOHdwWlE4ZnNkdmZtdVk5empXU05xVXRnWUZWbk9WUmVJTFlvQkZ6ZFFJNS9HR0Z6TkhoR2JlWm5vcERHVTI5c1pic2NnbGRtQzk5dzM1Vk9BVFR5Y0lNTWNCWElmcFNWR3paaEE2QzhoaDAwY29ubG42VlE5VEdnVjMyT0VBS1FDNERyQnE3Q0p3ZDBnZ1I3VnEvclByZmdCK0Mzc0d5cFk1REFBQUFBQkpSVTVFcmtKZ2dnPT1cIlxuICAgICAgICAgIGFsdD1cIlwiPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnNUaW1lcGlja2VyVmlld0NvbXBvbmVudCB7XG4gIGFtcG0gPSAnb2snO1xuICBob3VycyA9IDA7XG4gIG1pbnV0ZXMgPSAwO1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHllYXJzUGVyQ2FsZW5kYXIgfSBmcm9tICcuLi8uLi9lbmdpbmUvZm9ybWF0LXllYXJzLWNhbGVuZGFyJztcbmltcG9ydCB7XG4gIEJzRGF0ZXBpY2tlclZpZXdNb2RlLFxuICBCc05hdmlnYXRpb25EaXJlY3Rpb24sXG4gIEJzTmF2aWdhdGlvbkV2ZW50LFxuICBDYWxlbmRhckNlbGxWaWV3TW9kZWwsXG4gIENlbGxIb3ZlckV2ZW50LFxuICBZZWFyc0NhbGVuZGFyVmlld01vZGVsXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLXllYXJzLWNhbGVuZGFyLXZpZXcnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxicy1jYWxlbmRhci1sYXlvdXQ+XG4gICAgICA8YnMtZGF0ZXBpY2tlci1uYXZpZ2F0aW9uLXZpZXdcbiAgICAgICAgW2NhbGVuZGFyXT1cImNhbGVuZGFyXCJcbiAgICAgICAgKG9uTmF2aWdhdGUpPVwibmF2aWdhdGVUbygkZXZlbnQpXCJcbiAgICAgICAgKG9uVmlld01vZGUpPVwiY2hhbmdlVmlld01vZGUoJGV2ZW50KVwiXG4gICAgICA+PC9icy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlldz5cblxuICAgICAgPHRhYmxlIHJvbGU9XCJncmlkXCIgY2xhc3M9XCJ5ZWFyc1wiPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGNhbGVuZGFyLnllYXJzXCI+XG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHJvd1wiIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyWWVhcih5ZWFyLCB0cnVlKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyWWVhcih5ZWFyLCBmYWxzZSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwieWVhci5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWhpZ2hsaWdodGVkXT1cInllYXIuaXNIb3ZlcmVkXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyB5ZWFyLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvYnMtY2FsZW5kYXItbGF5b3V0PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEJzWWVhcnNDYWxlbmRhclZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBjYWxlbmRhcjogWWVhcnNDYWxlbmRhclZpZXdNb2RlbDtcblxuICBAT3V0cHV0KCkgb25OYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8QnNOYXZpZ2F0aW9uRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvblZpZXdNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxCc0RhdGVwaWNrZXJWaWV3TW9kZT4oKTtcblxuICBAT3V0cHV0KCkgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyQ2VsbFZpZXdNb2RlbD4oKTtcbiAgQE91dHB1dCgpIG9uSG92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxIb3ZlckV2ZW50PigpO1xuXG4gIG5hdmlnYXRlVG8oZXZlbnQ6IEJzTmF2aWdhdGlvbkRpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSBCc05hdmlnYXRpb25EaXJlY3Rpb24uRE9XTiA9PT0gZXZlbnQgPyAtMSA6IDE7XG4gICAgdGhpcy5vbk5hdmlnYXRlLmVtaXQoeyBzdGVwOiB7IHllYXI6IHN0ZXAgKiB5ZWFyc1BlckNhbGVuZGFyIH0gfSk7XG4gIH1cblxuICB2aWV3WWVhcih5ZWFyOiBDYWxlbmRhckNlbGxWaWV3TW9kZWwpIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQoeWVhcik7XG4gIH1cblxuICBob3ZlclllYXIoY2VsbDogQ2FsZW5kYXJDZWxsVmlld01vZGVsLCBpc0hvdmVyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9uSG92ZXIuZW1pdCh7IGNlbGwsIGlzSG92ZXJlZCB9KTtcbiAgfVxuXG4gIGNoYW5nZVZpZXdNb2RlKGV2ZW50OiBCc0RhdGVwaWNrZXJWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMub25WaWV3TW9kZS5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRMb2FkZXJGYWN0b3J5IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jb21wb25lbnQtbG9hZGVyJztcbmltcG9ydCB7IFBvc2l0aW9uaW5nU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvcG9zaXRpb25pbmcnO1xuXG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vYnMtZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9icy1kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuL2JzLWRhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IEJzRGF0ZXJhbmdlcGlja2VySW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2JzLWRhdGVyYW5nZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnNEYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmUgfSBmcm9tICcuL2JzLWRhdGVyYW5nZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcmFuZ2VwaWNrZXJDb25maWcgfSBmcm9tICcuL2JzLWRhdGVyYW5nZXBpY2tlci5jb25maWcnO1xuXG5pbXBvcnQgeyBCc0xvY2FsZVNlcnZpY2UgfSBmcm9tICcuL2JzLWxvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckFjdGlvbnMgfSBmcm9tICcuL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5hY3Rpb25zJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckVmZmVjdHMgfSBmcm9tICcuL3JlZHVjZXIvYnMtZGF0ZXBpY2tlci5lZmZlY3RzJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlclN0b3JlIH0gZnJvbSAnLi9yZWR1Y2VyL2JzLWRhdGVwaWNrZXIuc3RvcmUnO1xuaW1wb3J0IHsgQnNDYWxlbmRhckxheW91dENvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWNhbGVuZGFyLWxheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNDdXJyZW50RGF0ZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1jdXJyZW50LWRhdGUtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNDdXN0b21EYXRlc1ZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1jdXN0b20tZGF0ZXMtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi90aGVtZXMvYnMvYnMtZGF0ZXBpY2tlci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlckRheURlY29yYXRvckNvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLWRhdGVwaWNrZXItZGF5LWRlY29yYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyTmF2aWdhdGlvblZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1kYXRlcGlja2VyLW5hdmlnYXRpb24tdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1kYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCc0RheXNDYWxlbmRhclZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1kYXlzLWNhbGVuZGFyLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9udGhDYWxlbmRhclZpZXdDb21wb25lbnQgfSBmcm9tICcuL3RoZW1lcy9icy9icy1tb250aHMtY2FsZW5kYXItdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNUaW1lcGlja2VyVmlld0NvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLXRpbWVwaWNrZXItdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNZZWFyc0NhbGVuZGFyVmlld0NvbXBvbmVudCB9IGZyb20gJy4vdGhlbWVzL2JzL2JzLXllYXJzLWNhbGVuZGFyLXZpZXcuY29tcG9uZW50JztcblxuY29uc3QgX2V4cG9ydHMgPSBbXG4gIEJzRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCxcbiAgQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnQsXG5cbiAgQnNEYXRlcGlja2VyRGlyZWN0aXZlLFxuICBCc0RhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSxcblxuICBCc0RhdGVyYW5nZXBpY2tlcklucHV0RGlyZWN0aXZlLFxuICBCc0RhdGVyYW5nZXBpY2tlckRpcmVjdGl2ZVxuXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEJzRGF0ZXBpY2tlckRheURlY29yYXRvckNvbXBvbmVudCxcbiAgICBCc0N1cnJlbnREYXRlVmlld0NvbXBvbmVudCxcbiAgICBCc0RhdGVwaWNrZXJOYXZpZ2F0aW9uVmlld0NvbXBvbmVudCxcbiAgICBCc1RpbWVwaWNrZXJWaWV3Q29tcG9uZW50LFxuXG4gICAgQnNDYWxlbmRhckxheW91dENvbXBvbmVudCxcbiAgICBCc0RheXNDYWxlbmRhclZpZXdDb21wb25lbnQsXG4gICAgQnNNb250aENhbGVuZGFyVmlld0NvbXBvbmVudCxcbiAgICBCc1llYXJzQ2FsZW5kYXJWaWV3Q29tcG9uZW50LFxuXG4gICAgQnNDdXN0b21EYXRlc1ZpZXdDb21wb25lbnQsXG5cbiAgICAuLi5fZXhwb3J0c1xuICBdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtcbiAgICBCc0RhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQsXG4gICAgQnNEYXRlcmFuZ2VwaWNrZXJDb250YWluZXJDb21wb25lbnRcbiAgXSxcbiAgZXhwb3J0czogX2V4cG9ydHNcbn0pXG5leHBvcnQgY2xhc3MgQnNEYXRlcGlja2VyTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCc0RhdGVwaWNrZXJNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ29tcG9uZW50TG9hZGVyRmFjdG9yeSxcbiAgICAgICAgUG9zaXRpb25pbmdTZXJ2aWNlLFxuICAgICAgICBCc0RhdGVwaWNrZXJTdG9yZSxcbiAgICAgICAgQnNEYXRlcGlja2VyQWN0aW9ucyxcbiAgICAgICAgQnNEYXRlcGlja2VyQ29uZmlnLFxuICAgICAgICBCc0RhdGVyYW5nZXBpY2tlckNvbmZpZyxcbiAgICAgICAgQnNEYXRlcGlja2VyRWZmZWN0cyxcbiAgICAgICAgQnNMb2NhbGVTZXJ2aWNlXG4gICAgICBdXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRlRm9ybWF0dGVyIHtcbiAgZm9ybWF0KGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0LCBsb2NhbGUpO1xuICB9XG59XG4iLCIvKiB0c2xpbnQ6ZGlzYWJsZTogbWF4LWZpbGUtbGluZS1jb3VudCAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi9kYXRlLWZvcm1hdHRlcic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0ZXBpY2tlci1pbm5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSZsdDshJm5kYXNoO25nLWtleWRvd249XCJrZXlkb3duKCRldmVudClcIiZuZGFzaDsmZ3Q7LS0+XG4gICAgPGRpdiAqbmdJZj1cImRhdGVwaWNrZXJNb2RlXCIgY2xhc3M9XCJ3ZWxsIHdlbGwtc20gYmctZmFkZWQgcC1hIGNhcmRcIiByb2xlPVwiYXBwbGljYXRpb25cIiA+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZztcbiAgQElucHV0KCkgZGF0ZXBpY2tlck1vZGU6IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRpbmdEYXk6IG51bWJlcjtcbiAgQElucHV0KCkgeWVhclJhbmdlOiBudW1iZXI7XG5cbiAgQElucHV0KCkgbWluRGF0ZTogRGF0ZTtcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcbiAgQElucHV0KCkgbWluTW9kZTogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhNb2RlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dXZWVrczogYm9vbGVhbjtcbiAgQElucHV0KCkgZm9ybWF0RGF5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdFllYXI6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybWF0RGF5SGVhZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdERheVRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgb25seUN1cnJlbnRNb250aDogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvcnRjdXRQcm9wYWdhdGlvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M6IHsgZGF0ZTogRGF0ZTsgbW9kZTogc3RyaW5nOyBjbGF6ejogc3RyaW5nIH1bXTtcbiAgQElucHV0KCkgbW9udGhDb2xMaW1pdDogbnVtYmVyO1xuICBASW5wdXQoKSB5ZWFyQ29sTGltaXQ6IG51bWJlcjtcbiAgQElucHV0KCkgZGF0ZURpc2FibGVkOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZyB9W107XG4gIEBJbnB1dCgpIGRheURpc2FibGVkOiBudW1iZXJbXTtcbiAgQElucHV0KCkgaW5pdERhdGU6IERhdGU7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkRvbmU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4odW5kZWZpbmVkKTtcbiAgQE91dHB1dCgpIHVwZGF0ZTogRXZlbnRFbWl0dGVyPERhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPihmYWxzZSk7XG4gIEBPdXRwdXQoKSBhY3RpdmVEYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KHVuZGVmaW5lZCk7XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBzdGVwRGF5OiBhbnkgPSB7fTtcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBzdGVwTW9udGg6IGFueSA9IHt9O1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIHN0ZXBZZWFyOiBhbnkgPSB7fTtcblxuICB1bmlxdWVJZDogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBtb2Rlczogc3RyaW5nW10gPSBbJ2RheScsICdtb250aCcsICd5ZWFyJ107XG4gIHByb3RlY3RlZCBkYXRlRm9ybWF0dGVyOiBEYXRlRm9ybWF0dGVyID0gbmV3IERhdGVGb3JtYXR0ZXIoKTtcbiAgcHJvdGVjdGVkIF9hY3RpdmVEYXRlOiBEYXRlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBwcm90ZWN0ZWQgYWN0aXZlRGF0ZUlkOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hWaWV3SGFuZGxlckRheTogRnVuY3Rpb247XG4gIHByb3RlY3RlZCBjb21wYXJlSGFuZGxlckRheTogRnVuY3Rpb247XG4gIHByb3RlY3RlZCByZWZyZXNoVmlld0hhbmRsZXJNb250aDogRnVuY3Rpb247XG4gIHByb3RlY3RlZCBjb21wYXJlSGFuZGxlck1vbnRoOiBGdW5jdGlvbjtcbiAgcHJvdGVjdGVkIHJlZnJlc2hWaWV3SGFuZGxlclllYXI6IEZ1bmN0aW9uO1xuICBwcm90ZWN0ZWQgY29tcGFyZUhhbmRsZXJZZWFyOiBGdW5jdGlvbjtcblxuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgfVxuXG4gIHNldCBhY3RpdmVEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdG9kbzogYWRkIGZvcm1hdHRlciB2YWx1ZSB0byBEYXRlIG9iamVjdFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0b2RvOiB1c2UgZGF0ZSBmb3IgdW5pcXVlIHZhbHVlXG4gICAgdGhpcy51bmlxdWVJZCA9ICBgZGF0ZXBpY2tlci0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMCl9YDtcblxuICAgIGlmICh0aGlzLmluaXREYXRlKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmluaXREYXRlO1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZURhdGUudmFsdWVPZigpKTtcbiAgICAgIHRoaXMudXBkYXRlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMucmVmcmVzaFZpZXcgc2hvdWxkIGJlIGNhbGxlZCBoZXJlIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgb24gdGhlIGZseVxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLXZhcmlhYmxlXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgdGhpcy5jaGVja0lmQWN0aXZlRGF0ZUdvdFVwZGF0ZWQoY2hhbmdlcy5hY3RpdmVEYXRlKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGFjdGl2ZURhdGUgaGFzIGJlZW4gdXBkYXRlIGFuZCB0aGVuIGVtaXQgdGhlIGFjdGl2ZURhdGVDaGFuZ2Ugd2l0aCB0aGUgbmV3IGRhdGVcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkgKi9cbiAgY2hlY2tJZkFjdGl2ZURhdGVHb3RVcGRhdGVkKGFjdGl2ZURhdGU6IGFueSk6IHZvaWQge1xuICAgIGlmIChhY3RpdmVEYXRlICYmICFhY3RpdmVEYXRlLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gYWN0aXZlRGF0ZS5wcmV2aW91c1ZhbHVlO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1ZhbHVlICYmXG4gICAgICAgIHByZXZpb3VzVmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmXG4gICAgICAgIHByZXZpb3VzVmFsdWUuZ2V0VGltZSgpICE9PSBhY3RpdmVEYXRlLmN1cnJlbnRWYWx1ZS5nZXRUaW1lKClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldENvbXBhcmVIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLmNvbXBhcmVIYW5kbGVyTW9udGggPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyID0gaGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICBjb21wYXJlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGRhdGUxID09PSB1bmRlZmluZWQgfHwgZGF0ZTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScgJiYgdGhpcy5jb21wYXJlSGFuZGxlckRheSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkoZGF0ZTEsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ21vbnRoJyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyTW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyTW9udGgoZGF0ZTEsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ3llYXInICYmIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlclllYXIoZGF0ZTEsIGRhdGUyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgc2V0UmVmcmVzaFZpZXdIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5ID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyID0gaGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJEYXkpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSAneWVhcicgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3SGFuZGxlclllYXIoKTtcbiAgICB9XG4gIH1cblxuICBkYXRlRmlsdGVyKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRm9ybWF0dGVyLmZvcm1hdChkYXRlLCBmb3JtYXQsIHRoaXMubG9jYWxlKTtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgaXNBY3RpdmUoZGF0ZU9iamVjdDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29tcGFyZShkYXRlT2JqZWN0LmRhdGUsIHRoaXMuYWN0aXZlRGF0ZSkgPT09IDApIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZUlkID0gZGF0ZU9iamVjdC51aWQ7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgY3JlYXRlRGF0ZU9iamVjdChkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IGFueSB7XG4gICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICAgIGNvbnN0IGRhdGVPYmplY3Q6IGFueSA9IHt9O1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgZGF0ZS5nZXREYXRlKClcbiAgICApO1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IHRoaXMuZml4VGltZVpvbmUoZGF0ZU9iamVjdC5kYXRlKTtcbiAgICBkYXRlT2JqZWN0LmxhYmVsID0gdGhpcy5kYXRlRmlsdGVyKGRhdGUsIGZvcm1hdCk7XG4gICAgZGF0ZU9iamVjdC5zZWxlY3RlZCA9IHRoaXMuY29tcGFyZShkYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5kaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZChkYXRlKTtcbiAgICBkYXRlT2JqZWN0LmN1cnJlbnQgPSB0aGlzLmNvbXBhcmUoZGF0ZSwgbmV3IERhdGUoKSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5jdXN0b21DbGFzcyA9IHRoaXMuZ2V0Q3VzdG9tQ2xhc3NGb3JEYXRlKGRhdGVPYmplY3QuZGF0ZSk7XG5cbiAgICByZXR1cm4gZGF0ZU9iamVjdDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgc3BsaXQoYXJyOiBhbnlbXSwgc2l6ZTogbnVtYmVyKTogYW55W10ge1xuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55Ki9cbiAgICBjb25zdCBhcnJheXM6IGFueVtdID0gW107XG4gICAgd2hpbGUgKGFyci5sZW5ndGggPiAwKSB7XG4gICAgICBhcnJheXMucHVzaChhcnIuc3BsaWNlKDAsIHNpemUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXlzO1xuICB9XG5cbiAgLy8gRml4IGEgaGFyZC1yZXByb2R1Y2libGUgYnVnIHdpdGggdGltZXpvbmVzXG4gIC8vIFRoZSBidWcgZGVwZW5kcyBvbiBPUywgYnJvd3NlciwgY3VycmVudCB0aW1lem9uZSBhbmQgY3VycmVudCBkYXRlXG4gIC8vIGkuZS5cbiAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgyMDE0LCAwLCAxKTtcbiAgLy8gY29uc29sZS5sb2coZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLFxuICAvLyBkYXRlLmdldEhvdXJzKCkpOyBjYW4gcmVzdWx0IGluIFwiMjAxMyAxMSAzMSAyM1wiIGJlY2F1c2Ugb2YgdGhlIGJ1Zy5cbiAgZml4VGltZVpvbmUoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuXG4gICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICBob3VycyA9PT0gMjMgPyBob3VycyArIDIgOiAwXG4gICAgKTtcbiAgfVxuXG4gIHNlbGVjdChkYXRlOiBEYXRlLCBpc01hbnVhbCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gdGhpcy5taW5Nb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuYWN0aXZlRGF0ZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSgwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUoXG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXRlLmdldERhdGUoKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuZml4VGltZVpvbmUodGhpcy5hY3RpdmVEYXRlKTtcbiAgICAgIGlmIChpc01hbnVhbCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkRvbmUuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpXG4gICAgICApO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5maXhUaW1lWm9uZSh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgaWYgKGlzTWFudWFsKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlck1vZGUgPSB0aGlzLm1vZGVzW1xuICAgICAgICAgIHRoaXMubW9kZXMuaW5kZXhPZih0aGlzLmRhdGVwaWNrZXJNb2RlKSAtIDFcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS52YWx1ZU9mKCkpO1xuICAgIHRoaXMudXBkYXRlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBtb3ZlKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICAgIGxldCBleHBlY3RlZFN0ZXA6IGFueTtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgIGV4cGVjdGVkU3RlcCA9IHRoaXMuc3RlcERheTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgZXhwZWN0ZWRTdGVwID0gdGhpcy5zdGVwTW9udGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICd5ZWFyJykge1xuICAgICAgZXhwZWN0ZWRTdGVwID0gdGhpcy5zdGVwWWVhcjtcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0ZWRTdGVwKSB7XG4gICAgICBjb25zdCB5ZWFyID1cbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkgKyBkaXJlY3Rpb24gKiAoZXhwZWN0ZWRTdGVwLnllYXJzIHx8IDApO1xuICAgICAgY29uc3QgbW9udGggPVxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSArIGRpcmVjdGlvbiAqIChleHBlY3RlZFN0ZXAubW9udGhzIHx8IDApO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuXG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU1vZGUoX2RpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gX2RpcmVjdGlvbiB8fCAxO1xuXG4gICAgaWYgKFxuICAgICAgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09IHRoaXMubWF4TW9kZSAmJiBkaXJlY3Rpb24gPT09IDEpIHx8XG4gICAgICAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gdGhpcy5taW5Nb2RlICYmIGRpcmVjdGlvbiA9PT0gLTEpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRlcGlja2VyTW9kZSA9IHRoaXMubW9kZXNbXG4gICAgICB0aGlzLm1vZGVzLmluZGV4T2YodGhpcy5kYXRlcGlja2VyTW9kZSkgKyBkaXJlY3Rpb25cbiAgICBdO1xuICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDdXN0b21DbGFzc0ZvckRhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIHRvZG86IGJ1aWxkIGEgaGFzaCBvZiBjdXN0b20gY2xhc3NlcywgaXQgd2lsbCB3b3JrIGZhc3RlclxuICAgIGNvbnN0IGN1c3RvbUNsYXNzT2JqZWN0OiB7XG4gICAgICBkYXRlOiBEYXRlO1xuICAgICAgbW9kZTogc3RyaW5nO1xuICAgICAgY2xheno6IHN0cmluZztcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSAqL1xuICAgIH0gPSB0aGlzLmN1c3RvbUNsYXNzLmZpbmQoKGN1c3RvbUNsYXNzOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGN1c3RvbUNsYXNzLmRhdGUudmFsdWVPZigpID09PSBkYXRlLnZhbHVlT2YoKSAmJlxuICAgICAgICBjdXN0b21DbGFzcy5tb2RlID09PSB0aGlzLmRhdGVwaWNrZXJNb2RlXG4gICAgICApO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIGN1c3RvbUNsYXNzT2JqZWN0ID09PSB1bmRlZmluZWQgPyAnJyA6IGN1c3RvbUNsYXNzT2JqZWN0LmNsYXp6O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXBhcmVEYXRlRGlzYWJsZWQoXG4gICAgZGF0ZTFEaXNhYmxlZDogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmcgfSxcbiAgICBkYXRlMjogRGF0ZVxuICApOiBudW1iZXIge1xuICAgIGlmIChkYXRlMURpc2FibGVkID09PSB1bmRlZmluZWQgfHwgZGF0ZTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZTFEaXNhYmxlZC5tb2RlID09PSAnZGF5JyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyRGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlckRheShkYXRlMURpc2FibGVkLmRhdGUsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZTFEaXNhYmxlZC5tb2RlID09PSAnbW9udGgnICYmIHRoaXMuY29tcGFyZUhhbmRsZXJNb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJNb250aChkYXRlMURpc2FibGVkLmRhdGUsIGRhdGUyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZTFEaXNhYmxlZC5tb2RlID09PSAneWVhcicgJiYgdGhpcy5jb21wYXJlSGFuZGxlclllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyWWVhcihkYXRlMURpc2FibGVkLmRhdGUsIGRhdGUyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc0RhdGVEaXNhYmxlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmRhdGVEaXNhYmxlZCkge1xuICAgICAgdGhpcy5kYXRlRGlzYWJsZWQuZm9yRWFjaChcbiAgICAgICAgKGRpc2FibGVkRGF0ZTogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVEYXRlRGlzYWJsZWQoZGlzYWJsZWREYXRlLCBkYXRlKSA9PT0gMCkge1xuICAgICAgICAgICAgaXNEYXRlRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXlEaXNhYmxlZCkge1xuICAgICAgaXNEYXRlRGlzYWJsZWQgPVxuICAgICAgICBpc0RhdGVEaXNhYmxlZCB8fFxuICAgICAgICB0aGlzLmRheURpc2FibGVkLmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgaXNEYXRlRGlzYWJsZWQgfHxcbiAgICAgICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5jb21wYXJlKGRhdGUsIHRoaXMubWluRGF0ZSkgPCAwKSB8fFxuICAgICAgKHRoaXMubWF4RGF0ZSAmJiB0aGlzLmNvbXBhcmUoZGF0ZSwgdGhpcy5tYXhEYXRlKSA+IDApXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbmZpZyB7XG4gIGxvY2FsZSA9ICdlbic7XG4gIGRhdGVwaWNrZXJNb2RlID0gJ2RheSc7XG4gIHN0YXJ0aW5nRGF5ID0gMDtcbiAgeWVhclJhbmdlID0gMjA7XG4gIG1pbk1vZGUgPSAnZGF5JztcbiAgbWF4TW9kZSA9ICd5ZWFyJztcbiAgc2hvd1dlZWtzID0gdHJ1ZTtcbiAgZm9ybWF0RGF5ID0gJ0REJztcbiAgZm9ybWF0TW9udGggPSAnTU1NTSc7XG4gIGZvcm1hdFllYXIgPSAnWVlZWSc7XG4gIGZvcm1hdERheUhlYWRlciA9ICdkZCc7XG4gIGZvcm1hdERheVRpdGxlID0gJ01NTU0gWVlZWSc7XG4gIGZvcm1hdE1vbnRoVGl0bGUgPSAnWVlZWSc7XG4gIG9ubHlDdXJyZW50TW9udGggPSBmYWxzZTtcbiAgbW9udGhDb2xMaW1pdCA9IDM7XG4gIHllYXJDb2xMaW1pdCA9IDU7XG4gIHNob3J0Y3V0UHJvcGFnYXRpb24gPSBmYWxzZTtcbn1cbiIsImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBQcm92aWRlcixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29uZmlnIH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBEQVRFUElDS0VSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmUgKi9cbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3ItbmFtZSBjb21wb25lbnQtc2VsZWN0b3ItdHlwZSAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRhdGVwaWNrZXItaW5uZXIgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSk9XCJvblVwZGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbmZpZy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkYXRlcGlja2VyTW9kZV09XCJkYXRlcGlja2VyTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2luaXREYXRlXT1cImluaXREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWluTW9kZV09XCJtaW5Nb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TW9kZV09XCJtYXhNb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1dlZWtzXT1cInNob3dXZWVrc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdERheV09XCJmb3JtYXREYXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRNb250aF09XCJmb3JtYXRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdFllYXJdPVwiZm9ybWF0WWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdERheUhlYWRlcl09XCJmb3JtYXREYXlIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXREYXlUaXRsZV09XCJmb3JtYXREYXlUaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdE1vbnRoVGl0bGVdPVwiZm9ybWF0TW9udGhUaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0aW5nRGF5XT1cInN0YXJ0aW5nRGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbeWVhclJhbmdlXT1cInllYXJSYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cImN1c3RvbUNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGF0ZURpc2FibGVkXT1cImRhdGVEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RheURpc2FibGVkXT1cImRheURpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb25seUN1cnJlbnRNb250aF09XCJvbmx5Q3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvcnRjdXRQcm9wYWdhdGlvbl09XCJzaG9ydGN1dFByb3BhZ2F0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbW9udGhDb2xMaW1pdF09XCJtb250aENvbExpbWl0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbeWVhckNvbExpbWl0XT1cInllYXJDb2xMaW1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkRvbmUpPVwib25TZWxlY3Rpb25Eb25lKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVEYXRlQ2hhbmdlKT1cIm9uQWN0aXZlRGF0ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8ZGF5cGlja2VyIHRhYmluZGV4PVwiMFwiPjwvZGF5cGlja2VyPlxuICAgICAgPG1vbnRocGlja2VyIHRhYmluZGV4PVwiMFwiPjwvbW9udGhwaWNrZXI+XG4gICAgICA8eWVhcnBpY2tlciB0YWJpbmRleD1cIjBcIj48L3llYXJwaWNrZXI+XG4gICAgPC9kYXRlcGlja2VyLWlubmVyPlxuICAgIGAsXG4gIHByb3ZpZGVyczogW0RBVEVQSUNLRVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG4vKiB0c2xpbnQ6ZW5hYmxlOmNvbXBvbmVudC1zZWxlY3Rvci1uYW1lIGNvbXBvbmVudC1zZWxlY3Rvci10eXBlICovXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgLyoqIHNldHMgZGF0ZXBpY2tlciBtb2RlLCBzdXBwb3J0czogYGRheWAsIGBtb250aGAsIGB5ZWFyYCAqL1xuICBASW5wdXQoKSBkYXRlcGlja2VyTW9kZSA9ICdkYXknO1xuICAvKiogZGVmYXVsdCBkYXRlIHRvIHNob3cgaWYgYG5nLW1vZGVsYCB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkICovXG4gIEBJbnB1dCgpIGluaXREYXRlOiBEYXRlO1xuICAvKiogIG9sZGVzdCBzZWxlY3RhYmxlIGRhdGUgKi9cbiAgQElucHV0KCkgbWluRGF0ZTogRGF0ZTtcbiAgLyoqIGxhdGVzdCBzZWxlY3RhYmxlIGRhdGUgKi9cbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcbiAgLyoqIHNldCBsb3dlciBkYXRlcGlja2VyIG1vZGUsIHN1cHBvcnRzOiBgZGF5YCwgYG1vbnRoYCwgYHllYXJgICovXG4gIEBJbnB1dCgpIG1pbk1vZGU6IHN0cmluZztcbiAgLyoqIHNldHMgdXBwZXIgZGF0ZXBpY2tlciBtb2RlLCBzdXBwb3J0czogYGRheWAsIGBtb250aGAsIGB5ZWFyYCAqL1xuICBASW5wdXQoKSBtYXhNb2RlOiBzdHJpbmc7XG4gIC8qKiBpZiBmYWxzZSB3ZWVrIG51bWJlcnMgd2lsbCBiZSBoaWRkZW4gKi9cbiAgQElucHV0KCkgc2hvd1dlZWtzID0gdHJ1ZTtcbiAgLyoqIGZvcm1hdCBvZiBkYXkgaW4gbW9udGggKi9cbiAgQElucHV0KCkgZm9ybWF0RGF5OiBzdHJpbmc7XG4gIC8qKiBmb3JtYXQgb2YgbW9udGggaW4geWVhciAqL1xuICBASW5wdXQoKSBmb3JtYXRNb250aDogc3RyaW5nO1xuICAvKiogZm9ybWF0IG9mIHllYXIgaW4geWVhciByYW5nZSAqL1xuICBASW5wdXQoKSBmb3JtYXRZZWFyOiBzdHJpbmc7XG4gIC8qKiBmb3JtYXQgb2YgZGF5IGluIHdlZWsgaGVhZGVyICovXG4gIEBJbnB1dCgpIGZvcm1hdERheUhlYWRlcjogc3RyaW5nO1xuICAvKiogZm9ybWF0IG9mIHRpdGxlIHdoZW4gc2VsZWN0aW5nIGRheSAqL1xuICBASW5wdXQoKSBmb3JtYXREYXlUaXRsZTogc3RyaW5nO1xuICAvKiogZm9ybWF0IG9mIHRpdGxlIHdoZW4gc2VsZWN0aW5nIG1vbnRoICovXG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoVGl0bGU6IHN0cmluZztcbiAgLyoqIHN0YXJ0aW5nIGRheSBvZiB0aGUgd2VlayBmcm9tIDAtNiAoMD1TdW5kYXksIC4uLiwgNj1TYXR1cmRheSkgKi9cbiAgQElucHV0KCkgc3RhcnRpbmdEYXk6IG51bWJlcjtcbiAgLyoqIG51bWJlciBvZiB5ZWFycyBkaXNwbGF5ZWQgaW4geWVhciBzZWxlY3Rpb24gKi9cbiAgQElucHV0KCkgeWVhclJhbmdlOiBudW1iZXI7XG4gIC8qKiBpZiB0cnVlIG9ubHkgZGF0ZXMgZnJvbSB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBtb250aCB3aWxsIGJlIHNob3duICovXG4gIEBJbnB1dCgpIG9ubHlDdXJyZW50TW9udGg6IGJvb2xlYW47XG4gIC8qKiBpZiB0cnVlIHNob3J0Y3V0YHMgZXZlbnQgcHJvcGFnYXRpb24gd2lsbCBiZSBkaXNhYmxlZCAqL1xuICBASW5wdXQoKSBzaG9ydGN1dFByb3BhZ2F0aW9uOiBib29sZWFuO1xuICAvKiogbnVtYmVyIG9mIG1vbnRocyBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgcm93IG9mIG1vbnRoIHBpY2tlciAqL1xuICBASW5wdXQoKSBtb250aENvbExpbWl0OiBudW1iZXI7XG4gIC8qKiBudW1iZXIgb2YgeWVhcnMgZGlzcGxheWVkIGluIGEgc2luZ2xlIHJvdyBvZiB5ZWFyIHBpY2tlciAqL1xuICBASW5wdXQoKSB5ZWFyQ29sTGltaXQ6IG51bWJlcjtcbiAgLyoqIGFycmF5IG9mIGN1c3RvbSBjc3MgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRhcmdldGVkIGRhdGVzICovXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZzsgY2xheno6IHN0cmluZyB9W107XG4gIC8qKiBhcnJheSBvZiBkaXNhYmxlZCBkYXRlcyAqL1xuICBASW5wdXQoKSBkYXRlRGlzYWJsZWQ6IHsgZGF0ZTogRGF0ZTsgbW9kZTogc3RyaW5nIH1bXTtcbiAgLyoqIGRpc2FibGVkIGRheXMgb2YgdGhlIHdlZWsgZnJvbSAwLTYgKDA9U3VuZGF5LCAuLi4sIDY9U2F0dXJkYXkpICovXG4gIEBJbnB1dCgpIGRheURpc2FibGVkOiBudW1iZXJbXTtcblxuICAvKiogY3VycmVudGx5IGFjdGl2ZSBkYXRlICovXG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVEYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlIHx8IHRoaXMuX25vdztcbiAgfVxuXG4gIHNldCBhY3RpdmVEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIHNlbGVjdGlvbkRvbmU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4odW5kZWZpbmVkKTtcblxuICAvKiogY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIGFjdGl2ZURhdGUgaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpXG4gIGFjdGl2ZURhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgQFZpZXdDaGlsZChEYXRlUGlja2VySW5uZXJDb21wb25lbnQpXG4gIF9kYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQ7XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnkqL1xuICBvbkNoYW5nZTogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIG9uVG91Y2hlZDogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4gIGNvbmZpZzogRGF0ZXBpY2tlckNvbmZpZztcblxuICBwcm90ZWN0ZWQgX25vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHByb3RlY3RlZCBfYWN0aXZlRGF0ZTogRGF0ZTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IERhdGVwaWNrZXJDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMoKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBvblVwZGF0ZShldmVudDogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlRGF0ZSA9IGV2ZW50O1xuICAgIHRoaXMub25DaGFuZ2UoZXZlbnQpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25Eb25lKGV2ZW50OiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Eb25lLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25BY3RpdmVEYXRlQ2hhbmdlKGV2ZW50OiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVEYXRlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG4gIC8vIHRvZG86IHN1cHBvcnQgbnVsbCB2YWx1ZVxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueSovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kYXRlUGlja2VyLmNvbXBhcmUodmFsdWUsIHRoaXMuX2FjdGl2ZURhdGUpID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZGF0ZVBpY2tlci5zZWxlY3QodmFsdWUsIGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHZhbHVlID8gbmV3IERhdGUodmFsdWUpIDogdm9pZCAwO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxufVxuIiwiLy8gQGRlcHJlY2F0ZWRcbi8vIHRzbGludDpkaXNhYmxlXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNCczMgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3V0aWxzJztcbmltcG9ydCB7IERhdGVQaWNrZXJJbm5lckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci1pbm5lci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXlwaWNrZXInLFxuICB0ZW1wbGF0ZTogYFxuPHRhYmxlICpuZ0lmPVwiZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheSdcIiByb2xlPVwiZ3JpZFwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJkYXRlUGlja2VyLnVuaXF1ZUlkICsgJy10aXRsZSdcIiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9XCJhY3RpdmVEYXRlSWRcIj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc0JzNFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBidG4tc20gcHVsbC1sZWZ0IGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoLTEpXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+w6LCgMK5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJpc0JzNFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBidG4tc20gcHVsbC1sZWZ0IGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoLTEpXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+Jmx0OzwvYnV0dG9uPlxuICAgICAgPC90aD5cbiAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIjUgKyAoZGF0ZVBpY2tlci5zaG93V2Vla3MgPyAxIDogMClcIj5cbiAgICAgICAgPGJ1dHRvbiBbaWRdPVwiZGF0ZVBpY2tlci51bmlxdWVJZCArICctdGl0bGUnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnRvZ2dsZU1vZGUoMClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlID09PSBkYXRlUGlja2VyLm1heE1vZGVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gZGF0ZVBpY2tlci5tYXhNb2RlfVwiIHRhYmluZGV4PVwiLTFcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCI+XG4gICAgICAgICAgPHN0cm9uZz57eyB0aXRsZSB9fTwvc3Ryb25nPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgICA8dGg+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNCczRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnkgYnRuLXNtIHB1bGwtcmlnaHQgZmxvYXQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoMSlcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj7DosKAwro8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzQnM0XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBwdWxsLXJpZ2h0IGZsb2F0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKDEpXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+Jmd0O1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgPC90cj5cbiAgICA8dHI+XG4gICAgICA8dGggKm5nSWY9XCJkYXRlUGlja2VyLnNob3dXZWVrc1wiPjwvdGg+XG4gICAgICA8dGggKm5nRm9yPVwibGV0IGxhYmVseiBvZiBsYWJlbHNcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxzbWFsbCBhcmlhLWxhYmVsPVwibGFiZWx6LmZ1bGxcIj48Yj57eyBsYWJlbHouYWJiciB9fTwvYj48L3NtYWxsPlxuICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgPG5nLXRlbXBsYXRlIG5nRm9yIFtuZ0Zvck9mXT1cInJvd3NcIiBsZXQtcm93ej1cIiRpbXBsaWNpdFwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gICAgICA8dHIgKm5nSWY9XCIhKGRhdGVQaWNrZXIub25seUN1cnJlbnRNb250aCAmJiByb3d6WzBdLnNlY29uZGFyeSAmJiByb3d6WzZdLnNlY29uZGFyeSlcIj5cbiAgICAgICAgPHRkICpuZ0lmPVwiZGF0ZVBpY2tlci5zaG93V2Vla3NcIiBjbGFzcz1cImg2XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxlbT57eyB3ZWVrTnVtYmVyc1tpbmRleF0gfX08L2VtPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGR0eiBvZiByb3d6XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIHJvbGU9XCJncmlkY2VsbFwiIFtpZF09XCJkdHoudWlkXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6MTAwJTtcIiBjbGFzcz1cImJ0biBidG4tc20ge3tkdHouY3VzdG9tQ2xhc3N9fVwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoZGF0ZVBpY2tlci5vbmx5Q3VycmVudE1vbnRoICYmIGR0ei5zZWNvbmRhcnkpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYnRuLXNlY29uZGFyeSc6IGlzQnM0ICYmICFkdHouc2VsZWN0ZWQgJiYgIWRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KSwgJ2J0bi1pbmZvJzogZHR6LnNlbGVjdGVkLCBkaXNhYmxlZDogZHR6LmRpc2FibGVkLCBhY3RpdmU6ICFpc0JzNCAmJiBkYXRlUGlja2VyLmlzQWN0aXZlKGR0eiksICdidG4tZGVmYXVsdCc6ICFpc0JzNH1cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImR0ei5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5zZWxlY3QoZHR6LmRhdGUpXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd0ZXh0LW11dGVkJzogZHR6LnNlY29uZGFyeSB8fCBkdHouY3VycmVudCwgJ3RleHQtaW5mbyc6ICFpc0JzNCAmJiBkdHouY3VycmVudH1cIj57eyBkdHoubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgOmhvc3QgLmJ0bi1zZWNvbmRhcnkge1xuICAgICAgY29sb3I6ICMyOTJiMmM7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjY2NjO1xuICAgIH1cbiAgICA6aG9zdCAuYnRuLWluZm8gLnRleHQtbXV0ZWQge1xuICAgICAgY29sb3I6ICMyOTJiMmMgIWltcG9ydGFudDtcbiAgICB9XG4gIGBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXlQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBsYWJlbHM6IGFueVtdID0gW107XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHJvd3M6IGFueVtdID0gW107XG4gIHdlZWtOdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xuICBkYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoZGF0ZVBpY2tlcjogRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRlUGlja2VyID0gZGF0ZVBpY2tlcjtcbiAgfVxuXG4gIGdldCBpc0JzNCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzQnMzKCk7XG4gIH1cblxuICAvKnByb3RlY3RlZCBnZXREYXlzSW5Nb250aCh5ZWFyOm51bWJlciwgbW9udGg6bnVtYmVyKSB7XG4gICByZXR1cm4gKChtb250aCA9PT0gMSkgJiYgKHllYXIgJSA0ID09PSAwKSAmJlxuICAgKCh5ZWFyICUgMTAwICE9PSAwKSB8fCAoeWVhciAlIDQwMCA9PT0gMCkpKSA/IDI5IDogREFZU19JTl9NT05USFttb250aF07XG4gICB9Ki9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIuc3RlcERheSA9IHsgbW9udGhzOiAxIH07XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIuc2V0UmVmcmVzaFZpZXdIYW5kbGVyKGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgbW9udGggPSB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKTtcbiAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0aGlzLnN0YXJ0aW5nRGF5IC0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgY29uc3QgbnVtRGlzcGxheWVkRnJvbVByZXZpb3VzTW9udGggPVxuICAgICAgICBkaWZmZXJlbmNlID4gMCA/IDcgLSBkaWZmZXJlbmNlIDogLWRpZmZlcmVuY2U7XG4gICAgICBjb25zdCBmaXJzdERhdGUgPSBuZXcgRGF0ZShmaXJzdERheU9mTW9udGguZ2V0VGltZSgpKTtcblxuICAgICAgaWYgKG51bURpc3BsYXllZEZyb21QcmV2aW91c01vbnRoID4gMCkge1xuICAgICAgICBmaXJzdERhdGUuc2V0RGF0ZSgtbnVtRGlzcGxheWVkRnJvbVByZXZpb3VzTW9udGggKyAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gNDIgaXMgdGhlIG51bWJlciBvZiBkYXlzIG9uIGEgc2l4LXdlZWsgY2FsZW5kYXJcbiAgICAgIGNvbnN0IF9kYXlzOiBEYXRlW10gPSBzZWxmLmdldERhdGVzKGZpcnN0RGF0ZSwgNDIpO1xuICAgICAgY29uc3QgZGF5czogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkrKykge1xuICAgICAgICBjb25zdCBfZGF0ZU9iamVjdCA9IHRoaXMuY3JlYXRlRGF0ZU9iamVjdChfZGF5c1tpXSwgdGhpcy5mb3JtYXREYXkpO1xuICAgICAgICBfZGF0ZU9iamVjdC5zZWNvbmRhcnkgPSBfZGF5c1tpXS5nZXRNb250aCgpICE9PSBtb250aDtcbiAgICAgICAgX2RhdGVPYmplY3QudWlkID0gdGhpcy51bmlxdWVJZCArICctJyArIGk7XG4gICAgICAgIGRheXNbaV0gPSBfZGF0ZU9iamVjdDtcbiAgICAgIH1cblxuICAgICAgc2VsZi5sYWJlbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgIHNlbGYubGFiZWxzW2pdID0ge307XG4gICAgICAgIHNlbGYubGFiZWxzW2pdLmFiYnIgPSB0aGlzLmRhdGVGaWx0ZXIoXG4gICAgICAgICAgZGF5c1tqXS5kYXRlLFxuICAgICAgICAgIHRoaXMuZm9ybWF0RGF5SGVhZGVyXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYubGFiZWxzW2pdLmZ1bGwgPSB0aGlzLmRhdGVGaWx0ZXIoZGF5c1tqXS5kYXRlLCAnRUVFRScpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnRpdGxlID0gdGhpcy5kYXRlRmlsdGVyKHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5mb3JtYXREYXlUaXRsZSk7XG4gICAgICBzZWxmLnJvd3MgPSB0aGlzLnNwbGl0KGRheXMsIDcpO1xuXG4gICAgICBpZiAodGhpcy5zaG93V2Vla3MpIHtcbiAgICAgICAgc2VsZi53ZWVrTnVtYmVycyA9IFtdO1xuICAgICAgICBjb25zdCB0aHVyc2RheUluZGV4ID0gKDQgKyA3IC0gdGhpcy5zdGFydGluZ0RheSkgJSA3O1xuICAgICAgICBjb25zdCBudW1XZWVrcyA9IHNlbGYucm93cy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGN1cldlZWsgPSAwOyBjdXJXZWVrIDwgbnVtV2Vla3M7IGN1cldlZWsrKykge1xuICAgICAgICAgIHNlbGYud2Vla051bWJlcnMucHVzaChcbiAgICAgICAgICAgIHNlbGYuZ2V0SVNPODYwMVdlZWtOdW1iZXIoc2VsZi5yb3dzW2N1cldlZWtdW3RodXJzZGF5SW5kZXhdLmRhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sICdkYXknKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5zZXRDb21wYXJlSGFuZGxlcihmdW5jdGlvbihcbiAgICAgIGRhdGUxOiBEYXRlLFxuICAgICAgZGF0ZTI6IERhdGVcbiAgICApOiBudW1iZXIge1xuICAgICAgY29uc3QgZDEgPSBuZXcgRGF0ZShkYXRlMS5nZXRGdWxsWWVhcigpLCBkYXRlMS5nZXRNb250aCgpLCBkYXRlMS5nZXREYXRlKCkpO1xuICAgICAgY29uc3QgZDIgPSBuZXcgRGF0ZShkYXRlMi5nZXRGdWxsWWVhcigpLCBkYXRlMi5nZXRNb250aCgpLCBkYXRlMi5nZXREYXRlKCkpO1xuICAgICAgcmV0dXJuIGQxLmdldFRpbWUoKSAtIGQyLmdldFRpbWUoKTtcbiAgICB9LCAnZGF5Jyk7XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREYXRlcyhzdGFydERhdGU6IERhdGUsIG46IG51bWJlcik6IERhdGVbXSB7XG4gICAgY29uc3QgZGF0ZXM6IERhdGVbXSA9IG5ldyBBcnJheShuKTtcbiAgICBsZXQgY3VycmVudCA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRUaW1lKCkpO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgZGF0ZTogRGF0ZTtcbiAgICB3aGlsZSAoaSA8IG4pIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShjdXJyZW50LmdldFRpbWUoKSk7XG4gICAgICBkYXRlID0gdGhpcy5kYXRlUGlja2VyLmZpeFRpbWVab25lKGRhdGUpO1xuICAgICAgZGF0ZXNbaSsrXSA9IGRhdGU7XG4gICAgICBjdXJyZW50ID0gbmV3IERhdGUoXG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXRlLmdldERhdGUoKSArIDFcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJU084NjAxV2Vla051bWJlcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICBjb25zdCBjaGVja0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XG4gICAgLy8gVGh1cnNkYXlcbiAgICBjaGVja0RhdGUuc2V0RGF0ZShjaGVja0RhdGUuZ2V0RGF0ZSgpICsgNCAtIChjaGVja0RhdGUuZ2V0RGF5KCkgfHwgNykpO1xuICAgIGNvbnN0IHRpbWUgPSBjaGVja0RhdGUuZ2V0VGltZSgpO1xuICAgIC8vIENvbXBhcmUgd2l0aCBKYW4gMVxuICAgIGNoZWNrRGF0ZS5zZXRNb250aCgwKTtcbiAgICBjaGVja0RhdGUuc2V0RGF0ZSgxKTtcbiAgICByZXR1cm4gKFxuICAgICAgTWF0aC5mbG9vcihNYXRoLnJvdW5kKCh0aW1lIC0gY2hlY2tEYXRlLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgLyA3KSArIDFcbiAgICApO1xuICB9XG5cbiAgLy8gdG9kbzoga2V5IGV2ZW50cyBpbXBsZW1lbnRhdGlvblxufVxuIiwiLy8gQGRlcHJlY2F0ZWRcbi8vIHRzbGludDpkaXNhYmxlXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBpc0JzMyB9IGZyb20gJ25neC1ib290c3RyYXAvdXRpbHMnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21vbnRocGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbjx0YWJsZSAqbmdJZj1cImRhdGVQaWNrZXIuZGF0ZXBpY2tlck1vZGU9PT0nbW9udGgnXCIgcm9sZT1cImdyaWRcIj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtbGVmdCBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKC0xKVwiIHRhYmluZGV4PVwiLTFcIj7DosKAwrk8L2J1dHRvbj48L3RoPlxuICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiKChkYXRlUGlja2VyLm1vbnRoQ29sTGltaXQgLSAyKSA8PSAwKSA/IDEgOiBkYXRlUGlja2VyLm1vbnRoQ29sTGltaXQgLSAyXCI+XG4gICAgICAgIDxidXR0b24gW2lkXT1cImRhdGVQaWNrZXIudW5pcXVlSWQgKyAnLXRpdGxlJ1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVQaWNrZXIudG9nZ2xlTW9kZSgwKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRhdGVQaWNrZXIuZGF0ZXBpY2tlck1vZGUgPT09IG1heE1vZGVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gbWF4TW9kZX1cIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGl0bGUgfX08L3N0cm9uZz4gXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC90aD5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtcmlnaHQgZmxvYXQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLm1vdmUoMSlcIiB0YWJpbmRleD1cIi0xXCI+w6LCgMK6PC9idXR0b24+XG4gICAgICA8L3RoPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICA8dHIgKm5nRm9yPVwibGV0IHJvd3ogb2Ygcm93c1wiPlxuICAgICAgPHRkICpuZ0Zvcj1cImxldCBkdHogb2Ygcm93elwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIiByb2xlPVwiZ3JpZGNlbGxcIiBbYXR0ci5pZF09XCJkdHoudWlkXCIgW25nQ2xhc3NdPVwiZHR6LmN1c3RvbUNsYXNzXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwibWluLXdpZHRoOjEwMCU7XCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYnRuLWxpbmsnOiBpc0JzNCAmJiAhZHR6LnNlbGVjdGVkICYmICFkYXRlUGlja2VyLmlzQWN0aXZlKGR0eiksICdidG4taW5mbyc6IGR0ei5zZWxlY3RlZCB8fCAoaXNCczQgJiYgIWR0ei5zZWxlY3RlZCAmJiBkYXRlUGlja2VyLmlzQWN0aXZlKGR0eikpLCBkaXNhYmxlZDogZHR6LmRpc2FibGVkLCBhY3RpdmU6ICFpc0JzNCAmJiBkYXRlUGlja2VyLmlzQWN0aXZlKGR0eil9XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZHR6LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5zZWxlY3QoZHR6LmRhdGUpXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsndGV4dC1zdWNjZXNzJzogaXNCczQgJiYgZHR6LmN1cnJlbnQsICd0ZXh0LWluZm8nOiAhaXNCczQgJiYgZHR6LmN1cnJlbnR9XCI+e3sgZHR6LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICA6aG9zdCAuYnRuLWluZm8gLnRleHQtc3VjY2VzcyB7XG4gICAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICAgIH1cbiAgYFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1vbnRoUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgcm93czogYW55W10gPSBbXTtcbiAgZGF0ZVBpY2tlcjogRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50O1xuICBtYXhNb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0ZVBpY2tlcjogRGF0ZVBpY2tlcklubmVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRlUGlja2VyID0gZGF0ZVBpY2tlcjtcbiAgfVxuXG4gIGdldCBpc0JzNCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzQnMzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5zdGVwTW9udGggPSB7IHllYXJzOiAxIH07XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIuc2V0UmVmcmVzaFZpZXdIYW5kbGVyKGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgbW9udGhzOiBhbnlbXSA9IG5ldyBBcnJheSgxMik7XG4gICAgICBjb25zdCB5ZWFyOiBudW1iZXIgPSB0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGxldCBkYXRlOiBEYXRlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIGksIDEpO1xuICAgICAgICBkYXRlID0gdGhpcy5maXhUaW1lWm9uZShkYXRlKTtcbiAgICAgICAgbW9udGhzW2ldID0gdGhpcy5jcmVhdGVEYXRlT2JqZWN0KGRhdGUsIHRoaXMuZm9ybWF0TW9udGgpO1xuICAgICAgICBtb250aHNbaV0udWlkID0gdGhpcy51bmlxdWVJZCArICctJyArIGk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYudGl0bGUgPSB0aGlzLmRhdGVGaWx0ZXIodGhpcy5hY3RpdmVEYXRlLCB0aGlzLmZvcm1hdE1vbnRoVGl0bGUpO1xuICAgICAgc2VsZi5yb3dzID0gdGhpcy5zcGxpdChtb250aHMsIHNlbGYuZGF0ZVBpY2tlci5tb250aENvbExpbWl0KTtcbiAgICB9LCAnbW9udGgnKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5zZXRDb21wYXJlSGFuZGxlcihmdW5jdGlvbihcbiAgICAgIGRhdGUxOiBEYXRlLFxuICAgICAgZGF0ZTI6IERhdGVcbiAgICApOiBudW1iZXIge1xuICAgICAgY29uc3QgZDEgPSBuZXcgRGF0ZShkYXRlMS5nZXRGdWxsWWVhcigpLCBkYXRlMS5nZXRNb250aCgpKTtcbiAgICAgIGNvbnN0IGQyID0gbmV3IERhdGUoZGF0ZTIuZ2V0RnVsbFllYXIoKSwgZGF0ZTIuZ2V0TW9udGgoKSk7XG4gICAgICByZXR1cm4gZDEuZ2V0VGltZSgpIC0gZDIuZ2V0VGltZSgpO1xuICAgIH0sICdtb250aCcpO1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICAvLyB0b2RvOiBrZXkgZXZlbnRzIGltcGxlbWVudGF0aW9uXG59XG4iLCIvLyBAZGVwcmVjYXRlZFxuLy8gdHNsaW50OmRpc2FibGVcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGlzQnMzIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC91dGlscyc7XG5pbXBvcnQgeyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXItaW5uZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneWVhcnBpY2tlcicsXG4gIHRlbXBsYXRlOiBgXG48dGFibGUgKm5nSWY9XCJkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlPT09J3llYXInXCIgcm9sZT1cImdyaWRcIj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtbGVmdCBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKC0xKVwiIHRhYmluZGV4PVwiLTFcIj7DosKAwrk8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgICA8dGggW2F0dHIuY29sc3Bhbl09XCIoKGRhdGVQaWNrZXIueWVhckNvbExpbWl0IC0gMikgPD0gMCkgPyAxIDogZGF0ZVBpY2tlci55ZWFyQ29sTGltaXQgLSAyXCI+XG4gICAgICAgIDxidXR0b24gW2lkXT1cImRhdGVQaWNrZXIudW5pcXVlSWQgKyAnLXRpdGxlJ1wiIHJvbGU9XCJoZWFkaW5nXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci50b2dnbGVNb2RlKDApXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gZGF0ZVBpY2tlci5tYXhNb2RlXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6IGRhdGVQaWNrZXIuZGF0ZXBpY2tlck1vZGUgPT09IGRhdGVQaWNrZXIubWF4TW9kZX1cIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGl0bGUgfX08L3N0cm9uZz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3RoPlxuICAgICAgPHRoPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1yaWdodCBmbG9hdC1yaWdodFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVQaWNrZXIubW92ZSgxKVwiIHRhYmluZGV4PVwiLTFcIj7DosKAwro8L2J1dHRvbj5cbiAgICAgIDwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93eiBvZiByb3dzXCI+XG4gICAgICA8dGQgKm5nRm9yPVwibGV0IGR0eiBvZiByb3d6XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIHJvbGU9XCJncmlkY2VsbFwiIFthdHRyLmlkXT1cImR0ei51aWRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6MTAwJTtcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydidG4tbGluayc6IGlzQnM0ICYmICFkdHouc2VsZWN0ZWQgJiYgIWRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KSwgJ2J0bi1pbmZvJzogZHR6LnNlbGVjdGVkIHx8IChpc0JzNCAmJiAhZHR6LnNlbGVjdGVkICYmIGRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KSksIGRpc2FibGVkOiBkdHouZGlzYWJsZWQsIGFjdGl2ZTogIWlzQnM0ICYmIGRhdGVQaWNrZXIuaXNBY3RpdmUoZHR6KX1cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkdHouZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnNlbGVjdChkdHouZGF0ZSlcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd0ZXh0LXN1Y2Nlc3MnOiBpc0JzNCAmJiBkdHouY3VycmVudCwgJ3RleHQtaW5mbyc6ICFpc0JzNCAmJiBkdHouY3VycmVudH1cIj57eyBkdHoubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgIDpob3N0IC5idG4taW5mbyAudGV4dC1zdWNjZXNzIHtcbiAgICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG4gICAgfVxuICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgWWVhclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRhdGVQaWNrZXI6IERhdGVQaWNrZXJJbm5lckNvbXBvbmVudDtcbiAgdGl0bGU6IHN0cmluZztcbiAgcm93czogYW55W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXIgPSBkYXRlUGlja2VyO1xuICB9XG5cbiAgZ2V0IGlzQnM0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNCczMoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnN0ZXBZZWFyID0geyB5ZWFyczogdGhpcy5kYXRlUGlja2VyLnllYXJSYW5nZSB9O1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnNldFJlZnJlc2hWaWV3SGFuZGxlcihmdW5jdGlvbigpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHllYXJzOiBhbnlbXSA9IG5ldyBBcnJheSh0aGlzLnllYXJSYW5nZSk7XG4gICAgICBsZXQgZGF0ZTogRGF0ZTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gc2VsZi5nZXRTdGFydGluZ1llYXIodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueWVhclJhbmdlOyBpKyspIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0YXJ0ICsgaSwgMCwgMSk7XG4gICAgICAgIGRhdGUgPSB0aGlzLmZpeFRpbWVab25lKGRhdGUpO1xuICAgICAgICB5ZWFyc1tpXSA9IHRoaXMuY3JlYXRlRGF0ZU9iamVjdChkYXRlLCB0aGlzLmZvcm1hdFllYXIpO1xuICAgICAgICB5ZWFyc1tpXS51aWQgPSB0aGlzLnVuaXF1ZUlkICsgJy0nICsgaTtcbiAgICAgIH1cblxuICAgICAgc2VsZi50aXRsZSA9IFt5ZWFyc1swXS5sYWJlbCwgeWVhcnNbdGhpcy55ZWFyUmFuZ2UgLSAxXS5sYWJlbF0uam9pbihcbiAgICAgICAgJyAtICdcbiAgICAgICk7XG4gICAgICBzZWxmLnJvd3MgPSB0aGlzLnNwbGl0KHllYXJzLCBzZWxmLmRhdGVQaWNrZXIueWVhckNvbExpbWl0KTtcbiAgICB9LCAneWVhcicpO1xuXG4gICAgdGhpcy5kYXRlUGlja2VyLnNldENvbXBhcmVIYW5kbGVyKGZ1bmN0aW9uKFxuICAgICAgZGF0ZTE6IERhdGUsXG4gICAgICBkYXRlMjogRGF0ZVxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gZGF0ZTEuZ2V0RnVsbFllYXIoKSAtIGRhdGUyLmdldEZ1bGxZZWFyKCk7XG4gICAgfSwgJ3llYXInKTtcblxuICAgIHRoaXMuZGF0ZVBpY2tlci5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFN0YXJ0aW5nWWVhcih5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIHRvZG86IHBhcnNlSW50XG4gICAgcmV0dXJuIChcbiAgICAgICh5ZWFyIC0gMSkgLyB0aGlzLmRhdGVQaWNrZXIueWVhclJhbmdlICogdGhpcy5kYXRlUGlja2VyLnllYXJSYW5nZSArIDFcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXItaW5uZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29uZmlnJztcbmltcG9ydCB7IERheVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF5cGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb250aFBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vbW9udGhwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFllYXJQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL3llYXJwaWNrZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEYXRlUGlja2VyQ29tcG9uZW50LFxuICAgIERhdGVQaWNrZXJJbm5lckNvbXBvbmVudCxcbiAgICBEYXlQaWNrZXJDb21wb25lbnQsXG4gICAgTW9udGhQaWNrZXJDb21wb25lbnQsXG4gICAgWWVhclBpY2tlckNvbXBvbmVudFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgICBEYXRlUGlja2VySW5uZXJDb21wb25lbnQsXG4gICAgRGF5UGlja2VyQ29tcG9uZW50LFxuICAgIE1vbnRoUGlja2VyQ29tcG9uZW50LFxuICAgIFllYXJQaWNrZXJDb21wb25lbnRcbiAgXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRGF0ZVBpY2tlckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlck1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xuICAgIHJldHVybiB7IG5nTW9kdWxlOiBEYXRlcGlja2VyTW9kdWxlLCBwcm92aWRlcnM6IFtEYXRlcGlja2VyQ29uZmlnXSB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsidHNsaWJfMS5fX3ZhbHVlcyIsImhlaWdodCIsIndpZHRoIiwic2hpZnQiLCJ0c2xpYl8xLl9fZXh0ZW5kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7OzhCQTJDbUIsYUFBYTs7NkJBR2QsQ0FBQzs7OzsrQkFJQyxJQUFJOytCQUVKLEdBQUc7OzhCQUVKLEtBQUs7Ozs7Z0NBSUgsR0FBRzs7MEJBR1QsTUFBTTt5QkFDUCxNQUFNO3dCQUNQLEdBQUc7MEJBQ0QsTUFBTTt5QkFDUCxNQUFNOzJCQUNKLEdBQUc7OztnQkF2RGxCLFVBQVU7OzZCQVhYOzs7Ozs7Ozs7O0FDaUJBOzs7QUFBQTs7aUNBS3VDLEVBQUU7O0lBRXZDLHNCQUFJLGtEQUFPOzs7OztRQUFYLFVBQVksS0FBVztZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FB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