vite.config.ts.timestamp-1724225267534-70b77886d070a.mjs 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. // vite.config.ts
  2. import { loadEnv } from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/vite@5.1.3_@types+node@17.0.45_less@4.1.3_sass@1.53.0/node_modules/vite/dist/node/index.js";
  3. import path, { resolve } from "path";
  4. // build/utils.ts
  5. import dotenv from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/dotenv@16.0.1/node_modules/dotenv/lib/main.js";
  6. function isReportMode() {
  7. return process.env.REPORT === "true";
  8. }
  9. function wrapperEnv(envConf) {
  10. const ret = {};
  11. for (const envName of Object.keys(envConf)) {
  12. let realName = envConf[envName].replace(/\\n/g, "\n");
  13. realName = realName === "true" ? true : realName === "false" ? false : realName;
  14. if (envName === "VITE_PORT") {
  15. realName = Number(realName);
  16. }
  17. if (envName === "VITE_PROXY") {
  18. try {
  19. realName = JSON.parse(realName);
  20. } catch (error) {
  21. }
  22. }
  23. ret[envName] = realName;
  24. process.env[envName] = realName;
  25. }
  26. return ret;
  27. }
  28. // build/vite/plugin/index.ts
  29. import vue from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/@vitejs+plugin-vue@2.3.3_vite@5.1.3_vue@3.3.4/node_modules/@vitejs/plugin-vue/dist/index.js";
  30. import vueJsx from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/@vitejs+plugin-vue-jsx@1.3.10/node_modules/@vitejs/plugin-vue-jsx/index.js";
  31. import VueSetupExtend from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/vite-plugin-vue-setup-extend@0.4.0_vite@5.1.3/node_modules/vite-plugin-vue-setup-extend/dist/index.mjs";
  32. // build/vite/plugin/html.ts
  33. import { createHtmlPlugin } from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/vite-plugin-html@3.2.2_vite@5.1.3/node_modules/vite-plugin-html/dist/index.mjs";
  34. // package.json
  35. var package_default = {
  36. name: "skyeye-admin-fe",
  37. version: "1.3.9",
  38. private: true,
  39. type: "module",
  40. scripts: {
  41. bootstrap: "pnpm install",
  42. serve: "pnpm run dev",
  43. dev: "vite",
  44. createConfig: "esno ./build/script/postBuild.ts",
  45. build: "cross-env NODE_ENV=production vite build",
  46. "build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts",
  47. "build:no-cache": "pnpm clean:cache && pnpm run build",
  48. report: "cross-env REPORT=true pnpm run build",
  49. "type:check": "vue-tsc --noEmit --skipLibCheck",
  50. preview: "pnpm run build && vite preview",
  51. "preview:dist": "vite preview",
  52. "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
  53. "clean:lib": "rimraf node_modules",
  54. "lint:eslint": 'eslint "{src,mock}/**/*.{vue,ts,tsx}" --fix',
  55. "lint:prettier": 'prettier --write --loglevel warn "src/**/*.{js,json,tsx,css,less,scss,vue,html,md}"',
  56. "lint:stylelint": 'stylelint --fix "**/*.{vue,less,postcss,css,scss}" --cache --cache-location node_modules/.cache/stylelint/',
  57. "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
  58. "lint:pretty": "pretty-quick --staged",
  59. "test prod gzip": "http-server dist --cors --gzip -c-1",
  60. reinstall: "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && pnpm run bootstrap",
  61. "build typecheck": "vuedx-typecheck . && vite build",
  62. deploy: "gh-pages -d dist",
  63. publish: "esno ./build/publish/publish.ts"
  64. },
  65. dependencies: {
  66. "@element-plus/icons-vue": "2.0.9",
  67. "@types/fabric": "5.3.6",
  68. "@vicons/antd": "0.12.0",
  69. "@vicons/ionicons5": "0.12.0",
  70. "@vueup/vue-quill": "1.0.0-beta.8",
  71. "@vueuse/core": "8.9.4",
  72. "@vueuse/router": "10.6.1",
  73. "@wangeditor/editor": "5.1.23",
  74. "@wangeditor/editor-for-vue": "5.1.12",
  75. "animate.css": "4.1.1",
  76. archiver: "^7.0.1",
  77. axios: "0.27.2",
  78. "blueimp-md5": "2.19.0",
  79. canvg: "4.0.1",
  80. cropperjs: "1.5.12",
  81. dayjs: "1.11.4",
  82. echarts: "5.3.3",
  83. "element-plus": "2.7.1",
  84. "element-resize-detector": "1.2.4",
  85. "form-data": "^4.0.0",
  86. html2canvas: "1.0.0",
  87. konva: "9.3.0",
  88. "lodash-es": "4.17.21",
  89. mockjs: "1.1.0",
  90. "mpegts.js": "1.7.3",
  91. nprogress: "0.2.0",
  92. "number-precision": "1.6.0",
  93. "perfect-scrollbar": "1.5.5",
  94. pinia: "2.0.16",
  95. "print-js": "1.6.0",
  96. qrcode: "1.5.1",
  97. qs: "6.11.0",
  98. uid: "2.0.2",
  99. "url-join": "5.0.0",
  100. vue: "3.3.4",
  101. "vue-echarts": "^6.6.8",
  102. "vue-hooks-plus": "1.8.6",
  103. "vue-konva": "3.0.2",
  104. "vue-router": "4.1.2",
  105. "vue-types": "4.1.1",
  106. vuedraggable: "4.1.0",
  107. xlsx: "0.18.5"
  108. },
  109. devDependencies: {
  110. "@commitlint/cli": "17.0.3",
  111. "@commitlint/config-conventional": "17.0.3",
  112. "@types/element-resize-detector": "1.1.3",
  113. "@types/intro.js": "3.0.2",
  114. "@types/lodash-es": "4.17.6",
  115. "@types/node": "17.0.45",
  116. "@types/qrcode": "1.4.2",
  117. "@typescript-eslint/eslint-plugin": "5.30.7",
  118. "@typescript-eslint/parser": "5.30.7",
  119. "@vitejs/plugin-vue": "2.3.3",
  120. "@vitejs/plugin-vue-jsx": "1.3.10",
  121. "@vue/compiler-sfc": "3.3.4",
  122. autoprefixer: "10.4.7",
  123. chalk: "5.3.0",
  124. colors: "1.4.0",
  125. commitizen: "4.2.5",
  126. "core-js": "3.23.5",
  127. "cross-env": "7.0.3",
  128. dotenv: "16.0.1",
  129. eslint: "8.20.0",
  130. "eslint-config-prettier": "8.5.0",
  131. "eslint-define-config": "1.5.1",
  132. "eslint-plugin-prettier": "4.2.1",
  133. "eslint-plugin-vue": "8.7.1",
  134. esno: "0.16.3",
  135. "fast-glob": "3.3.1",
  136. "fs-extra": "10.1.0",
  137. "gh-pages": "4.0.0",
  138. husky: "8.0.1",
  139. less: "4.1.3",
  140. "less-loader": "11.1.3",
  141. "lint-staged": "13.0.3",
  142. picocolors: "1.0.0",
  143. postcss: "8.4.14",
  144. "postcss-px-to-viewport": "1.1.1",
  145. prettier: "2.7.1",
  146. "pretty-quick": "3.1.3",
  147. rimraf: "3.0.2",
  148. "rollup-plugin-visualizer": "5.8.3",
  149. sass: "1.53.0",
  150. "simple-git": "3.22.0",
  151. stylelint: "14.9.1",
  152. "stylelint-config-prettier": "9.0.3",
  153. "stylelint-config-standard": "25.0.0",
  154. "stylelint-order": "5.0.0",
  155. "stylelint-scss": "4.3.0",
  156. tailwindcss: "3.3.2",
  157. "ts-node": "10.9.1",
  158. typescript: "4.7.4",
  159. vconsole: "3.15.1",
  160. vite: "5.1.3",
  161. "vite-plugin-compression": "0.5.1",
  162. "vite-plugin-html": "3.2.2",
  163. "vite-plugin-mock": "2.9.6",
  164. "vite-plugin-style-import": "2.0.0",
  165. "vite-plugin-svg-icons": "2.0.1",
  166. "vite-plugin-vconsole": "1.3.1",
  167. "vite-plugin-vue-setup-extend": "0.4.0",
  168. "vue-eslint-parser": "9.0.3",
  169. "vue-tsc": "0.35.2"
  170. },
  171. "lint-staged": {
  172. "*.{vue,js,ts,tsx}": "eslint --fix"
  173. },
  174. config: {
  175. commitizen: {
  176. path: "./node_modules/cz-customizable"
  177. }
  178. },
  179. keywords: [
  180. "vue",
  181. "naive-ui",
  182. "naive-ui-admin",
  183. "vue3",
  184. "ts",
  185. "tsx",
  186. "admin",
  187. "typescript"
  188. ],
  189. engines: {
  190. node: "12 || >=14"
  191. },
  192. pnpm: {
  193. peerDependencyRules: {
  194. ignoreMissing: [
  195. "rollup",
  196. "webpack"
  197. ]
  198. }
  199. }
  200. };
  201. // build/constant.ts
  202. var GLOB_CONFIG_FILE_NAME = "app.config.js";
  203. var OUTPUT_DIR = "dist";
  204. // build/vite/plugin/html.ts
  205. import { simpleGit } from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/simple-git@3.22.0/node_modules/simple-git/dist/esm/index.js";
  206. var git = simpleGit();
  207. async function getLatestHash() {
  208. const gitLog = await git.log();
  209. const lastStrNum = 8;
  210. return gitLog.latest?.hash.substring(-lastStrNum, lastStrNum);
  211. }
  212. function configHtmlPlugin(env, isBuild) {
  213. const { VITE_GLOB_APP_TITLE } = env;
  214. const path2 = "./";
  215. const getAppConfigSrc = () => {
  216. return `${path2 || "/"}${GLOB_CONFIG_FILE_NAME}?v=${package_default.version}-${(/* @__PURE__ */ new Date()).getTime()}`;
  217. };
  218. return new Promise((resolve2) => {
  219. getLatestHash().then((hash) => {
  220. const htmlPlugin = createHtmlPlugin({
  221. minify: isBuild,
  222. inject: {
  223. // Inject data into ejs template
  224. data: {
  225. title: VITE_GLOB_APP_TITLE,
  226. hash
  227. },
  228. // Embed the generated app.config.js file
  229. tags: isBuild ? [
  230. {
  231. tag: "script",
  232. attrs: {
  233. src: getAppConfigSrc()
  234. }
  235. }
  236. ] : []
  237. }
  238. });
  239. resolve2(htmlPlugin);
  240. });
  241. });
  242. }
  243. // build/vite/plugin/mock.ts
  244. import { viteMockServe } from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/vite-plugin-mock@2.9.6_mockjs@1.1.0_vite@5.1.3/node_modules/vite-plugin-mock/dist/index.js";
  245. function configMockPlugin(isBuild, prodMock) {
  246. return viteMockServe({
  247. ignore: /^\_/,
  248. mockPath: "mock",
  249. localEnabled: !isBuild,
  250. prodEnabled: isBuild && prodMock,
  251. injectCode: `
  252. import { setupProdMockServer } from '../mock/_createProductionServer';
  253. setupProdMockServer();
  254. `
  255. });
  256. }
  257. // build/vite/plugin/compress.ts
  258. import compressPlugin from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/vite-plugin-compression@0.5.1_vite@5.1.3/node_modules/vite-plugin-compression/dist/index.mjs";
  259. function configCompressPlugin(compress, deleteOriginFile = false) {
  260. const compressList = compress.split(",");
  261. const plugins = [];
  262. if (compressList.includes("gzip")) {
  263. plugins.push(
  264. compressPlugin({
  265. ext: ".gz",
  266. deleteOriginFile
  267. })
  268. );
  269. }
  270. if (compressList.includes("brotli")) {
  271. plugins.push(
  272. compressPlugin({
  273. ext: ".br",
  274. algorithm: "brotliCompress",
  275. deleteOriginFile
  276. })
  277. );
  278. }
  279. return plugins;
  280. }
  281. // build/vite/plugin/visualizer.ts
  282. import { visualizer } from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/rollup-plugin-visualizer@5.8.3/node_modules/rollup-plugin-visualizer/dist/plugin/index.js";
  283. function configVisualizerPlugin() {
  284. if (isReportMode()) {
  285. return visualizer({
  286. filename: "./node_modules/.cache/visualizer/stats.html",
  287. open: true,
  288. gzipSize: true,
  289. brotliSize: true
  290. });
  291. }
  292. return [];
  293. }
  294. // build/vite/plugin/index.ts
  295. function createVitePlugins(viteEnv, isBuild, prodMock) {
  296. const { VITE_USE_MOCK, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv;
  297. const vitePlugins = [
  298. // have to
  299. vue(),
  300. // have to
  301. vueJsx(),
  302. VueSetupExtend()
  303. // ElementPlus({
  304. // // 引入的样式的类型,可以是css、sass、less等,
  305. // importStyle: 'sass',
  306. // useSource: true,
  307. // }),
  308. // 按需引入element且自动创建组件声明
  309. // AutoImport({
  310. // resolvers: [ElementPlusResolver()],
  311. // }),
  312. // Components({
  313. // resolvers: [ElementPlusResolver()],
  314. // }),
  315. ];
  316. vitePlugins.push(configHtmlPlugin(viteEnv, isBuild));
  317. VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild, prodMock));
  318. vitePlugins.push(configVisualizerPlugin());
  319. if (isBuild) {
  320. vitePlugins.push(
  321. configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)
  322. );
  323. }
  324. return vitePlugins;
  325. }
  326. // build/vite/proxy.ts
  327. var httpsRE = /^https:\/\//;
  328. function createProxy(list = []) {
  329. const ret = {};
  330. for (const [prefix, target] of list) {
  331. const isHttps = httpsRE.test(target);
  332. ret[prefix] = {
  333. target,
  334. changeOrigin: true,
  335. ws: true,
  336. rewrite: (path2) => path2.replace(new RegExp(`^${prefix}`), ""),
  337. // https is require secure=false
  338. ...isHttps ? { secure: false } : {}
  339. };
  340. }
  341. return ret;
  342. }
  343. // src/utils/dateUtil.ts
  344. import dayjs from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/dayjs@1.11.4/node_modules/dayjs/dayjs.min.js";
  345. var DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm";
  346. function formatToDateTime(date, formatStr = DATE_TIME_FORMAT) {
  347. return dayjs(date).format(formatStr);
  348. }
  349. // vite.config.ts
  350. import { createSvgIconsPlugin } from "file:///C:/Users/cheng/Desktop/skyeye-admin/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@5.1.3/node_modules/vite-plugin-svg-icons/dist/index.mjs";
  351. var __vite_injected_original_dirname = "C:\\Users\\cheng\\Desktop\\skyeye-admin";
  352. var svg = createSvgIconsPlugin({
  353. // 要缓存的图标文件夹
  354. iconDirs: [path.resolve(__vite_injected_original_dirname, "src/assets/icons")],
  355. // 执行 icon name 的格式
  356. symbolId: "icon-[name]"
  357. });
  358. var { dependencies, devDependencies, name, version } = package_default;
  359. var __APP_INFO__ = {
  360. pkg: { dependencies, devDependencies, name, version },
  361. lastBuildTime: formatToDateTime(/* @__PURE__ */ new Date())
  362. };
  363. function pathResolve(dir) {
  364. return resolve(process.cwd(), ".", dir);
  365. }
  366. var vite_config_default = ({ command, mode }) => {
  367. const root = process.cwd();
  368. const env = loadEnv(mode, root);
  369. const viteEnv = wrapperEnv(env);
  370. const { VITE_PORT, VITE_GLOB_PROD_MOCK, VITE_PROXY } = viteEnv;
  371. const prodMock = VITE_GLOB_PROD_MOCK;
  372. const isBuild = command === "build";
  373. return {
  374. base: "./",
  375. esbuild: {},
  376. resolve: {
  377. alias: [
  378. {
  379. find: /\/#\//,
  380. replacement: pathResolve("types") + "/"
  381. },
  382. {
  383. find: "@",
  384. replacement: pathResolve("src") + "/"
  385. }
  386. ],
  387. dedupe: ["vue"]
  388. },
  389. plugins: [createVitePlugins(viteEnv, isBuild, prodMock), svg],
  390. define: {
  391. __APP_INFO__: JSON.stringify(__APP_INFO__)
  392. },
  393. css: {
  394. devSourcemap: true,
  395. preprocessorOptions: {
  396. scss: {
  397. modifyVars: {},
  398. javascriptEnabled: true,
  399. additionalData: `@import "src/styles/var.scss";`
  400. }
  401. }
  402. },
  403. server: {
  404. host: true,
  405. port: VITE_PORT,
  406. proxy: createProxy(VITE_PROXY)
  407. // proxy: {
  408. // '/api': {
  409. // target: '',
  410. // changeOrigin: true,
  411. // rewrite: (path) => path.replace(/^\/api/, '/api/v1')
  412. // }
  413. // }
  414. },
  415. optimizeDeps: {
  416. include: ["dayjs", "@vicons/ionicons5", "@vicons/antd", "@element-plus/icons-vue"],
  417. exclude: []
  418. },
  419. build: {
  420. target: "es2015",
  421. outDir: OUTPUT_DIR,
  422. minify: "terser",
  423. /**
  424. * 当 minify 为 minify 或 terser 打开注释
  425. */
  426. terserOptions: {
  427. compress: {
  428. keep_infinity: true,
  429. drop_console: true
  430. }
  431. },
  432. reportCompressedSize: false,
  433. chunkSizeWarningLimit: 2e3
  434. }
  435. };
  436. };
  437. export {
  438. vite_config_default as default
  439. };
  440. //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAiYnVpbGQvdXRpbHMudHMiLCAiYnVpbGQvdml0ZS9wbHVnaW4vaW5kZXgudHMiLCAiYnVpbGQvdml0ZS9wbHVnaW4vaHRtbC50cyIsICJwYWNrYWdlLmpzb24iLCAiYnVpbGQvY29uc3RhbnQudHMiLCAiYnVpbGQvdml0ZS9wbHVnaW4vbW9jay50cyIsICJidWlsZC92aXRlL3BsdWdpbi9jb21wcmVzcy50cyIsICJidWlsZC92aXRlL3BsdWdpbi92aXN1YWxpemVyLnRzIiwgImJ1aWxkL3ZpdGUvcHJveHkudHMiLCAic3JjL3V0aWxzL2RhdGVVdGlsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcY2hlbmdcXFxcRGVza3RvcFxcXFxza3lleWUtYWRtaW5cIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9DOi9Vc2Vycy9jaGVuZy9EZXNrdG9wL3NreWV5ZS1hZG1pbi92aXRlLmNvbmZpZy50c1wiO2ltcG9ydCB0eXBlIHsgVXNlckNvbmZpZywgQ29uZmlnRW52IH0gZnJvbSAndml0ZSc7XHJcbmltcG9ydCB7IGxvYWRFbnYgfSBmcm9tICd2aXRlJztcclxuaW1wb3J0IHBhdGgsIHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyB3cmFwcGVyRW52IH0gZnJvbSAnLi9idWlsZC91dGlscyc7XHJcbmltcG9ydCB7IGNyZWF0ZVZpdGVQbHVnaW5zIH0gZnJvbSAnLi9idWlsZC92aXRlL3BsdWdpbic7XHJcbmltcG9ydCB7IE9VVFBVVF9ESVIgfSBmcm9tICcuL2J1aWxkL2NvbnN0YW50JztcclxuaW1wb3J0IHsgY3JlYXRlUHJveHkgfSBmcm9tICcuL2J1aWxkL3ZpdGUvcHJveHknO1xyXG5pbXBvcnQgcGtnIGZyb20gJy4vcGFja2FnZS5qc29uJztcclxuaW1wb3J0IHsgZm9ybWF0VG9EYXRlVGltZSB9IGZyb20gJy4vc3JjL3V0aWxzL2RhdGVVdGlsJztcclxuaW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1zdmctaWNvbnMnO1xyXG5cclxuY29uc3Qgc3ZnID0gY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xyXG4gIC8vIFx1ODk4MVx1N0YxM1x1NUI1OFx1NzY4NFx1NTZGRVx1NjgwN1x1NjU4N1x1NEVGNlx1NTkzOVxyXG4gIGljb25EaXJzOiBbcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NyYy9hc3NldHMvaWNvbnMnKV0sXHJcbiAgLy8gXHU2MjY3XHU4ODRDIGljb24gbmFtZSBcdTc2ODRcdTY4M0NcdTVGMEZcclxuICBzeW1ib2xJZDogJ2ljb24tW25hbWVdJyxcclxufSk7XHJcblxyXG5jb25zdCB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBuYW1lLCB2ZXJzaW9uIH0gPSBwa2c7XHJcblxyXG5jb25zdCBfX0FQUF9JTkZPX18gPSB7XHJcbiAgcGtnOiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBuYW1lLCB2ZXJzaW9uIH0sXHJcbiAgbGFzdEJ1aWxkVGltZTogZm9ybWF0VG9EYXRlVGltZShuZXcgRGF0ZSgpKSxcclxufTtcclxuXHJcbmZ1bmN0aW9uIHBhdGhSZXNvbHZlKGRpcjogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4nLCBkaXIpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoeyBjb21tYW5kLCBtb2RlIH06IENvbmZpZ0Vudik6IFVzZXJDb25maWcgPT4ge1xyXG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xyXG4gIGNvbnN0IGVudiA9IGxvYWRFbnYobW9kZSwgcm9vdCk7XHJcbiAgY29uc3Qgdml0ZUVudiA9IHdyYXBwZXJFbnYoZW52KTtcclxuICBjb25zdCB7IFZJVEVfUE9SVCwgVklURV9HTE9CX1BST0RfTU9DSywgVklURV9QUk9YWSB9ID0gdml0ZUVudjtcclxuICBjb25zdCBwcm9kTW9jayA9IFZJVEVfR0xPQl9QUk9EX01PQ0s7XHJcbiAgY29uc3QgaXNCdWlsZCA9IGNvbW1hbmQgPT09ICdidWlsZCc7XHJcbiAgcmV0dXJuIHtcclxuICAgIGJhc2U6ICcuLycsXHJcbiAgICBlc2J1aWxkOiB7fSxcclxuICAgIHJlc29sdmU6IHtcclxuICAgICAgYWxpYXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaW5kOiAvXFwvI1xcLy8sXHJcbiAgICAgICAgICByZXBsYWNlbWVudDogcGF0aFJlc29sdmUoJ3R5cGVzJykgKyAnLycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaW5kOiAnQCcsXHJcbiAgICAgICAgICByZXBsYWNlbWVudDogcGF0aFJlc29sdmUoJ3NyYycpICsgJy8nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGRlZHVwZTogWyd2dWUnXSxcclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiBbY3JlYXRlVml0ZVBsdWdpbnModml0ZUVudiwgaXNCdWlsZCwgcHJvZE1vY2spLCBzdmddLFxyXG4gICAgZGVmaW5lOiB7XHJcbiAgICAgIF9fQVBQX0lORk9fXzogSlNPTi5zdHJpbmdpZnkoX19BUFBfSU5GT19fKSxcclxuICAgIH0sXHJcbiAgICBjc3M6IHtcclxuICAgICAgZGV2U291cmNlbWFwOiB0cnVlLFxyXG4gICAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XHJcbiAgICAgICAgc2Nzczoge1xyXG4gICAgICAgICAgbW9kaWZ5VmFyczoge30sXHJcbiAgICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiBgQGltcG9ydCBcInNyYy9zdHlsZXMvdmFyLnNjc3NcIjtgLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgc2VydmVyOiB7XHJcbiAgICAgIGhvc3Q6IHRydWUsXHJcbiAgICAgIHBvcnQ6IFZJVEVfUE9SVCxcclxuICAgICAgcHJveHk6IGNyZWF0ZVByb3h5KFZJVEVfUFJPWFkpLFxyXG4gICAgICAvLyBwcm94eToge1xyXG4gICAgICAvLyAgICAgJy9hcGknOiB7XHJcbiAgICAgIC8vICAgICAgICAgdGFyZ2V0OiAnJyxcclxuICAgICAgLy8gICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgIC8vICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZSgvXlxcL2FwaS8sICcvYXBpL3YxJylcclxuICAgICAgLy8gICAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgfSxcclxuICAgIG9wdGltaXplRGVwczoge1xyXG4gICAgICBpbmNsdWRlOiBbJ2RheWpzJywgJ0B2aWNvbnMvaW9uaWNvbnM1JywgJ0B2aWNvbnMvYW50ZCcsICdAZWxlbWVudC1wbHVzL2ljb25zLXZ1ZSddLFxyXG4gICAgICBleGNsdWRlOiBbXSxcclxuICAgIH0sXHJcbiAgICBidWlsZDoge1xyXG4gICAgICB0YXJnZXQ6ICdlczIwMTUnLFxyXG4gICAgICBvdXREaXI6IE9VVFBVVF9ESVIsXHJcbiAgICAgIG1pbmlmeTogJ3RlcnNlcicsXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBcdTVGNTMgbWluaWZ5IFx1NEUzQSBtaW5pZnkgXHU2MjE2IHRlcnNlciBcdTYyNTNcdTVGMDBcdTZDRThcdTkxQ0FcclxuICAgICAgICovXHJcbiAgICAgIHRlcnNlck9wdGlvbnM6IHtcclxuICAgICAgICBjb21wcmVzczoge1xyXG4gICAgICAgICAga2VlcF9pbmZpbml0eTogdHJ1ZSxcclxuICAgICAgICAgIGRyb3BfY29uc29sZTogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICByZXBvcnRDb21wcmVzc2VkU2l6ZTogZmFsc2UsXHJcbiAgICAgIGNodW5rU2l6ZVdhcm5pbmdMaW1pdDogMjAwMCxcclxuICAgIH0sXHJcbiAgfTtcclxufTtcclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxjaGVuZ1xcXFxEZXNrdG9wXFxcXHNreWV5ZS1hZG1pblxcXFxidWlsZFwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcY2hlbmdcXFxcRGVza3RvcFxcXFxza3lleWUtYWRtaW5cXFxcYnVpbGRcXFxcdXRpbHMudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL2NoZW5nL0Rlc2t0b3Avc2t5ZXllLWFkbWluL2J1aWxkL3V0aWxzLnRzXCI7aW1wb3J0IGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RldkZuKG1vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBtb2RlID09PSAnZGV2ZWxvcG1lbnQnO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9kRm4obW9kZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIG1vZGUgPT09ICdwcm9kdWN0aW9uJztcclxufVxyXG5cclxuLyoqXHJcbiAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgcGFja2FnZSBwcmV2aWV3XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNSZXBvcnRNb2RlKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBwcm9jZXNzLmVudi5SRVBPUlQgPT09ICd0cnVlJztcclxufVxyXG5cclxuLy8gUmVhZCBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgY29uZmlndXJhdGlvbiBmaWxlcyB0byBwcm9jZXNzLmVudlxyXG5leHBvcnQgZnVuY3Rpb24gd3JhcHBlckVudihlbnZDb25mOiBSZWNvcmRhYmxlKTogVml0ZUVudiB7XHJcbiAgY29uc3QgcmV0OiBhbnkgPSB7fTtcclxuXHJcbiAgZm9yIChjb25zdCBlbnZOYW1lIG9mIE9iamVjdC5rZXlzKGVudkNvbmYpKSB7XHJcbiAgICBsZXQgcmVhbE5hbWUgPSBlbnZDb25mW2Vudk5hbWVdLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKTtcclxuICAgIHJlYWxOYW1lID0gcmVhbE5hbWUgPT09ICd0cnVlJyA/IHRydWUgOiByZWFsTmFtZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogcmVhbE5hbWU7XHJcblxyXG4gICAgaWYgKGVudk5hbWUgPT09ICdWSVRFX1BPUlQnKSB7XHJcbiAgICAgIHJlYWxOYW1lID0gTnVtYmVyKHJlYWxOYW1lKTtcclxuICAgIH1cclxuICAgIGlmIChlbnZOYW1lID09PSAnVklURV9QUk9YWScpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZWFsTmFtZSA9IEpTT04ucGFyc2UocmVhbE5hbWUpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge31cclxuICAgIH1cclxuICAgIHJldFtlbnZOYW1lXSA9IHJlYWxOYW1lO1xyXG4gICAgcHJvY2Vzcy5lbnZbZW52TmFtZV0gPSByZWFsTmFtZTtcclxuICB9XHJcbiAgcmV0dXJuIHJldDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXhcclxuICogQHBhcmFtIG1hdGNoIHByZWZpeFxyXG4gKiBAcGFyYW0gY29uZkZpbGVzIGV4dFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudkNvbmZpZyhtYXRjaCA9ICdWSVRFX0dMT0JfJywgY29uZkZpbGVzID0gWycuZW52JywgJy5lbnYucHJvZHVjdGlvbiddKSB7XHJcbiAgbGV0IGVudkNvbmZpZyA9IHt9O1xyXG4gIGNvbmZGaWxlcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBlbnYgPSBkb3RlbnYucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpdGVtKSkpO1xyXG4gICAgICBlbnZDb25maWcgPSB7IC4uLmVudkNvbmZpZywgLi4uZW52IH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge31cclxuICB9KTtcclxuXHJcbiAgT2JqZWN0LmtleXMoZW52Q29uZmlnKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoYF4oJHttYXRjaH0pYCk7XHJcbiAgICBpZiAoIXJlZy50ZXN0KGtleSkpIHtcclxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShlbnZDb25maWcsIGtleSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGVudkNvbmZpZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB1c2VyIHJvb3QgZGlyZWN0b3J5XHJcbiAqIEBwYXJhbSBkaXIgZmlsZSBwYXRoXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdFBhdGgoLi4uZGlyOiBzdHJpbmdbXSkge1xyXG4gIHJldHVybiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgLi4uZGlyKTtcclxufVxyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXFxcXHZpdGVcXFxccGx1Z2luXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxjaGVuZ1xcXFxEZXNrdG9wXFxcXHNreWV5ZS1hZG1pblxcXFxidWlsZFxcXFx2aXRlXFxcXHBsdWdpblxcXFxpbmRleC50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvY2hlbmcvRGVza3RvcC9za3lleWUtYWRtaW4vYnVpbGQvdml0ZS9wbHVnaW4vaW5kZXgudHNcIjtpbXBvcnQgdHlwZSB7IFBsdWdpbk9wdGlvbiB9IGZyb20gJ3ZpdGUnO1xyXG5cclxuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnO1xyXG5pbXBvcnQgdnVlSnN4IGZyb20gJ0B2aXRlanMvcGx1Z2luLXZ1ZS1qc3gnO1xyXG5pbXBvcnQgVnVlU2V0dXBFeHRlbmQgZnJvbSAndml0ZS1wbHVnaW4tdnVlLXNldHVwLWV4dGVuZCc7XHJcbi8vIFx1ODFFQVx1NTJBOFx1NjMwOVx1OTcwMFx1NUJGQ1x1NTE2NVx1RkYwQ1x1NjgzOVx1NjM2RVx1ODFFQVx1OEVBQlx1NjBDNVx1NTFCNVx1OTAwOVx1NjJFOVxyXG4vLyBpbXBvcnQgQXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJztcclxuLy8gaW1wb3J0IENvbXBvbmVudHMgZnJvbSAndW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvdml0ZSc7XHJcbi8vIGltcG9ydCB7IEVsZW1lbnRQbHVzUmVzb2x2ZXIgfSBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy9yZXNvbHZlcnMnO1xyXG4vLyBpbXBvcnQgQ29tcG9uZW50cyBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlJztcclxuLy8gaW1wb3J0IEVsZW1lbnRQbHVzIGZyb20gJ3VucGx1Z2luLWVsZW1lbnQtcGx1cy92aXRlJztcclxuXHJcbmltcG9ydCB7IGNvbmZpZ0h0bWxQbHVnaW4gfSBmcm9tICcuL2h0bWwnO1xyXG5pbXBvcnQgeyBjb25maWdNb2NrUGx1Z2luIH0gZnJvbSAnLi9tb2NrJztcclxuaW1wb3J0IHsgY29uZmlnQ29tcHJlc3NQbHVnaW4gfSBmcm9tICcuL2NvbXByZXNzJztcclxuaW1wb3J0IHsgY29uZmlnVmlzdWFsaXplclBsdWdpbiB9IGZyb20gJy4vdmlzdWFsaXplcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVml0ZVBsdWdpbnModml0ZUVudjogVml0ZUVudiwgaXNCdWlsZDogYm9vbGVhbiwgcHJvZE1vY2spIHtcclxuICBjb25zdCB7IFZJVEVfVVNFX01PQ0ssIFZJVEVfQlVJTERfQ09NUFJFU1MsIFZJVEVfQlVJTERfQ09NUFJFU1NfREVMRVRFX09SSUdJTl9GSUxFIH0gPSB2aXRlRW52O1xyXG5cclxuICBjb25zdCB2aXRlUGx1Z2luczogKFBsdWdpbk9wdGlvbiB8IFBsdWdpbk9wdGlvbltdKVtdID0gW1xyXG4gICAgLy8gaGF2ZSB0b1xyXG4gICAgdnVlKCksXHJcbiAgICAvLyBoYXZlIHRvXHJcbiAgICB2dWVKc3goKSxcclxuICAgIFZ1ZVNldHVwRXh0ZW5kKCksXHJcbiAgICAvLyBFbGVtZW50UGx1cyh7XHJcbiAgICAvLyAgIC8vIFx1NUYxNVx1NTE2NVx1NzY4NFx1NjgzN1x1NUYwRlx1NzY4NFx1N0M3Qlx1NTc4Qlx1RkYwQ1x1NTNFRlx1NEVFNVx1NjYyRmNzc1x1MzAwMXNhc3NcdTMwMDFsZXNzXHU3QjQ5XHVGRjBDXHJcbiAgICAvLyAgIGltcG9ydFN0eWxlOiAnc2FzcycsXHJcbiAgICAvLyAgIHVzZVNvdXJjZTogdHJ1ZSxcclxuICAgIC8vIH0pLFxyXG4gICAgLy8gXHU2MzA5XHU5NzAwXHU1RjE1XHU1MTY1ZWxlbWVudFx1NEUxNFx1ODFFQVx1NTJBOFx1NTIxQlx1NUVGQVx1N0VDNFx1NEVGNlx1NThGMFx1NjYwRVxyXG4gICAgLy8gQXV0b0ltcG9ydCh7XHJcbiAgICAvLyAgIHJlc29sdmVyczogW0VsZW1lbnRQbHVzUmVzb2x2ZXIoKV0sXHJcbiAgICAvLyB9KSxcclxuICAgIC8vIENvbXBvbmVudHMoe1xyXG4gICAgLy8gICByZXNvbHZlcnM6IFtFbGVtZW50UGx1c1Jlc29sdmVyKCldLFxyXG4gICAgLy8gfSksXHJcbiAgXTtcclxuXHJcbiAgLy8gdml0ZS1wbHVnaW4taHRtbFxyXG4gIHZpdGVQbHVnaW5zLnB1c2goY29uZmlnSHRtbFBsdWdpbih2aXRlRW52LCBpc0J1aWxkKSk7XHJcblxyXG4gIC8vIHZpdGUtcGx1Z2luLW1vY2tcclxuICBWSVRFX1VTRV9NT0NLICYmIHZpdGVQbHVnaW5zLnB1c2goY29uZmlnTW9ja1BsdWdpbihpc0J1aWxkLCBwcm9kTW9jaykpO1xyXG5cclxuICAvLyByb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXJcclxuICB2aXRlUGx1Z2lucy5wdXNoKGNvbmZpZ1Zpc3VhbGl6ZXJQbHVnaW4oKSk7XHJcblxyXG4gIGlmIChpc0J1aWxkKSB7XHJcbiAgICAvLyByb2xsdXAtcGx1Z2luLWd6aXBcclxuICAgIHZpdGVQbHVnaW5zLnB1c2goXHJcbiAgICAgIGNvbmZpZ0NvbXByZXNzUGx1Z2luKFZJVEVfQlVJTERfQ09NUFJFU1MsIFZJVEVfQlVJTERfQ09NUFJFU1NfREVMRVRFX09SSUdJTl9GSUxFKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdml0ZVBsdWdpbnM7XHJcbn1cclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxjaGVuZ1xcXFxEZXNrdG9wXFxcXHNreWV5ZS1hZG1pblxcXFxidWlsZFxcXFx2aXRlXFxcXHBsdWdpblwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcY2hlbmdcXFxcRGVza3RvcFxcXFxza3lleWUtYWRtaW5cXFxcYnVpbGRcXFxcdml0ZVxcXFxwbHVnaW5cXFxcaHRtbC50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvY2hlbmcvRGVza3RvcC9za3lleWUtYWRtaW4vYnVpbGQvdml0ZS9wbHVnaW4vaHRtbC50c1wiOy8qKlxyXG4gKiBQbHVnaW4gdG8gbWluaW1pemUgYW5kIHVzZSBlanMgdGVtcGxhdGUgc3ludGF4IGluIGluZGV4Lmh0bWwuXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbm5jd2Ivdml0ZS1wbHVnaW4taHRtbFxyXG4gKi9cclxuaW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb24gfSBmcm9tICd2aXRlJztcclxuaW1wb3J0IHsgY3JlYXRlSHRtbFBsdWdpbiB9IGZyb20gJ3ZpdGUtcGx1Z2luLWh0bWwnO1xyXG5pbXBvcnQgcGtnIGZyb20gJy4uLy4uLy4uL3BhY2thZ2UuanNvbic7XHJcbmltcG9ydCB7IEdMT0JfQ09ORklHX0ZJTEVfTkFNRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50JztcclxuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XHJcbmNvbnN0IGdpdCA9IHNpbXBsZUdpdCgpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0SGFzaCgpIHtcclxuICBjb25zdCBnaXRMb2cgPSBhd2FpdCBnaXQubG9nKCk7XHJcbiAgLyoqIFx1NjIyQVx1NTNENmdpdCBoYXNoXHU1MDNDXHU2NzAwXHU1NDBFOFx1NEY0RCAqL1xyXG4gIGNvbnN0IGxhc3RTdHJOdW0gPSA4O1xyXG4gIHJldHVybiBnaXRMb2cubGF0ZXN0Py5oYXNoLnN1YnN0cmluZygtbGFzdFN0ck51bSwgbGFzdFN0ck51bSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb25maWdIdG1sUGx1Z2luKGVudjogVml0ZUVudiwgaXNCdWlsZDogYm9vbGVhbik6IFByb21pc2U8UGx1Z2luT3B0aW9uW10+IHtcclxuICBjb25zdCB7IFZJVEVfR0xPQl9BUFBfVElUTEUgfSA9IGVudjtcclxuXHJcbiAgY29uc3QgcGF0aCA9ICcuLyc7XHJcblxyXG4gIGNvbnN0IGdldEFwcENvbmZpZ1NyYyA9ICgpID0+IHtcclxuICAgIHJldHVybiBgJHtwYXRoIHx8ICcvJ30ke0dMT0JfQ09ORklHX0ZJTEVfTkFNRX0/dj0ke3BrZy52ZXJzaW9ufS0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICBnZXRMYXRlc3RIYXNoKCkudGhlbigoaGFzaCkgPT4ge1xyXG4gICAgICBjb25zdCBodG1sUGx1Z2luOiBQbHVnaW5PcHRpb25bXSA9IGNyZWF0ZUh0bWxQbHVnaW4oe1xyXG4gICAgICAgIG1pbmlmeTogaXNCdWlsZCxcclxuICAgICAgICBpbmplY3Q6IHtcclxuICAgICAgICAgIC8vIEluamVjdCBkYXRhIGludG8gZWpzIHRlbXBsYXRlXHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBWSVRFX0dMT0JfQVBQX1RJVExFLFxyXG4gICAgICAgICAgICBoYXNoLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIEVtYmVkIHRoZSBnZW5lcmF0ZWQgYXBwLmNvbmZpZy5qcyBmaWxlXHJcbiAgICAgICAgICB0YWdzOiBpc0J1aWxkXHJcbiAgICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB0YWc6ICdzY3JpcHQnLFxyXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2V0QXBwQ29uZmlnU3JjKCksXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgICAgcmVzb2x2ZShodG1sUGx1Z2luKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJ7XHJcbiAgXCJuYW1lXCI6IFwic2t5ZXllLWFkbWluLWZlXCIsXHJcbiAgXCJ2ZXJzaW9uXCI6IFwiMS4zLjlcIixcclxuICBcInByaXZhdGVcIjogdHJ1ZSxcclxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcclxuICBcInNjcmlwdHNcIjoge1xyXG4gICAgXCJib290c3RyYXBcIjogXCJwbnBtIGluc3RhbGxcIixcclxuICAgIFwic2VydmVcIjogXCJwbnBtIHJ1biBkZXZcIixcclxuICAgIFwiZGV2XCI6IFwidml0ZVwiLFxyXG4gICAgXCJjcmVhdGVDb25maWdcIjogXCJlc25vIC4vYnVpbGQvc2NyaXB0L3Bvc3RCdWlsZC50c1wiLFxyXG4gICAgXCJidWlsZFwiOiBcImNyb3NzLWVudiBOT0RFX0VOVj1wcm9kdWN0aW9uIHZpdGUgYnVpbGRcIixcclxuICAgIFwiYnVpbGQ6dGVzdFwiOiBcImNyb3NzLWVudiB2aXRlIGJ1aWxkIC0tbW9kZSB0ZXN0ICYmIGVzbm8gLi9idWlsZC9zY3JpcHQvcG9zdEJ1aWxkLnRzXCIsXHJcbiAgICBcImJ1aWxkOm5vLWNhY2hlXCI6IFwicG5wbSBjbGVhbjpjYWNoZSAmJiBwbnBtIHJ1biBidWlsZFwiLFxyXG4gICAgXCJyZXBvcnRcIjogXCJjcm9zcy1lbnYgUkVQT1JUPXRydWUgcG5wbSBydW4gYnVpbGRcIixcclxuICAgIFwidHlwZTpjaGVja1wiOiBcInZ1ZS10c2MgLS1ub0VtaXQgLS1za2lwTGliQ2hlY2tcIixcclxuICAgIFwicHJldmlld1wiOiBcInBucG0gcnVuIGJ1aWxkICYmIHZpdGUgcHJldmlld1wiLFxyXG4gICAgXCJwcmV2aWV3OmRpc3RcIjogXCJ2aXRlIHByZXZpZXdcIixcclxuICAgIFwiY2xlYW46Y2FjaGVcIjogXCJyaW1yYWYgbm9kZV9tb2R1bGVzLy5jYWNoZS8gJiYgcmltcmFmIG5vZGVfbW9kdWxlcy8udml0ZVwiLFxyXG4gICAgXCJjbGVhbjpsaWJcIjogXCJyaW1yYWYgbm9kZV9tb2R1bGVzXCIsXHJcbiAgICBcImxpbnQ6ZXNsaW50XCI6IFwiZXNsaW50IFxcXCJ7c3JjLG1vY2t9LyoqLyoue3Z1ZSx0cyx0c3h9XFxcIiAtLWZpeFwiLFxyXG4gICAgXCJsaW50OnByZXR0aWVyXCI6IFwicHJldHRpZXIgLS13cml0ZSAtLWxvZ2xldmVsIHdhcm4gXFxcInNyYy8qKi8qLntqcyxqc29uLHRzeCxjc3MsbGVzcyxzY3NzLHZ1ZSxodG1sLG1kfVxcXCJcIixcclxuICAgIFwibGludDpzdHlsZWxpbnRcIjogXCJzdHlsZWxpbnQgLS1maXggXFxcIioqLyoue3Z1ZSxsZXNzLHBvc3Rjc3MsY3NzLHNjc3N9XFxcIiAtLWNhY2hlIC0tY2FjaGUtbG9jYXRpb24gbm9kZV9tb2R1bGVzLy5jYWNoZS9zdHlsZWxpbnQvXCIsXHJcbiAgICBcImxpbnQ6bGludC1zdGFnZWRcIjogXCJsaW50LXN0YWdlZCAtYyAuLy5odXNreS9saW50c3RhZ2VkcmMuanNcIixcclxuICAgIFwibGludDpwcmV0dHlcIjogXCJwcmV0dHktcXVpY2sgLS1zdGFnZWRcIixcclxuICAgIFwidGVzdCBwcm9kIGd6aXBcIjogXCJodHRwLXNlcnZlciBkaXN0IC0tY29ycyAtLWd6aXAgLWMtMVwiLFxyXG4gICAgXCJyZWluc3RhbGxcIjogXCJyaW1yYWYgcG5wbS1sb2NrLnlhbWwgJiYgcmltcmFmIHBhY2thZ2UubG9jay5qc29uICYmIHJpbXJhZiBub2RlX21vZHVsZXMgJiYgcG5wbSBydW4gYm9vdHN0cmFwXCIsXHJcbiAgICBcImJ1aWxkIHR5cGVjaGVja1wiOiBcInZ1ZWR4LXR5cGVjaGVjayAuICYmIHZpdGUgYnVpbGRcIixcclxuICAgIFwiZGVwbG95XCI6IFwiZ2gtcGFnZXMgLWQgZGlzdFwiLFxyXG4gICAgXCJwdWJsaXNoXCI6IFwiZXNubyAuL2J1aWxkL3B1Ymxpc2gvcHVibGlzaC50c1wiXHJcbiAgfSxcclxuICBcImRlcGVuZGVuY2llc1wiOiB7XHJcbiAgICBcIkBlbGVtZW50LXBsdXMvaWNvbnMtdnVlXCI6IFwiMi4wLjlcIixcclxuICAgIFwiQHR5cGVzL2ZhYnJpY1wiOiBcIjUuMy42XCIsXHJcbiAgICBcIkB2aWNvbnMvYW50ZFwiOiBcIjAuMTIuMFwiLFxyXG4gICAgXCJAdmljb25zL2lvbmljb25zNVwiOiBcIjAuMTIuMFwiLFxyXG4gICAgXCJAdnVldXAvdnVlLXF1aWxsXCI6IFwiMS4wLjAtYmV0YS44XCIsXHJcbiAgICBcIkB2dWV1c2UvY29yZVwiOiBcIjguOS40XCIsXHJcbiAgICBcIkB2dWV1c2Uvcm91dGVyXCI6IFwiMTAuNi4xXCIsXHJcbiAgICBcIkB3YW5nZWRpdG9yL2VkaXRvclwiOiBcIjUuMS4yM1wiLFxyXG4gICAgXCJAd2FuZ2VkaXRvci9lZGl0b3ItZm9yLXZ1ZVwiOiBcIjUuMS4xMlwiLFxyXG4gICAgXCJhbmltYXRlLmNzc1wiOiBcIjQuMS4xXCIsXHJcbiAgICBcImFyY2hpdmVyXCI6IFwiXjcuMC4xXCIsXHJcbiAgICBcImF4aW9zXCI6IFwiMC4yNy4yXCIsXHJcbiAgICBcImJsdWVpbXAtbWQ1XCI6IFwiMi4xOS4wXCIsXHJcbiAgICBcImNhbnZnXCI6IFwiNC4wLjFcIixcclxuICAgIFwiY3JvcHBlcmpzXCI6IFwiMS41LjEyXCIsXHJcbiAgICBcImRheWpzXCI6IFwiMS4xMS40XCIsXHJcbiAgICBcImVjaGFydHNcIjogXCI1LjMuM1wiLFxyXG4gICAgXCJlbGVtZW50LXBsdXNcIjogXCIyLjcuMVwiLFxyXG4gICAgXCJlbGVtZW50LXJlc2l6ZS1kZXRlY3RvclwiOiBcIjEuMi40XCIsXHJcbiAgICBcImZvcm0tZGF0YVwiOiBcIl40LjAuMFwiLFxyXG4gICAgXCJodG1sMmNhbnZhc1wiOiBcIjEuMC4wXCIsXHJcbiAgICBcImtvbnZhXCI6IFwiOS4zLjBcIixcclxuICAgIFwibG9kYXNoLWVzXCI6IFwiNC4xNy4yMVwiLFxyXG4gICAgXCJtb2NranNcIjogXCIxLjEuMFwiLFxyXG4gICAgXCJtcGVndHMuanNcIjogXCIxLjcuM1wiLFxyXG4gICAgXCJucHJvZ3Jlc3NcIjogXCIwLjIuMFwiLFxyXG4gICAgXCJudW1iZXItcHJlY2lzaW9uXCI6IFwiMS42LjBcIixcclxuICAgIFwicGVyZmVjdC1zY3JvbGxiYXJcIjogXCIxLjUuNVwiLFxyXG4gICAgXCJwaW5pYVwiOiBcIjIuMC4xNlwiLFxyXG4gICAgXCJwcmludC1qc1wiOiBcIjEuNi4wXCIsXHJcbiAgICBcInFyY29kZVwiOiBcIjEuNS4xXCIsXHJcbiAgICBcInFzXCI6IFwiNi4xMS4wXCIsXHJcbiAgICBcInVpZFwiOiBcIjIuMC4yXCIsXHJcbiAgICBcInVybC1qb2luXCI6IFwiNS4wLjBcIixcclxuICAgIFwidnVlXCI6IFwiMy4zLjRcIixcclxuICAgIFwidnVlLWVjaGFydHNcIjogXCJeNi42LjhcIixcclxuICAgIFwidnVlLWhvb2tzLXBsdXNcIjogXCIxLjguNlwiLFxyXG4gICAgXCJ2dWUta29udmFcIjogXCIzLjAuMlwiLFxyXG4gICAgXCJ2dWUtcm91dGVyXCI6IFwiNC4xLjJcIixcclxuICAgIFwidnVlLXR5cGVzXCI6IFwiNC4xLjFcIixcclxuICAgIFwidnVlZHJhZ2dhYmxlXCI6IFwiNC4xLjBcIixcclxuICAgIFwieGxzeFwiOiBcIjAuMTguNVwiXHJcbiAgfSxcclxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XHJcbiAgICBcIkBjb21taXRsaW50L2NsaVwiOiBcIjE3LjAuM1wiLFxyXG4gICAgXCJAY29tbWl0bGludC9jb25maWctY29udmVudGlvbmFsXCI6IFwiMTcuMC4zXCIsXHJcbiAgICBcIkB0eXBlcy9lbGVtZW50LXJlc2l6ZS1kZXRlY3RvclwiOiBcIjEuMS4zXCIsXHJcbiAgICBcIkB0eXBlcy9pbnRyby5qc1wiOiBcIjMuMC4yXCIsXHJcbiAgICBcIkB0eXBlcy9sb2Rhc2gtZXNcIjogXCI0LjE3LjZcIixcclxuICAgIFwiQHR5cGVzL25vZGVcIjogXCIxNy4wLjQ1XCIsXHJcbiAgICBcIkB0eXBlcy9xcmNvZGVcIjogXCIxLjQuMlwiLFxyXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpblwiOiBcIjUuMzAuN1wiLFxyXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyXCI6IFwiNS4zMC43XCIsXHJcbiAgICBcIkB2aXRlanMvcGx1Z2luLXZ1ZVwiOiBcIjIuMy4zXCIsXHJcbiAgICBcIkB2aXRlanMvcGx1Z2luLXZ1ZS1qc3hcIjogXCIxLjMuMTBcIixcclxuICAgIFwiQHZ1ZS9jb21waWxlci1zZmNcIjogXCIzLjMuNFwiLFxyXG4gICAgXCJhdXRvcHJlZml4ZXJcIjogXCIxMC40LjdcIixcclxuICAgIFwiY2hhbGtcIjogXCI1LjMuMFwiLFxyXG4gICAgXCJjb2xvcnNcIjogXCIxLjQuMFwiLFxyXG4gICAgXCJjb21taXRpemVuXCI6IFwiNC4yLjVcIixcclxuICAgIFwiY29yZS1qc1wiOiBcIjMuMjMuNVwiLFxyXG4gICAgXCJjcm9zcy1lbnZcIjogXCI3LjAuM1wiLFxyXG4gICAgXCJkb3RlbnZcIjogXCIxNi4wLjFcIixcclxuICAgIFwiZXNsaW50XCI6IFwiOC4yMC4wXCIsXHJcbiAgICBcImVzbGludC1jb25maWctcHJldHRpZXJcIjogXCI4LjUuMFwiLFxyXG4gICAgXCJlc2xpbnQtZGVmaW5lLWNvbmZpZ1wiOiBcIjEuNS4xXCIsXHJcbiAgICBcImVzbGludC1wbHVnaW4tcHJldHRpZXJcIjogXCI0LjIuMVwiLFxyXG4gICAgXCJlc2xpbnQtcGx1Z2luLXZ1ZVwiOiBcIjguNy4xXCIsXHJcbiAgICBcImVzbm9cIjogXCIwLjE2LjNcIixcclxuICAgIFwiZmFzdC1nbG9iXCI6IFwiMy4zLjFcIixcclxuICAgIFwiZnMtZXh0cmFcIjogXCIxMC4xLjBcIixcclxuICAgIFwiZ2gtcGFnZXNcIjogXCI0LjAuMFwiLFxyXG4gICAgXCJodXNreVwiOiBcIjguMC4xXCIsXHJcbiAgICBcImxlc3NcIjogXCI0LjEuM1wiLFxyXG4gICAgXCJsZXNzLWxvYWRlclwiOiBcIjExLjEuM1wiLFxyXG4gICAgXCJsaW50LXN0YWdlZFwiOiBcIjEzLjAuM1wiLFxyXG4gICAgXCJwaWNvY29sb3JzXCI6IFwiMS4wLjBcIixcclxuICAgIFwicG9zdGNzc1wiOiBcIjguNC4xNFwiLFxyXG4gICAgXCJwb3N0Y3NzLXB4LXRvLXZpZXdwb3J0XCI6IFwiMS4xLjFcIixcclxuICAgIFwicHJldHRpZXJcIjogXCIyLjcuMVwiLFxyXG4gICAgXCJwcmV0dHktcXVpY2tcIjogXCIzLjEuM1wiLFxyXG4gICAgXCJyaW1yYWZcIjogXCIzLjAuMlwiLFxyXG4gICAgXCJyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXJcIjogXCI1LjguM1wiLFxyXG4gICAgXCJzYXNzXCI6IFwiMS41My4wXCIsXHJcbiAgICBcInNpbXBsZS1naXRcIjogXCIzLjIyLjBcIixcclxuICAgIFwic3R5bGVsaW50XCI6IFwiMTQuOS4xXCIsXHJcbiAgICBcInN0eWxlbGludC1jb25maWctcHJldHRpZXJcIjogXCI5LjAuM1wiLFxyXG4gICAgXCJzdHlsZWxpbnQtY29uZmlnLXN0YW5kYXJkXCI6IFwiMjUuMC4wXCIsXHJcbiAgICBcInN0eWxlbGludC1vcmRlclwiOiBcIjUuMC4wXCIsXHJcbiAgICBcInN0eWxlbGludC1zY3NzXCI6IFwiNC4zLjBcIixcclxuICAgIFwidGFpbHdpbmRjc3NcIjogXCIzLjMuMlwiLFxyXG4gICAgXCJ0cy1ub2RlXCI6IFwiMTAuOS4xXCIsXHJcbiAgICBcInR5cGVzY3JpcHRcIjogXCI0LjcuNFwiLFxyXG4gICAgXCJ2Y29uc29sZVwiOiBcIjMuMTUuMVwiLFxyXG4gICAgXCJ2aXRlXCI6IFwiNS4xLjNcIixcclxuICAgIFwidml0ZS1wbHVnaW4tY29tcHJlc3Npb25cIjogXCIwLjUuMVwiLFxyXG4gICAgXCJ2aXRlLXBsdWdpbi1odG1sXCI6IFwiMy4yLjJcIixcclxuICAgIFwidml0ZS1wbHVnaW4tbW9ja1wiOiBcIjIuOS42XCIsXHJcbiAgICBcInZpdGUtcGx1Z2luLXN0eWxlLWltcG9ydFwiOiBcIjIuMC4wXCIsXHJcbiAgICBcInZpdGUtcGx1Z2luLXN2Zy1pY29uc1wiOiBcIjIuMC4xXCIsXHJcbiAgICBcInZpdGUtcGx1Z2luLXZjb25zb2xlXCI6IFwiMS4zLjFcIixcclxuICAgIFwidml0ZS1wbHVnaW4tdnVlLXNldHVwLWV4dGVuZFwiOiBcIjAuNC4wXCIsXHJcbiAgICBcInZ1ZS1lc2xpbnQtcGFyc2VyXCI6IFwiOS4wLjNcIixcclxuICAgIFwidnVlLXRzY1wiOiBcIjAuMzUuMlwiXHJcbiAgfSxcclxuICBcImxpbnQtc3RhZ2VkXCI6IHtcclxuICAgIFwiKi57dnVlLGpzLHRzLHRzeH1cIjogXCJlc2xpbnQgLS1maXhcIlxyXG4gIH0sXHJcbiAgXCJjb25maWdcIjoge1xyXG4gICAgXCJjb21taXRpemVuXCI6IHtcclxuICAgICAgXCJwYXRoXCI6IFwiLi9ub2RlX21vZHVsZXMvY3otY3VzdG9taXphYmxlXCJcclxuICAgIH1cclxuICB9LFxyXG4gIFwia2V5d29yZHNcIjogW1xyXG4gICAgXCJ2dWVcIixcclxuICAgIFwibmFpdmUtdWlcIixcclxuICAgIFwibmFpdmUtdWktYWRtaW5cIixcclxuICAgIFwidnVlM1wiLFxyXG4gICAgXCJ0c1wiLFxyXG4gICAgXCJ0c3hcIixcclxuICAgIFwiYWRtaW5cIixcclxuICAgIFwidHlwZXNjcmlwdFwiXHJcbiAgXSxcclxuICBcImVuZ2luZXNcIjoge1xyXG4gICAgXCJub2RlXCI6IFwiMTIgfHwgPj0xNFwiXHJcbiAgfSxcclxuICBcInBucG1cIjoge1xyXG4gICAgXCJwZWVyRGVwZW5kZW5jeVJ1bGVzXCI6IHtcclxuICAgICAgXCJpZ25vcmVNaXNzaW5nXCI6IFtcclxuICAgICAgICBcInJvbGx1cFwiLFxyXG4gICAgICAgIFwid2VicGFja1wiXHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9XHJcbn0iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxjaGVuZ1xcXFxEZXNrdG9wXFxcXHNreWV5ZS1hZG1pblxcXFxidWlsZFxcXFxjb25zdGFudC50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvY2hlbmcvRGVza3RvcC9za3lleWUtYWRtaW4vYnVpbGQvY29uc3RhbnQudHNcIjsvKipcclxuICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBlbnRlcmVkIGluIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR0xPQl9DT05GSUdfRklMRV9OQU1FID0gJ2FwcC5jb25maWcuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IE9VVFBVVF9ESVIgPSAnZGlzdCc7XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcY2hlbmdcXFxcRGVza3RvcFxcXFxza3lleWUtYWRtaW5cXFxcYnVpbGRcXFxcdml0ZVxcXFxwbHVnaW5cIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXFxcXHZpdGVcXFxccGx1Z2luXFxcXG1vY2sudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL2NoZW5nL0Rlc2t0b3Avc2t5ZXllLWFkbWluL2J1aWxkL3ZpdGUvcGx1Z2luL21vY2sudHNcIjsvKipcclxuICogTW9jayBwbHVnaW4gZm9yIGRldmVsb3BtZW50IGFuZCBwcm9kdWN0aW9uLlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW5uY3diL3ZpdGUtcGx1Z2luLW1vY2tcclxuICovXHJcbmltcG9ydCB7IHZpdGVNb2NrU2VydmUgfSBmcm9tICd2aXRlLXBsdWdpbi1tb2NrJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb25maWdNb2NrUGx1Z2luKGlzQnVpbGQ6IGJvb2xlYW4sIHByb2RNb2NrOiBib29sZWFuKSB7XHJcbiAgcmV0dXJuIHZpdGVNb2NrU2VydmUoe1xyXG4gICAgaWdub3JlOiAvXlxcXy8sXHJcbiAgICBtb2NrUGF0aDogJ21vY2snLFxyXG4gICAgbG9jYWxFbmFibGVkOiAhaXNCdWlsZCxcclxuICAgIHByb2RFbmFibGVkOiBpc0J1aWxkICYmIHByb2RNb2NrLFxyXG4gICAgaW5qZWN0Q29kZTogYFxyXG4gICAgICAgaW1wb3J0IHsgc2V0dXBQcm9kTW9ja1NlcnZlciB9IGZyb20gJy4uL21vY2svX2NyZWF0ZVByb2R1Y3Rpb25TZXJ2ZXInO1xyXG4gXHJcbiAgICAgICBzZXR1cFByb2RNb2NrU2VydmVyKCk7XHJcbiAgICAgICBgLFxyXG4gIH0pO1xyXG59XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcY2hlbmdcXFxcRGVza3RvcFxcXFxza3lleWUtYWRtaW5cXFxcYnVpbGRcXFxcdml0ZVxcXFxwbHVnaW5cIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXFxcXHZpdGVcXFxccGx1Z2luXFxcXGNvbXByZXNzLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9DOi9Vc2Vycy9jaGVuZy9EZXNrdG9wL3NreWV5ZS1hZG1pbi9idWlsZC92aXRlL3BsdWdpbi9jb21wcmVzcy50c1wiOy8qKlxyXG4gKiBVc2VkIHRvIHBhY2thZ2UgYW5kIG91dHB1dCBnemlwLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGluIFZpdGUsIHRoZSBzcGVjaWZpYyByZWFzb24gaXMgc3RpbGwgYmVpbmcgaW52ZXN0aWdhdGVkXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbm5jd2Ivdml0ZS1wbHVnaW4tY29tcHJlc3Npb25cclxuICovXHJcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XHJcblxyXG5pbXBvcnQgY29tcHJlc3NQbHVnaW4gZnJvbSAndml0ZS1wbHVnaW4tY29tcHJlc3Npb24nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ0NvbXByZXNzUGx1Z2luKFxyXG4gIGNvbXByZXNzOiAnZ3ppcCcgfCAnYnJvdGxpJyB8ICdub25lJyxcclxuICBkZWxldGVPcmlnaW5GaWxlID0gZmFsc2VcclxuKTogUGx1Z2luIHwgUGx1Z2luW10ge1xyXG4gIGNvbnN0IGNvbXByZXNzTGlzdCA9IGNvbXByZXNzLnNwbGl0KCcsJyk7XHJcblxyXG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW107XHJcblxyXG4gIGlmIChjb21wcmVzc0xpc3QuaW5jbHVkZXMoJ2d6aXAnKSkge1xyXG4gICAgcGx1Z2lucy5wdXNoKFxyXG4gICAgICBjb21wcmVzc1BsdWdpbih7XHJcbiAgICAgICAgZXh0OiAnLmd6JyxcclxuICAgICAgICBkZWxldGVPcmlnaW5GaWxlLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgaWYgKGNvbXByZXNzTGlzdC5pbmNsdWRlcygnYnJvdGxpJykpIHtcclxuICAgIHBsdWdpbnMucHVzaChcclxuICAgICAgY29tcHJlc3NQbHVnaW4oe1xyXG4gICAgICAgIGV4dDogJy5icicsXHJcbiAgICAgICAgYWxnb3JpdGhtOiAnYnJvdGxpQ29tcHJlc3MnLFxyXG4gICAgICAgIGRlbGV0ZU9yaWdpbkZpbGUsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICByZXR1cm4gcGx1Z2lucztcclxufVxyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXFxcXHZpdGVcXFxccGx1Z2luXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxjaGVuZ1xcXFxEZXNrdG9wXFxcXHNreWV5ZS1hZG1pblxcXFxidWlsZFxcXFx2aXRlXFxcXHBsdWdpblxcXFx2aXN1YWxpemVyLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9DOi9Vc2Vycy9jaGVuZy9EZXNrdG9wL3NreWV5ZS1hZG1pbi9idWlsZC92aXRlL3BsdWdpbi92aXN1YWxpemVyLnRzXCI7aW1wb3J0IHsgUGx1Z2luT3B0aW9uIH0gZnJvbSAndml0ZSc7XHJcbmltcG9ydCB7IHZpc3VhbGl6ZXIgfSBmcm9tICdyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXInO1xyXG5pbXBvcnQgeyBpc1JlcG9ydE1vZGUgfSBmcm9tICcuLi8uLi91dGlscyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnVmlzdWFsaXplclBsdWdpbigpIHtcclxuICBpZiAoaXNSZXBvcnRNb2RlKCkpIHtcclxuICAgIHJldHVybiB2aXN1YWxpemVyKHtcclxuICAgICAgZmlsZW5hbWU6ICcuL25vZGVfbW9kdWxlcy8uY2FjaGUvdmlzdWFsaXplci9zdGF0cy5odG1sJyxcclxuICAgICAgb3BlbjogdHJ1ZSxcclxuICAgICAgZ3ppcFNpemU6IHRydWUsXHJcbiAgICAgIGJyb3RsaVNpemU6IHRydWUsXHJcbiAgICB9KSBhcyBQbHVnaW5PcHRpb247XHJcbiAgfVxyXG4gIHJldHVybiBbXTtcclxufVxyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXFxcXHZpdGVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXGJ1aWxkXFxcXHZpdGVcXFxccHJveHkudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL2NoZW5nL0Rlc2t0b3Avc2t5ZXllLWFkbWluL2J1aWxkL3ZpdGUvcHJveHkudHNcIjsvKipcclxuICogVXNlZCB0byBwYXJzZSB0aGUgLmVudi5kZXZlbG9wbWVudCBwcm94eSBjb25maWd1cmF0aW9uXHJcbiAqL1xyXG5pbXBvcnQgdHlwZSB7IFByb3h5T3B0aW9ucyB9IGZyb20gJ3ZpdGUnO1xyXG5cclxudHlwZSBQcm94eUl0ZW0gPSBbc3RyaW5nLCBzdHJpbmddO1xyXG5cclxudHlwZSBQcm94eUxpc3QgPSBQcm94eUl0ZW1bXTtcclxuXHJcbnR5cGUgUHJveHlUYXJnZXRMaXN0ID0gUmVjb3JkPHN0cmluZywgUHJveHlPcHRpb25zICYgeyByZXdyaXRlOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmcgfT47XHJcblxyXG5jb25zdCBodHRwc1JFID0gL15odHRwczpcXC9cXC8vO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIHByb3h5XHJcbiAqIEBwYXJhbSBsaXN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJveHkobGlzdDogUHJveHlMaXN0ID0gW10pIHtcclxuICBjb25zdCByZXQ6IFByb3h5VGFyZ2V0TGlzdCA9IHt9O1xyXG4gIGZvciAoY29uc3QgW3ByZWZpeCwgdGFyZ2V0XSBvZiBsaXN0KSB7XHJcbiAgICBjb25zdCBpc0h0dHBzID0gaHR0cHNSRS50ZXN0KHRhcmdldCk7XHJcblxyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2h0dHAtcGFydHkvbm9kZS1odHRwLXByb3h5I29wdGlvbnNcclxuICAgIHJldFtwcmVmaXhdID0ge1xyXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcclxuICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICB3czogdHJ1ZSxcclxuICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKGBeJHtwcmVmaXh9YCksICcnKSxcclxuICAgICAgLy8gaHR0cHMgaXMgcmVxdWlyZSBzZWN1cmU9ZmFsc2VcclxuICAgICAgLi4uKGlzSHR0cHMgPyB7IHNlY3VyZTogZmFsc2UgfSA6IHt9KSxcclxuICAgIH07XHJcbiAgfVxyXG4gIHJldHVybiByZXQ7XHJcbn1cclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxjaGVuZ1xcXFxEZXNrdG9wXFxcXHNreWV5ZS1hZG1pblxcXFxzcmNcXFxcdXRpbHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXGNoZW5nXFxcXERlc2t0b3BcXFxcc2t5ZXllLWFkbWluXFxcXHNyY1xcXFx1dGlsc1xcXFxkYXRlVXRpbC50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvY2hlbmcvRGVza3RvcC9za3lleWUtYWRtaW4vc3JjL3V0aWxzL2RhdGVVdGlsLnRzXCI7aW1wb3J0IGRheWpzLCB7IERheWpzIH0gZnJvbSAnZGF5anMnO1xyXG5cclxuY29uc3QgREFURV9USU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREIEhIOm1tJztcclxuY29uc3QgREFURV9GT1JNQVQgPSAnWVlZWS1NTS1ERCAnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRvRGF0ZVRpbWUoXHJcbiAgZGF0ZTogRGF0ZSB8IERheWpzIHwgc3RyaW5nLFxyXG4gIGZvcm1hdFN0ciA9IERBVEVfVElNRV9GT1JNQVQsXHJcbik6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGRheWpzKGRhdGUpLmZvcm1hdChmb3JtYXRTdHIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VG9EYXRlKGRhdGU6IERhdGUgfCBEYXlqcyB8IHN0cmluZywgZm9ybWF0U3RyID0gREFURV9GT1JNQVQpOiBzdHJpbmcge1xyXG4gIHJldHVybiBkYXlqcyhkYXRlKS5mb3JtYXQoZm9ybWF0U3RyKTtcclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxlQUFlO0FBQ3hCLE9BQU8sUUFBUSxlQUFlOzs7QUNBOUIsT0FBTyxZQUFZO0FBYVosU0FBUyxlQUF3QjtBQUN0QyxTQUFPLFFBQVEsSUFBSSxXQUFXO0FBQ2hDO0FBR08sU0FBUyxXQUFXLFNBQThCO0FBQ3ZELFFBQU0sTUFBVyxDQUFDO0FBRWxCLGFBQVcsV0FBVyxPQUFPLEtBQUssT0FBTyxHQUFHO0FBQzFDLFFBQUksV0FBVyxRQUFRLE9BQU8sRUFBRSxRQUFRLFFBQVEsSUFBSTtBQUNwRCxlQUFXLGFBQWEsU0FBUyxPQUFPLGFBQWEsVUFBVSxRQUFRO0FBRXZFLFFBQUksWUFBWSxhQUFhO0FBQzNCLGlCQUFXLE9BQU8sUUFBUTtBQUFBLElBQzVCO0FBQ0EsUUFBSSxZQUFZLGNBQWM7QUFDNUIsVUFBSTtBQUNGLG1CQUFXLEtBQUssTUFBTSxRQUFRO0FBQUEsTUFDaEMsU0FBUyxPQUFPO0FBQUEsTUFBQztBQUFBLElBQ25CO0FBQ0EsUUFBSSxPQUFPLElBQUk7QUFDZixZQUFRLElBQUksT0FBTyxJQUFJO0FBQUEsRUFDekI7QUFDQSxTQUFPO0FBQ1Q7OztBQ3JDQSxPQUFPLFNBQVM7QUFDaEIsT0FBTyxZQUFZO0FBQ25CLE9BQU8sb0JBQW9COzs7QUNDM0IsU0FBUyx3QkFBd0I7OztBQ0xqQztBQUFBLEVBQ0UsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLEVBQ1gsU0FBVztBQUFBLEVBQ1gsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLElBQ1QsV0FBYTtBQUFBLElBQ2IsT0FBUztBQUFBLElBQ1QsS0FBTztBQUFBLElBQ1AsY0FBZ0I7QUFBQSxJQUNoQixPQUFTO0FBQUEsSUFDVCxjQUFjO0FBQUEsSUFDZCxrQkFBa0I7QUFBQSxJQUNsQixRQUFVO0FBQUEsSUFDVixjQUFjO0FBQUEsSUFDZCxTQUFXO0FBQUEsSUFDWCxnQkFBZ0I7QUFBQSxJQUNoQixlQUFlO0FBQUEsSUFDZixhQUFhO0FBQUEsSUFDYixlQUFlO0FBQUEsSUFDZixpQkFBaUI7QUFBQSxJQUNqQixrQkFBa0I7QUFBQSxJQUNsQixvQkFBb0I7QUFBQSxJQUNwQixlQUFlO0FBQUEsSUFDZixrQkFBa0I7QUFBQSxJQUNsQixXQUFhO0FBQUEsSUFDYixtQkFBbUI7QUFBQSxJQUNuQixRQUFVO0FBQUEsSUFDVixTQUFXO0FBQUEsRUFDYjtBQUFBLEVBQ0EsY0FBZ0I7QUFBQSxJQUNkLDJCQUEyQjtBQUFBLElBQzNCLGlCQUFpQjtBQUFBLElBQ2pCLGdCQUFnQjtBQUFBLElBQ2hCLHFCQUFxQjtBQUFBLElBQ3JCLG9CQUFvQjtBQUFBLElBQ3BCLGdCQUFnQjtBQUFBLElBQ2hCLGtCQUFrQjtBQUFBLElBQ2xCLHNCQUFzQjtBQUFBLElBQ3RCLDhCQUE4QjtBQUFBLElBQzlCLGVBQWU7QUFBQSxJQUNmLFVBQVk7QUFBQSxJQUNaLE9BQVM7QUFBQSxJQUNULGVBQWU7QUFBQSxJQUNmLE9BQVM7QUFBQSxJQUNULFdBQWE7QUFBQSxJQUNiLE9BQVM7QUFBQSxJQUNULFNBQVc7QUFBQSxJQUNYLGdCQUFnQjtBQUFBLElBQ2hCLDJCQUEyQjtBQUFBLElBQzNCLGFBQWE7QUFBQSxJQUNiLGFBQWU7QUFBQSxJQUNmLE9BQVM7QUFBQSxJQUNULGFBQWE7QUFBQSxJQUNiLFFBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxJQUNiLFdBQWE7QUFBQSxJQUNiLG9CQUFvQjtBQUFBLElBQ3BCLHFCQUFxQjtBQUFBLElBQ3JCLE9BQVM7QUFBQSxJQUNULFlBQVk7QUFBQSxJQUNaLFFBQVU7QUFBQSxJQUNWLElBQU07QUFBQSxJQUNOLEtBQU87QUFBQSxJQUNQLFlBQVk7QUFBQSxJQUNaLEtBQU87QUFBQSxJQUNQLGVBQWU7QUFBQSxJQUNmLGtCQUFrQjtBQUFBLElBQ2xCLGFBQWE7QUFBQSxJQUNiLGNBQWM7QUFBQSxJQUNkLGFBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1Y7QUFBQSxFQUNBLGlCQUFtQjtBQUFBLElBQ2pCLG1CQUFtQjtBQUFBLElBQ25CLG1DQUFtQztBQUFBLElBQ25DLGtDQUFrQztBQUFBLElBQ2xDLG1CQUFtQjtBQUFBLElBQ25CLG9CQUFvQjtBQUFBLElBQ3BCLGVBQWU7QUFBQSxJQUNmLGlCQUFpQjtBQUFBLElBQ2pCLG9DQUFvQztBQUFBLElBQ3BDLDZCQUE2QjtBQUFBLElBQzdCLHNCQUFzQjtBQUFBLElBQ3RCLDBCQUEwQjtBQUFBLElBQzFCLHFCQUFxQjtBQUFBLElBQ3JCLGNBQWdCO0FBQUEsSUFDaEIsT0FBUztBQUFBLElBQ1QsUUFBVTtBQUFBLElBQ1YsWUFBYztBQUFBLElBQ2QsV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsUUFBVTtBQUFBLElBQ1YsUUFBVTtBQUFBLElBQ1YsMEJBQTBCO0FBQUEsSUFDMUIsd0JBQXdCO0FBQUEsSUFDeEIsMEJBQTBCO0FBQUEsSUFDMUIscUJBQXFCO0FBQUEsSUFDckIsTUFBUTtBQUFBLElBQ1IsYUFBYTtBQUFBLElBQ2IsWUFBWTtBQUFBLElBQ1osWUFBWTtBQUFBLElBQ1osT0FBUztBQUFBLElBQ1QsTUFBUTtBQUFBLElBQ1IsZUFBZTtBQUFBLElBQ2YsZUFBZTtBQUFBLElBQ2YsWUFBYztBQUFBLElBQ2QsU0FBVztBQUFBLElBQ1gsMEJBQTBCO0FBQUEsSUFDMUIsVUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsUUFBVTtBQUFBLElBQ1YsNEJBQTRCO0FBQUEsSUFDNUIsTUFBUTtBQUFBLElBQ1IsY0FBYztBQUFBLElBQ2QsV0FBYTtBQUFBLElBQ2IsNkJBQTZCO0FBQUEsSUFDN0IsNkJBQTZCO0FBQUEsSUFDN0IsbUJBQW1CO0FBQUEsSUFDbkIsa0JBQWtCO0FBQUEsSUFDbEIsYUFBZTtBQUFBLElBQ2YsV0FBVztBQUFBLElBQ1gsWUFBYztBQUFBLElBQ2QsVUFBWTtBQUFBLElBQ1osTUFBUTtBQUFBLElBQ1IsMkJBQTJCO0FBQUEsSUFDM0Isb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsNEJBQTRCO0FBQUEsSUFDNUIseUJBQXlCO0FBQUEsSUFDekIsd0JBQXdCO0FBQUEsSUFDeEIsZ0NBQWdDO0FBQUEsSUFDaEMscUJBQXFCO0FBQUEsSUFDckIsV0FBVztBQUFBLEVBQ2I7QUFBQSxFQUNBLGVBQWU7QUFBQSxJQUNiLHFCQUFxQjtBQUFBLEVBQ3ZCO0FBQUEsRUFDQSxRQUFVO0FBQUEsSUFDUixZQUFjO0FBQUEsTUFDWixNQUFRO0FBQUEsSUFDVjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFVBQVk7QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVc7QUFBQSxJQUNULE1BQVE7QUFBQSxFQUNWO0FBQUEsRUFDQSxNQUFRO0FBQUEsSUFDTixxQkFBdUI7QUFBQSxNQUNyQixlQUFpQjtBQUFBLFFBQ2Y7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQ2xLTyxJQUFNLHdCQUF3QjtBQUU5QixJQUFNLGFBQWE7OztBRkcxQixTQUFTLGlCQUFpQjtBQUMxQixJQUFNLE1BQU0sVUFBVTtBQUV0QixlQUFlLGdCQUFnQjtBQUM3QixRQUFNLFNBQVMsTUFBTSxJQUFJLElBQUk7QUFFN0IsUUFBTSxhQUFhO0FBQ25CLFNBQU8sT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLFlBQVksVUFBVTtBQUM5RDtBQUVPLFNBQVMsaUJBQWlCLEtBQWMsU0FBMkM7QUFDeEYsUUFBTSxFQUFFLG9CQUFvQixJQUFJO0FBRWhDLFFBQU1BLFFBQU87QUFFYixRQUFNLGtCQUFrQixNQUFNO0FBQzVCLFdBQU8sR0FBR0EsU0FBUSxHQUFHLEdBQUcscUJBQXFCLE1BQU0sZ0JBQUksT0FBTyxLQUFJLG9CQUFJLEtBQUssR0FBRSxRQUFRLENBQUM7QUFBQSxFQUN4RjtBQUVBLFNBQU8sSUFBSSxRQUFRLENBQUNDLGFBQVk7QUFDOUIsa0JBQWMsRUFBRSxLQUFLLENBQUMsU0FBUztBQUM3QixZQUFNLGFBQTZCLGlCQUFpQjtBQUFBLFFBQ2xELFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQTtBQUFBLFVBRU4sTUFBTTtBQUFBLFlBQ0osT0FBTztBQUFBLFlBQ1A7QUFBQSxVQUNGO0FBQUE7QUFBQSxVQUVBLE1BQU0sVUFDRjtBQUFBLFlBQ0U7QUFBQSxjQUNFLEtBQUs7QUFBQSxjQUNMLE9BQU87QUFBQSxnQkFDTCxLQUFLLGdCQUFnQjtBQUFBLGNBQ3ZCO0FBQUEsWUFDRjtBQUFBLFVBQ0YsSUFDQSxDQUFDO0FBQUEsUUFDUDtBQUFBLE1BQ0YsQ0FBQztBQUNELE1BQUFBLFNBQVEsVUFBVTtBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDs7O0FHakRBLFNBQVMscUJBQXFCO0FBRXZCLFNBQVMsaUJBQWlCLFNBQWtCLFVBQW1CO0FBQ3BFLFNBQU8sY0FBYztBQUFBLElBQ25CLFFBQVE7QUFBQSxJQUNSLFVBQVU7QUFBQSxJQUNWLGNBQWMsQ0FBQztBQUFBLElBQ2YsYUFBYSxXQUFXO0FBQUEsSUFDeEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZCxDQUFDO0FBQ0g7OztBQ1pBLE9BQU8sb0JBQW9CO0FBRXBCLFNBQVMscUJBQ2QsVUFDQSxtQkFBbUIsT0FDQTtBQUNuQixRQUFNLGVBQWUsU0FBUyxNQUFNLEdBQUc7QUFFdkMsUUFBTSxVQUFvQixDQUFDO0FBRTNCLE1BQUksYUFBYSxTQUFTLE1BQU0sR0FBRztBQUNqQyxZQUFRO0FBQUEsTUFDTixlQUFlO0FBQUEsUUFDYixLQUFLO0FBQUEsUUFDTDtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0EsTUFBSSxhQUFhLFNBQVMsUUFBUSxHQUFHO0FBQ25DLFlBQVE7QUFBQSxNQUNOLGVBQWU7QUFBQSxRQUNiLEtBQUs7QUFBQSxRQUNMLFdBQVc7QUFBQSxRQUNYO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7OztBQ2pDQSxTQUFTLGtCQUFrQjtBQUdwQixTQUFTLHlCQUF5QjtBQUN2QyxNQUFJLGFBQWEsR0FBRztBQUNsQixXQUFPLFdBQVc7QUFBQSxNQUNoQixVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsSUFDZCxDQUFDO0FBQUEsRUFDSDtBQUNBLFNBQU8sQ0FBQztBQUNWOzs7QU5HTyxTQUFTLGtCQUFrQixTQUFrQixTQUFrQixVQUFVO0FBQzlFLFFBQU0sRUFBRSxlQUFlLHFCQUFxQix1Q0FBdUMsSUFBSTtBQUV2RixRQUFNLGNBQWlEO0FBQUE7QUFBQSxJQUVyRCxJQUFJO0FBQUE7QUFBQSxJQUVKLE9BQU87QUFBQSxJQUNQLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFqQjtBQUdBLGNBQVksS0FBSyxpQkFBaUIsU0FBUyxPQUFPLENBQUM7QUFHbkQsbUJBQWlCLFlBQVksS0FBSyxpQkFBaUIsU0FBUyxRQUFRLENBQUM7QUFHckUsY0FBWSxLQUFLLHVCQUF1QixDQUFDO0FBRXpDLE1BQUksU0FBUztBQUVYLGdCQUFZO0FBQUEsTUFDVixxQkFBcUIscUJBQXFCLHNDQUFzQztBQUFBLElBQ2xGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDs7O0FPOUNBLElBQU0sVUFBVTtBQU1ULFNBQVMsWUFBWSxPQUFrQixDQUFDLEdBQUc7QUFDaEQsUUFBTSxNQUF1QixDQUFDO0FBQzlCLGFBQVcsQ0FBQyxRQUFRLE1BQU0sS0FBSyxNQUFNO0FBQ25DLFVBQU0sVUFBVSxRQUFRLEtBQUssTUFBTTtBQUduQyxRQUFJLE1BQU0sSUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUNBLGNBQWM7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLFNBQVMsQ0FBQ0MsVUFBU0EsTUFBSyxRQUFRLElBQUksT0FBTyxJQUFJLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFBQTtBQUFBLE1BRTVELEdBQUksVUFBVSxFQUFFLFFBQVEsTUFBTSxJQUFJLENBQUM7QUFBQSxJQUNyQztBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7OztBQ2pDaVUsT0FBTyxXQUFzQjtBQUU5VixJQUFNLG1CQUFtQjtBQUdsQixTQUFTLGlCQUNkLE1BQ0EsWUFBWSxrQkFDSjtBQUNSLFNBQU8sTUFBTSxJQUFJLEVBQUUsT0FBTyxTQUFTO0FBQ3JDOzs7QVZEQSxTQUFTLDRCQUE0QjtBQVRyQyxJQUFNLG1DQUFtQztBQVd6QyxJQUFNLE1BQU0scUJBQXFCO0FBQUE7QUFBQSxFQUUvQixVQUFVLENBQUMsS0FBSyxRQUFRLGtDQUFXLGtCQUFrQixDQUFDO0FBQUE7QUFBQSxFQUV0RCxVQUFVO0FBQ1osQ0FBQztBQUVELElBQU0sRUFBRSxjQUFjLGlCQUFpQixNQUFNLFFBQVEsSUFBSTtBQUV6RCxJQUFNLGVBQWU7QUFBQSxFQUNuQixLQUFLLEVBQUUsY0FBYyxpQkFBaUIsTUFBTSxRQUFRO0FBQUEsRUFDcEQsZUFBZSxpQkFBaUIsb0JBQUksS0FBSyxDQUFDO0FBQzVDO0FBRUEsU0FBUyxZQUFZLEtBQWE7QUFDaEMsU0FBTyxRQUFRLFFBQVEsSUFBSSxHQUFHLEtBQUssR0FBRztBQUN4QztBQUVBLElBQU8sc0JBQVEsQ0FBQyxFQUFFLFNBQVMsS0FBSyxNQUE2QjtBQUMzRCxRQUFNLE9BQU8sUUFBUSxJQUFJO0FBQ3pCLFFBQU0sTUFBTSxRQUFRLE1BQU0sSUFBSTtBQUM5QixRQUFNLFVBQVUsV0FBVyxHQUFHO0FBQzlCLFFBQU0sRUFBRSxXQUFXLHFCQUFxQixXQUFXLElBQUk7QUFDdkQsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sVUFBVSxZQUFZO0FBQzVCLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLFNBQVMsQ0FBQztBQUFBLElBQ1YsU0FBUztBQUFBLE1BQ1AsT0FBTztBQUFBLFFBQ0w7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLGFBQWEsWUFBWSxPQUFPLElBQUk7QUFBQSxRQUN0QztBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLGFBQWEsWUFBWSxLQUFLLElBQUk7QUFBQSxRQUNwQztBQUFBLE1BQ0Y7QUFBQSxNQUNBLFFBQVEsQ0FBQyxLQUFLO0FBQUEsSUFDaEI7QUFBQSxJQUNBLFNBQVMsQ0FBQyxrQkFBa0IsU0FBUyxTQUFTLFFBQVEsR0FBRyxHQUFHO0FBQUEsSUFDNUQsUUFBUTtBQUFBLE1BQ04sY0FBYyxLQUFLLFVBQVUsWUFBWTtBQUFBLElBQzNDO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxjQUFjO0FBQUEsTUFDZCxxQkFBcUI7QUFBQSxRQUNuQixNQUFNO0FBQUEsVUFDSixZQUFZLENBQUM7QUFBQSxVQUNiLG1CQUFtQjtBQUFBLFVBQ25CLGdCQUFnQjtBQUFBLFFBQ2xCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLE9BQU8sWUFBWSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVEvQjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osU0FBUyxDQUFDLFNBQVMscUJBQXFCLGdCQUFnQix5QkFBeUI7QUFBQSxNQUNqRixTQUFTLENBQUM7QUFBQSxJQUNaO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJUixlQUFlO0FBQUEsUUFDYixVQUFVO0FBQUEsVUFDUixlQUFlO0FBQUEsVUFDZixjQUFjO0FBQUEsUUFDaEI7QUFBQSxNQUNGO0FBQUEsTUFDQSxzQkFBc0I7QUFBQSxNQUN0Qix1QkFBdUI7QUFBQSxJQUN6QjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsicGF0aCIsICJyZXNvbHZlIiwgInBhdGgiXQp9Cg==