shared-ui-test-1 1.0.1 → 1.0.2

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 (700) hide show
  1. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/01/3f/040c1228e816cb9c08fb64e187288ff8ba118a6a4c219c675b90c2f0671abcece1bf1df0d27972f342acaf58abc240b0471d630971f1d5612cb6f81cb96b +1 -0
  2. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/03/87/b241f3b8fe0a68120d1fbbca32d818992e4e6f7f0736cf0e24076081f6a9a33dfbbe2ea501b792021873bbd57e8d80ae431f3a33450e6edbfda087a52008 +1 -0
  3. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/03/91/8ae3dd03a5e838bf09d1156e7747904ad1248c193d84645e18e765877dde63555c9e1171d434f5ac487e5066678d419ba30a463254b95e37323878dae4fe +1 -0
  4. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/09/84/f75112196f4637465d7d2c2dad9a2ef4a76b63627e0ffa88b4a1d8726bbb855ec4029f6a0b91cf25ba42fed69dabf4a3dcb5eb6cea3a29b7f29dc0f95ad3 +1 -0
  5. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/0c/b6/4ac66157ec095ab06e6f94e77c813f2a0b0e0bc9f94ec6fc5650f962a58d6039273a8e036d97de741363053b2ac5fc962e9abaf28daf5a905634f43a27e7 +1 -0
  6. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/16/7d/674f353083cdc1b159370608303143d35f80811d30a8bd9f5ade697dbf42e23bd5c9167f2c21ff2a367b94093f467803c7628dbb21ea2deda7643c744d5a +1 -0
  7. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/1a/34/1fcf4526ae84d16205b1a97140e2d91c14239ee771d58a1e75e3724ac7c078dfd70a8cc3e92275c72d9a258f48ef707dc15ff508c595134f7881c2bd7b0b +1 -0
  8. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/1a/fa/8692e121af8219a89ff147204e3a522889a929cf5609e53eb199e6935705a62a155cfb7ac3698967ebebbc44ce4bb60e4612a7694d6e101962fdc1a25ebc +1 -0
  9. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/1b/09/9b86f27a7ffeea90e563ce7e2e300f4c10cd18b9a4cc66f19a83b7808b9171acf25273b4083fb299a0b84e3f58d0e4a1f7657c89e6fbea48f24398010c90 +1 -0
  10. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/29/d0/d1718ed580be27bdbf98f24ff09ca9b2ab05b01f777b6e080a43a7ed74f6debcfc532910fae123b3ebb259cc6c841edba6489feeff73f961b57e156aa00f +1 -0
  11. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/2f/62/9f9b2eb550581b217a08c833818d19ef6e25ed4e3f0d4b2268b10f17928720e786f81460f1c5709c5ffc0cecd01debdd117f4828ba46452bd2a3d531c4d6 +1 -0
  12. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/3c/fe/e2a94d282ce21ea310e4ef9f9316258bccf0f70c478281a72361ffff5dea6e15b44f7548289d443a294dd8b5b1dbb3f894e71d56eef10571d07ea83fa162 +1 -0
  13. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/43/d0/75f69dabc179a7b86d10ace74eda3d0deb88aeb115b8e63a3c9da23bccd9e588f2e440db7cec89be29218707c03623d30aa1ad754ff6f420711b53676f11 +1 -0
  14. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/44/d6/167368c6ca1081a3641ebdb5e7b42e400ba6f3138594c55c9bb476066b38fe9878335903b2c98e78e1140b8d95a260001f2db8f887f934799f9a18d3e612 +1 -0
  15. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/48/19/0c65d82328cdb245f5adaa377d4385a19f13ae1a54f41a6df487a0aea6f6fb5415c0722ade84364b0163a2349d2ebbfa3eb32a90c4545c6d32a2913b8325 +1 -0
  16. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/4c/e0/055a8a72c82d0b20ae3a134efeb1c9d641f0f6c2549aa71faf71e5fc851d2b2144632103b0abc2812c53c379508b60a5dd7a39b73593d2aaa66a5011259b +1 -0
  17. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/51/36/4f6f84be92c83d4f3b9829eabf40f3cad08e2b055c9ce7a31bcd60d381b8167a6fc2d19c543f20b0daa644e1e084e12e12bf57fbf8e546cdfe6d064ac02e +1 -0
  18. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/56/c5/5f785e169abe56b821d239bff483b2de9ec104ec7c516d662470c09cdf52f12397cc1f9923e804290bb61a87c328793fc4bd40f390ce9a36e3c8368fd379 +1 -0
  19. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/5e/c2/7ea5ed650645c26ba636105fc5d87f1f0e54f151821f9eb72494dbd5c3150d9792a6af2ddee9b53f16aa6b4655bf5c4b29fb645dba1d6d63e4b8c88b34c5 +1 -0
  20. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/65/ff/5a611cccef718d4fc2c5a0b5636828ea347ab3bd0e61526a1dd3c3698e84b5240c3c3ef3ff5d64f78a85ad165a4c92fbd6a012062f03c5ab0e551f1d2cad +1 -0
  21. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/6e/88/2634e35647040e486fcd7bdc361790a6de80b7944334bd94caf0b36abcce92708a834f95748d99725440d1c2b335af77513a00567a49c5cdb0e77db6c7ac +1 -0
  22. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/75/20/8a68228ecaf5c095ccb13c602b80e1def4eb6126bc9a4fc8112c90bbeba11997c8b2ff976e3b5baf4ddab68322a29ef50b53a81cecbf756b6d2124df763a +1 -0
  23. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/78/e9/5c0c5a4fde32b4c9c8a32f5cf5dbfb52cb12a592dd496c8146f19cb888fe591b634d4e8ef9f01af8c061fa1172baceea9c05a8082102d59e06ffdbfb3084 +1 -0
  24. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/7a/66/a503da27c1588e8c528364ad5b833c44884f8beceda66c243fee6c61f0a3014e4aca37cb951487afc0c7918bbd042202a222a2536a3f96202c0393820f17 +1 -0
  25. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/82/ed/4e387fb3681817503fc98a1faaf4b46705bb416ef13d56c9044b0dbf66ebfbe66b7fb6d53d66102bb00131d78f4295c676902aac0cfed817f604b3784568 +1 -0
  26. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/84/16/51187c6eee9fbb4c3dd2c2b7c92bdec498c2a5bbf7bf1ed20f722fe8cc7d72e827c40fb3894f6b53ba8639ec54af3eb332c2e6d6194c1a7394eb5d975191 +1 -0
  27. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/84/bf/ebc190f5d498f3278c779ed69cac9dfa3ba4aa3830a52e47527f8d5abc8037e67166156a93beab03507fa7dbbbdede7f0c5d71b501d7c7a7f208a702f927 +1 -0
  28. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/84/dd/9d32faefb04de7c1d7197aba2e8100e99139c5886e17e4bb7c563e68cb5ff5753286a4c09d5a545669d3496445c2562c0d7d71af2891d8208f0d6a004d0e +1 -0
  29. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/87/2e/9a95bc283d194e245b59e3f68467a8e4c68d14a5cbed6411b6a7343ad981d442d8abc8b83631f5a66f3e945df402e1e81ccc248d5d7d87ccb871bdfc779a +1 -0
  30. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/87/d1/7517ae69a5180682a55c23da05c5584296e45da7c8c5565feba5f6236deb3c1779fa3338ff801d3f373611145592e74cd99afbec648286695552b6488ab9 +1 -0
  31. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/88/eb/3c2119d9f2a145ff38c080c16a6397257049a0322370671b9bd6ea3f091702d018dabe87d104d36b64952a885eac73f131367a6056a3d36519a6e83563c9 +1 -0
  32. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/8d/53/ad58764bc240411378ae1c47c0c20525da378a3b143795a11bc3fdbf6c9cde6fb2de6c3947d673d5872b9ce205d6274114b3b4dfd27609a636df7fd0b600 +1 -0
  33. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/8f/f1/55572297520b12ec95443743fd9842bceb718cdd356d0fb7f118cebe5453e5cd13582944e26afa865b52547eea6dbee44fe5bd4c0511b8f3f43ded77b2c3 +1 -0
  34. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/92/3f/14cd3165c289adb03f841d783993d2d330ebd735e7bceb024d3453c911f1db41ba92dea5af2cd6dfd4170f3ff27d382dc7cb4212b81f6e07086bc266263e +1 -0
  35. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/94/10/35575692a66e889cc0129aa506297eb9c21a7d03a5754cf48dbca517155f97f0b41d12be78a62ffd767ea58d3160e32b2b80d3863aa8662795309b596db3 +1 -0
  36. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/94/89/9aa199f0d0af3892408e55c51370ddf3def4e3a1384266675ae6600a1be7d5f117e1c82c633240c1b8ce4265259744ea06512292fda991d6430a3db95189 +1 -0
  37. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/95/a6/e80bf112983cd6012f28ebaf1b7e8319f52752ebe99399db87eb2739808d9a7435576f44bfc57aaf4354ab4e1564fd821208a9cd074698d3c7f6fe93d898 +1 -0
  38. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/98/47/0d1edd1ba683462af44c6410101da0a0a7949b7fc0b0bfc4103a6e0c8b851c9283847e29283df4dfc5c6cb386128918a1d403fb7d079684418c6f6ad3d48 +1 -0
  39. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/99/10/267bbfe7c07e3e261f54dff371e9c83375394964ebaf5b5175b7bb4c07dbc022d32b0ae5c8c6ba6ece45b9edb884061bec5d629032f9e2dfc120bdfb7f9b +1 -0
  40. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/9a/c0/14d2e0477acec7e1e4b71fdc4ba7341048be96c19b1ab95cbacdbada8d63199d785338d8ff7d4adfef2a807bb1212829ef728ad139238605d60b10d3927b +1 -0
  41. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/9a/cf/679eb03d9351055692e7c51156330ea0dfb821bbe52d1a1f819b8f8d32311271e7bed56b6e3f556170f469ad3ba70ca4d413a94ab5332767fbc56595d399 +1 -0
  42. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/a1/b9/3bd628719eb8b0aa13dd058f8e3cd945fc164a00bb76aec8106c2290fbde18418b6d50ca00b1b332e7bf61d945bb801e04d105800087fa1eb5046dcea73d +1 -0
  43. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/ac/ec/91861d1ebc9b64fc825f0a2da32bf28f213f2aafd1ac29233463abd9f5e0b6cd54d94c3931dd7ea50f56c19b358d08306b5e44375160e20a24b20ab2c48c +1 -0
  44. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/ac/f5/0a316e2f12282b53da47a607cda09afeccf401a03c56db801682a608e27a04c0d12bd63995961804bebc528ea667da10284fe48425086bf925cc3324bc15 +1 -0
  45. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/b5/bb/a39701c6ee3f72e736885a0ab114e3f2f1680b30641f355633a1b4ca35f399963e6704a5ab9f475bd205675a361df06d3e4be8e6f3c12f2964bb793b49d5 +1 -0
  46. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/b5/d2/84b38e7e367fe74b0220b7472cda2002a81693d5c1d9c3a0442a0d63254d8b6b27205f86d92417f588f38fa6ffc5f0f4969671d8a7a8d8df8d5ab471254d +1 -0
  47. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/b6/83/2a46bab1783498203f1a245cba1b5cee5cf794c96b00c6f33e2a30c21c038ac912833b3d865a7b786894dac34235a27dd2d76f8ea8496b5aaf482c3e9ef7 +1 -0
  48. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/ba/46/626bfecccccad2466d4dd52d4e6b57919fd499decf5269614a4ef76f4ccdad9fea47bea50738cd86572fb94df4f96de8ab079c504094fefd81a34c38c8da +1 -0
  49. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/bd/be/c56ec8907548629bb1d2d93d70505a9eb00eed0760903e6e4a47c337fbc26b9487c67705c483a9f20167d82f40d1a1a32f9a7742c944a88a6a15056f2bac +1 -0
  50. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/c3/02/a1ce851f2405bd373fb34406acc6036afcf6a69c3511a61be0624274852513e02717467f3ef7fa1d1287d72e964ce5f7ec62830b10a0035d848e186f12d6 +1 -0
  51. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/c5/17/a058edba55f38dad32ff3a10d4a16f7dc1150c4d302f2a862579d939c804f950c649296be845a9c02d22b69284ac62a48fd2ec478d185860454f84b855da +1 -0
  52. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/c8/30/fa0a509b6198ffe6c5ecb998b0caf34cd15578f7e9e24db3a374fae7fa4a43a23db38ea0b3e6da6640167a87c7f51e9fb9f805e1f9690c23fc8375d03f15 +1 -0
  53. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/c8/fc/165bbbfdefb7e0f61eea111ebf064de4a36d1ebcf6fa753375dfe3080a2ac557f0e7f132ee529705c7c8d3a0be7b3685cb6c0dd4963e5900e33d97a0a153 +1 -0
  54. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/ce/29/101aaced839a4e8f90b7222db64072ace54f5c650d88780e4804c596d46abbcc9d104d05e72ffd1c072d1d7b482e71f50db99c9d9ad2775b9e7587d292e3 +1 -0
  55. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/d0/23/37cbacc1a5c5ad5f0a7b2d845c3bd9b06b3ae18a66d1e60f599667f043d01b35d6df1e05422c565e2f00436df639f8705bba6d95d680a6ac2c5eda9654e8 +1 -0
  56. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/df/48/15fc389b3c57a852f5432ce8dc427bae0ab19b520054fbc9bd2d241199a90eebc00d3c1a4bdd2d74cb483c62d3a7de322ced687519a2aaac79600f90c168 +1 -0
  57. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/e3/b2/5583e444df3b518f55a297880ee7b01c05d9e7e96266ec157582ca2e0604259544f451163032fb684eac58291b8ab1233716a7ee3712e2895392d56d64f4 +1 -0
  58. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/e7/c2/515208bd5778c7075d3ced324598eba245d1c066636ef5a58fcfb27249ccb16c98112a3cde5e3a535ccf118defc8b57969dcd2d20f7abe2e228de894337c +1 -0
  59. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/ec/9a/bec9ed151b862b597562d22a54f0b06c94eaa1e5a196f9d47f943b0cc16ccedf27305b87cc838c91ec05c715829983c6cdd9af232101378481a4d602669c +1 -0
  60. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/f1/80/c04c06838e6cf8b883d71a14834afa023da192061a5b9a28015d65b3cb1d279e11b6703930ece6589ac67a897907f9458729e27543eccf97fd11e900b455 +1 -0
  61. package/.angular/cache/18.2.20/ng-packagr/content-v2/sha512/fb/65/51e78c212f0cf1b47e458e7ab066e574cd7daa545f33ec86dc6a57f6c62acaa603fe0b6955c8d30b7855482e1c7e46706b56060cbfe783cc2f55f8456ee7 +1 -0
  62. package/.angular/cache/18.2.20/ng-packagr/index-v5/03/cc/fccc1324935a8cd6808885ec55f74d0e10b96f038938d7807e0b48e54a64 +2 -0
  63. package/.angular/cache/18.2.20/ng-packagr/index-v5/04/2a/09f68bac69fd8c17a8dca637e4ca5e01857461367ae29e57d2f537ba5c22 +2 -0
  64. package/.angular/cache/18.2.20/ng-packagr/index-v5/07/07/93064b6474e5697b72e81e2c7e00e55e80cf208764bcac9b1fb4b188b703 +2 -0
  65. package/.angular/cache/18.2.20/ng-packagr/index-v5/0a/39/f021effdf4547fd0145c54ea9e872809b49ae65a8ec4b9795c4c53d7a92e +2 -0
  66. package/.angular/cache/18.2.20/ng-packagr/index-v5/13/3c/df40919c399dbbd57e43b2d490abaa9506a42dda16f5eeebf712e403be68 +2 -0
  67. package/.angular/cache/18.2.20/ng-packagr/index-v5/15/7d/4603b8f10603172f32872df745036ea0100ca4d08dfdbc9dfbe6a68361ff +2 -0
  68. package/.angular/cache/18.2.20/ng-packagr/index-v5/18/e4/7cba03fe874e9c3147b696aa2d89a201442b65877ded31a1099446320458 +2 -0
  69. package/.angular/cache/18.2.20/ng-packagr/index-v5/1e/86/ae7bc39d1872165863e59b3976a10a19d86b5b9d41b83e3068a3386cd215 +2 -0
  70. package/.angular/cache/18.2.20/ng-packagr/index-v5/22/06/83e91e52605724e45002b1ccaf24df27e841b8a95ddfd88aa644f4da3afa +2 -0
  71. package/.angular/cache/18.2.20/ng-packagr/index-v5/24/dd/231d64e71afb0f204660bfafd6d20f295a1815014fa25ee10ef9647d9182 +2 -0
  72. package/.angular/cache/18.2.20/ng-packagr/index-v5/2b/8c/0c377f22ea2614d11bbe02829e28cc30d4bb6ed763285209533f8891bd38 +2 -0
  73. package/.angular/cache/18.2.20/ng-packagr/index-v5/2e/d8/5b0f9a037b5b154a637d1661d90828c3ed467e534606475c2283a546688a +2 -0
  74. package/.angular/cache/18.2.20/ng-packagr/index-v5/30/a5/c911dc8a1039b24e79f70a027ad5f6c9eeb3954bfabca0573949ee642055 +2 -0
  75. package/.angular/cache/18.2.20/ng-packagr/index-v5/38/34/6cc834b0a8cbdc119f9e91f9511cf6a40ea6f6f20157e9521261c09af6f6 +2 -0
  76. package/.angular/cache/18.2.20/ng-packagr/index-v5/3b/57/a3cbd16654755426316e8b5b26fba94b77f3cfe58dca8181d7303d354cf5 +2 -0
  77. package/.angular/cache/18.2.20/ng-packagr/index-v5/45/f9/d75db2e622b940d6154bdaf058b76b95384b8f5bf40a2b72ec456097fc42 +2 -0
  78. package/.angular/cache/18.2.20/ng-packagr/index-v5/47/9d/af9ac41e81771d125a03964e32f39fa0350e263611dbd425fbeb0f32949f +2 -0
  79. package/.angular/cache/18.2.20/ng-packagr/index-v5/49/b9/22a37e997496c6b1f18ae3d38f059bbccf7cf5ac31ae249f79ee83b1490d +2 -0
  80. package/.angular/cache/18.2.20/ng-packagr/index-v5/51/ca/7a6efb6b231ae2a64492bc13d4e99a286c304789647530de423f72442116 +2 -0
  81. package/.angular/cache/18.2.20/ng-packagr/index-v5/5a/cc/93b0d0eb1d2e9bca4c782a293939eabade3c8fedbc0332b902e6d51c30ca +2 -0
  82. package/.angular/cache/18.2.20/ng-packagr/index-v5/5d/2f/f7f32ebd68790c8e5def1d8a1f5dcff9def6ddc8debff8cca86d183fff19 +2 -0
  83. package/.angular/cache/18.2.20/ng-packagr/index-v5/5e/69/d79068a2032aec8784bfda54e9c535ec00731e741d0508927ca944e33c6f +2 -0
  84. package/.angular/cache/18.2.20/ng-packagr/index-v5/60/f3/306ed2cf0f1f52765f23bc166481d24bfbd3e5d314567601194735dd82c1 +2 -0
  85. package/.angular/cache/18.2.20/ng-packagr/index-v5/64/2e/23ea5d26e77d446e1ae83859b634d9c7c9cb7f25841ba480b8d36580bba9 +2 -0
  86. package/.angular/cache/18.2.20/ng-packagr/index-v5/68/ba/8b5b3941a252f6e9c38f2ac2ad96c24295dd6eb2107db4da524e00347e8e +2 -0
  87. package/.angular/cache/18.2.20/ng-packagr/index-v5/6a/7e/a360e6f1c837f98654b248e7358606b96cb6a3fe12073715dd9272833937 +2 -0
  88. package/.angular/cache/18.2.20/ng-packagr/index-v5/6b/ee/bb0fa5a017484edcd511fd080a98efd097ece7ad7ea9725fd83a587f243c +2 -0
  89. package/.angular/cache/18.2.20/ng-packagr/index-v5/6c/98/1be6bd0818e1c01aa3feee96962cce6981957c74c6eac6641afdbf122935 +2 -0
  90. package/.angular/cache/18.2.20/ng-packagr/index-v5/6d/ae/9bf1c25011a108bf4f2816ab43ef70dad335b1d501b3d969f22a659adeb8 +2 -0
  91. package/.angular/cache/18.2.20/ng-packagr/index-v5/72/c9/82496d7fe9a33ea30092b35854bed610236c88184972c68ee4ec61c27fee +2 -0
  92. package/.angular/cache/18.2.20/ng-packagr/index-v5/74/7d/58478b582031769fba0916ebcd9d286fac4a5cbbb4660347116d5ec3b4e9 +2 -0
  93. package/.angular/cache/18.2.20/ng-packagr/index-v5/77/74/9d1eb45ee7c8fb0781fe057451b71e71150e0d975897e40e09510ba7c477 +2 -0
  94. package/.angular/cache/18.2.20/ng-packagr/index-v5/7b/8d/4e13b95722de3f57a217658de81df2c8748908bbaa4b936f2dbba041d635 +2 -0
  95. package/.angular/cache/18.2.20/ng-packagr/index-v5/7c/39/41667eb235b317fe1ff9d8b2e8957fed7b251b658b1c84edbdfd91ccb717 +2 -0
  96. package/.angular/cache/18.2.20/ng-packagr/index-v5/83/4c/9a70e17c1ab1eb66010b81c88e5d9aad4b4c859001480a3c10b1c998e9d8 +2 -0
  97. package/.angular/cache/18.2.20/ng-packagr/index-v5/88/48/834aa59cc9e064e22267fe5b772a65e6dbab04ff413b2e975a7a41d897fd +2 -0
  98. package/.angular/cache/18.2.20/ng-packagr/index-v5/89/d6/8dc2624cc13aa2b19f8d18063fa6f3156f8c61d9abc05b435b8bda1aa029 +2 -0
  99. package/.angular/cache/18.2.20/ng-packagr/index-v5/8a/97/397caffece331c5383bbbe0c64945c67b514709980c1c25e54e987829914 +2 -0
  100. package/.angular/cache/18.2.20/ng-packagr/index-v5/8f/e5/31f445a30d64be9093201ce089e65013ea520dbd888e9733e744983073a3 +2 -0
  101. package/.angular/cache/18.2.20/ng-packagr/index-v5/a7/bb/96f7882e22191e545fa7703ea0d61cfecad6b8f42ec8729a3fbeaab40b5d +2 -0
  102. package/.angular/cache/18.2.20/ng-packagr/index-v5/b4/a8/e4c9a823f741eef483d66b2ccdfc1aa4c6f0fa291d99f6409ef3864ebb52 +2 -0
  103. package/.angular/cache/18.2.20/ng-packagr/index-v5/b6/11/310ada84de53822d34f3ccf53899cd39bdf2765d05112f3f8e6dd5d8959e +2 -0
  104. package/.angular/cache/18.2.20/ng-packagr/index-v5/bf/d0/7707d0cf0504b5b9cc0d8bdc0d11d379c599492a9815e35993d361c4c48e +2 -0
  105. package/.angular/cache/18.2.20/ng-packagr/index-v5/c0/3a/dc2902a9193df2a99ca784dcebdc69e87a28de8cc3c94c84a8eaf6390500 +2 -0
  106. package/.angular/cache/18.2.20/ng-packagr/index-v5/c4/d5/ac42529c8990209d82fa8ce72376cd558e6e7d8113b0ec87cf1cf66c74e3 +2 -0
  107. package/.angular/cache/18.2.20/ng-packagr/index-v5/c5/06/320510d7cbf26fcf1f5b3bf7ac927fe4d82bcaa7d3f9e3637d9edc5f6cba +2 -0
  108. package/.angular/cache/18.2.20/ng-packagr/index-v5/c8/d2/52a4d7a6c2130a378f6e043e4365e84a88566c7c512eea26309ce175cbfd +2 -0
  109. package/.angular/cache/18.2.20/ng-packagr/index-v5/d1/74/7078dc9dc9a16e17420aa3d977205a916bbfce8aae472b9af4139a8efcec +2 -0
  110. package/.angular/cache/18.2.20/ng-packagr/index-v5/d1/8b/defe3fcd88fa8c696f6d6dd2dd80d1f1627e3f1b5d43c42ea6b5d281f404 +2 -0
  111. package/.angular/cache/18.2.20/ng-packagr/index-v5/d1/f0/7c002daa447b9b556104ec5191448560ea1e213aeec74e925dfbc0e24144 +2 -0
  112. package/.angular/cache/18.2.20/ng-packagr/index-v5/d5/bb/3dc594ac827dac3811e8eff9c5fa3c813f458bf4283a93f6e6e00bd0e24f +2 -0
  113. package/.angular/cache/18.2.20/ng-packagr/index-v5/dd/94/c502ebe6b7ba00c8d3107c0c9585b5dcd17a15c386f4960147c92a327590 +2 -0
  114. package/.angular/cache/18.2.20/ng-packagr/index-v5/df/60/509f2f04af76cfbf44e26658a37d3dc281ec9b154b483e19d67b8f542f37 +2 -0
  115. package/.angular/cache/18.2.20/ng-packagr/index-v5/e6/58/2a2ab8a9ddbe3266c199425deecc67f4d9084548ccbb7923e9c1be60bb03 +2 -0
  116. package/.angular/cache/18.2.20/ng-packagr/index-v5/ed/b8/2a7a77fe55fa3e4d171e9885d4368866324cc179042f8da510d0a21d16f1 +2 -0
  117. package/.angular/cache/18.2.20/ng-packagr/index-v5/ee/44/b9449edadad6aee67b1407a16565368d7509a086655ddc81d084b636807a +2 -0
  118. package/.angular/cache/18.2.20/ng-packagr/index-v5/f6/19/bdbf05d571bfb9e1c07532b119e3b992c93f8d9fd6c3800824764f86309c +2 -0
  119. package/.angular/cache/18.2.20/ng-packagr/index-v5/f9/7b/316a425887d2d24e109ebdf8082a4fc1f991d4a9b8f46ed230955a0474b0 +2 -0
  120. package/.angular/cache/18.2.20/ng-packagr/index-v5/fa/a4/9c6343bad076da62b7cb4c157d9b19ce8176bf129fd73528c4a97d304607 +2 -0
  121. package/.angular/cache/18.2.20/ng-packagr/index-v5/fb/93/b7219657e24fa0cadcc24aee416abcb8531af8f71d5784201a3e3923d347 +2 -0
  122. package/.angular/cache/18.2.20/ng-packagr/index-v5/fc/88/bb8095394d06053fc935fd31e805e31b197dedbad579a831b8efba2b1701 +2 -0
  123. package/.angular/cache/18.2.20/ng-packagr/index-v5/fd/58/ab7dfeccb54c99d552967ff9e20ffaf6b60f9fe35c94c0028755d988dd3b +2 -0
  124. package/.angular/cache/18.2.20/ng-packagr/tmp/519e5708 +0 -0
  125. package/.angular/cache/18.2.20/ng-packagr/tmp/61ae2450 +0 -0
  126. package/.angular/cache/18.2.20/ng-packagr/tmp/bc568f26 +0 -0
  127. package/.angular/cache/18.2.20/ng-packagr/tmp/dca44689 +1 -0
  128. package/.editorconfig +17 -0
  129. package/lib/package.json +28 -0
  130. package/package.json +19 -19
  131. package/constants/breadcrumbs.const.d.ts +0 -1
  132. package/constants/query-design-custom-class.constant.d.ts +0 -1
  133. package/core/directive/authorize.directive.d.ts +0 -14
  134. package/core/interfaces/filters.api.interface.d.ts +0 -32
  135. package/core/models/menu-elements-dto.d.ts +0 -21
  136. package/core/services/local-storage.service.d.ts +0 -34
  137. package/core/services/user-management.service.d.ts +0 -39
  138. package/core/site/services/support-util.service.d.ts +0 -18
  139. package/core/token/client-injection-token.d.ts +0 -2
  140. package/core/utils/sql-to-filter-datatype-converter.d.ts +0 -2
  141. package/core/utils/type-checks.utils.d.ts +0 -10
  142. package/core/utils/uuid-generator.utils.d.ts +0 -1
  143. package/directives/let.directive.d.ts +0 -25
  144. package/directives/remove-cancel-button.directive.d.ts +0 -10
  145. package/enums/action-types.enum.d.ts +0 -16
  146. package/enums/sort-direction.enum.d.ts +0 -4
  147. package/enums/source-types.enum.d.ts +0 -4
  148. package/enums/tooltips-prop.enum.d.ts +0 -31
  149. package/esm2022/constants/breadcrumbs.const.mjs +0 -2
  150. package/esm2022/constants/query-design-custom-class.constant.mjs +0 -2
  151. package/esm2022/core/directive/authorize.directive.mjs +0 -37
  152. package/esm2022/core/interfaces/filters.api.interface.mjs +0 -12
  153. package/esm2022/core/models/menu-elements-dto.mjs +0 -2
  154. package/esm2022/core/services/local-storage.service.mjs +0 -55
  155. package/esm2022/core/services/user-management.service.mjs +0 -97
  156. package/esm2022/core/site/services/support-util.service.mjs +0 -55
  157. package/esm2022/core/token/client-injection-token.mjs +0 -3
  158. package/esm2022/core/utils/sql-to-filter-datatype-converter.mjs +0 -37
  159. package/esm2022/core/utils/type-checks.utils.mjs +0 -34
  160. package/esm2022/core/utils/uuid-generator.utils.mjs +0 -8
  161. package/esm2022/directives/let.directive.mjs +0 -48
  162. package/esm2022/directives/remove-cancel-button.directive.mjs +0 -23
  163. package/esm2022/enums/action-types.enum.mjs +0 -18
  164. package/esm2022/enums/sort-direction.enum.mjs +0 -6
  165. package/esm2022/enums/source-types.enum.mjs +0 -6
  166. package/esm2022/enums/tooltips-prop.enum.mjs +0 -33
  167. package/esm2022/modules/dynamic-cards/directives/flip-card.directive.mjs +0 -44
  168. package/esm2022/modules/dynamic-cards/dynamic-card/card-list-container/card-list-container.component.mjs +0 -20
  169. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card/dynamic-card.component.mjs +0 -19
  170. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-back/dynamic-card-back.component.mjs +0 -16
  171. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-footer/dynamic-card-footer.component.mjs +0 -21
  172. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-front/dynamic-card-front.component.mjs +0 -18
  173. package/esm2022/modules/dynamic-cards/dynamic-cards.module.mjs +0 -60
  174. package/esm2022/modules/dynamic-cards/interface/card-list.interface.mjs +0 -2
  175. package/esm2022/modules/dynamic-cards/interface/card.interface.mjs +0 -2
  176. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-button-control/dynamic-form-button-control.component.mjs +0 -27
  177. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-checkbox-control/dynamic-form-checkbox-control.component.mjs +0 -19
  178. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-control-label/dynamic-form-control-label.component.mjs +0 -14
  179. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-counter-control/dynamic-form-counter-control.component.mjs +0 -43
  180. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-datepicker-control/dynamic-form-datepicker-control.component.mjs +0 -48
  181. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field-control.component.mjs +0 -96
  182. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field.matcher.mjs +0 -9
  183. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-input-control/dynamic-form-input-control.component.mjs +0 -22
  184. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ng-select-control/dynamic-form-ng-select-control.component.mjs +0 -27
  185. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/dynamic-form-radio-group.component.mjs +0 -31
  186. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/enum/radio-group-orientation.enum.mjs +0 -6
  187. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-select-control/dynamic-form-select-control.component.mjs +0 -29
  188. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-switch-control/dynamic-form-switch-control.component.mjs +0 -18
  189. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-text-area-control/dynamic-form-text-area-control.component.mjs +0 -22
  190. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control-list/dynamic-form-ui-control-list.component.mjs +0 -74
  191. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control.component.mjs +0 -30
  192. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/base-form-actions.component.mjs +0 -47
  193. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/enums/base-form-action-types.mjs +0 -7
  194. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/interfaces/base-form-action.interface.mjs +0 -2
  195. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/dynamic-form-ui.component.mjs +0 -64
  196. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-array/dynamic-form-ui-array.component.mjs +0 -26
  197. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-group/dynamic-form-group.component.mjs +0 -26
  198. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout-item/dynamic-form-layout-item.component.mjs +0 -65
  199. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout.component.mjs +0 -33
  200. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/enums/form-field-css-class.enum.mjs +0 -9
  201. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/errors-block/errors-block.component.mjs +0 -25
  202. package/esm2022/modules/dynamic-forms/dynamic-form-UI/dynamic-form-ui.module.mjs +0 -117
  203. package/esm2022/modules/dynamic-forms/dynamic-form-UI/providers/ui-form-control-map.provider.mjs +0 -47
  204. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-array.component.mjs +0 -16
  205. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-component.mjs +0 -82
  206. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control-container.component.mjs +0 -189
  207. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control.component.mjs +0 -112
  208. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-layout.component.mjs +0 -34
  209. package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/form-errors.constant.mjs +0 -34
  210. package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/matchers/matchers.constant.mjs +0 -27
  211. package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/reg-exp-error.constant.mjs +0 -10
  212. package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-id.directive.mjs +0 -24
  213. package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-list.directive.mjs +0 -26
  214. package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-template.directive.mjs +0 -29
  215. package/esm2022/modules/dynamic-forms/dynamic-forms-core/dynamic-form-core.module.mjs +0 -49
  216. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/autocomplete.enum.mjs +0 -6
  217. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/control-types.enum.mjs +0 -22
  218. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-control-events.enum.mjs +0 -8
  219. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-hooks.enum.mjs +0 -7
  220. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/input-types.enum.mjs +0 -20
  221. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/matcher-types.enum.mjs +0 -10
  222. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/template-directive-alignment.mjs +0 -6
  223. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/textarea-wrap.enum.mjs +0 -6
  224. package/esm2022/modules/dynamic-forms/dynamic-forms-core/index.mjs +0 -39
  225. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control-event.interface.mjs +0 -2
  226. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control.interface.mjs +0 -2
  227. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/dynamic-form/dynamic-form-model.interface.mjs +0 -2
  228. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-control-layout.interface.mjs +0 -2
  229. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout-config.interface.mjs +0 -2
  230. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout.interface.mjs +0 -2
  231. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/matchers/form-control-matcher.interface.mjs +0 -2
  232. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-array/form-array-model-config.interface.mjs +0 -2
  233. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-button-control/button-control-model-config.interface.mjs +0 -2
  234. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-check-control/check-control-model-config.interface.mjs +0 -2
  235. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-model-config.interface.mjs +0 -2
  236. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-relation.interface.mjs +0 -2
  237. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-date-control/date-control-model-config.interface.mjs +0 -2
  238. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-group/form-group-model-config.interface.mjs +0 -2
  239. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-input-control/form-input-control-config.interface.mjs +0 -2
  240. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-number-control/form-number-control-config.interface.mjs +0 -2
  241. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option/form-option-config.interface.mjs +0 -2
  242. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option-control/form-option-control-config.interface.mjs +0 -2
  243. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/button-control-model-config.interface.mjs +0 -2
  244. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/checkbox-control-model-config.interface.mjs +0 -2
  245. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/datepicker-control-model-config.interface.mjs +0 -2
  246. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/input-control-model-config.interface.mjs +0 -2
  247. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/radio-group-model-config.interface.mjs +0 -2
  248. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/select-control-model-config.interface.mjs +0 -2
  249. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/switch-control-model-config.interface.mjs +0 -2
  250. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/textarea-control-model-config.interface.mjs +0 -2
  251. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-value-control/form-value-control.interface.mjs +0 -2
  252. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/validators/validators.interface.mjs +0 -2
  253. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-array/dynamic-form-array.model.mjs +0 -51
  254. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-array/form-array-group/dynamic-form-array-group.model.mjs +0 -15
  255. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-button-control/dynamic-button-control.model.mjs +0 -19
  256. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-check-control/dynamic-check-control.model.mjs +0 -19
  257. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-control/dynamic-form-control.model.mjs +0 -23
  258. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-date-control/dynamic-date-control.model.mjs +0 -11
  259. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-group/dynamic-form-group.model.mjs +0 -37
  260. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-input-control/dynamic-input-control.model.mjs +0 -20
  261. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-number-control/dynamic-number-control.model.mjs +0 -15
  262. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-option/form-option.model.mjs +0 -15
  263. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-option-control/dynamic-option-control.model.mjs +0 -52
  264. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-static-control/static-control.model.mjs +0 -7
  265. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/button/dynamic-button.model.mjs +0 -13
  266. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox.model.mjs +0 -12
  267. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/counter/dynamic-counter.model.mjs +0 -11
  268. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/datepicker/dynamic-datepicker.model.mjs +0 -18
  269. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/input/dynamic-input.model.mjs +0 -13
  270. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/radio/dynamic-radio-group.model.mjs +0 -13
  271. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/select/dynamic-select.model.mjs +0 -18
  272. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/switch/dynamic-switch.model.mjs +0 -11
  273. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/textarea/dynamic-textarea.model.mjs +0 -14
  274. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-value-control/form-value-control.model.mjs +0 -25
  275. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/enums/FormLayoutControlTypes.enum.mjs +0 -7
  276. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-control.model.mjs +0 -8
  277. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/ng-select-control/dynamic-ng-select.model.mjs +0 -19
  278. package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.pipe.mjs +0 -38
  279. package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/get-error-from-key-value.pipe.mjs +0 -20
  280. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-component.service.mjs +0 -37
  281. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-layout.service.mjs +0 -35
  282. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-validation.service.mjs +0 -35
  283. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form.service.mjs +0 -239
  284. package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/dynamic-matchers.token.mjs +0 -3
  285. package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/form-control-map.token.mjs +0 -3
  286. package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/validators.token.mjs +0 -3
  287. package/esm2022/modules/dynamic-forms/dynamic-forms.module.mjs +0 -32
  288. package/esm2022/modules/material/mat-cdk-module.mjs +0 -17
  289. package/esm2022/modules/material/material.module.mjs +0 -201
  290. package/esm2022/modules/query-builder/components/query-design/query-design.component.mjs +0 -103
  291. package/esm2022/modules/query-builder/components/query-design/rule-line/components/alphanumeric-control/alphanumeric-control.component.mjs +0 -150
  292. package/esm2022/modules/query-builder/components/query-design/rule-line/components/boolean-control/boolean-control.component.mjs +0 -102
  293. package/esm2022/modules/query-builder/components/query-design/rule-line/components/date-control/date-control.component.mjs +0 -76
  294. package/esm2022/modules/query-builder/components/query-design/rule-line/components/numeric-control/numeric-control.component.mjs +0 -168
  295. package/esm2022/modules/query-builder/components/query-design/rule-line/constants/operators-sets.mjs +0 -108
  296. package/esm2022/modules/query-builder/components/query-design/rule-line/helpers/condition-operators.mapper.mjs +0 -8
  297. package/esm2022/modules/query-builder/components/query-design/rule-line/helpers/control-values-mapper.mjs +0 -78
  298. package/esm2022/modules/query-builder/components/query-design/rule-line/rule-line.component.mjs +0 -234
  299. package/esm2022/modules/query-builder/directive/auto-complete-position.directive.mjs +0 -30
  300. package/esm2022/modules/query-builder/interfaces/query-builder.interface.mjs +0 -39
  301. package/esm2022/modules/query-builder/interfaces/select-custom-css-object.mjs +0 -2
  302. package/esm2022/modules/query-builder/query-builder.module.mjs +0 -66
  303. package/esm2022/modules/ui-kit/components/accordion/accordion-content/accordion-content.component.mjs +0 -16
  304. package/esm2022/modules/ui-kit/components/accordion/accordion-trigger.directive.mjs +0 -30
  305. package/esm2022/modules/ui-kit/components/accordion/accordion.directive.mjs +0 -19
  306. package/esm2022/modules/ui-kit/components/banner/banner.component.mjs +0 -53
  307. package/esm2022/modules/ui-kit/components/banner/banner.service.mjs +0 -64
  308. package/esm2022/modules/ui-kit/components/breadcrumbs/breadcrumbs.component.mjs +0 -25
  309. package/esm2022/modules/ui-kit/components/breadcrumbs/model/breadCrumbItem.mjs +0 -2
  310. package/esm2022/modules/ui-kit/components/breadcrumbs/service/breadcrumb.service.mjs +0 -63
  311. package/esm2022/modules/ui-kit/components/breadcrumbs/utils/crumb-service.enum.mjs +0 -8
  312. package/esm2022/modules/ui-kit/components/buttons/button-control/button-control.component.mjs +0 -46
  313. package/esm2022/modules/ui-kit/components/buttons/buttons-list/buttons-list.component.mjs +0 -11
  314. package/esm2022/modules/ui-kit/components/buttons/circle-button/circle-button.component.mjs +0 -37
  315. package/esm2022/modules/ui-kit/components/card-container/card-container.component.mjs +0 -11
  316. package/esm2022/modules/ui-kit/components/common-breadcrumbs/common-breadcrumbs.component.mjs +0 -30
  317. package/esm2022/modules/ui-kit/components/common-breadcrumbs/interface/breadcrumb.interface.mjs +0 -2
  318. package/esm2022/modules/ui-kit/components/common-breadcrumbs/service/breadcrumb.service.mjs +0 -65
  319. package/esm2022/modules/ui-kit/components/data-pagination/data-pagination.component.mjs +0 -155
  320. package/esm2022/modules/ui-kit/components/data-table/api-classes/filter-manager.mjs +0 -50
  321. package/esm2022/modules/ui-kit/components/data-table/api-classes/grid-api.mjs +0 -73
  322. package/esm2022/modules/ui-kit/components/data-table/constants/change-type.enum.mjs +0 -8
  323. package/esm2022/modules/ui-kit/components/data-table/constants/column-id.mjs +0 -13
  324. package/esm2022/modules/ui-kit/components/data-table/constants/row.mjs +0 -4
  325. package/esm2022/modules/ui-kit/components/data-table/data-col/base-data-col/base-data-col.component.mjs +0 -93
  326. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col/data-col.component.mjs +0 -17
  327. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-action-button/data-col-action-button.component.mjs +0 -27
  328. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-boolean/data-col-boolean.component.mjs +0 -20
  329. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-multivalue/data-col-multivalue.component.mjs +0 -18
  330. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-nested/data-col-nested.component.mjs +0 -31
  331. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-reference/data-col-reference.component.mjs +0 -96
  332. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-view/data-col-view.component.mjs +0 -75
  333. package/esm2022/modules/ui-kit/components/data-table/data-col-disp/data-col-disp.component.mjs +0 -248
  334. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/data-col-filter.component.mjs +0 -323
  335. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-between-value.mjs +0 -68
  336. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-contains-value.mjs +0 -25
  337. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-in-value.mjs +0 -64
  338. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-slider-value.mjs +0 -42
  339. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/filter-value-executor-provider.mjs +0 -42
  340. package/esm2022/modules/ui-kit/components/data-table/data-column-filter/data-column-filter.component.mjs +0 -69
  341. package/esm2022/modules/ui-kit/components/data-table/data-row/data-row.component.mjs +0 -251
  342. package/esm2022/modules/ui-kit/components/data-table/data-table/data-table.component.mjs +0 -1534
  343. package/esm2022/modules/ui-kit/components/data-table/data-table-actions/data-table-actions.component.mjs +0 -153
  344. package/esm2022/modules/ui-kit/components/data-table/data-table-body/data-table-body.component.mjs +0 -205
  345. package/esm2022/modules/ui-kit/components/data-table/data-table-check-rows/data-table-check-rows.component.mjs +0 -61
  346. package/esm2022/modules/ui-kit/components/data-table/data-table-row-actions/const/data-table-actions.enum.mjs +0 -8
  347. package/esm2022/modules/ui-kit/components/data-table/data-table-row-actions/data-table-row-actions.component.mjs +0 -120
  348. package/esm2022/modules/ui-kit/components/data-table/enums/col-filter-types.mjs +0 -17
  349. package/esm2022/modules/ui-kit/components/data-table/header-row/header-row.component.mjs +0 -14
  350. package/esm2022/modules/ui-kit/components/data-table/interfaces/data-table-component.interface.mjs +0 -2
  351. package/esm2022/modules/ui-kit/components/data-table/interfaces/filter-value-executor.interface.mjs +0 -2
  352. package/esm2022/modules/ui-kit/components/data-table/services/data-table-context.service.mjs +0 -26
  353. package/esm2022/modules/ui-kit/components/data-table-wrap/data-table-wrap.component.mjs +0 -38
  354. package/esm2022/modules/ui-kit/components/excel-table/excel-table.component.mjs +0 -164
  355. package/esm2022/modules/ui-kit/components/excel-table/interface/excel-table.interface.mjs +0 -44
  356. package/esm2022/modules/ui-kit/components/form/base-form-control/base-form-control.component.mjs +0 -41
  357. package/esm2022/modules/ui-kit/components/form/checkbox-form-control/checkbox-form-control.component.mjs +0 -21
  358. package/esm2022/modules/ui-kit/components/form/counter-form-control/counter-form-control.component.mjs +0 -66
  359. package/esm2022/modules/ui-kit/components/form/form-container/form-container.component.mjs +0 -133
  360. package/esm2022/modules/ui-kit/components/form/form-group-container/form-group-container.component.mjs +0 -11
  361. package/esm2022/modules/ui-kit/components/form/input-form-control/input-form-control.component.mjs +0 -20
  362. package/esm2022/modules/ui-kit/components/form/multivalue-form-control/custom-input/custom-input.component.mjs +0 -35
  363. package/esm2022/modules/ui-kit/components/form/multivalue-form-control/custom-input/old-new-value.interface.mjs +0 -2
  364. package/esm2022/modules/ui-kit/components/form/multivalue-form-control/multivalue-form-control.component.mjs +0 -66
  365. package/esm2022/modules/ui-kit/components/form/radio-form-control/radio-form-control.component.mjs +0 -19
  366. package/esm2022/modules/ui-kit/components/form/select-form-control/select-form-control.component.mjs +0 -78
  367. package/esm2022/modules/ui-kit/components/form/selection-group-container/selection-group-container.component.mjs +0 -18
  368. package/esm2022/modules/ui-kit/components/form/textarea-form-control/textarea-form-control.component.mjs +0 -20
  369. package/esm2022/modules/ui-kit/components/icon/expand-collapse-icon/expand-collapse-icon.component.mjs +0 -26
  370. package/esm2022/modules/ui-kit/components/icon/icon/icon.component.mjs +0 -35
  371. package/esm2022/modules/ui-kit/components/icon/text-icon/text-icon.component.mjs +0 -22
  372. package/esm2022/modules/ui-kit/components/layouts/form-layout/form-layout.component.mjs +0 -56
  373. package/esm2022/modules/ui-kit/components/layouts/primary-layout/primary-layout.component.mjs +0 -11
  374. package/esm2022/modules/ui-kit/components/loader/loader.component.mjs +0 -27
  375. package/esm2022/modules/ui-kit/components/mat-actions-button/mat-actions-button.mjs +0 -34
  376. package/esm2022/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component.mjs +0 -53
  377. package/esm2022/modules/ui-kit/components/modals/confirm-modal/confirm-modal.component.mjs +0 -37
  378. package/esm2022/modules/ui-kit/components/modals/delete-modal/delete-modal.component.mjs +0 -41
  379. package/esm2022/modules/ui-kit/components/modals/enums/confirmation-modal.enum.mjs +0 -13
  380. package/esm2022/modules/ui-kit/components/snackbar/snackbar.component.mjs +0 -21
  381. package/esm2022/modules/ui-kit/components/tabs/constants/index.mjs +0 -2
  382. package/esm2022/modules/ui-kit/components/tabs/interfaces/index.mjs +0 -2
  383. package/esm2022/modules/ui-kit/components/tabs/tab-group/tab-group.component.mjs +0 -77
  384. package/esm2022/modules/ui-kit/components/tabs/tab.directive.mjs +0 -60
  385. package/esm2022/modules/ui-kit/components/tree-view/tree-view.component.mjs +0 -374
  386. package/esm2022/modules/ui-kit/constants/data-table.constants.mjs +0 -7
  387. package/esm2022/modules/ui-kit/constants/snackbar.constants.mjs +0 -4
  388. package/esm2022/modules/ui-kit/enums/coderefs-prop.enum.mjs +0 -26
  389. package/esm2022/modules/ui-kit/enums/color-schemes.enum.mjs +0 -13
  390. package/esm2022/modules/ui-kit/enums/column-disable-mode.enum.mjs +0 -7
  391. package/esm2022/modules/ui-kit/enums/column-types.enum.mjs +0 -10
  392. package/esm2022/modules/ui-kit/enums/component-sizes.enum.mjs +0 -6
  393. package/esm2022/modules/ui-kit/enums/form-item-type.mjs +0 -7
  394. package/esm2022/modules/ui-kit/enums/form-types.enum.mjs +0 -7
  395. package/esm2022/modules/ui-kit/enums/form-url-params.enum.mjs +0 -6
  396. package/esm2022/modules/ui-kit/enums/icons.enum.mjs +0 -24
  397. package/esm2022/modules/ui-kit/enums/position.enum.mjs +0 -6
  398. package/esm2022/modules/ui-kit/enums/select-option.enum.mjs +0 -10
  399. package/esm2022/modules/ui-kit/enums/snackbar.enum.mjs +0 -8
  400. package/esm2022/modules/ui-kit/enums/url-param-action.enum.mjs +0 -6
  401. package/esm2022/modules/ui-kit/enums/viewType.enum.mjs +0 -7
  402. package/esm2022/modules/ui-kit/interfaces/api.interface.mjs +0 -2
  403. package/esm2022/modules/ui-kit/interfaces/confirm-modal-data.interface.mjs +0 -2
  404. package/esm2022/modules/ui-kit/interfaces/constants.interface.mjs +0 -2
  405. package/esm2022/modules/ui-kit/interfaces/data-table.interface.mjs +0 -2
  406. package/esm2022/modules/ui-kit/interfaces/form.interface.mjs +0 -2
  407. package/esm2022/modules/ui-kit/interfaces/generic.interface.mjs +0 -2
  408. package/esm2022/modules/ui-kit/interfaces/list-item.interface.mjs +0 -2
  409. package/esm2022/modules/ui-kit/interfaces/mat-action-buttons.interface.mjs +0 -2
  410. package/esm2022/modules/ui-kit/interfaces/row-selection-info.interface.mjs +0 -2
  411. package/esm2022/modules/ui-kit/interfaces/select.interface.mjs +0 -2
  412. package/esm2022/modules/ui-kit/interfaces/snackbar.interface.mjs +0 -2
  413. package/esm2022/modules/ui-kit/interfaces/tree-view.interface.mjs +0 -2
  414. package/esm2022/modules/ui-kit/pipes/column-filter.pipe.mjs +0 -21
  415. package/esm2022/modules/ui-kit/pipes/filter-by-prop.pipe.mjs +0 -27
  416. package/esm2022/modules/ui-kit/pipes/first-letter-text.pipe.mjs +0 -17
  417. package/esm2022/modules/ui-kit/pipes/keys.pipe.mjs +0 -17
  418. package/esm2022/modules/ui-kit/pipes/paginate.pipe.mjs +0 -29
  419. package/esm2022/modules/ui-kit/pipes/search.pipe.mjs +0 -50
  420. package/esm2022/modules/ui-kit/services/data-table.service.mjs +0 -202
  421. package/esm2022/modules/ui-kit/services/form.service.mjs +0 -91
  422. package/esm2022/modules/ui-kit/services/mappers/form-data-table-mapper.service.mjs +0 -19
  423. package/esm2022/modules/ui-kit/services/snackbar.service.mjs +0 -43
  424. package/esm2022/modules/ui-kit/services/url.service.mjs +0 -17
  425. package/esm2022/modules/ui-kit/types/basic.type.mjs +0 -2
  426. package/esm2022/modules/ui-kit/types/function.type.mjs +0 -2
  427. package/esm2022/modules/ui-kit/types/select.type.mjs +0 -2
  428. package/esm2022/modules/ui-kit/ui-kit.module.mjs +0 -370
  429. package/esm2022/public-api.mjs +0 -85
  430. package/esm2022/shared-pipes/pipes/search.pipe.mjs +0 -48
  431. package/esm2022/shared-ui-test-1.mjs +0 -5
  432. package/esm2022/shared.module.mjs +0 -57
  433. package/fesm2022/shared-ui-test-1.mjs +0 -10516
  434. package/fesm2022/shared-ui-test-1.mjs.map +0 -1
  435. package/index.d.ts +0 -5
  436. package/modules/dynamic-cards/directives/flip-card.directive.d.ts +0 -15
  437. package/modules/dynamic-cards/dynamic-card/card-list-container/card-list-container.component.d.ts +0 -10
  438. package/modules/dynamic-cards/dynamic-card/dynamic-card/dynamic-card.component.d.ts +0 -7
  439. package/modules/dynamic-cards/dynamic-card/dynamic-card-back/dynamic-card-back.component.d.ts +0 -7
  440. package/modules/dynamic-cards/dynamic-card/dynamic-card-footer/dynamic-card-footer.component.d.ts +0 -10
  441. package/modules/dynamic-cards/dynamic-card/dynamic-card-front/dynamic-card-front.component.d.ts +0 -8
  442. package/modules/dynamic-cards/dynamic-cards.module.d.ts +0 -18
  443. package/modules/dynamic-cards/interface/card-list.interface.d.ts +0 -9
  444. package/modules/dynamic-cards/interface/card.interface.d.ts +0 -12
  445. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-button-control/dynamic-form-button-control.component.d.ts +0 -11
  446. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-checkbox-control/dynamic-form-checkbox-control.component.d.ts +0 -9
  447. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-control-label/dynamic-form-control-label.component.d.ts +0 -7
  448. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-counter-control/dynamic-form-counter-control.component.d.ts +0 -13
  449. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-datepicker-control/dynamic-form-datepicker-control.component.d.ts +0 -13
  450. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field-control.component.d.ts +0 -34
  451. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field.matcher.d.ts +0 -8
  452. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-input-control/dynamic-form-input-control.component.d.ts +0 -8
  453. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ng-select-control/dynamic-form-ng-select-control.component.d.ts +0 -11
  454. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/dynamic-form-radio-group.component.d.ts +0 -12
  455. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/enum/radio-group-orientation.enum.d.ts +0 -4
  456. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-select-control/dynamic-form-select-control.component.d.ts +0 -10
  457. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-switch-control/dynamic-form-switch-control.component.d.ts +0 -9
  458. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-text-area-control/dynamic-form-text-area-control.component.d.ts +0 -9
  459. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control-list/dynamic-form-ui-control-list.component.d.ts +0 -26
  460. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control.component.d.ts +0 -14
  461. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/base-form-actions.component.d.ts +0 -19
  462. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/enums/base-form-action-types.d.ts +0 -5
  463. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/interfaces/base-form-action.interface.d.ts +0 -5
  464. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/dynamic-form-ui.component.d.ts +0 -26
  465. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-array/dynamic-form-ui-array.component.d.ts +0 -9
  466. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-group/dynamic-form-group.component.d.ts +0 -11
  467. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout-item/dynamic-form-layout-item.component.d.ts +0 -23
  468. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout.component.d.ts +0 -21
  469. package/modules/dynamic-forms/dynamic-form-UI/components/enums/form-field-css-class.enum.d.ts +0 -7
  470. package/modules/dynamic-forms/dynamic-form-UI/components/errors-block/errors-block.component.d.ts +0 -11
  471. package/modules/dynamic-forms/dynamic-form-UI/dynamic-form-ui.module.d.ts +0 -32
  472. package/modules/dynamic-forms/dynamic-form-UI/providers/ui-form-control-map.provider.d.ts +0 -6
  473. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-array.component.d.ts +0 -10
  474. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-component.d.ts +0 -26
  475. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control-container.component.d.ts +0 -57
  476. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control.component.d.ts +0 -42
  477. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-layout.component.d.ts +0 -28
  478. package/modules/dynamic-forms/dynamic-forms-core/constants/form-errors.constant.d.ts +0 -6
  479. package/modules/dynamic-forms/dynamic-forms-core/constants/matchers/matchers.constant.d.ts +0 -6
  480. package/modules/dynamic-forms/dynamic-forms-core/constants/reg-exp-error.constant.d.ts +0 -9
  481. package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-id.directive.d.ts +0 -11
  482. package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-list.directive.d.ts +0 -11
  483. package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-template.directive.d.ts +0 -13
  484. package/modules/dynamic-forms/dynamic-forms-core/dynamic-form-core.module.d.ts +0 -12
  485. package/modules/dynamic-forms/dynamic-forms-core/enums/autocomplete.enum.d.ts +0 -4
  486. package/modules/dynamic-forms/dynamic-forms-core/enums/control-types.enum.d.ts +0 -20
  487. package/modules/dynamic-forms/dynamic-forms-core/enums/form-control-events.enum.d.ts +0 -6
  488. package/modules/dynamic-forms/dynamic-forms-core/enums/form-hooks.enum.d.ts +0 -5
  489. package/modules/dynamic-forms/dynamic-forms-core/enums/input-types.enum.d.ts +0 -18
  490. package/modules/dynamic-forms/dynamic-forms-core/enums/matcher-types.enum.d.ts +0 -8
  491. package/modules/dynamic-forms/dynamic-forms-core/enums/template-directive-alignment.d.ts +0 -4
  492. package/modules/dynamic-forms/dynamic-forms-core/enums/textarea-wrap.enum.d.ts +0 -4
  493. package/modules/dynamic-forms/dynamic-forms-core/index.d.ts +0 -38
  494. package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control-event.interface.d.ts +0 -15
  495. package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control.interface.d.ts +0 -19
  496. package/modules/dynamic-forms/dynamic-forms-core/interfaces/dynamic-form/dynamic-form-model.interface.d.ts +0 -4
  497. package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-control-layout.interface.d.ts +0 -3
  498. package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout-config.interface.d.ts +0 -6
  499. package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout.interface.d.ts +0 -2
  500. package/modules/dynamic-forms/dynamic-forms-core/interfaces/matchers/form-control-matcher.interface.d.ts +0 -8
  501. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-array/form-array-model-config.interface.d.ts +0 -7
  502. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-button-control/button-control-model-config.interface.d.ts +0 -4
  503. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-check-control/check-control-model-config.interface.d.ts +0 -4
  504. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-model-config.interface.d.ts +0 -16
  505. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-relation.interface.d.ts +0 -8
  506. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-date-control/date-control-model-config.interface.d.ts +0 -8
  507. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-group/form-group-model-config.interface.d.ts +0 -6
  508. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-input-control/form-input-control-config.interface.d.ts +0 -14
  509. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-number-control/form-number-control-config.interface.d.ts +0 -7
  510. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option/form-option-config.interface.d.ts +0 -5
  511. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option-control/form-option-control-config.interface.d.ts +0 -6
  512. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/button-control-model-config.interface.d.ts +0 -6
  513. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/checkbox-control-model-config.interface.d.ts +0 -5
  514. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/datepicker-control-model-config.interface.d.ts +0 -11
  515. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/input-control-model-config.interface.d.ts +0 -9
  516. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/radio-group-model-config.interface.d.ts +0 -4
  517. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/select-control-model-config.interface.d.ts +0 -8
  518. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/switch-control-model-config.interface.d.ts +0 -5
  519. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/textarea-control-model-config.interface.d.ts +0 -6
  520. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-value-control/form-value-control.interface.d.ts +0 -10
  521. package/modules/dynamic-forms/dynamic-forms-core/interfaces/validators/validators.interface.d.ts +0 -5
  522. package/modules/dynamic-forms/dynamic-forms-core/models/form-array/dynamic-form-array.model.d.ts +0 -19
  523. package/modules/dynamic-forms/dynamic-forms-core/models/form-array/form-array-group/dynamic-form-array-group.model.d.ts +0 -12
  524. package/modules/dynamic-forms/dynamic-forms-core/models/form-button-control/dynamic-button-control.model.d.ts +0 -9
  525. package/modules/dynamic-forms/dynamic-forms-core/models/form-check-control/dynamic-check-control.model.d.ts +0 -9
  526. package/modules/dynamic-forms/dynamic-forms-core/models/form-control/dynamic-form-control.model.d.ts +0 -24
  527. package/modules/dynamic-forms/dynamic-forms-core/models/form-date-control/dynamic-date-control.model.d.ts +0 -9
  528. package/modules/dynamic-forms/dynamic-forms-core/models/form-group/dynamic-form-group.model.d.ts +0 -17
  529. package/modules/dynamic-forms/dynamic-forms-core/models/form-input-control/dynamic-input-control.model.d.ts +0 -16
  530. package/modules/dynamic-forms/dynamic-forms-core/models/form-number-control/dynamic-number-control.model.d.ts +0 -12
  531. package/modules/dynamic-forms/dynamic-forms-core/models/form-option/form-option.model.d.ts +0 -9
  532. package/modules/dynamic-forms/dynamic-forms-core/models/form-option-control/dynamic-option-control.model.d.ts +0 -19
  533. package/modules/dynamic-forms/dynamic-forms-core/models/form-static-control/static-control.model.d.ts +0 -7
  534. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/button/dynamic-button.model.d.ts +0 -10
  535. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox.model.d.ts +0 -8
  536. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/counter/dynamic-counter.model.d.ts +0 -7
  537. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/datepicker/dynamic-datepicker.model.d.ts +0 -15
  538. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/input/dynamic-input.model.d.ts +0 -10
  539. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/radio/dynamic-radio-group.model.d.ts +0 -8
  540. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/select/dynamic-select.model.d.ts +0 -11
  541. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/switch/dynamic-switch.model.d.ts +0 -8
  542. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/textarea/dynamic-textarea.model.d.ts +0 -9
  543. package/modules/dynamic-forms/dynamic-forms-core/models/form-value-control/form-value-control.model.d.ts +0 -17
  544. package/modules/dynamic-forms/dynamic-forms-core/models/layout/enums/FormLayoutControlTypes.enum.d.ts +0 -5
  545. package/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-control.model.d.ts +0 -9
  546. package/modules/dynamic-forms/dynamic-forms-core/models/ng-select-control/dynamic-ng-select.model.d.ts +0 -12
  547. package/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.pipe.d.ts +0 -20
  548. package/modules/dynamic-forms/dynamic-forms-core/pipes/get-error-from-key-value.pipe.d.ts +0 -8
  549. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-component.service.d.ts +0 -14
  550. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-layout.service.d.ts +0 -14
  551. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-validation.service.d.ts +0 -11
  552. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form.service.d.ts +0 -30
  553. package/modules/dynamic-forms/dynamic-forms-core/tokens/dynamic-matchers.token.d.ts +0 -3
  554. package/modules/dynamic-forms/dynamic-forms-core/tokens/form-control-map.token.d.ts +0 -3
  555. package/modules/dynamic-forms/dynamic-forms-core/tokens/validators.token.d.ts +0 -3
  556. package/modules/dynamic-forms/dynamic-forms.module.d.ts +0 -9
  557. package/modules/material/mat-cdk-module.d.ts +0 -7
  558. package/modules/material/material.module.d.ts +0 -50
  559. package/modules/query-builder/components/query-design/query-design.component.d.ts +0 -35
  560. package/modules/query-builder/components/query-design/rule-line/components/alphanumeric-control/alphanumeric-control.component.d.ts +0 -46
  561. package/modules/query-builder/components/query-design/rule-line/components/boolean-control/boolean-control.component.d.ts +0 -29
  562. package/modules/query-builder/components/query-design/rule-line/components/date-control/date-control.component.d.ts +0 -21
  563. package/modules/query-builder/components/query-design/rule-line/components/numeric-control/numeric-control.component.d.ts +0 -46
  564. package/modules/query-builder/components/query-design/rule-line/constants/operators-sets.d.ts +0 -12
  565. package/modules/query-builder/components/query-design/rule-line/helpers/condition-operators.mapper.d.ts +0 -6
  566. package/modules/query-builder/components/query-design/rule-line/helpers/control-values-mapper.d.ts +0 -7
  567. package/modules/query-builder/components/query-design/rule-line/rule-line.component.d.ts +0 -64
  568. package/modules/query-builder/directive/auto-complete-position.directive.d.ts +0 -11
  569. package/modules/query-builder/interfaces/query-builder.interface.d.ts +0 -61
  570. package/modules/query-builder/interfaces/select-custom-css-object.d.ts +0 -7
  571. package/modules/query-builder/query-builder.module.d.ts +0 -18
  572. package/modules/ui-kit/components/accordion/accordion-content/accordion-content.component.d.ts +0 -8
  573. package/modules/ui-kit/components/accordion/accordion-trigger.directive.d.ts +0 -10
  574. package/modules/ui-kit/components/accordion/accordion.directive.d.ts +0 -7
  575. package/modules/ui-kit/components/banner/banner.component.d.ts +0 -14
  576. package/modules/ui-kit/components/banner/banner.service.d.ts +0 -27
  577. package/modules/ui-kit/components/breadcrumbs/breadcrumbs.component.d.ts +0 -15
  578. package/modules/ui-kit/components/breadcrumbs/model/breadCrumbItem.d.ts +0 -4
  579. package/modules/ui-kit/components/breadcrumbs/service/breadcrumb.service.d.ts +0 -19
  580. package/modules/ui-kit/components/breadcrumbs/utils/crumb-service.enum.d.ts +0 -6
  581. package/modules/ui-kit/components/buttons/button-control/button-control.component.d.ts +0 -16
  582. package/modules/ui-kit/components/buttons/buttons-list/buttons-list.component.d.ts +0 -5
  583. package/modules/ui-kit/components/buttons/circle-button/circle-button.component.d.ts +0 -20
  584. package/modules/ui-kit/components/card-container/card-container.component.d.ts +0 -5
  585. package/modules/ui-kit/components/common-breadcrumbs/common-breadcrumbs.component.d.ts +0 -20
  586. package/modules/ui-kit/components/common-breadcrumbs/interface/breadcrumb.interface.d.ts +0 -6
  587. package/modules/ui-kit/components/common-breadcrumbs/service/breadcrumb.service.d.ts +0 -21
  588. package/modules/ui-kit/components/data-pagination/data-pagination.component.d.ts +0 -54
  589. package/modules/ui-kit/components/data-table/api-classes/filter-manager.d.ts +0 -13
  590. package/modules/ui-kit/components/data-table/api-classes/grid-api.d.ts +0 -31
  591. package/modules/ui-kit/components/data-table/constants/change-type.enum.d.ts +0 -6
  592. package/modules/ui-kit/components/data-table/constants/column-id.d.ts +0 -2
  593. package/modules/ui-kit/components/data-table/constants/row.d.ts +0 -2
  594. package/modules/ui-kit/components/data-table/data-col/base-data-col/base-data-col.component.d.ts +0 -28
  595. package/modules/ui-kit/components/data-table/data-col/data-col/data-col.component.d.ts +0 -7
  596. package/modules/ui-kit/components/data-table/data-col/data-col-action-button/data-col-action-button.component.d.ts +0 -12
  597. package/modules/ui-kit/components/data-table/data-col/data-col-boolean/data-col-boolean.component.d.ts +0 -8
  598. package/modules/ui-kit/components/data-table/data-col/data-col-multivalue/data-col-multivalue.component.d.ts +0 -8
  599. package/modules/ui-kit/components/data-table/data-col/data-col-nested/data-col-nested.component.d.ts +0 -13
  600. package/modules/ui-kit/components/data-table/data-col/data-col-reference/data-col-reference.component.d.ts +0 -29
  601. package/modules/ui-kit/components/data-table/data-col/data-col-view/data-col-view.component.d.ts +0 -27
  602. package/modules/ui-kit/components/data-table/data-col-disp/data-col-disp.component.d.ts +0 -60
  603. package/modules/ui-kit/components/data-table/data-col-filter/data-col-filter.component.d.ts +0 -85
  604. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-between-value.d.ts +0 -12
  605. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-contains-value.d.ts +0 -9
  606. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-in-value.d.ts +0 -13
  607. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-slider-value.d.ts +0 -10
  608. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/filter-value-executor-provider.d.ts +0 -11
  609. package/modules/ui-kit/components/data-table/data-column-filter/data-column-filter.component.d.ts +0 -29
  610. package/modules/ui-kit/components/data-table/data-row/data-row.component.d.ts +0 -81
  611. package/modules/ui-kit/components/data-table/data-table/data-table.component.d.ts +0 -302
  612. package/modules/ui-kit/components/data-table/data-table-actions/data-table-actions.component.d.ts +0 -53
  613. package/modules/ui-kit/components/data-table/data-table-body/data-table-body.component.d.ts +0 -75
  614. package/modules/ui-kit/components/data-table/data-table-check-rows/data-table-check-rows.component.d.ts +0 -25
  615. package/modules/ui-kit/components/data-table/data-table-row-actions/const/data-table-actions.enum.d.ts +0 -6
  616. package/modules/ui-kit/components/data-table/data-table-row-actions/data-table-row-actions.component.d.ts +0 -42
  617. package/modules/ui-kit/components/data-table/enums/col-filter-types.d.ts +0 -14
  618. package/modules/ui-kit/components/data-table/header-row/header-row.component.d.ts +0 -7
  619. package/modules/ui-kit/components/data-table/interfaces/data-table-component.interface.d.ts +0 -28
  620. package/modules/ui-kit/components/data-table/interfaces/filter-value-executor.interface.d.ts +0 -12
  621. package/modules/ui-kit/components/data-table/services/data-table-context.service.d.ts +0 -12
  622. package/modules/ui-kit/components/data-table-wrap/data-table-wrap.component.d.ts +0 -13
  623. package/modules/ui-kit/components/excel-table/excel-table.component.d.ts +0 -28
  624. package/modules/ui-kit/components/excel-table/interface/excel-table.interface.d.ts +0 -29
  625. package/modules/ui-kit/components/form/base-form-control/base-form-control.component.d.ts +0 -17
  626. package/modules/ui-kit/components/form/checkbox-form-control/checkbox-form-control.component.d.ts +0 -8
  627. package/modules/ui-kit/components/form/counter-form-control/counter-form-control.component.d.ts +0 -21
  628. package/modules/ui-kit/components/form/form-container/form-container.component.d.ts +0 -45
  629. package/modules/ui-kit/components/form/form-group-container/form-group-container.component.d.ts +0 -5
  630. package/modules/ui-kit/components/form/input-form-control/input-form-control.component.d.ts +0 -8
  631. package/modules/ui-kit/components/form/multivalue-form-control/custom-input/custom-input.component.d.ts +0 -15
  632. package/modules/ui-kit/components/form/multivalue-form-control/custom-input/old-new-value.interface.d.ts +0 -4
  633. package/modules/ui-kit/components/form/multivalue-form-control/multivalue-form-control.component.d.ts +0 -26
  634. package/modules/ui-kit/components/form/radio-form-control/radio-form-control.component.d.ts +0 -8
  635. package/modules/ui-kit/components/form/select-form-control/select-form-control.component.d.ts +0 -32
  636. package/modules/ui-kit/components/form/selection-group-container/selection-group-container.component.d.ts +0 -7
  637. package/modules/ui-kit/components/form/textarea-form-control/textarea-form-control.component.d.ts +0 -8
  638. package/modules/ui-kit/components/icon/expand-collapse-icon/expand-collapse-icon.component.d.ts +0 -11
  639. package/modules/ui-kit/components/icon/icon/icon.component.d.ts +0 -14
  640. package/modules/ui-kit/components/icon/text-icon/text-icon.component.d.ts +0 -10
  641. package/modules/ui-kit/components/layouts/form-layout/form-layout.component.d.ts +0 -29
  642. package/modules/ui-kit/components/layouts/primary-layout/primary-layout.component.d.ts +0 -5
  643. package/modules/ui-kit/components/loader/loader.component.d.ts +0 -12
  644. package/modules/ui-kit/components/mat-actions-button/mat-actions-button.d.ts +0 -14
  645. package/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component.d.ts +0 -17
  646. package/modules/ui-kit/components/modals/confirm-modal/confirm-modal.component.d.ts +0 -13
  647. package/modules/ui-kit/components/modals/delete-modal/delete-modal.component.d.ts +0 -17
  648. package/modules/ui-kit/components/modals/enums/confirmation-modal.enum.d.ts +0 -11
  649. package/modules/ui-kit/components/snackbar/snackbar.component.d.ts +0 -10
  650. package/modules/ui-kit/components/tabs/constants/index.d.ts +0 -1
  651. package/modules/ui-kit/components/tabs/interfaces/index.d.ts +0 -3
  652. package/modules/ui-kit/components/tabs/tab-group/tab-group.component.d.ts +0 -25
  653. package/modules/ui-kit/components/tabs/tab.directive.d.ts +0 -16
  654. package/modules/ui-kit/components/tree-view/tree-view.component.d.ts +0 -67
  655. package/modules/ui-kit/constants/data-table.constants.d.ts +0 -6
  656. package/modules/ui-kit/constants/snackbar.constants.d.ts +0 -3
  657. package/modules/ui-kit/enums/coderefs-prop.enum.d.ts +0 -24
  658. package/modules/ui-kit/enums/color-schemes.enum.d.ts +0 -11
  659. package/modules/ui-kit/enums/column-disable-mode.enum.d.ts +0 -5
  660. package/modules/ui-kit/enums/column-types.enum.d.ts +0 -8
  661. package/modules/ui-kit/enums/component-sizes.enum.d.ts +0 -4
  662. package/modules/ui-kit/enums/form-item-type.d.ts +0 -5
  663. package/modules/ui-kit/enums/form-types.enum.d.ts +0 -5
  664. package/modules/ui-kit/enums/form-url-params.enum.d.ts +0 -4
  665. package/modules/ui-kit/enums/icons.enum.d.ts +0 -22
  666. package/modules/ui-kit/enums/position.enum.d.ts +0 -4
  667. package/modules/ui-kit/enums/select-option.enum.d.ts +0 -8
  668. package/modules/ui-kit/enums/snackbar.enum.d.ts +0 -6
  669. package/modules/ui-kit/enums/url-param-action.enum.d.ts +0 -4
  670. package/modules/ui-kit/enums/viewType.enum.d.ts +0 -5
  671. package/modules/ui-kit/interfaces/api.interface.d.ts +0 -45
  672. package/modules/ui-kit/interfaces/confirm-modal-data.interface.d.ts +0 -7
  673. package/modules/ui-kit/interfaces/constants.interface.d.ts +0 -4
  674. package/modules/ui-kit/interfaces/data-table.interface.d.ts +0 -253
  675. package/modules/ui-kit/interfaces/form.interface.d.ts +0 -21
  676. package/modules/ui-kit/interfaces/generic.interface.d.ts +0 -7
  677. package/modules/ui-kit/interfaces/list-item.interface.d.ts +0 -5
  678. package/modules/ui-kit/interfaces/mat-action-buttons.interface.d.ts +0 -14
  679. package/modules/ui-kit/interfaces/row-selection-info.interface.d.ts +0 -7
  680. package/modules/ui-kit/interfaces/select.interface.d.ts +0 -8
  681. package/modules/ui-kit/interfaces/snackbar.interface.d.ts +0 -4
  682. package/modules/ui-kit/interfaces/tree-view.interface.d.ts +0 -49
  683. package/modules/ui-kit/pipes/column-filter.pipe.d.ts +0 -12
  684. package/modules/ui-kit/pipes/filter-by-prop.pipe.d.ts +0 -9
  685. package/modules/ui-kit/pipes/first-letter-text.pipe.d.ts +0 -7
  686. package/modules/ui-kit/pipes/keys.pipe.d.ts +0 -7
  687. package/modules/ui-kit/pipes/paginate.pipe.d.ts +0 -12
  688. package/modules/ui-kit/pipes/search.pipe.d.ts +0 -16
  689. package/modules/ui-kit/services/data-table.service.d.ts +0 -37
  690. package/modules/ui-kit/services/form.service.d.ts +0 -26
  691. package/modules/ui-kit/services/mappers/form-data-table-mapper.service.d.ts +0 -8
  692. package/modules/ui-kit/services/snackbar.service.d.ts +0 -15
  693. package/modules/ui-kit/services/url.service.d.ts +0 -7
  694. package/modules/ui-kit/types/basic.type.d.ts +0 -2
  695. package/modules/ui-kit/types/function.type.d.ts +0 -20
  696. package/modules/ui-kit/types/select.type.d.ts +0 -2
  697. package/modules/ui-kit/ui-kit.module.d.ts +0 -79
  698. package/public-api.d.ts +0 -84
  699. package/shared-pipes/pipes/search.pipe.d.ts +0 -15
  700. package/shared.module.d.ts +0 -13
@@ -1,1534 +0,0 @@
1
- /* eslint-disable @angular-eslint/no-output-on-prefix */
2
- /* eslint-disable sort-class-members/sort-class-members */
3
- import { SelectionModel } from '@angular/cdk/collections';
4
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
5
- import { FormControl } from '@angular/forms';
6
- import { MatDialogConfig } from '@angular/material/dialog';
7
- import { ActionTypesEnum } from 'idp-apps-shared-ui/enums/action-types.enum';
8
- import { SortDirectionEnum } from 'idp-apps-shared-ui/enums/sort-direction.enum';
9
- import { SourceTypesEnum } from 'idp-apps-shared-ui/enums/source-types.enum';
10
- import { ToolTipsProp, tooltipsDefaultValue } from 'idp-apps-shared-ui/enums/tooltips-prop.enum';
11
- import { CommonConfirmModalComponent } from 'idp-apps-shared-ui/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component';
12
- import { clone, isFunction, isUndefined, merge } from 'lodash';
13
- import cloneDeep from 'lodash/cloneDeep';
14
- import { BehaviorSubject, Subject } from 'rxjs';
15
- import { debounceTime, distinctUntilChanged, filter, first, takeUntil } from 'rxjs/operators';
16
- import { ChangeType } from '../../../../../modules/ui-kit/components/data-table/constants/change-type.enum';
17
- import { DataTableConstants } from '../../../constants/data-table.constants';
18
- import { ColumnDisableModes } from '../../../enums/column-disable-mode.enum';
19
- import { ColumnTypes } from '../../../enums/column-types.enum';
20
- import { FormTypes } from '../../../enums/form-types.enum';
21
- import { Icons } from '../../../enums/icons.enum';
22
- import { SnackbarTypes } from '../../../enums/snackbar.enum';
23
- import { DeleteModalComponent } from '../../modals/delete-modal/delete-modal.component';
24
- import { FilterManager } from '../api-classes/filter-manager';
25
- import { GridApi } from '../api-classes/grid-api';
26
- import { COLUMN_ID } from '../constants/column-id';
27
- import { ROW } from '../constants/row';
28
- import { DataColDispComponent } from '../data-col-disp/data-col-disp.component';
29
- import { DataTableBodyComponent } from '../data-table-body/data-table-body.component';
30
- import { DATA_TABLE_CONTEXT } from '../services/data-table-context.service';
31
- import * as i0 from "@angular/core";
32
- import * as i1 from "../../../services/data-table.service";
33
- import * as i2 from "@angular/router";
34
- import * as i3 from "@angular/material/dialog";
35
- import * as i4 from "../../../services/snackbar.service";
36
- import * as i5 from "idp-apps-shared-ui/core/services/user-management.service";
37
- import * as i6 from "idp-apps-shared-ui/modules/ui-kit/pipes/column-filter.pipe";
38
- import * as i7 from "idp-apps-shared-ui/modules/ui-kit/pipes/search.pipe";
39
- import * as i8 from "idp-apps-shared-ui/core/services/local-storage.service";
40
- import * as i9 from "../../../services/form.service";
41
- import * as i10 from "../services/data-table-context.service";
42
- import * as i11 from "@angular/common";
43
- import * as i12 from "@angular/material/input";
44
- import * as i13 from "@angular/material/button";
45
- import * as i14 from "@angular/material/card";
46
- import * as i15 from "@angular/material/checkbox";
47
- import * as i16 from "@angular/material/expansion";
48
- import * as i17 from "@angular/material/progress-spinner";
49
- import * as i18 from "@angular/forms";
50
- import * as i19 from "@angular/flex-layout/extended";
51
- import * as i20 from "../../data-pagination/data-pagination.component";
52
- import * as i21 from "../../loader/loader.component";
53
- import * as i22 from "../data-table-actions/data-table-actions.component";
54
- import * as i23 from "../../icon/icon/icon.component";
55
- import * as i24 from "../data-table-body/data-table-body.component";
56
- import * as i25 from "../data-col-filter/data-col-filter.component";
57
- import * as i26 from "../../../../../core/directive/authorize.directive";
58
- import * as i27 from "../../../pipes/column-filter.pipe";
59
- export class DataTableComponent {
60
- // Inline edit settings
61
- get canInlineEdit() {
62
- return this.gridOptions.canInlineEdit;
63
- }
64
- set setDataTableBody(tableBody) {
65
- this.dataTableBody = tableBody;
66
- }
67
- get columnShowhideStoragekey() {
68
- return this.gridOptions.columnShowhideStoragekey;
69
- }
70
- get allowSaveColumnVisibilitySettings() {
71
- return this.gridOptions.allowSaveColumnVisibilitySettings;
72
- }
73
- get addActionTitle() {
74
- return `${this.gridOptions.actionAddTitle}`;
75
- }
76
- get isViewActionVisible() {
77
- return this.gridOptions.isRowLevelViewActionVisible;
78
- }
79
- get searchPlaceholder() {
80
- return this.gridOptions.searchboxPlaceholder ? this.gridOptions.searchboxPlaceholder : this.header;
81
- }
82
- get isTableInEditState() {
83
- return this.isEditing || this.hasEmptyRow;
84
- }
85
- get apiReqParams() {
86
- return {
87
- page: this.currentPage,
88
- itemsOnPage: this.pageSize,
89
- filterParams: this.populateFilterParams(),
90
- searchText: this.searchValue.value,
91
- ...this.getSortParams,
92
- };
93
- }
94
- get getSortParams() {
95
- const parmas = [];
96
- Object.keys(this.sortedColumn).forEach((x) => {
97
- parmas.push({ sortBy: x, sortDirection: this.sortedColumn[x] });
98
- });
99
- return parmas.length ? parmas[0] : {};
100
- }
101
- constructor(dataTableService, router, activatedRoute, matDialog, changeDetectorRef, snackbarService, userManagementService, filterPipe, searchPipe, localStorageService, dialog, formService, dataTableContext) {
102
- this.dataTableService = dataTableService;
103
- this.router = router;
104
- this.activatedRoute = activatedRoute;
105
- this.matDialog = matDialog;
106
- this.changeDetectorRef = changeDetectorRef;
107
- this.snackbarService = snackbarService;
108
- this.userManagementService = userManagementService;
109
- this.filterPipe = filterPipe;
110
- this.searchPipe = searchPipe;
111
- this.localStorageService = localStorageService;
112
- this.dialog = dialog;
113
- this.formService = formService;
114
- this.dataTableContext = dataTableContext;
115
- this.ICONS = Icons;
116
- this.sortDirectionEnum = SortDirectionEnum;
117
- this.toolTips = ToolTipsProp;
118
- this.actionTypes = ActionTypesEnum;
119
- this.DEFAULT_PAGE_SIZE = DataTableConstants.DEFAULT_PAGE_SIZE;
120
- this.DEFAULT_INIT_PAGE = DataTableConstants.DEFAULT_INIT_PAGE;
121
- this.confirmationMsgPagination = `Selected checkbox will be lost `;
122
- this.defaultRowValues = {};
123
- this.header = '';
124
- this.isIdColVisible = false;
125
- this.hasPagination = true;
126
- this.isOnlyView = false;
127
- this.isEditable = true;
128
- this.isCloneVisible = true;
129
- this.isLazyInitialization = false;
130
- this.isRowSelectionEnable = false;
131
- this.isSaveDataLocal = false;
132
- // Tree grid settings
133
- this.isTreeGrid = false;
134
- this.changeLocalData = new EventEmitter();
135
- this.actionClick = new EventEmitter();
136
- this.onInitCompleted = new EventEmitter();
137
- this.onComplexDetailClicked = new EventEmitter();
138
- this.onEditClicked = new EventEmitter();
139
- this.onAddClicked = new EventEmitter();
140
- this.onRowClicked = new EventEmitter();
141
- this.onPageChanged = new EventEmitter();
142
- this.matExpansionPanelClicked = new EventEmitter();
143
- this.onUpdateCompleted = new EventEmitter();
144
- this.onDeleteCompleted = new EventEmitter();
145
- this.onScrolled = new EventEmitter();
146
- this.CheckboxSelect = new EventEmitter();
147
- this.isTableDataLoad = new EventEmitter();
148
- this.searchValue = new FormControl();
149
- this.isSearchDisabled = false;
150
- this.sourceTypes = SourceTypesEnum;
151
- this.masterSelection = new FormControl(false);
152
- this.paginationParams = {
153
- currentPage: this.DEFAULT_INIT_PAGE,
154
- pageSize: this.DEFAULT_PAGE_SIZE,
155
- };
156
- this.searchedRowCount$ = new Subject();
157
- this.isClearFilter$ = new BehaviorSubject(false);
158
- this.isFilterView = false;
159
- this.excludedRows = [];
160
- this.sortedColumn = {};
161
- this.count = 0;
162
- this.isLoading$ = new BehaviorSubject(false);
163
- this.hasEmptyRow = false;
164
- this.isEditing = false;
165
- this.isSaving = false;
166
- this.map = new Map();
167
- this.numberOfTableRefresh = 0;
168
- this.clearSubs$ = new Subject();
169
- this.totalItems = 0;
170
- this.startX = 0;
171
- this.startWidth = 0;
172
- this.resizingTh = null;
173
- this.apolloDataTable = null;
174
- this.resizingTd = null;
175
- this.defaultGridOptions = {
176
- addIdColumn: true,
177
- actionAddTitle: '',
178
- allowSaveColumnVisibilitySettings: false,
179
- isRowLevelViewActionVisible: true,
180
- isOnlyView: false,
181
- isRowSelectionEnable: false,
182
- idProperty: COLUMN_ID.PROP,
183
- isClientSidePagination: true,
184
- canInlineAdd: true,
185
- canInlineEdit: true,
186
- isSaveDataLocal: false,
187
- isSearchBoxVisible: true,
188
- isFilterEnabled: false,
189
- filterableColumns: [],
190
- defaultSortProperty: {},
191
- cloneOptions: {
192
- copyOfClonableProperties: [],
193
- emptyValueProperties: [],
194
- },
195
- searchableProperties: [],
196
- sortableProperties: [],
197
- isRowActionVisible: true,
198
- topRightActions: [],
199
- deleteOptions: {},
200
- searchboxPlaceholder: this.header,
201
- refreshOnAdd: true,
202
- topLeftAdditionalActions: [],
203
- isSortEnabled: false,
204
- disableIcons: {
205
- add: false,
206
- edit: false,
207
- delete: false,
208
- clone: false,
209
- add$: new BehaviorSubject(false),
210
- edit$: new BehaviorSubject(false),
211
- delete$: new BehaviorSubject(false),
212
- copy$: new BehaviorSubject(false),
213
- },
214
- gridMenuOptions: {
215
- isMenuEnabled: false,
216
- menuItems: [],
217
- },
218
- actionLoading$: {
219
- copy$: new BehaviorSubject(false),
220
- edit$: new BehaviorSubject(false),
221
- delete$: new BehaviorSubject(false),
222
- },
223
- };
224
- this.onMouseMove = (event) => {
225
- const width = this.startWidth + (event.pageX - this.startX);
226
- if (this.resizingTh) {
227
- this.setWidthToElement(width, width, this.resizingTh.offsetWidth);
228
- }
229
- };
230
- this.onMouseUp = () => {
231
- document.removeEventListener('mousemove', this.onMouseMove);
232
- document.removeEventListener('mouseup', this.onMouseUp);
233
- document.body.classList.remove('no-select-resize');
234
- this.resizingTh = null;
235
- this.resizingTd = null;
236
- };
237
- this.filterManager = new FilterManager();
238
- this.gridApi = new GridApi(this, this.formService);
239
- this.dataTableContext.setDataTableComponent(this);
240
- }
241
- get getSelectedRows() {
242
- return this.getFilteredDataRow(this.selection.selected);
243
- }
244
- get getAllCheckedRows() {
245
- return this.selection.selected;
246
- }
247
- get isActionsDisabled() {
248
- return this.filteredRows.length === 0;
249
- }
250
- get getRows() {
251
- return this.getFilteredDataRow(this.rows);
252
- }
253
- get getCustomTableStyle() {
254
- if (this.gridOptions.isInnerScroll) {
255
- return this.gridOptions.customTableStyle ? this.gridOptions.customTableStyle : { height: '30vh' };
256
- }
257
- return {};
258
- }
259
- onTableScrolled(e) {
260
- const htmlElement = this.customDataTable.nativeElement;
261
- const event = {
262
- ...e,
263
- currentElement: this.customDataTable,
264
- currentScrollPosition: { x: htmlElement.scrollLeft, y: htmlElement.scrollTop },
265
- };
266
- this.onScrolled.emit(event);
267
- }
268
- changeScrollPosition(position) {
269
- const htmlElement = this.customDataTable.nativeElement;
270
- htmlElement.scroll(position.x, position.y);
271
- }
272
- ngOnInit() {
273
- if (!this.isLazyInitialization) {
274
- this.init();
275
- }
276
- else {
277
- this.isLoading$.next(true);
278
- }
279
- if (!this.gridOptions.isClientSidePagination) {
280
- this.searchTable();
281
- }
282
- }
283
- isDisabledMainAction(actionProp) {
284
- return this.gridOptions.disableIcons && this.gridOptions.disableIcons[actionProp];
285
- }
286
- nonFilterClassName(columnProp) {
287
- if (!this.isFilterEnable(columnProp) && this.isRowSelectionEnable) {
288
- return 'row-selection-non-filter-cell';
289
- }
290
- if (!this.isFilterEnable(columnProp)) {
291
- return 'non-filter-cell';
292
- }
293
- return '';
294
- }
295
- isFilterEnable(columnProp) {
296
- if (this.isTableInEditState) {
297
- return false;
298
- }
299
- return this.gridOptions.isFilterEnabled && (!this.gridOptions.filterableColumns.length || this.isFilterableColumn(columnProp));
300
- }
301
- isFilterableColumn(columnProp) {
302
- return this.gridOptions.filterableColumns.findIndex((item) => item === columnProp) !== -1;
303
- }
304
- get isFilterApplied() {
305
- return this.filterManager.getFilterParams().length > 0;
306
- }
307
- get nonDisabledRows() {
308
- if (this.gridOptions.rowDisableFn && isFunction(this.gridOptions.rowDisableFn)) {
309
- return this.rows.filter((row) => !this.gridOptions.rowDisableFn(row));
310
- }
311
- return this.rows;
312
- }
313
- ngAfterViewInit() {
314
- this.fireInitCompleted();
315
- if (this.scrollPosition) {
316
- const htmlElement = this.customDataTable.nativeElement;
317
- htmlElement.scrollTop = this.scrollPosition.y;
318
- htmlElement.scrollLeft = this.scrollPosition.x;
319
- }
320
- }
321
- checkDeleteDisabled() {
322
- if (isFunction(this.isDeleteDisabled) && !isUndefined(this.selectedRow)) {
323
- return this.isDeleteDisabled(this.selectedRow);
324
- }
325
- if (this.isDeleteDisabled && typeof this.isDeleteDisabled !== 'function') {
326
- return true;
327
- }
328
- return false;
329
- }
330
- isAllSelected() {
331
- if (this.gridOptions.isClientSidePagination) {
332
- return this.nonDisabledRows.length === this.selection.selected.length;
333
- }
334
- return (this.masterSelection.value && this.excludedRows.length === 0) || this.totalItems === this.selection.selected.length;
335
- }
336
- isSortColumn(viewColumn) {
337
- return !!(this.gridOptions.sortableProperties && this.gridOptions.sortableProperties.find((x) => x === viewColumn.prop));
338
- }
339
- openColumnShowHideDialogue() {
340
- let dialogConfig = new MatDialogConfig();
341
- dialogConfig = this.configureDialog(dialogConfig);
342
- const dialogRef = this.dialog.open(DataColDispComponent, dialogConfig);
343
- dialogRef.afterClosed().subscribe((result) => {
344
- if (result && result.status === 'OK') {
345
- this.viewColumns = result.columns;
346
- this.changeDetectorRef.detectChanges();
347
- }
348
- });
349
- }
350
- masterToggle() {
351
- this.excludedRows = [];
352
- if (!this.masterSelection.pristine && !this.masterSelection.value) {
353
- this.selection.clear();
354
- this.changeDetectorRef.detectChanges();
355
- this.gridApi.detectRowChanges();
356
- this.masterSelection.reset();
357
- this.CheckboxSelect.emit({ rows: [], gridApi: this.getGridApi(), checked: false });
358
- return;
359
- }
360
- if (!this.gridOptions.isClientSidePagination) {
361
- this.checkedAllExceptExcludedRows();
362
- this.changeDetectorRef.detectChanges();
363
- this.gridApi.detectRowChanges();
364
- this.CheckboxSelect.emit({ rows: [], gridApi: this.getGridApi(), checked: true });
365
- }
366
- else {
367
- this.masterToggleClientSide();
368
- this.CheckboxSelect.emit({ rows: this.rows, gridApi: this.getGridApi(), checked: true });
369
- }
370
- }
371
- isCheckboxSelect(row) {
372
- const isSelected = this.selection.isSelected(row);
373
- if (this.masterSelection.value && !isSelected) {
374
- this.excludedRows.push(row);
375
- }
376
- else if (this.masterSelection.value && isSelected) {
377
- const findIndex = this.excludedRows.findIndex((x) => JSON.stringify(x) === JSON.stringify(row));
378
- if (findIndex > -1) {
379
- this.excludedRows.splice(findIndex, 1);
380
- }
381
- }
382
- this.CheckboxSelect.emit({ rows: [row], gridApi: this.getGridApi(), checked: isSelected });
383
- if (isSelected) {
384
- this.rows.forEach((row) => (row.isSelected = false));
385
- }
386
- const checkedRows = this.gridApi.getAllCheckedRows();
387
- if (!this.selectedRow && checkedRows.length > 0) {
388
- this.selectedRow = checkedRows[checkedRows.length - 1];
389
- }
390
- }
391
- refresh() {
392
- this.setData();
393
- }
394
- onClickAction(action) {
395
- this.actionClick.emit(action);
396
- }
397
- onClickAdd() {
398
- this.onAddClicked.emit();
399
- if (isFunction(this.onAddClick) && !this.onAddClick(undefined, undefined)) {
400
- return;
401
- }
402
- this.addActionHandler();
403
- }
404
- addActionHandler() {
405
- this.setIdColumn();
406
- this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
407
- this.isSearchDisabled = true;
408
- this.searchValue.setValue(DataTableConstants.EMPTY);
409
- if (this.gridOptions.canInlineAdd) {
410
- if (!this.hasEmptyRow) {
411
- this.addEmptyRow();
412
- }
413
- }
414
- else {
415
- this.navigatePage(FormTypes.Add);
416
- }
417
- }
418
- onClickRow(eventData) {
419
- const checkedRows = this.gridApi.getAllCheckedRows();
420
- if (checkedRows?.length > 0) {
421
- return;
422
- }
423
- if (this.isDefaultFirstRowSelected()) {
424
- this.rows.forEach((x) => (x.isSelected = false));
425
- }
426
- if (this.selectedRow) {
427
- this.selectedRow.isSelected = false;
428
- }
429
- this.selectedRow = eventData.row;
430
- eventData.row.isSelected = true;
431
- const emitIndex = this.gridOptions.isClientSidePagination
432
- ? eventData.row.rowIndex + this.pageSize * (this.currentPage - 1)
433
- : eventData.row.rowIndex;
434
- this.selectedRow.rowIndex = emitIndex;
435
- this.onRowClicked.emit(eventData.row);
436
- }
437
- onClickRowAdd(eventData) {
438
- if (this.gridOptions.canInlineAdd && !this.hasEmptyRow) {
439
- this.addEmptyRow(eventData.row.depth + 1, this.dataTableService.getRowId(eventData.row));
440
- }
441
- }
442
- onClickEdit(eventData) {
443
- if (isFunction(this.onBeforeEdit) && !this.onBeforeEdit(this.dataTableService.getRowsDataFromRows(this.rows), eventData)) {
444
- return;
445
- }
446
- this.onEditClicked.emit(eventData);
447
- if (this.gridOptions.canInlineEdit) {
448
- if (!this.isEditing) {
449
- this.toggleRowEditing(eventData.row, true);
450
- }
451
- }
452
- else {
453
- this.navigateToItem(FormTypes.Edit, this.dataTableService.getRowId(eventData.row));
454
- }
455
- }
456
- onClickClone(eventData) {
457
- if (this.gridOptions.canInlineAdd && !this.hasEmptyRow) {
458
- const newEventData = cloneDeep(eventData);
459
- this.addCloneRow(newEventData.row);
460
- }
461
- }
462
- onClickView(eventData) {
463
- this.navigateToItem(FormTypes.View, this.getNavigateItemValue(eventData));
464
- }
465
- ComplexDetailClicked(eventData) {
466
- this.onComplexDetailClicked.emit(eventData);
467
- }
468
- ActionClickHandler(action) {
469
- if (action.clicked) {
470
- action.clicked(this.selectedRow);
471
- }
472
- }
473
- showHideFilterView() {
474
- this.isFilterView = !this.isFilterView;
475
- }
476
- clearGlobalFilter() {
477
- this.isClearFilter$.next(true);
478
- this.searchValue.setValue('');
479
- this.changeDetectorRef.detectChanges();
480
- this.filterManager.clearFilterParams();
481
- this.setData();
482
- }
483
- onChangePage(paginationParams, selectableIndex) {
484
- this.setPaginationData(paginationParams);
485
- if (!this.isClientSidePagination()) {
486
- this.setData(selectableIndex);
487
- }
488
- else if (this.isDefaultFirstRowSelected() && this.isClientSidePagination()) {
489
- if (selectableIndex) {
490
- this.emitNextRow(this.pageSize * (this.currentPage - 1) + this.getSelectableValidIndex(selectableIndex));
491
- }
492
- else {
493
- this.emitNextRow(this.pageSize * (this.currentPage - 1));
494
- }
495
- }
496
- this.onPageChanged.emit();
497
- }
498
- onExpansionPanelClick(eventData) {
499
- this.matExpansionPanelClicked.emit(eventData);
500
- }
501
- onChangePageSize(pageSize) {
502
- this.setPaginationDataOnSizeChanged(pageSize);
503
- if (!this.isClientSidePagination()) {
504
- this.setData();
505
- }
506
- }
507
- getFilterParam(column) {
508
- return this.filterManager.getFilterParam(column);
509
- }
510
- isFilteredColumn(columnProp) {
511
- return this.filterManager.getFilterParams().findIndex((item) => item.filterColumn.prop === columnProp) !== -1;
512
- }
513
- onFilterClicked(filterParam) {
514
- this.filterManager.setFilterParams(filterParam);
515
- this.filteredRows = this.filterPipe.transform(this.rows, this.filterManager.getFilterParams(), this.columns, this.gridOptions.isClientSidePagination);
516
- this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
517
- if (!this.isClientSidePagination()) {
518
- this.setData();
519
- }
520
- else {
521
- // this.numberOfTableRefresh = 1.5; // to skip init filter value assign
522
- }
523
- }
524
- onClickEditCancel(eventData) {
525
- this.isSearchDisabled = false;
526
- if (this.dataTableService.isEmptyRow(eventData.row)) {
527
- this.removeEmptyRow();
528
- }
529
- else {
530
- this.toggleRowEditing(eventData.row, false);
531
- }
532
- }
533
- onClickEditSave(eventData) {
534
- this.isSearchDisabled = false;
535
- if (isFunction(this.beforeSaveFn) && !this.beforeSaveFn(this.dataTableService.getRowsDataFromRows(this.rows), eventData)) {
536
- return;
537
- }
538
- if (this.isSaveDataLocal) {
539
- this.onSaveLocalRow(eventData);
540
- }
541
- else {
542
- this.saveRow(eventData);
543
- }
544
- }
545
- onChangeExpandCollapse(eventData) {
546
- this.toggleRowExpandCollapse(eventData.row, eventData.shouldExpand);
547
- }
548
- getNavigateItemValue(eventData) {
549
- if (this.gridOptions && this.gridOptions.rowNavigationProperty) {
550
- return this.dataTableService.getValueByPropertyName(eventData.row, this.gridOptions.rowNavigationProperty);
551
- }
552
- return this.dataTableService.getRowId(eventData.row);
553
- }
554
- navigateToItem(type, id) {
555
- const url = this.gridOptions.editExtraRouteParam ? `${type}/${id}/${this.gridOptions.editExtraRouteParam}` : `${type}/${id}`;
556
- this.navigatePage(url);
557
- }
558
- onClickDeleteRow(eventData) {
559
- this.openDeleteModal(eventData.row);
560
- }
561
- onClickDeleteModal(shouldDelete) {
562
- if (shouldDelete) {
563
- this.gridOptions?.actionLoading$?.delete$.next(true);
564
- if (this.isSaveDataLocal) {
565
- this.removeLocalRow(this.dataTableService.getRowId(this.rowToDelete));
566
- this.onChangeLocalData(ChangeType.ROW_DELETED);
567
- this.gridOptions?.actionLoading$?.delete$.next(false);
568
- }
569
- else {
570
- this.deleteRow(this.rowToDelete);
571
- }
572
- }
573
- }
574
- VisibleColumnListChanged(columnList) {
575
- this.viewColumns = columnList;
576
- }
577
- ngOnDestroy() {
578
- this.clearSubs$.next(null);
579
- this.clearSubs$.complete();
580
- this.isClearFilter$.next(false);
581
- this.isClearFilter$.complete();
582
- this.dataTableContext.clearDataTableComponent();
583
- }
584
- init() {
585
- this.gridOptions = merge(this.defaultGridOptions, this.gridOptions);
586
- this.setPaginationData({
587
- currentPage: isUndefined(this.initialPage) ? this.DEFAULT_INIT_PAGE : this.initialPage,
588
- pageSize: this.pageSize,
589
- });
590
- this.selection = new SelectionModel(!this.isSingleSelect, []);
591
- if (!this.gridOptions.isAutoColumn) {
592
- this.setIdColumn();
593
- this.initColumns();
594
- this.defaultSortedColumns = clone(this.viewColumns);
595
- }
596
- this.getConfiguredColumns();
597
- this.setData();
598
- }
599
- sortTable(viewColumn) {
600
- if (this.isTableInEditState) {
601
- return;
602
- }
603
- if (!this.gridOptions.sortableProperties.find((item) => item === viewColumn.prop) && !this.gridOptions.isSortEnabled) {
604
- return;
605
- }
606
- if (this.sortedColumn[viewColumn.prop] === undefined) {
607
- this.sortedColumn = {};
608
- this.sortedColumn[viewColumn.prop] = SortDirectionEnum.ASC;
609
- this.sortData(viewColumn, true);
610
- }
611
- else if (this.sortedColumn[viewColumn.prop] === SortDirectionEnum.ASC) {
612
- this.sortedColumn[viewColumn.prop] = SortDirectionEnum.DESC;
613
- this.sortData(viewColumn, false);
614
- }
615
- else {
616
- this.sortedColumn = {};
617
- this.sortData(viewColumn, false, true);
618
- }
619
- }
620
- deleteRow(row) {
621
- this.setIdColumn();
622
- const rowId = this.dataTableService.getRowId(row);
623
- this.deleteItemFn(rowId, row.data)
624
- .pipe(first(), takeUntil(this.clearSubs$))
625
- .subscribe({
626
- next: () => {
627
- this.gridOptions?.actionLoading$?.delete$.next(false);
628
- this.snackbarService.success(SnackbarTypes.Deleted, SnackbarTypes.Deleted);
629
- if (this.isClientSidePagination()) {
630
- this.removeLocalRow(rowId);
631
- }
632
- else {
633
- this.setData();
634
- }
635
- if (!this.isDefaultFirstRowSelected()) {
636
- this.selectedRow = undefined;
637
- }
638
- this.onDeleteCompleted.emit({ row: this.selectedRow });
639
- },
640
- error: () => {
641
- // Empty method block.
642
- },
643
- });
644
- }
645
- searchModelChanged() {
646
- if (this.gridOptions.isClientSidePagination) {
647
- this.filteredRows = this.searchPipe.transform(this.rows, this.searchValue.value, this.searchColumns, this.gridOptions.isClientSidePagination, this.searchedRowCount$);
648
- this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
649
- this.changeDetectorRef.detectChanges();
650
- }
651
- }
652
- getTooltipText(text) {
653
- if (this.gridOptions.iconTooltips && this.gridOptions.iconTooltips[text]) {
654
- return this.gridOptions.iconTooltips[text];
655
- }
656
- return tooltipsDefaultValue[text];
657
- }
658
- getActionName(prop) {
659
- return this.userManagementService.getActionName(this.gridOptions, prop);
660
- }
661
- getLeftActionName(prop) {
662
- return this.userManagementService.getLeftActionName(this.gridOptions, prop);
663
- }
664
- getLeftRightActionText(data) {
665
- if (data.title) {
666
- return data.title;
667
- }
668
- return tooltipsDefaultValue[data.title];
669
- }
670
- get isSingleSelect() {
671
- return this.gridOptions && this.gridOptions.isSingleSelect === true;
672
- }
673
- get pageSize() {
674
- return this.paginationParams.pageSize;
675
- }
676
- get currentPage() {
677
- return this.paginationParams.currentPage;
678
- }
679
- detectChange() {
680
- this.changeDetectorRef.detectChanges();
681
- }
682
- selectNextRow() {
683
- if (this.isLastRowInPage()) {
684
- this.paginationParams.currentPage = this.isLastRowInLastPage() ? 1 : this.paginationParams.currentPage + 1;
685
- this.onChangePage(this.paginationParams);
686
- }
687
- else {
688
- this.emitNextRow(this.selectedRow.rowIndex + 1);
689
- }
690
- }
691
- selectPreviousRow() {
692
- if (this.isFirstRowInPage()) {
693
- this.paginationParams.currentPage = this.isFirstRowInFirstPage() ? this.pagesCount : this.paginationParams.currentPage - 1;
694
- this.onChangePage(this.paginationParams, 'last');
695
- }
696
- else {
697
- this.emitNextRow(this.selectedRow.rowIndex - 1);
698
- }
699
- }
700
- uncheckSelectedSource() {
701
- this.selection.clear();
702
- this.changeDetectorRef.detectChanges();
703
- this.gridApi.detectRowChanges();
704
- }
705
- onDoubleClickSeparator(index, viewColumn) {
706
- if (!this.gridOptions.draggable || !viewColumn.draggable) {
707
- return;
708
- }
709
- clearTimeout(this.clickTimeout);
710
- this.resizingTh = this.getSelectedHtml(`th[data-column-prop="${viewColumn.prop}"] div`);
711
- this.resizingTd = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"]`, true);
712
- if (!this.resizingTh || !this.resizingTd) {
713
- return;
714
- }
715
- viewColumn.doubleClicked = !viewColumn.doubleClicked;
716
- viewColumn.dragged = false;
717
- this.formatTableData(viewColumn);
718
- this.formatTableHeader();
719
- }
720
- getHeaderStyle(index, viewColumn) {
721
- let classes = [];
722
- if (this.viewColumns[index].dragged || viewColumn?.doubleClicked === true) {
723
- classes.push('drag-column');
724
- }
725
- else if (this.gridOptions.fixedWidthData) {
726
- classes.push('header-max-width');
727
- }
728
- return classes;
729
- }
730
- onSeparatorMouseDown(event, index, viewColumn) {
731
- clearTimeout(this.clickTimeout);
732
- this.clickTimeout = setTimeout(() => {
733
- if (!this.gridOptions.draggable || !viewColumn.draggable) {
734
- return;
735
- }
736
- if (!viewColumn.dragged) {
737
- viewColumn.dragged = true;
738
- this.changeDetectorRef.detectChanges();
739
- }
740
- this.resizingTh = this.getSelectedHtml(`th[data-column-prop="${viewColumn.prop}"] div`);
741
- this.resizingTd = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"]`, true);
742
- const tdDiv = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"] div`);
743
- this.apolloDataTable = document.querySelector('.apollo-design-new-data-table');
744
- if (this.resizingTh) {
745
- this.startX = event.pageX;
746
- this.startWidth = this.getActualWidth(this.resizingTh, this.startX);
747
- const tdDivWidth = this.getActualWidth(tdDiv, this.startX);
748
- if (this.resizingTd) {
749
- this.resizingTd.forEach((cell) => {
750
- const tdDiv = cell.querySelector('div');
751
- tdDiv.classList.remove('data-max-width');
752
- tdDiv.classList.add('drag-column');
753
- });
754
- }
755
- this.setWidthToElement(this.startWidth, tdDivWidth, this.resizingTh.offsetWidth);
756
- }
757
- }, 250);
758
- document.body.classList.add('no-select-resize');
759
- if (this.gridOptions.draggable && viewColumn.draggable) {
760
- document.addEventListener('mousemove', this.onMouseMove);
761
- }
762
- document.addEventListener('mouseup', this.onMouseUp);
763
- }
764
- getSelectedHtml(selector, isSelectAll = false) {
765
- if (isSelectAll) {
766
- return this.customDataTable.nativeElement.querySelectorAll(selector);
767
- }
768
- return this.customDataTable.nativeElement.querySelector(selector);
769
- }
770
- formatTableData(viewColumn) {
771
- if (!viewColumn.doubleClicked) {
772
- this.resizingTd.forEach((cell) => {
773
- const tdDiv = cell.querySelector('div');
774
- tdDiv.classList.remove('drag-column');
775
- if (this.gridOptions.fixedWidthData) {
776
- tdDiv.classList.add('data-max-width');
777
- }
778
- });
779
- }
780
- else {
781
- this.resizingTd.forEach((cell) => {
782
- const tdDiv = cell.querySelector('div');
783
- tdDiv.classList.remove('data-max-width');
784
- tdDiv.classList.add('drag-column');
785
- });
786
- }
787
- }
788
- formatTableHeader() {
789
- this.resizingTh.style.width = '';
790
- this.resizingTd.forEach((cell) => {
791
- const tdDiv = cell.querySelector('div');
792
- tdDiv.style.width = '';
793
- });
794
- }
795
- setWidthToElement(thWidth, tdWidth, previousThWidth) {
796
- if (this.resizingTh) {
797
- this.resizingTh.style.width = `${thWidth}px`;
798
- }
799
- if (this.resizingTd) {
800
- this.resizingTd.forEach((cell) => {
801
- const div = cell.querySelector('div.drag-column');
802
- if (div) {
803
- div.style.width = `${tdWidth}px`;
804
- }
805
- });
806
- }
807
- if (this.resizingTh && this.apolloDataTable) {
808
- const updatedTableWidth = this.apolloDataTable.offsetWidth + (this.resizingTh.offsetWidth - previousThWidth);
809
- this.apolloDataTable.style.width = `${updatedTableWidth}px`;
810
- }
811
- }
812
- getActualWidth(element, startX) {
813
- let width;
814
- const boundingRect = element.getBoundingClientRect();
815
- width = boundingRect.width;
816
- const offset = startX - boundingRect.left;
817
- if (offset < boundingRect.width) {
818
- width = offset;
819
- }
820
- return width;
821
- }
822
- get pagesCount() {
823
- return Math.ceil(this.count / this.pageSize);
824
- }
825
- get rowsCountInCurrentPage() {
826
- if (!this.gridOptions.isClientSidePagination) {
827
- return this.rows.length;
828
- }
829
- const leftRows = this.rows.length - this.pageSize * (this.currentPage - 1);
830
- return leftRows >= this.pageSize ? this.pageSize : leftRows;
831
- }
832
- isLastRowInPage() {
833
- if (this.selectedRow && this.gridOptions.isClientSidePagination) {
834
- return ((this.selectedRow.rowIndex + 1) / this.currentPage === this.rowsCountInCurrentPage || this.selectedRow.rowIndex + 1 === this.count);
835
- }
836
- return this.selectedRow && this.selectedRow.rowIndex + 1 === this.rowsCountInCurrentPage;
837
- }
838
- isFirstRowInPage() {
839
- return this.selectedRow && this.selectedRow.rowIndex % this.pageSize === 0;
840
- }
841
- isFirstRowInFirstPage() {
842
- return this.isFirstRowInPage() && this.currentPage === 1;
843
- }
844
- isLastRowInLastPage() {
845
- return this.isLastRowInPage() && this.currentPage === this.pagesCount;
846
- }
847
- detectRowChange() {
848
- this.rows = clone(this.rows);
849
- this.changeDetectorRef.detectChanges();
850
- }
851
- isClientSidePagination() {
852
- return this.gridOptions.isClientSidePagination;
853
- }
854
- setIdColumn() {
855
- // To do improve
856
- if (this.gridOptions && this.gridOptions.idProperty) {
857
- COLUMN_ID.PROP = this.gridOptions.idProperty;
858
- }
859
- else {
860
- COLUMN_ID.PROP = 'id';
861
- }
862
- }
863
- initColumns() {
864
- this.initViewColumns();
865
- if (this.gridOptions && this.gridOptions.addIdColumn) {
866
- this.addIdColumn();
867
- }
868
- }
869
- configureDialog(dialogConfig) {
870
- dialogConfig.position = {
871
- top: '15vh',
872
- left: '20vw',
873
- };
874
- dialogConfig.height = '80vh';
875
- dialogConfig.width = '60vw';
876
- dialogConfig.panelClass = 'columnshowhide-panel';
877
- dialogConfig.data = {
878
- defaultSortedColumns: this.defaultSortedColumns,
879
- columns: this.viewColumns,
880
- storageKey: this.storageKey,
881
- metaDataColumns: this.gridOptions.metaDataColumns,
882
- };
883
- dialogConfig.disableClose = false;
884
- return dialogConfig;
885
- }
886
- initViewColumns() {
887
- this.viewColumns = clone(this.columns.filter((x) => x != undefined));
888
- this.viewColumns.forEach((viewColumn) => {
889
- if (viewColumn.isVisible === undefined) {
890
- viewColumn.isVisible = true;
891
- }
892
- if (viewColumn.isDisplayValueAsFormControl === undefined) {
893
- viewColumn.isDisplayValueAsFormControl = false;
894
- }
895
- });
896
- this.searchColumns = this.getSearchableColumns(this.viewColumns);
897
- }
898
- addIdColumn() {
899
- this.viewColumns.unshift({
900
- header: COLUMN_ID.HEADER,
901
- prop: COLUMN_ID.PROP,
902
- type: ColumnTypes.Integer,
903
- isReadOnly: true,
904
- isVisible: false, // this.isIdColVisible,
905
- isDisplayValueAsFormControl: false,
906
- editDisabledMode: ColumnDisableModes.AlwaysDisabled,
907
- });
908
- }
909
- setData(selectableIndex) {
910
- this.numberOfTableRefresh += 1;
911
- this.isLoading$.next(true);
912
- if (!this.gridOptions.isAutoColumn) {
913
- this.setInitApiParams();
914
- }
915
- this.applyDefaultSortingParams();
916
- this.getListFn(this.apiReqParams)
917
- .pipe(first(), takeUntil(this.clearSubs$))
918
- .subscribe((response) => {
919
- // TODO: add error handling
920
- this.totalItems = response.itemsTotal;
921
- this.initGetFunc(response, selectableIndex);
922
- if (this.gridOptions.isDefaultAllRowSelected && this.gridOptions.isClientSidePagination) {
923
- this.masterSelection.setValue(true);
924
- this.masterToggle();
925
- }
926
- this.isTableDataLoad.emit(true);
927
- }, (err) => {
928
- if (err) {
929
- this.isLoading$.next(false);
930
- this.rows = this.rows || [];
931
- this.changeDetectorRef.detectChanges();
932
- }
933
- }, () => {
934
- // Empty Method block
935
- });
936
- }
937
- setInitApiParams() {
938
- if (this.numberOfTableRefresh > 1) {
939
- return;
940
- }
941
- this.setInitFilterParams();
942
- }
943
- setInitFilterParams() {
944
- this.filterManager.setInitFilterParams(this.columns);
945
- }
946
- initGetFunc(response, selectableIndex) {
947
- this.count = this.gridOptions.isClientSidePagination ? response.resultSet.length : response.itemsTotal;
948
- this.searchedRowCount$.next(response.itemsTotal);
949
- if (this.gridOptions.isAutoColumn) {
950
- this.generateColumns(response.resultSet);
951
- }
952
- this.rows = this.dataTableService.getRowsFromRowsData(response.resultSet);
953
- if (this.gridOptions.editable) {
954
- this.rows.forEach((x) => (x.isEditing = true));
955
- }
956
- if (this.gridOptions.isClientSidePagination) {
957
- this.originalUnsortedRows = cloneDeep(this.rows);
958
- }
959
- this.filteredRows = cloneDeep(this.rows);
960
- this.selectedRow = undefined;
961
- this.isLoading$.next(false);
962
- this.isClearFilter$.next(false);
963
- this.isEditing = false;
964
- this.hasEmptyRow = false;
965
- if (this.gridOptions.defaultSortProperty.prop) {
966
- this.applyDefaultSort();
967
- }
968
- if (this.isEligibleForAllCheck()) {
969
- this.checkedAllExceptExcludedRows();
970
- }
971
- else if (this.isRowSelectionEnable && !this.gridOptions.isClientSidePagination) {
972
- this.setRowChecked();
973
- }
974
- if (this.isDefaultFirstRowSelected()) {
975
- // TODO - refactor
976
- this.emitNextRow(this.getSelectableValidIndex(selectableIndex));
977
- }
978
- this.changeDetectorRef.detectChanges();
979
- }
980
- isEligibleForAllCheck() {
981
- return (this.isRowSelectionEnable && !this.gridOptions.isClientSidePagination && !this.masterSelection.pristine && this.masterSelection.value);
982
- }
983
- getSelectableValidIndex(selectableIndex) {
984
- if (selectableIndex === 'last') {
985
- selectableIndex = this.pageSize;
986
- }
987
- return Number(selectableIndex) > this.rowsCountInCurrentPage - 1 ? this.rowsCountInCurrentPage - 1 : selectableIndex;
988
- }
989
- setPaginationData(paginationParams) {
990
- this.paginationParams = paginationParams;
991
- }
992
- checkedAllExceptExcludedRows() {
993
- this.clearPropertyWhenSelectionEnable(this.excludedRows);
994
- this.selection.clear();
995
- const excludedCurrentPageRows = this.rows.filter((x) => this.excludedRows.map((e) => JSON.stringify(e)).includes(JSON.stringify(x)));
996
- this.rows
997
- .filter((x) => !excludedCurrentPageRows.some((y) => JSON.stringify(x) === JSON.stringify(y)))
998
- .forEach((row) => {
999
- if (this.gridOptions.rowDisableFn && isFunction(this.gridOptions.rowDisableFn) && !this.gridOptions.rowDisableFn(row)) {
1000
- this.selection.select(row);
1001
- }
1002
- else if (!this.gridOptions.rowDisableFn) {
1003
- this.selection.select(row);
1004
- }
1005
- });
1006
- }
1007
- applyDefaultSort() {
1008
- if (this.gridOptions.defaultSortProperty.order === SortDirectionEnum.DESC) {
1009
- this.downSort(this.gridOptions.defaultSortProperty);
1010
- }
1011
- else {
1012
- this.upSort(this.gridOptions.defaultSortProperty);
1013
- }
1014
- }
1015
- applyDefaultSortingParams() {
1016
- if (!this.gridOptions.defaultSortProperty.prop) {
1017
- return;
1018
- }
1019
- this.sortedColumn = {};
1020
- if (this.gridOptions.defaultSortProperty.order === SortDirectionEnum.DESC) {
1021
- this.sortedColumn[this.gridOptions.defaultSortProperty.prop] = SortDirectionEnum.DESC;
1022
- }
1023
- else {
1024
- this.sortedColumn[this.gridOptions.defaultSortProperty.prop] = SortDirectionEnum.ASC;
1025
- }
1026
- }
1027
- setPaginationDataOnSizeChanged(pageSize) {
1028
- this.paginationParams.pageSize = pageSize;
1029
- }
1030
- navigatePage(url) {
1031
- this.router.navigate([url], { relativeTo: this.activatedRoute });
1032
- }
1033
- openDeleteModal(row) {
1034
- this.rowToDelete = row;
1035
- const dialogConfig = new MatDialogConfig();
1036
- dialogConfig.data = {
1037
- message: this.gridOptions.deleteOptions.confirmationMessage,
1038
- };
1039
- dialogConfig.position = {
1040
- top: '7%',
1041
- };
1042
- dialogConfig.panelClass = 'delete-modal-panel';
1043
- const dialogRef = this.matDialog.open(DeleteModalComponent, dialogConfig);
1044
- dialogRef
1045
- .afterClosed()
1046
- .pipe(first(), takeUntil(this.clearSubs$))
1047
- .subscribe((result) => this.onClickDeleteModal(result));
1048
- this.changeDetectorRef.detectChanges();
1049
- }
1050
- saveRow(eventData) {
1051
- this.setIdColumn();
1052
- const row = eventData.row, saveData = eventData.saveData;
1053
- if (saveData[COLUMN_ID.PROP] === COLUMN_ID.EMPTY_ROW_VAL) {
1054
- this.postDataForAdd(saveData, row);
1055
- }
1056
- else {
1057
- this.putDataForEdit(saveData, row);
1058
- }
1059
- }
1060
- postDataForAdd(saveData, row) {
1061
- this.isSaving = true;
1062
- row.isSaving = true;
1063
- this.postItemFn(saveData)
1064
- .pipe(first(), takeUntil(this.clearSubs$))
1065
- .subscribe((result) => {
1066
- this.isSaving = false;
1067
- row.isSaving = false;
1068
- this.snackbarService.success(SnackbarTypes.Success, SnackbarTypes.Success);
1069
- if (this.gridOptions.refreshOnAdd) {
1070
- this.setData();
1071
- }
1072
- else {
1073
- this.hasEmptyRow = false;
1074
- saveData[COLUMN_ID.PROP] = result[COLUMN_ID.PROP];
1075
- this.saveLocalRow(row, saveData);
1076
- }
1077
- }, () => {
1078
- this.isSaving = false;
1079
- row.isSaving = false;
1080
- this.changeDetectorRef.detectChanges();
1081
- });
1082
- }
1083
- putDataForEdit(saveData, row) {
1084
- this.isSaving = true;
1085
- row.isSaving = true;
1086
- this.putItemFn(this.dataTableService.getRowId(row), saveData)
1087
- .pipe(first(), takeUntil(this.clearSubs$))
1088
- .subscribe((returnData) => {
1089
- if (returnData) {
1090
- saveData = merge(saveData, returnData);
1091
- }
1092
- this.isSaving = false;
1093
- row.isSaving = false;
1094
- this.snackbarService.info(SnackbarTypes.Update, SnackbarTypes.Update);
1095
- if (!this.isClientSidePagination()) {
1096
- this.setData();
1097
- }
1098
- else {
1099
- this.saveLocalRow(row, saveData);
1100
- this.onUpdateCompleted.emit({ row });
1101
- }
1102
- }, () => {
1103
- this.isSaving = false;
1104
- row.isSaving = false;
1105
- this.changeDetectorRef.detectChanges();
1106
- });
1107
- }
1108
- downSort(viewColumn) {
1109
- this.rows.sort((item1, item2) => {
1110
- return item1.data[viewColumn.prop] <= item2.data[viewColumn.prop] ? 1 : -1;
1111
- });
1112
- this.detectRowChange();
1113
- }
1114
- upSort(viewColumn) {
1115
- this.rows.sort((item1, item2) => {
1116
- return item1.data[viewColumn.prop] >= item2.data[viewColumn.prop] ? 1 : -1;
1117
- });
1118
- this.detectRowChange();
1119
- }
1120
- unsort() {
1121
- this.rows = this.originalUnsortedRows.filter((original) => {
1122
- return this.rows.filter((row) => JSON.stringify(row.data) === JSON.stringify(original.data));
1123
- });
1124
- }
1125
- sortData(viewColumn, isAscending, isUnsort = false) {
1126
- if (!this.gridOptions.isClientSidePagination) {
1127
- this.setData();
1128
- return;
1129
- }
1130
- if (isUnsort) {
1131
- this.unsort();
1132
- }
1133
- else {
1134
- isAscending ? this.upSort(viewColumn) : this.downSort(viewColumn);
1135
- }
1136
- }
1137
- addEmptyRow(depth = ROW.ROOT_DEPTH, parentId = COLUMN_ID.NO_PARENT_VAL) {
1138
- this.hasEmptyRow = true;
1139
- this.filterManager.clearFilterParams();
1140
- const newRow = this.getEmptyRow(depth, parentId);
1141
- this.selectedRow = newRow;
1142
- this.rows = this.dataTableService.getRowsWithInsertedRow(parentId, this.rows, newRow);
1143
- }
1144
- removeEmptyRow() {
1145
- this.hasEmptyRow = false;
1146
- this.selectedRow = undefined;
1147
- this.removeLocalRow(COLUMN_ID.EMPTY_ROW_VAL);
1148
- }
1149
- onSaveLocalRow(eventData) {
1150
- if (this.dataTableService.isEmptyRow(eventData.row)) {
1151
- this.addLocalRow(eventData.row, eventData.saveData);
1152
- this.onChangeLocalData(ChangeType.ROW_ADDED);
1153
- }
1154
- else {
1155
- this.editLocalRow(eventData.row, eventData.saveData);
1156
- this.onChangeLocalData(ChangeType.ROW_UPDATED);
1157
- }
1158
- }
1159
- addLocalRow(row, saveData) {
1160
- this.hasEmptyRow = false;
1161
- this.saveLocalRow(row, { ...saveData, id: this.dataTableService.getNewRowId() });
1162
- }
1163
- editLocalRow(row, saveData) {
1164
- this.saveLocalRow(row, saveData);
1165
- }
1166
- saveLocalRow(row, saveData) {
1167
- this.isEditing = false;
1168
- this.updateRowData(row, saveData);
1169
- row.isEditing = false;
1170
- this.detectRowChange();
1171
- }
1172
- updateRowData(row, saveData) {
1173
- Object.assign(row.data, saveData);
1174
- if (!isUndefined(row.formGroup)) {
1175
- this.formService.fillForm(row.formGroup, row.data);
1176
- }
1177
- }
1178
- removeLocalRow(removeRowId) {
1179
- const index = this.rows.findIndex((x) => x.data[COLUMN_ID.PROP] === removeRowId);
1180
- this.rows = this.dataTableService.getRowsWithRemovedRow(removeRowId, this.rows);
1181
- if (this.isDefaultFirstRowSelected()) {
1182
- this.selectAutoNextRow(index);
1183
- }
1184
- else if (this.gridOptions.defaultFirstRowSelection && this.rows.length === 0) {
1185
- this.onRowClicked.emit();
1186
- }
1187
- if (this.rows.length && this.rows.length % this.paginationParams.pageSize === 0) {
1188
- this.paginationParams.currentPage--;
1189
- this.searchedRowCount$.next(this.rows.length);
1190
- }
1191
- this.changeDetectorRef.detectChanges();
1192
- }
1193
- selectAutoNextRow(index) {
1194
- if (index !== -1) {
1195
- this.emitNextRow(this.rows.length === index ? this.rows.length - 1 : index);
1196
- }
1197
- }
1198
- isDefaultFirstRowSelected() {
1199
- return this.gridOptions.defaultFirstRowSelection;
1200
- }
1201
- emitNextRow(index = 0) {
1202
- if (this.rows.length > 0) {
1203
- this.rows.forEach((x) => (x.isSelected = false));
1204
- this.selectedRow = this.rows[index];
1205
- this.selectedRow.rowIndex = index;
1206
- this.rows[index].isSelected = true;
1207
- this.changeDetectorRef.detectChanges();
1208
- this.dataTableBody.detectChange();
1209
- this.onRowClicked.emit(this.rows[index]);
1210
- }
1211
- else {
1212
- this.onRowClicked.emit();
1213
- }
1214
- }
1215
- toggleRowEditing(row, isEditing) {
1216
- this.isEditing = isEditing;
1217
- row.isEditing = isEditing;
1218
- this.rows = [...this.rows];
1219
- this.changeDetectorRef.detectChanges();
1220
- }
1221
- toggleRowExpandCollapse(row, shouldExpand) {
1222
- row.isExpanded = shouldExpand;
1223
- this.rows = [...this.rows];
1224
- this.changeDetectorRef.detectChanges();
1225
- }
1226
- getEmptyRow(depth, parentId) {
1227
- return this.dataTableService.getRow(this.dataTableService.getEmptyRowData(this.viewColumns, this.defaultRowValues), depth, parentId, true);
1228
- }
1229
- onChangeLocalData(changeType = ChangeType.OTHER) {
1230
- this.changeLocalData.emit({
1231
- rowsData: this.dataTableService.getRowsDataFromRows(this.rows),
1232
- changeType,
1233
- });
1234
- }
1235
- fireInitCompleted() {
1236
- this.onInitCompleted.emit(this.getGridApi());
1237
- }
1238
- addCloneRow(row, depth = ROW.ROOT_DEPTH, parentId = COLUMN_ID.NO_PARENT_VAL) {
1239
- this.hasEmptyRow = true;
1240
- row.data[COLUMN_ID.PROP] = COLUMN_ID.EMPTY_ROW_VAL;
1241
- this.gridOptions.cloneOptions.copyOfClonableProperties.forEach((property) => {
1242
- row.data[property] = DataTableConstants.COPY_OF + row.data[property];
1243
- });
1244
- const emptyValueColumns = this.viewColumns.filter((col) => {
1245
- return this.gridOptions.cloneOptions.emptyValueProperties.includes(col.prop);
1246
- });
1247
- this.dataTableService.setEmptyValuesInRowData(row, emptyValueColumns);
1248
- const clonedRow = this.dataTableService.getRow(row.data, depth, parentId, true);
1249
- this.rows = this.dataTableService.getRowsWithInsertedRow(parentId, this.rows, clonedRow);
1250
- this.selectedRow = clonedRow;
1251
- }
1252
- getGridApi() {
1253
- return this.gridApi;
1254
- }
1255
- getSearchableColumns(columns) {
1256
- const searchableColumns = columns.filter((item) => Object.hasOwnProperty.call(item, 'prop') && this.gridOptions.searchableProperties.includes(item.prop));
1257
- return searchableColumns.length === 0 ? columns : searchableColumns;
1258
- }
1259
- masterToggleClientSide() {
1260
- this.isAllSelected() ? this.selection.clear() : this.nonDisabledRows.forEach((row) => this.selection.select(row));
1261
- this.changeDetectorRef.detectChanges();
1262
- this.gridApi.detectRowChanges();
1263
- }
1264
- clearPropertyWhenSelectionEnable(checkedRows) {
1265
- if (this.isRowSelectionEnable && checkedRows.length) {
1266
- checkedRows.forEach((s) => {
1267
- if (s.hasOwnProperty('isSelected')) {
1268
- delete s.isSelected;
1269
- }
1270
- if (s.hasOwnProperty('rowIndex')) {
1271
- delete s.rowIndex;
1272
- }
1273
- });
1274
- }
1275
- }
1276
- getCheckedRows() {
1277
- const checkedRows = this.selection.selected;
1278
- this.clearPropertyWhenSelectionEnable(checkedRows);
1279
- const pageMatchedPreviousCheckedRows = this.rows.filter((row) => {
1280
- return checkedRows.some((item) => JSON.stringify(row) === JSON.stringify(item));
1281
- });
1282
- const pageUnmatchedCheckedRows = checkedRows.filter((e) => {
1283
- return pageMatchedPreviousCheckedRows.findIndex((m) => JSON.stringify(e) === JSON.stringify(m)) < 0;
1284
- });
1285
- return { pageMatchedPreviousCheckedRows: pageMatchedPreviousCheckedRows, pageUnmatchedCheckedRows: pageUnmatchedCheckedRows };
1286
- }
1287
- masterToggleServerSide() {
1288
- const previousCheckedRows = this.getCheckedRows();
1289
- this.selection.clear();
1290
- this.addUnmatchedRowToSelection(previousCheckedRows.pageUnmatchedCheckedRows);
1291
- if (this.rows.length !== previousCheckedRows.pageMatchedPreviousCheckedRows.length) {
1292
- this.rows.forEach((row) => this.selection.select(row));
1293
- }
1294
- this.changeDetectorRef.detectChanges();
1295
- this.gridApi.detectRowChanges();
1296
- }
1297
- addUnmatchedRowToSelection(rows) {
1298
- rows.forEach((row) => this.selection.select(row));
1299
- }
1300
- setRowChecked() {
1301
- const previousCheckedRows = this.getCheckedRows();
1302
- this.selection.clear();
1303
- this.addUnmatchedRowToSelection(previousCheckedRows.pageUnmatchedCheckedRows);
1304
- this.rows
1305
- .filter((e) => {
1306
- return previousCheckedRows.pageMatchedPreviousCheckedRows.some((item) => JSON.stringify(e) === JSON.stringify(item));
1307
- })
1308
- .forEach((row) => {
1309
- this.selection.select(row);
1310
- });
1311
- this.changeDetectorRef.detectChanges();
1312
- this.gridApi.detectRowChanges();
1313
- }
1314
- getFilteredDataRow(dataRows) {
1315
- return dataRows.filter((e) => {
1316
- return this.filteredRows.some((item) => JSON.stringify(e.data) === JSON.stringify(item.data));
1317
- });
1318
- }
1319
- setColumnSource(property) {
1320
- let source;
1321
- const index = this.gridOptions.metaDataColumns.findIndex((value) => value === property);
1322
- if (index > -1) {
1323
- source = this.sourceTypes.METADATA;
1324
- }
1325
- else {
1326
- source = this.sourceTypes.DATA_SOURCE;
1327
- }
1328
- return source;
1329
- }
1330
- setColumnsUsingStoredData(defaultColumns) {
1331
- let tempCollection = [];
1332
- tempCollection = defaultColumns.filter((x) => x != undefined);
1333
- if (!this.storageKey) {
1334
- return tempCollection;
1335
- }
1336
- let storedColumns = this.localStorageService.getItem(this.storageKey);
1337
- if (storedColumns && storedColumns.length) {
1338
- var index = 0;
1339
- storedColumns
1340
- .filter((x) => x != undefined)
1341
- .forEach((item) => {
1342
- const existingColumnIndex = tempCollection.findIndex((x) => x.prop === item.prop);
1343
- if (existingColumnIndex > -1) {
1344
- const existingColumn = tempCollection.find((x) => x.prop === item.prop);
1345
- if (existingColumn) {
1346
- existingColumn.isVisible = true;
1347
- var tempcolumn = tempCollection[index];
1348
- tempCollection[index] = existingColumn;
1349
- tempCollection[existingColumnIndex] = tempcolumn;
1350
- }
1351
- }
1352
- index++;
1353
- });
1354
- // added invisible columns at the end to complete the set
1355
- tempCollection
1356
- .filter((item) => item && storedColumns.findIndex((x) => x.prop === item.prop) < 0)
1357
- .forEach((item) => {
1358
- if (item) {
1359
- item.isVisible = false;
1360
- }
1361
- });
1362
- }
1363
- return tempCollection;
1364
- }
1365
- selectedCheckboxPagingConfirmation(selectableIndex) {
1366
- const dialogRef = this.matDialog.open(CommonConfirmModalComponent, {
1367
- width: '450px',
1368
- data: {
1369
- body: this.confirmationMsgPagination,
1370
- },
1371
- });
1372
- dialogRef
1373
- .afterClosed()
1374
- .pipe()
1375
- .subscribe((confirmation) => {
1376
- if (confirmation) {
1377
- this.setData(selectableIndex);
1378
- }
1379
- });
1380
- }
1381
- isSelectedRow() {
1382
- return this.gridApi.getSelectedRows().map((x) => x.data).length;
1383
- }
1384
- searchTable() {
1385
- this.searchValue.valueChanges
1386
- .pipe(filter((res) => res.length >= 2 || res === ''), debounceTime(500), distinctUntilChanged(), takeUntil(this.clearSubs$))
1387
- .subscribe(() => {
1388
- if (!this.isSearchDisabled) {
1389
- this.paginationParams.currentPage = 1;
1390
- this.changeDetectorRef.detectChanges();
1391
- this.setData();
1392
- }
1393
- });
1394
- }
1395
- populateFilterParams() {
1396
- if (!this.gridOptions.isClientSidePagination && this.gridOptions.isSearchBoxVisible && !this.gridOptions.isUpdatedTableDesign) {
1397
- return [{ columnName: 'searchText', filterValue: this.searchValue.value }, ...this.filterManager.getFilterParams()];
1398
- }
1399
- return this.filterManager.getFilterParams();
1400
- }
1401
- getConfiguredColumns() {
1402
- if (isFunction(this.gridOptions.storageFn)) {
1403
- this.storageKey = this.gridOptions.storageFn();
1404
- let columns = this.setColumnsUsingStoredData(this.columns);
1405
- this.viewColumns = columns.filter((x) => x != undefined);
1406
- }
1407
- }
1408
- generateColumns(rowData) {
1409
- this.columns = Object.keys(rowData[0]).map((x) => {
1410
- return {
1411
- header: x.toUpperCase(),
1412
- prop: x,
1413
- type: ColumnTypes.String,
1414
- rendererTemplate: this.gridOptions.renderTemplatesProp ? this.gridOptions.renderTemplatesProp[x] : undefined,
1415
- };
1416
- });
1417
- this.initColumns();
1418
- this.defaultSortedColumns = clone(this.viewColumns);
1419
- this.changeDetectorRef.detectChanges();
1420
- }
1421
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.DataTableService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.MatDialog }, { token: i0.ChangeDetectorRef }, { token: i4.SnackbarService }, { token: i5.UserManagementService }, { token: i6.ColumnFilterPipe }, { token: i7.SearchPipe }, { token: i8.LocalStorageService }, { token: i3.MatDialog }, { token: i9.FormService }, { token: i10.DataTableContextService }], target: i0.ɵɵFactoryTarget.Component }); }
1422
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DataTableComponent, selector: "app-data-table", inputs: { defaultRowValues: "defaultRowValues", columns: "columns", getListFn: "getListFn", postItemFn: "postItemFn", putItemFn: "putItemFn", deleteItemFn: "deleteItemFn", header: "header", description: "description", actionAddTitle: "actionAddTitle", isIdColVisible: "isIdColVisible", hasPagination: "hasPagination", isOnlyView: "isOnlyView", isOnlyViewRow: "isOnlyViewRow", isDeleteDisabled: "isDeleteDisabled", isEditable: "isEditable", isCloneVisible: "isCloneVisible", isLazyInitialization: "isLazyInitialization", objectName: "objectName", gridOptions: "gridOptions", isRowSelectionEnable: "isRowSelectionEnable", beforeSaveFn: "beforeSaveFn", onBeforeEdit: "onBeforeEdit", onAddClick: "onAddClick", isRowUnchecked: "isRowUnchecked", isSaveDataLocal: "isSaveDataLocal", scrollPosition: "scrollPosition", isTreeGrid: "isTreeGrid", initialPage: "initialPage" }, outputs: { changeLocalData: "changeLocalData", actionClick: "actionClick", onInitCompleted: "onInitCompleted", onComplexDetailClicked: "onComplexDetailClicked", onEditClicked: "onEditClicked", onAddClicked: "onAddClicked", onRowClicked: "onRowClicked", onPageChanged: "onPageChanged", matExpansionPanelClicked: "matExpansionPanelClicked", onUpdateCompleted: "onUpdateCompleted", onDeleteCompleted: "onDeleteCompleted", onScrolled: "onScrolled", CheckboxSelect: "CheckboxSelect", isTableDataLoad: "isTableDataLoad" }, providers: [
1423
- {
1424
- provide: DATA_TABLE_CONTEXT,
1425
- useExisting: DataTableComponent,
1426
- },
1427
- ], viewQueries: [{ propertyName: "setDataTableBody", first: true, predicate: DataTableBodyComponent, descendants: true }, { propertyName: "deleteModal", first: true, predicate: ["deleteModal"], descendants: true, read: TemplateRef, static: true }, { propertyName: "customDataTable", first: true, predicate: ["customDataTable"], descendants: true }, { propertyName: "sliderTemplate", first: true, predicate: ["sliderTemplate"], descendants: true }], ngImport: i0, template: "<div>\n <section class=\"actions\">\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible && !gridOptions.isUpdatedTableDesign\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search {{ searchPlaceholder }}\" name=\"search\"\n [formControl]=\"searchValue\" [disabled]=\"isSearchDisabled\"\n (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <div class=\"toolbar\" *ngIf=\"!gridOptions.hideTopToolbar\">\n <section *ngIf=\"!isOnlyView\" class=\"adding\">\n <ul class=\"row-actions\">\n <ng-container *hasPermission=\"getActionName(actionTypes.ADD)\">\n <li *ngIf=\"!gridOptions.addButtonTemplate\">\n <span *ngIf=\"!isTableInEditState\">\n <a (click)=\"onClickAdd()\"\n [ngClass]=\"{'disabled': isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async)}\">\n <span title=\"{{getTooltipText(toolTips.ADD)}}\" class=\"toolbar-icon icon-plus\"\n [ngClass]=\"(isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async))? 'icon-inactive': 'icon-active'\"></span>\n </a>\n </span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"gridOptions.addButtonTemplate\">\n <li>\n <ng-container *ngTemplateOutlet=\"gridOptions.addButtonTemplate;\"></ng-container>\n </li>\n </ng-container>\n </ul>\n <ng-container *ngIf=\"!isLoading$.getValue()\">\n <app-data-table-actions\n *ngIf=\"!(isOnlyView && !isViewActionVisible) && !gridOptions.isRowActionVisible\"\n [gridApi]=\"gridApi\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [gridOptions]=\"gridOptions\" [selectedRow]=\"selectedRow\" [isIconsDisabled]=\"isActionsDisabled\"\n [isEditing]=\"selectedRow?.isEditing\" [isSaving]=\"selectedRow?.isSaving\"\n [isOnlyView]=\"isOnlyView\" [isEditable]=\"isEditable\" (clickAdd)=\"onClickAdd()\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\" [isSaving]=\"isSaving\"\n [isCloneVisible]=\"isCloneVisible\" [isDeleteVisible]=\"!checkDeleteDisabled()\">\n </app-data-table-actions>\n </ng-container>\n </section>\n <ul class=\"row-actions\" *ngIf=\"!isOnlyView || gridOptions.isTopLeftActionsForceDisply\">\n <ng-container *ngFor=\"let action of gridOptions.topLeftAdditionalActions\">\n <li>\n <a *hasPermission=\"getLeftActionName(action.actionName)\"\n [ngClass]=\"{'disabled': action.isDisabled}\" (click)=\"ActionClickHandler(action)\"\n class=\"fontIco\">\n <app-icon *ngIf=\"!action.isClass\" [title]=\"getLeftRightActionText(action)\"\n [name]=\"action.iconOrClassName\"></app-icon>\n <span *ngIf=\"action.isClass\" title=\"{{getLeftRightActionText(action)}}\"\n class=\"toolbar-icon {{ action.iconOrClassName }}\"\n [ngClass]=\"(action.actionName===actionTypes.UPLOAD && action.isDisabled)? 'icon-inactive': ''\"></span>\n </a>\n </li>\n <li *ngIf=\"action.loading$ | async\">\n <mat-spinner class=\"mr-1 action-loader\" [diameter]=\"25\"></mat-spinner>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.leftActionBtnTemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.leftActionBtnTemplate\"></ng-container>\n </ng-container>\n <span class=\"toolbar-spacer\"></span>\n\n <ul class=\"row-actions\">\n\n <ng-container *ngFor=\"let action of gridOptions.topRightActions\">\n <li>\n <a (click)=\"ActionClickHandler(action)\" class=\"fontIco\">\n <app-icon [title]=\"getLeftRightActionText(action)\" [name]=\"action.icon\"></app-icon>\n </a>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.isUpdatedTableDesign\">\n <ng-container *ngIf=\"gridOptions.newTableButtontemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.newTableButtontemplate\"></ng-container>\n </ng-container>\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search\" name=\"search\" [formControl]=\"searchValue\"\n [disabled]=\"isSearchDisabled\" (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <ng-container *ngIf=\"gridOptions.isFilterEnabled\">\n <button mat-stroked-button color=\"primary\" (click)=\"showHideFilterView()\">\n <em class=\"fas fa-filter inactive-filter\" [ngClass]=\"{'active-filter': isFilterApplied }\"></em>\n Filter\n </button>\n <button [title]=\"'Clear'\" (click)=\"clearGlobalFilter()\" mat-stroked-button color=\"primary\">\n <em class=\"fas fa-broom\"></em>\n </button>\n </ng-container>\n </ng-container>\n\n <ul class=\"row-actions\">\n <li *ngIf=\"!gridOptions.hideColumnConfiguration\">\n <a (click)=\"openColumnShowHideDialogue()\" class=\"fontIco\">\n <app-icon [title]=\"getTooltipText(toolTips.COLUMN_CONFIGURATION)\" [name]=\"ICONS.ColumnSelector\">\n </app-icon>\n </a>\n </li>\n </ul>\n\n </div>\n </section>\n</div>\n\n<mat-card class=\"table-card\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\">\n <app-loader *ngIf=\"isLoading$ | async\" class=\"loader-middle\"></app-loader>\n\n <mat-card-content>\n <div class=\"custom-data-table\" [ngClass]=\"{'default-table-height': isLoading$.getValue(), 'overflow-visible': gridOptions.isAccordionTable }\"\n (scroll)=\"onTableScrolled($event)\" #customDataTable [ngStyle]=\"getCustomTableStyle\">\n <table aria-describedby=\"Generic data table\" *ngIf=\"!gridOptions.isAccordionTable\"\n class=\"table apollo-design-new-data-table\" [ngClass]=\"{ '-tree': isTreeGrid }\" mdbTable>\n <thead *ngIf=\"!gridOptions.hideTableHeader\" class=\"sticky-header\">\n <tr *ngIf=\"gridOptions.isUpdatedTableDesign && isFilterView\" class=\"table-first-header\">\n <th *ngIf=\"isRowSelectionEnable\" scope=\"col\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <app-data-col-filter *ngIf=\"isFilterEnable(viewColumn.prop)\" [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\" [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isUpdatedFilterDesign]=\"true\"\n [isClearFilter$]=\"isClearFilter$\" [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n </th>\n </ng-container>\n </tr>\n <tr class=\"table-second-header\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" scope=\"col\" class=\"hasSelection\">\n <mat-checkbox class=\"table-header-checkbox\" (change)=\"$event ? masterToggle() : null\"\n [formControl]=\"masterSelection\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <th scope=\"col\" *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"hasSelection\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns; let i = index\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\" [attr.data-column-prop]=\"viewColumn.prop\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <div [ngClass]=\"getHeaderStyle(i, viewColumn)\">\n <app-data-col-filter\n *ngIf=\"isFilterEnable(viewColumn.prop) && !gridOptions.isUpdatedTableDesign\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isClearFilter$]=\"isClearFilter$\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n\n <span class=\"header\" [ngClass]=\"{'sort-column': isSortColumn(viewColumn)}\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <ng-container *ngIf=\"viewColumn.headerIconClass\">\n <span class=\"header-icon\" [ngClass]=\"viewColumn.headerIconClass\"></span>\n </ng-container>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.DESC\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.ASC\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n <ng-container\n *ngIf=\"gridOptions.isUpdatedTableDesign && isFilteredColumn(viewColumn.prop)\">\n <em class=\"fas fa-filter active-filter\"></em>\n </ng-container>\n <div *ngIf=\"gridOptions.draggable\"\n [ngClass]=\"{ 'header-separator': true, 'col-resize-cursor': viewColumn.draggable }\"\n (mousedown)=\"onSeparatorMouseDown($event, i, viewColumn)\"\n (dblclick)=\"onDoubleClickSeparator(i, viewColumn)\">\n </div>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"!(isOnlyView && !isViewActionVisible) && gridOptions.isRowActionVisible\" scope=\"col\">\n Actions</th>\n <th [ngClass]=\"{'transparent': gridOptions.isUpdatedTableDesign}\"\n *ngIf=\"gridOptions.gridMenuOptions && gridOptions.gridMenuOptions.isMenuEnabled\"></th>\n </tr>\n <ng-container *ngIf=\"gridOptions.hasFixedFirstRow\">\n <tr *ngIf=\"!(isLoading$ | async)\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" class=\"transparent\"></th>\n <th *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"transparent\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th class=\"transparent\">\n <ng-container\n *ngTemplateOutlet=\"viewColumn.fixedFirstRowTemplate; context: { $implicit: { col: viewColumn } }\"></ng-container>\n </th>\n </ng-container>\n </tr>\n </ng-container>\n </thead>\n <tbody *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\" [onAddClick]=\"onAddClick\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\" [search]=\"searchValue.value\"\n [paginationParams]=\"paginationParams\" [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\" [isRowUnchecked]=\"isRowUnchecked\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\">\n </tbody>\n\n </table>\n\n <ng-container *ngIf=\"gridOptions.isAccordionTable\">\n <mat-accordion displayMode=\"flat\" multi class=\"mat-table\" *ngIf=\"gridOptions.isAccordionTable\">\n <mat-expansion-panel *ngIf=\"!gridOptions.hideTableHeader\" class=\"mask-body header-panel\" hideToggle>\n <mat-expansion-panel-header (keydown.Enter)=\"$event.stopImmediatePropagation();\"\n [collapsedHeight]=\"'auto'\" [expandedHeight]=\"'auto'\" class=\"mat-row header-row\">\n <div class=\"mat-checkboxRow\" *ngIf=\"isRowSelectionEnable && !isSingleSelect\"\n (click)=\"$event.stopPropagation()\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [(ngModel)]=\"masterSelection\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </div>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <div *ngIf=\"viewColumn.isVisible\" scope=\"col\" (click)=\"$event.stopPropagation()\"\n class=\"mat-cell d-inline-block\" [ngClass]=\"viewColumn.customCssClass\">\n <app-data-col-filter class=\"filter-column\" *ngIf=\"isFilterEnable(viewColumn.prop)\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n &nbsp;\n <span [ngClass]=\"nonFilterClassName(viewColumn.prop)\" class=\"table .header\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='DownSorted'\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='UpSorted'\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n <ng-container>\n <div *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\"\n [search]=\"searchValue.value\" [paginationParams]=\"paginationParams\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (matExpansionPanelClicked)=\"onExpansionPanelClick($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\"></div>\n\n </ng-container>\n </mat-accordion>\n </ng-container>\n </div>\n <section *ngIf=\"hasPagination && selection\" class=\"pagination\">\n <app-data-pagination [selectionCount]=\"selection.selected.length\" class=\"table-pagination-container\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\" [totalRowCount$]=\"this.searchedRowCount$\"\n [count]=\"count\" [page]=\"paginationParams.currentPage\" [size]=\"paginationParams.pageSize\" [hasDropdownStylePageSize]=\"gridOptions.hasDropdownStylePageSize ?? true\"\n (changePage)=\"onChangePage($event)\">\n </app-data-pagination>\n </section>\n </mat-card-content>\n</mat-card>", styles: [".show-hide{float:right}::-webkit-input-placeholder{color:#000;font-size:11px}::-moz-placeholder{color:#000;font-size:11px}:-ms-input-placeholder{color:#000;font-size:11px}::placeholder{color:#000;font-size:11px}.custom-data-table{margin:0!important;overflow-x:auto;position:relative}.table-card{padding:0}.custom-data-table .table thead th:first-child{border-top-left-radius:4px}.custom-data-table .table thead th:last-child{border-top-right-radius:4px}.custom-data-table .table thead th{padding:.5rem .8rem;text-align:left;white-space:nowrap;font-weight:400;color:#393939;font-size:.9rem;vertical-align:middle;position:relative}.hasSelection{width:20px}.search{margin:1px 0 22px}.sort-icon .material-icons{color:#2371fc;font-size:18px;position:relative;top:4px;left:10px;padding-right:14px}.table-card-hidden{visibility:hidden}.disabled{pointer-events:none!important;color:gray!important}.table-card{margin-bottom:14px;border-radius:4px;border:1px solid rgb(233,233,233);box-shadow:0 4px 16px #0000000a;opacity:1;background-color:#fff}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#0768fd}::ng-deep .filteredColumn>a:hover{color:#0768fd!important}::ng-deep .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#0768fd}:host ::ng-deep app-data-col-filter.filteredColumn>a{color:#0768fd}:host ::ng-deep app-data-col-filter a{color:#999}.table-pagination-container{width:100%;padding:12px 16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid rgb(233,233,233);opacity:1;background-color:#f6f7fb}.text-link-with-ico{color:#0768fd!important}.text-link-with-ico img{position:relative;top:-2px;padding-right:12px}a.text-link-with-ico{margin-right:0}.search-icon{margin-right:5px;position:absolute;top:10px;left:10px;font-size:16px;color:#bbb;z-index:1000}.fontIco{font-size:20px}.mat-checkboxRow{margin-right:6px}.filter-column{color:#ccc;margin-left:2px}.empty-row{width:auto;margin:0;font-size:15px;line-height:5rem;text-align:center}.non-filter-cell{margin-left:-8px}.row-selection-non-filter-cell{margin-left:-2px}.table-header-checkbox{margin-left:0}.toolbar .adding{display:flex;align-items:center}.sticky-header{position:sticky;top:0;z-index:100}.inactive-filter{color:#ccc!important}.active-filter,.header-icon{color:#0768fd!important}.clear-button{padding:4px 15px!important;font-weight:700}.transparent{background-color:#fff;opacity:1}.loader-middle{position:absolute;z-index:99;left:45%;margin-left:-28px;top:40%;margin-top:-28px}.default-table-height{height:300px}.no-records-found{width:auto;font-size:15px;position:absolute;top:40%;left:45%}.sort-column{cursor:pointer}.icon-inactive{filter:grayscale(1)}.header-separator{position:absolute;top:7px;right:0;height:60%;width:3px;background-color:#1c1a1a33;transition:background-color .3s ease;z-index:1}.header-separator:before{content:\"\";position:absolute;inset:0 0 0 -10px}.col-resize-cursor{cursor:col-resize}.header-separator:hover{background-color:#00000080}.drag-column{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px}.header-max-width{max-width:170px;overflow:hidden;text-overflow:ellipsis}.overflow-visible{overflow:visible}:host ::ng-deep .mat-expansion-panel.header-panel{overflow:visible}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i14.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i16.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i16.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i16.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: i17.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i18.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i18.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i18.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i18.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i18.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i18.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i18.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i19.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i19.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i20.DataPaginationComponent, selector: "app-data-pagination", inputs: ["totalRowCount$", "count", "page", "pageSizeOptions", "size", "selectionCount", "numberOfLinks", "hasDropdownStylePageSize"], outputs: ["changePage", "changePageSize"] }, { kind: "component", type: i21.LoaderComponent, selector: "app-loader", inputs: ["colorScheme", "componentSize"] }, { kind: "component", type: i22.DataTableActionsComponent, selector: "app-data-table-actions", inputs: ["canInlineEdit", "isEditable", "isEditing", "isSaving", "isTreeGrid", "isOnlyView", "hasEmptyRow", "isCloneVisible", "isDeleteVisible", "selectedRow", "gridApi", "gridOptions", "isIconsDisabled"], outputs: ["clickAdd"] }, { kind: "component", type: i23.IconComponent, selector: "app-icon", inputs: ["name", "title", "colorScheme", "hasStyleOnHover", "isDisabled"] }, { kind: "component", type: i24.DataTableBodyComponent, selector: "[app-data-table-body]", inputs: ["rows", "viewColumns", "canInlineEdit", "isTreeGrid", "isOnlyView", "isOnlyViewRow", "isDeleteDisabled", "isEditable", "searchedRowCount$", "gridOptions", "search", "paginationParams", "hasEmptyRow", "isEditing", "isSaving", "isRowSelectionEnable", "isCloneVisible", "searchColumns", "selection", "isRowUnchecked", "onAddClick"], outputs: ["clickAction", "clickEdit", "clickEditCancel", "clickEditSave", "clickView", "clickDelete", "clickAdd", "clickRow", "changeExpandCollapse", "complexDetailClicked", "clickClone", "matExpansionPanelClicked", "CheckboxSelect"] }, { kind: "component", type: i25.DataColFilterComponent, selector: "app-data-col-filter", inputs: ["isClearFilter$", "isUpdatedFilterDesign", "columnName", "filterParam", "numberOfTableRefresh", "filterOption"], outputs: ["onFilterClicked"] }, { kind: "directive", type: i26.AuthorizedDirective, selector: "[hasPermission]", inputs: ["hasPermission", "hasPermissionElse"] }, { kind: "pipe", type: i11.AsyncPipe, name: "async" }, { kind: "pipe", type: i27.ColumnFilterPipe, name: "columnFilter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1428
- }
1429
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, decorators: [{
1430
- type: Component,
1431
- args: [{ selector: 'app-data-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
1432
- {
1433
- provide: DATA_TABLE_CONTEXT,
1434
- useExisting: DataTableComponent,
1435
- },
1436
- ], template: "<div>\n <section class=\"actions\">\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible && !gridOptions.isUpdatedTableDesign\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search {{ searchPlaceholder }}\" name=\"search\"\n [formControl]=\"searchValue\" [disabled]=\"isSearchDisabled\"\n (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <div class=\"toolbar\" *ngIf=\"!gridOptions.hideTopToolbar\">\n <section *ngIf=\"!isOnlyView\" class=\"adding\">\n <ul class=\"row-actions\">\n <ng-container *hasPermission=\"getActionName(actionTypes.ADD)\">\n <li *ngIf=\"!gridOptions.addButtonTemplate\">\n <span *ngIf=\"!isTableInEditState\">\n <a (click)=\"onClickAdd()\"\n [ngClass]=\"{'disabled': isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async)}\">\n <span title=\"{{getTooltipText(toolTips.ADD)}}\" class=\"toolbar-icon icon-plus\"\n [ngClass]=\"(isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async))? 'icon-inactive': 'icon-active'\"></span>\n </a>\n </span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"gridOptions.addButtonTemplate\">\n <li>\n <ng-container *ngTemplateOutlet=\"gridOptions.addButtonTemplate;\"></ng-container>\n </li>\n </ng-container>\n </ul>\n <ng-container *ngIf=\"!isLoading$.getValue()\">\n <app-data-table-actions\n *ngIf=\"!(isOnlyView && !isViewActionVisible) && !gridOptions.isRowActionVisible\"\n [gridApi]=\"gridApi\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [gridOptions]=\"gridOptions\" [selectedRow]=\"selectedRow\" [isIconsDisabled]=\"isActionsDisabled\"\n [isEditing]=\"selectedRow?.isEditing\" [isSaving]=\"selectedRow?.isSaving\"\n [isOnlyView]=\"isOnlyView\" [isEditable]=\"isEditable\" (clickAdd)=\"onClickAdd()\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\" [isSaving]=\"isSaving\"\n [isCloneVisible]=\"isCloneVisible\" [isDeleteVisible]=\"!checkDeleteDisabled()\">\n </app-data-table-actions>\n </ng-container>\n </section>\n <ul class=\"row-actions\" *ngIf=\"!isOnlyView || gridOptions.isTopLeftActionsForceDisply\">\n <ng-container *ngFor=\"let action of gridOptions.topLeftAdditionalActions\">\n <li>\n <a *hasPermission=\"getLeftActionName(action.actionName)\"\n [ngClass]=\"{'disabled': action.isDisabled}\" (click)=\"ActionClickHandler(action)\"\n class=\"fontIco\">\n <app-icon *ngIf=\"!action.isClass\" [title]=\"getLeftRightActionText(action)\"\n [name]=\"action.iconOrClassName\"></app-icon>\n <span *ngIf=\"action.isClass\" title=\"{{getLeftRightActionText(action)}}\"\n class=\"toolbar-icon {{ action.iconOrClassName }}\"\n [ngClass]=\"(action.actionName===actionTypes.UPLOAD && action.isDisabled)? 'icon-inactive': ''\"></span>\n </a>\n </li>\n <li *ngIf=\"action.loading$ | async\">\n <mat-spinner class=\"mr-1 action-loader\" [diameter]=\"25\"></mat-spinner>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.leftActionBtnTemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.leftActionBtnTemplate\"></ng-container>\n </ng-container>\n <span class=\"toolbar-spacer\"></span>\n\n <ul class=\"row-actions\">\n\n <ng-container *ngFor=\"let action of gridOptions.topRightActions\">\n <li>\n <a (click)=\"ActionClickHandler(action)\" class=\"fontIco\">\n <app-icon [title]=\"getLeftRightActionText(action)\" [name]=\"action.icon\"></app-icon>\n </a>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.isUpdatedTableDesign\">\n <ng-container *ngIf=\"gridOptions.newTableButtontemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.newTableButtontemplate\"></ng-container>\n </ng-container>\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search\" name=\"search\" [formControl]=\"searchValue\"\n [disabled]=\"isSearchDisabled\" (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <ng-container *ngIf=\"gridOptions.isFilterEnabled\">\n <button mat-stroked-button color=\"primary\" (click)=\"showHideFilterView()\">\n <em class=\"fas fa-filter inactive-filter\" [ngClass]=\"{'active-filter': isFilterApplied }\"></em>\n Filter\n </button>\n <button [title]=\"'Clear'\" (click)=\"clearGlobalFilter()\" mat-stroked-button color=\"primary\">\n <em class=\"fas fa-broom\"></em>\n </button>\n </ng-container>\n </ng-container>\n\n <ul class=\"row-actions\">\n <li *ngIf=\"!gridOptions.hideColumnConfiguration\">\n <a (click)=\"openColumnShowHideDialogue()\" class=\"fontIco\">\n <app-icon [title]=\"getTooltipText(toolTips.COLUMN_CONFIGURATION)\" [name]=\"ICONS.ColumnSelector\">\n </app-icon>\n </a>\n </li>\n </ul>\n\n </div>\n </section>\n</div>\n\n<mat-card class=\"table-card\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\">\n <app-loader *ngIf=\"isLoading$ | async\" class=\"loader-middle\"></app-loader>\n\n <mat-card-content>\n <div class=\"custom-data-table\" [ngClass]=\"{'default-table-height': isLoading$.getValue(), 'overflow-visible': gridOptions.isAccordionTable }\"\n (scroll)=\"onTableScrolled($event)\" #customDataTable [ngStyle]=\"getCustomTableStyle\">\n <table aria-describedby=\"Generic data table\" *ngIf=\"!gridOptions.isAccordionTable\"\n class=\"table apollo-design-new-data-table\" [ngClass]=\"{ '-tree': isTreeGrid }\" mdbTable>\n <thead *ngIf=\"!gridOptions.hideTableHeader\" class=\"sticky-header\">\n <tr *ngIf=\"gridOptions.isUpdatedTableDesign && isFilterView\" class=\"table-first-header\">\n <th *ngIf=\"isRowSelectionEnable\" scope=\"col\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <app-data-col-filter *ngIf=\"isFilterEnable(viewColumn.prop)\" [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\" [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isUpdatedFilterDesign]=\"true\"\n [isClearFilter$]=\"isClearFilter$\" [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n </th>\n </ng-container>\n </tr>\n <tr class=\"table-second-header\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" scope=\"col\" class=\"hasSelection\">\n <mat-checkbox class=\"table-header-checkbox\" (change)=\"$event ? masterToggle() : null\"\n [formControl]=\"masterSelection\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <th scope=\"col\" *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"hasSelection\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns; let i = index\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\" [attr.data-column-prop]=\"viewColumn.prop\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <div [ngClass]=\"getHeaderStyle(i, viewColumn)\">\n <app-data-col-filter\n *ngIf=\"isFilterEnable(viewColumn.prop) && !gridOptions.isUpdatedTableDesign\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isClearFilter$]=\"isClearFilter$\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n\n <span class=\"header\" [ngClass]=\"{'sort-column': isSortColumn(viewColumn)}\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <ng-container *ngIf=\"viewColumn.headerIconClass\">\n <span class=\"header-icon\" [ngClass]=\"viewColumn.headerIconClass\"></span>\n </ng-container>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.DESC\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.ASC\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n <ng-container\n *ngIf=\"gridOptions.isUpdatedTableDesign && isFilteredColumn(viewColumn.prop)\">\n <em class=\"fas fa-filter active-filter\"></em>\n </ng-container>\n <div *ngIf=\"gridOptions.draggable\"\n [ngClass]=\"{ 'header-separator': true, 'col-resize-cursor': viewColumn.draggable }\"\n (mousedown)=\"onSeparatorMouseDown($event, i, viewColumn)\"\n (dblclick)=\"onDoubleClickSeparator(i, viewColumn)\">\n </div>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"!(isOnlyView && !isViewActionVisible) && gridOptions.isRowActionVisible\" scope=\"col\">\n Actions</th>\n <th [ngClass]=\"{'transparent': gridOptions.isUpdatedTableDesign}\"\n *ngIf=\"gridOptions.gridMenuOptions && gridOptions.gridMenuOptions.isMenuEnabled\"></th>\n </tr>\n <ng-container *ngIf=\"gridOptions.hasFixedFirstRow\">\n <tr *ngIf=\"!(isLoading$ | async)\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" class=\"transparent\"></th>\n <th *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"transparent\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th class=\"transparent\">\n <ng-container\n *ngTemplateOutlet=\"viewColumn.fixedFirstRowTemplate; context: { $implicit: { col: viewColumn } }\"></ng-container>\n </th>\n </ng-container>\n </tr>\n </ng-container>\n </thead>\n <tbody *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\" [onAddClick]=\"onAddClick\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\" [search]=\"searchValue.value\"\n [paginationParams]=\"paginationParams\" [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\" [isRowUnchecked]=\"isRowUnchecked\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\">\n </tbody>\n\n </table>\n\n <ng-container *ngIf=\"gridOptions.isAccordionTable\">\n <mat-accordion displayMode=\"flat\" multi class=\"mat-table\" *ngIf=\"gridOptions.isAccordionTable\">\n <mat-expansion-panel *ngIf=\"!gridOptions.hideTableHeader\" class=\"mask-body header-panel\" hideToggle>\n <mat-expansion-panel-header (keydown.Enter)=\"$event.stopImmediatePropagation();\"\n [collapsedHeight]=\"'auto'\" [expandedHeight]=\"'auto'\" class=\"mat-row header-row\">\n <div class=\"mat-checkboxRow\" *ngIf=\"isRowSelectionEnable && !isSingleSelect\"\n (click)=\"$event.stopPropagation()\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [(ngModel)]=\"masterSelection\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </div>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <div *ngIf=\"viewColumn.isVisible\" scope=\"col\" (click)=\"$event.stopPropagation()\"\n class=\"mat-cell d-inline-block\" [ngClass]=\"viewColumn.customCssClass\">\n <app-data-col-filter class=\"filter-column\" *ngIf=\"isFilterEnable(viewColumn.prop)\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n &nbsp;\n <span [ngClass]=\"nonFilterClassName(viewColumn.prop)\" class=\"table .header\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='DownSorted'\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='UpSorted'\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n <ng-container>\n <div *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\"\n [search]=\"searchValue.value\" [paginationParams]=\"paginationParams\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (matExpansionPanelClicked)=\"onExpansionPanelClick($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\"></div>\n\n </ng-container>\n </mat-accordion>\n </ng-container>\n </div>\n <section *ngIf=\"hasPagination && selection\" class=\"pagination\">\n <app-data-pagination [selectionCount]=\"selection.selected.length\" class=\"table-pagination-container\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\" [totalRowCount$]=\"this.searchedRowCount$\"\n [count]=\"count\" [page]=\"paginationParams.currentPage\" [size]=\"paginationParams.pageSize\" [hasDropdownStylePageSize]=\"gridOptions.hasDropdownStylePageSize ?? true\"\n (changePage)=\"onChangePage($event)\">\n </app-data-pagination>\n </section>\n </mat-card-content>\n</mat-card>", styles: [".show-hide{float:right}::-webkit-input-placeholder{color:#000;font-size:11px}::-moz-placeholder{color:#000;font-size:11px}:-ms-input-placeholder{color:#000;font-size:11px}::placeholder{color:#000;font-size:11px}.custom-data-table{margin:0!important;overflow-x:auto;position:relative}.table-card{padding:0}.custom-data-table .table thead th:first-child{border-top-left-radius:4px}.custom-data-table .table thead th:last-child{border-top-right-radius:4px}.custom-data-table .table thead th{padding:.5rem .8rem;text-align:left;white-space:nowrap;font-weight:400;color:#393939;font-size:.9rem;vertical-align:middle;position:relative}.hasSelection{width:20px}.search{margin:1px 0 22px}.sort-icon .material-icons{color:#2371fc;font-size:18px;position:relative;top:4px;left:10px;padding-right:14px}.table-card-hidden{visibility:hidden}.disabled{pointer-events:none!important;color:gray!important}.table-card{margin-bottom:14px;border-radius:4px;border:1px solid rgb(233,233,233);box-shadow:0 4px 16px #0000000a;opacity:1;background-color:#fff}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#0768fd}::ng-deep .filteredColumn>a:hover{color:#0768fd!important}::ng-deep .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#0768fd}:host ::ng-deep app-data-col-filter.filteredColumn>a{color:#0768fd}:host ::ng-deep app-data-col-filter a{color:#999}.table-pagination-container{width:100%;padding:12px 16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid rgb(233,233,233);opacity:1;background-color:#f6f7fb}.text-link-with-ico{color:#0768fd!important}.text-link-with-ico img{position:relative;top:-2px;padding-right:12px}a.text-link-with-ico{margin-right:0}.search-icon{margin-right:5px;position:absolute;top:10px;left:10px;font-size:16px;color:#bbb;z-index:1000}.fontIco{font-size:20px}.mat-checkboxRow{margin-right:6px}.filter-column{color:#ccc;margin-left:2px}.empty-row{width:auto;margin:0;font-size:15px;line-height:5rem;text-align:center}.non-filter-cell{margin-left:-8px}.row-selection-non-filter-cell{margin-left:-2px}.table-header-checkbox{margin-left:0}.toolbar .adding{display:flex;align-items:center}.sticky-header{position:sticky;top:0;z-index:100}.inactive-filter{color:#ccc!important}.active-filter,.header-icon{color:#0768fd!important}.clear-button{padding:4px 15px!important;font-weight:700}.transparent{background-color:#fff;opacity:1}.loader-middle{position:absolute;z-index:99;left:45%;margin-left:-28px;top:40%;margin-top:-28px}.default-table-height{height:300px}.no-records-found{width:auto;font-size:15px;position:absolute;top:40%;left:45%}.sort-column{cursor:pointer}.icon-inactive{filter:grayscale(1)}.header-separator{position:absolute;top:7px;right:0;height:60%;width:3px;background-color:#1c1a1a33;transition:background-color .3s ease;z-index:1}.header-separator:before{content:\"\";position:absolute;inset:0 0 0 -10px}.col-resize-cursor{cursor:col-resize}.header-separator:hover{background-color:#00000080}.drag-column{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px}.header-max-width{max-width:170px;overflow:hidden;text-overflow:ellipsis}.overflow-visible{overflow:visible}:host ::ng-deep .mat-expansion-panel.header-panel{overflow:visible}\n"] }]
1437
- }], ctorParameters: () => [{ type: i1.DataTableService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.MatDialog }, { type: i0.ChangeDetectorRef }, { type: i4.SnackbarService }, { type: i5.UserManagementService }, { type: i6.ColumnFilterPipe }, { type: i7.SearchPipe }, { type: i8.LocalStorageService }, { type: i3.MatDialog }, { type: i9.FormService }, { type: i10.DataTableContextService }], propDecorators: { setDataTableBody: [{
1438
- type: ViewChild,
1439
- args: [DataTableBodyComponent, { static: false }]
1440
- }], defaultRowValues: [{
1441
- type: Input
1442
- }], columns: [{
1443
- type: Input
1444
- }], getListFn: [{
1445
- type: Input
1446
- }], postItemFn: [{
1447
- type: Input
1448
- }], putItemFn: [{
1449
- type: Input
1450
- }], deleteItemFn: [{
1451
- type: Input
1452
- }], header: [{
1453
- type: Input
1454
- }], description: [{
1455
- type: Input
1456
- }], actionAddTitle: [{
1457
- type: Input
1458
- }], isIdColVisible: [{
1459
- type: Input
1460
- }], hasPagination: [{
1461
- type: Input
1462
- }], isOnlyView: [{
1463
- type: Input
1464
- }], isOnlyViewRow: [{
1465
- type: Input
1466
- }], isDeleteDisabled: [{
1467
- type: Input
1468
- }], isEditable: [{
1469
- type: Input
1470
- }], isCloneVisible: [{
1471
- type: Input
1472
- }], isLazyInitialization: [{
1473
- type: Input
1474
- }], objectName: [{
1475
- type: Input
1476
- }], gridOptions: [{
1477
- type: Input
1478
- }], isRowSelectionEnable: [{
1479
- type: Input
1480
- }], beforeSaveFn: [{
1481
- type: Input
1482
- }], onBeforeEdit: [{
1483
- type: Input
1484
- }], onAddClick: [{
1485
- type: Input
1486
- }], isRowUnchecked: [{
1487
- type: Input
1488
- }], isSaveDataLocal: [{
1489
- type: Input
1490
- }], scrollPosition: [{
1491
- type: Input
1492
- }], isTreeGrid: [{
1493
- type: Input
1494
- }], initialPage: [{
1495
- type: Input
1496
- }], changeLocalData: [{
1497
- type: Output
1498
- }], actionClick: [{
1499
- type: Output
1500
- }], onInitCompleted: [{
1501
- type: Output
1502
- }], onComplexDetailClicked: [{
1503
- type: Output
1504
- }], onEditClicked: [{
1505
- type: Output
1506
- }], onAddClicked: [{
1507
- type: Output
1508
- }], onRowClicked: [{
1509
- type: Output
1510
- }], onPageChanged: [{
1511
- type: Output
1512
- }], matExpansionPanelClicked: [{
1513
- type: Output
1514
- }], onUpdateCompleted: [{
1515
- type: Output
1516
- }], onDeleteCompleted: [{
1517
- type: Output
1518
- }], onScrolled: [{
1519
- type: Output
1520
- }], CheckboxSelect: [{
1521
- type: Output
1522
- }], isTableDataLoad: [{
1523
- type: Output
1524
- }], deleteModal: [{
1525
- type: ViewChild,
1526
- args: ['deleteModal', { read: TemplateRef, static: true }]
1527
- }], customDataTable: [{
1528
- type: ViewChild,
1529
- args: ['customDataTable']
1530
- }], sliderTemplate: [{
1531
- type: ViewChild,
1532
- args: ['sliderTemplate']
1533
- }] } });
1534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL21vZHVsZXMvdWkta2l0L2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9tb2R1bGVzL3VpLWtpdC9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDtBQUN4RCwwREFBMEQ7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFJcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUdBQXlHLENBQUM7QUFJdEosT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvRCxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztB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QkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBR1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxXQUFXO3NCQUExQixLQUFLO2dCQUVXLGVBQWU7c0JBQS9CLE1BQU07Z0JBQ1UsV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLHNCQUFzQjtzQkFBdEMsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFlBQVk7c0JBQTVCLE1BQU07Z0JBQ1UsWUFBWTtzQkFBNUIsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLHdCQUF3QjtzQkFBeEMsTUFBTTtnQkFDVSxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBQ1UsaUJBQWlCO3NCQUFqQyxNQUFNO2dCQUNVLFVBQVU7c0JBQTFCLE1BQU07Z0JBQ1UsY0FBYztzQkFBOUIsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQU9BLFdBQVc7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUd0RCxlQUFlO3NCQURyQixTQUFTO3VCQUFDLGlCQUFpQjtnQkFHckIsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29ydC1jbGFzcy1tZW1iZXJzL3NvcnQtY2xhc3MtbWVtYmVycyAqL1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9jb3JlL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvY29yZS9zZXJ2aWNlcy91c2VyLW1hbmFnZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25UeXBlc0VudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvYWN0aW9uLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbkVudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvc29ydC1kaXJlY3Rpb24uZW51bSc7XG5pbXBvcnQgeyBTb3VyY2VUeXBlc0VudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvc291cmNlLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgVG9vbFRpcHNQcm9wLCB0b29sdGlwc0RlZmF1bHRWYWx1ZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9lbnVtcy90b29sdGlwcy1wcm9wLmVudW0nO1xuaW1wb3J0IHsgQ29tbW9uQ29uZmlybU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnaWRwLWFwcHMtc2hhcmVkLXVpL21vZHVsZXMvdWkta2l0L2NvbXBvbmVudHMvbW9kYWxzL2NvbW1vbi1jb25maXJtLW1vZGFsL2NvbW1vbi1jb25maXJtLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUm93U2VsZWN0aW9uSW5mbyB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9pbnRlcmZhY2VzL3Jvdy1zZWxlY3Rpb24taW5mby5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uRmlsdGVyUGlwZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9waXBlcy9jb2x1bW4tZmlsdGVyLnBpcGUnO1xuaW1wb3J0IHsgU2VhcmNoUGlwZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9waXBlcy9zZWFyY2gucGlwZSc7XG5pbXBvcnQgeyBjbG9uZSwgaXNGdW5jdGlvbiwgaXNVbmRlZmluZWQsIG1lcmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENoYW5nZVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3VpLWtpdC9jb21wb25lbnRzL2RhdGEtdGFibGUvY29uc3RhbnRzL2NoYW5nZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2RhdGEtdGFibGUuY29uc3RhbnRzJztcbmltcG9ydCB7IENvbHVtbkRpc2FibGVNb2RlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbHVtbi1kaXNhYmxlLW1vZGUuZW51bSc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbHVtbi10eXBlcy5lbnVtJztcbmltcG9ydCB7IEZvcm1UeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2Zvcm0tdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2ljb25zLmVudW0nO1xuaW1wb3J0IHsgU25hY2tiYXJUeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL3NuYWNrYmFyLmVudW0nO1xuaW1wb3J0IHsgSUZpbHRlclBhcmFtLCBJTGlzdFJlcVBhcmFtc0FwaSwgSUxpc3RSZXNBcGkgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2FwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgR3JpZE9wdGlvbnMsXG4gIElDaGVja2VkUm93RXZlbnQsXG4gIElDbGlja2VkRXZlbnREYXRhLFxuICBJRGF0YVRhYmxlQWN0aW9uLFxuICBJRGF0YVRhYmxlQ2hhbmdlTG9jYWxEYXRhRXZlbnQsXG4gIElEYXRhVGFibGVDb2x1bW4sXG4gIElEYXRhVGFibGVFeHBhbmRDb2xsYXBzZUV2ZW50LFxuICBJRGF0YVRhYmxlUm93LFxuICBJRGF0YVRhYmxlUm93RXZlbnQsXG4gIElEYXRhVGFibGVSb3dTYXZlRXZlbnQsXG4gIElSb3dEYXRhLFxuICBJVG9wUmlnaHRBY3Rpb24sXG59IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZGF0YS10YWJsZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUtleVZhbHVlLCBJUGFnaW5hdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZ2VuZXJpYy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2RhdGEtdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IERlbGV0ZUl0ZW1GbiwgR2V0TGlzdEZuLCBQb3N0SXRlbUZuLCBQdXRJdGVtRm4gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IERlbGV0ZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9kYWxzL2RlbGV0ZS1tb2RhbC9kZWxldGUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbHRlck1hbmFnZXIgfSBmcm9tICcuLi9hcGktY2xhc3Nlcy9maWx0ZXItbWFuYWdlcic7XG5pbXBvcnQgeyBHcmlkQXBpIH0gZnJvbSAnLi4vYXBpLWNsYXNzZXMvZ3JpZC1hcGknO1xuaW1wb3J0IHsgQ09MVU1OX0lEIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbHVtbi1pZCc7XG5pbXBvcnQgeyBST1cgfSBmcm9tICcuLi9jb25zdGFudHMvcm93JztcbmltcG9ydCB7IERhdGFDb2xEaXNwQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0YS1jb2wtZGlzcC9kYXRhLWNvbC1kaXNwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vZGF0YS10YWJsZS1ib2R5L2RhdGEtdGFibGUtYm9keS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSURhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS10YWJsZS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERBVEFfVEFCTEVfQ09OVEVYVCwgRGF0YVRhYmxlQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLXRhYmxlLWNvbnRleHQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsUG9zaXRpb24ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgaXNUcnVzdGVkOiBib29sZWFuO1xuICBjdXJyZW50U2Nyb2xsUG9zaXRpb246IFNjcm9sbFBvc2l0aW9uO1xuICBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRBX1RBQkxFX0NPTlRFWFQsXG4gICAgICB1c2VFeGlzdGluZzogRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJRGF0YVRhYmxlQ29tcG9uZW50IHtcbiAgLy8gSW5saW5lIGVkaXQgc2V0dGluZ3NcbiAgcHVibGljIGdldCBjYW5JbmxpbmVFZGl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUVkaXQ7XG4gIH1cblxuICBAVmlld0NoaWxkKERhdGFUYWJsZUJvZHlDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgc2V0IHNldERhdGFUYWJsZUJvZHkodGFibGVCb2R5OiBEYXRhVGFibGVCb2R5Q29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRhVGFibGVCb2R5ID0gdGFibGVCb2R5O1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5TaG93aGlkZVN0b3JhZ2VrZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5TaG93aGlkZVN0b3JhZ2VrZXk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93U2F2ZUNvbHVtblZpc2liaWxpdHlTZXR0aW5ncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5hbGxvd1NhdmVDb2x1bW5WaXNpYmlsaXR5U2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFkZEFjdGlvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ3JpZE9wdGlvbnMuYWN0aW9uQWRkVGl0bGV9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaWV3QWN0aW9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5pc1Jvd0xldmVsVmlld0FjdGlvblZpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuc2VhcmNoYm94UGxhY2Vob2xkZXIgPyB0aGlzLmdyaWRPcHRpb25zLnNlYXJjaGJveFBsYWNlaG9sZGVyIDogdGhpcy5oZWFkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVGFibGVJbkVkaXRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRpbmcgfHwgdGhpcy5oYXNFbXB0eVJvdztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGFwaVJlcVBhcmFtcygpOiBJTGlzdFJlcVBhcmFtc0FwaSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBpdGVtc09uUGFnZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGZpbHRlclBhcmFtczogdGhpcy5wb3B1bGF0ZUZpbHRlclBhcmFtcygpLFxuICAgICAgc2VhcmNoVGV4dDogdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0U29ydFBhcmFtcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGdldFNvcnRQYXJhbXMoKTogeyBzb3J0Qnk6IHN0cmluZzsgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbkVudW0gfSB7XG4gICAgY29uc3QgcGFybWFzID0gW107XG4gICAgT2JqZWN0LmtleXModGhpcy5zb3J0ZWRDb2x1bW4pLmZvckVhY2goKHgpID0+IHtcbiAgICAgIHBhcm1hcy5wdXNoKHsgc29ydEJ5OiB4LCBzb3J0RGlyZWN0aW9uOiB0aGlzLnNvcnRlZENvbHVtblt4XSB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFybWFzLmxlbmd0aCA/IHBhcm1hc1swXSA6IHt9O1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IElDT05TOiB0eXBlb2YgSWNvbnMgPSBJY29ucztcbiAgcHVibGljIHJlYWRvbmx5IHNvcnREaXJlY3Rpb25FbnVtOiB0eXBlb2YgU29ydERpcmVjdGlvbkVudW0gPSBTb3J0RGlyZWN0aW9uRW51bTtcbiAgcHVibGljIHJlYWRvbmx5IHRvb2xUaXBzOiB0eXBlb2YgVG9vbFRpcHNQcm9wID0gVG9vbFRpcHNQcm9wO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uVHlwZXM6IHR5cGVvZiBBY3Rpb25UeXBlc0VudW0gPSBBY3Rpb25UeXBlc0VudW07XG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX1BBR0VfU0laRTogbnVtYmVyID0gRGF0YVRhYmxlQ29uc3RhbnRzLkRFRkFVTFRfUEFHRV9TSVpFO1xuICBwdWJsaWMgcmVhZG9ubHkgREVGQVVMVF9JTklUX1BBR0U6IG51bWJlciA9IERhdGFUYWJsZUNvbnN0YW50cy5ERUZBVUxUX0lOSVRfUEFHRTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlybWF0aW9uTXNnUGFnaW5hdGlvbjogc3RyaW5nID0gYFNlbGVjdGVkIGNoZWNrYm94IHdpbGwgYmUgbG9zdCBgO1xuICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdFJvd1ZhbHVlczogSUtleVZhbHVlID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIEBJbnB1dCgpIHB1YmxpYyBnZXRMaXN0Rm46IEdldExpc3RGbjtcbiAgQElucHV0KCkgcHVibGljIHBvc3RJdGVtRm46IFBvc3RJdGVtRm47XG4gIEBJbnB1dCgpIHB1YmxpYyBwdXRJdGVtRm46IFB1dEl0ZW1GbjtcbiAgQElucHV0KCkgcHVibGljIGRlbGV0ZUl0ZW1GbjogRGVsZXRlSXRlbUZuO1xuICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25BZGRUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgaXNJZENvbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGhhc1BhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNPbmx5VmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNPbmx5Vmlld1Jvdz86IChyb3c6IElEYXRhVGFibGVSb3cpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBpc0RlbGV0ZURpc2FibGVkPzogKHJvdzogSURhdGFUYWJsZVJvdykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzRWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNDbG9uZVZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNMYXp5SW5pdGlhbGl6YXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIG9iamVjdE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucztcbiAgQElucHV0KCkgcHVibGljIGlzUm93U2VsZWN0aW9uRW5hYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBiZWZvcmVTYXZlRm4/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBvbkJlZm9yZUVkaXQ/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIG9uQWRkQ2xpY2s/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzUm93VW5jaGVja2VkPzogKHJvdzogSURhdGFUYWJsZVJvdykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzU2F2ZURhdGFMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsUG9zaXRpb246IFNjcm9sbFBvc2l0aW9uO1xuXG4gIC8vIFRyZWUgZ3JpZCBzZXR0aW5nc1xuICBASW5wdXQoKSBwdWJsaWMgaXNUcmVlR3JpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBpbml0aWFsUGFnZTogbnVtYmVyO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlTG9jYWxEYXRhOiBFdmVudEVtaXR0ZXI8SURhdGFUYWJsZUNoYW5nZUxvY2FsRGF0YUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBhY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVBY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uSW5pdENvbXBsZXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25Db21wbGV4RGV0YWlsQ2xpY2tlZDogRXZlbnRFbWl0dGVyPElDbGlja2VkRXZlbnREYXRhPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNsaWNrZWRFdmVudERhdGE+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25FZGl0Q2xpY2tlZDogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvbkFkZENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uUm93Q2xpY2tlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25QYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgbWF0RXhwYW5zaW9uUGFuZWxDbGlja2VkOiBFdmVudEVtaXR0ZXI8SURhdGFUYWJsZVJvd0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvblVwZGF0ZUNvbXBsZXRlZDogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25EZWxldGVDb21wbGV0ZWQ6IEV2ZW50RW1pdHRlcjxJRGF0YVRhYmxlUm93RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uU2Nyb2xsZWQ6IEV2ZW50RW1pdHRlcjxTY3JvbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcHVibGljIENoZWNrYm94U2VsZWN0OiBFdmVudEVtaXR0ZXI8SVJvd1NlbGVjdGlvbkluZm8+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGlzVGFibGVEYXRhTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcHVibGljIHNlYXJjaFZhbHVlOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBwdWJsaWMgc2VhcmNoQ29sdW1uczogSURhdGFUYWJsZUNvbHVtbltdO1xuICBwdWJsaWMgaXNTZWFyY2hEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc2VsZWN0ZWRSb3c6IElEYXRhVGFibGVSb3c7XG4gIHB1YmxpYyBmaWx0ZXJlZFJvd3M6IElEYXRhVGFibGVSb3dbXTtcbiAgQFZpZXdDaGlsZCgnZGVsZXRlTW9kYWwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIGRlbGV0ZU1vZGFsOiBUZW1wbGF0ZVJlZjxEZWxldGVNb2RhbENvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbURhdGFUYWJsZScpXG4gIHB1YmxpYyBjdXN0b21EYXRhVGFibGU6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdzbGlkZXJUZW1wbGF0ZScpXG4gIHB1YmxpYyBzbGlkZXJUZW1wbGF0ZTogVmlld0NvbnRhaW5lclJlZjtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZVR5cGVzOiB0eXBlb2YgU291cmNlVHlwZXNFbnVtID0gU291cmNlVHlwZXNFbnVtO1xuICBwdWJsaWMgZGF0YVRhYmxlQm9keTogRGF0YVRhYmxlQm9keUNvbXBvbmVudDtcbiAgcHVibGljIGdyaWRBcGk6IEdyaWRBcGk7XG4gIHB1YmxpYyBtYXN0ZXJTZWxlY3Rpb246IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlKTtcbiAgcHVibGljIHBhZ2luYXRpb25QYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zID0ge1xuICAgIGN1cnJlbnRQYWdlOiB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFLFxuICAgIHBhZ2VTaXplOiB0aGlzLkRFRkFVTFRfUEFHRV9TSVpFLFxuICB9O1xuICBwdWJsaWMgc2VhcmNoZWRSb3dDb3VudCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHB1YmxpYyBpc0NsZWFyRmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHB1YmxpYyBpc0ZpbHRlclZpZXcgPSBmYWxzZTtcbiAgcHVibGljIHZpZXdDb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIHB1YmxpYyByb3dzOiBJRGF0YVRhYmxlUm93W107XG4gIHB1YmxpYyBleGNsdWRlZFJvd3M6IElEYXRhVGFibGVSb3dbXSA9IFtdO1xuICBwdWJsaWMgc29ydGVkQ29sdW1uID0ge307XG4gIHB1YmxpYyBjb3VudDogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgZmlsdGVyTWFuYWdlcjogRmlsdGVyTWFuYWdlcjtcblxuICBwdWJsaWMgaXNMb2FkaW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBoYXNFbXB0eVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNFZGl0aW5nID0gZmFsc2U7XG4gIHB1YmxpYyBpc1NhdmluZyA9IGZhbHNlO1xuXG4gIHB1YmxpYyByb3dUb0RlbGV0ZTogSURhdGFUYWJsZVJvdztcbiAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8SURhdGFUYWJsZVJvdz47XG5cbiAgcHVibGljIG1hcCA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgbnVtYmVyT2ZUYWJsZVJlZnJlc2ggPSAwO1xuICBwcml2YXRlIGRlZmF1bHRTb3J0ZWRDb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgb3JpZ2luYWxVbnNvcnRlZFJvd3M6IElEYXRhVGFibGVSb3dbXTtcbiAgcHJpdmF0ZSBjbGVhclN1YnMkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgdG90YWxJdGVtczogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIHN0YXJ0WDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlc2l6aW5nVGg6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXBvbGxvRGF0YVRhYmxlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc2l6aW5nVGQ6IE5vZGVMaXN0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2xpY2tUaW1lb3V0OiBhbnk7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0R3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zID0ge1xuICAgIGFkZElkQ29sdW1uOiB0cnVlLFxuICAgIGFjdGlvbkFkZFRpdGxlOiAnJyxcbiAgICBhbGxvd1NhdmVDb2x1bW5WaXNpYmlsaXR5U2V0dGluZ3M6IGZhbHNlLFxuICAgIGlzUm93TGV2ZWxWaWV3QWN0aW9uVmlzaWJsZTogdHJ1ZSxcbiAgICBpc09ubHlWaWV3OiBmYWxzZSxcbiAgICBpc1Jvd1NlbGVjdGlvbkVuYWJsZTogZmFsc2UsXG4gICAgaWRQcm9wZXJ0eTogQ09MVU1OX0lELlBST1AsXG4gICAgaXNDbGllbnRTaWRlUGFnaW5hdGlvbjogdHJ1ZSxcbiAgICBjYW5JbmxpbmVBZGQ6IHRydWUsXG4gICAgY2FuSW5saW5lRWRpdDogdHJ1ZSxcbiAgICBpc1NhdmVEYXRhTG9jYWw6IGZhbHNlLFxuICAgIGlzU2VhcmNoQm94VmlzaWJsZTogdHJ1ZSxcbiAgICBpc0ZpbHRlckVuYWJsZWQ6IGZhbHNlLFxuICAgIGZpbHRlcmFibGVDb2x1bW5zOiBbXSxcbiAgICBkZWZhdWx0U29ydFByb3BlcnR5OiB7fSxcbiAgICBjbG9uZU9wdGlvbnM6IHtcbiAgICAgIGNvcHlPZkNsb25hYmxlUHJvcGVydGllczogW10sXG4gICAgICBlbXB0eVZhbHVlUHJvcGVydGllczogW10sXG4gICAgfSxcbiAgICBzZWFyY2hhYmxlUHJvcGVydGllczogW10sXG4gICAgc29ydGFibGVQcm9wZXJ0aWVzOiBbXSxcbiAgICBpc1Jvd0FjdGlvblZpc2libGU6IHRydWUsXG4gICAgdG9wUmlnaHRBY3Rpb25zOiBbXSxcbiAgICBkZWxldGVPcHRpb25zOiB7fSxcbiAgICBzZWFyY2hib3hQbGFjZWhvbGRlcjogdGhpcy5oZWFkZXIsXG4gICAgcmVmcmVzaE9uQWRkOiB0cnVlLFxuICAgIHRvcExlZnRBZGRpdGlvbmFsQWN0aW9uczogW10sXG4gICAgaXNTb3J0RW5hYmxlZDogZmFsc2UsXG4gICAgZGlzYWJsZUljb25zOiB7XG4gICAgICBhZGQ6IGZhbHNlLFxuICAgICAgZWRpdDogZmFsc2UsXG4gICAgICBkZWxldGU6IGZhbHNlLFxuICAgICAgY2xvbmU6IGZhbHNlLFxuICAgICAgYWRkJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICBlZGl0JDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICBkZWxldGUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGNvcHkkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICB9LFxuICAgIGdyaWRNZW51T3B0aW9uczoge1xuICAgICAgaXNNZW51RW5hYmxlZDogZmFsc2UsXG4gICAgICBtZW51SXRlbXM6IFtdLFxuICAgIH0sXG4gICAgYWN0aW9uTG9hZGluZyQ6IHtcbiAgICAgIGNvcHkkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGVkaXQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGRlbGV0ZSQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGFUYWJsZVNlcnZpY2U6IERhdGFUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzbmFja2JhclNlcnZpY2U6IFNuYWNrYmFyU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJNYW5hZ2VtZW50U2VydmljZTogVXNlck1hbmFnZW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsdGVyUGlwZTogQ29sdW1uRmlsdGVyUGlwZSxcbiAgICBwcml2YXRlIHNlYXJjaFBpcGU6IFNlYXJjaFBpcGUsXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVRhYmxlQ29udGV4dDogRGF0YVRhYmxlQ29udGV4dFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJNYW5hZ2VyID0gbmV3IEZpbHRlck1hbmFnZXIoKTtcbiAgICB0aGlzLmdyaWRBcGkgPSBuZXcgR3JpZEFwaSh0aGlzLCB0aGlzLmZvcm1TZXJ2aWNlKTtcbiAgICB0aGlzLmRhdGFUYWJsZUNvbnRleHQuc2V0RGF0YVRhYmxlQ29tcG9uZW50KHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRTZWxlY3RlZFJvd3MoKTogSURhdGFUYWJsZVJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZERhdGFSb3codGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRBbGxDaGVja2VkUm93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3Rpb25zRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ2V0Um93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkRGF0YVJvdyh0aGlzLnJvd3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRDdXN0b21UYWJsZVN0eWxlKCk6IElLZXlWYWx1ZSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNJbm5lclNjcm9sbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tVGFibGVTdHlsZSA/IHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tVGFibGVTdHlsZSA6IHsgaGVpZ2h0OiAnMzB2aCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIG9uVGFibGVTY3JvbGxlZChlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gdGhpcy5jdXN0b21EYXRhVGFibGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBldmVudDogU2Nyb2xsRXZlbnQgPSB7XG4gICAgICAuLi5lLFxuICAgICAgY3VycmVudEVsZW1lbnQ6IHRoaXMuY3VzdG9tRGF0YVRhYmxlLFxuICAgICAgY3VycmVudFNjcm9sbFBvc2l0aW9uOiB7IHg6IGh0bWxFbGVtZW50LnNjcm9sbExlZnQsIHk6IGh0bWxFbGVtZW50LnNjcm9sbFRvcCB9LFxuICAgIH07XG4gICAgdGhpcy5vblNjcm9sbGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVNjcm9sbFBvc2l0aW9uKHBvc2l0aW9uOiBTY3JvbGxQb3NpdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gdGhpcy5jdXN0b21EYXRhVGFibGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBodG1sRWxlbWVudC5zY3JvbGwocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF6eUluaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnNlYXJjaFRhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzRGlzYWJsZWRNYWluQWN0aW9uKGFjdGlvblByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmRpc2FibGVJY29ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRpc2FibGVJY29uc1thY3Rpb25Qcm9wXTtcbiAgfVxuXG4gIHB1YmxpYyBub25GaWx0ZXJDbGFzc05hbWUoY29sdW1uUHJvcDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNGaWx0ZXJFbmFibGUoY29sdW1uUHJvcCkgJiYgdGhpcy5pc1Jvd1NlbGVjdGlvbkVuYWJsZSkge1xuICAgICAgcmV0dXJuICdyb3ctc2VsZWN0aW9uLW5vbi1maWx0ZXItY2VsbCc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0ZpbHRlckVuYWJsZShjb2x1bW5Qcm9wKSkge1xuICAgICAgcmV0dXJuICdub24tZmlsdGVyLWNlbGwnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJFbmFibGUoY29sdW1uUHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNUYWJsZUluRWRpdFN0YXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmlzRmlsdGVyRW5hYmxlZCAmJiAoIXRoaXMuZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZUNvbHVtbnMubGVuZ3RoIHx8IHRoaXMuaXNGaWx0ZXJhYmxlQ29sdW1uKGNvbHVtblByb3ApKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlcmFibGVDb2x1bW4oY29sdW1uUHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZUNvbHVtbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBjb2x1bW5Qcm9wKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmlsdGVyQXBwbGllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlclBhcmFtcygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5vbkRpc2FibGVkUm93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbiAmJiBpc0Z1bmN0aW9uKHRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKSkge1xuICAgICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gIXRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKHJvdykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlyZUluaXRDb21wbGV0ZWQoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxQb3NpdGlvbikge1xuICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSB0aGlzLmN1c3RvbURhdGFUYWJsZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaHRtbEVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxQb3NpdGlvbi55O1xuICAgICAgaHRtbEVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsUG9zaXRpb24ueDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2hlY2tEZWxldGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmlzRGVsZXRlRGlzYWJsZWQpICYmICFpc1VuZGVmaW5lZCh0aGlzLnNlbGVjdGVkUm93KSkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNEZWxldGVEaXNhYmxlZCh0aGlzLnNlbGVjdGVkUm93KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZWxldGVEaXNhYmxlZCAmJiB0eXBlb2YgdGhpcy5pc0RlbGV0ZURpc2FibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMubm9uRGlzYWJsZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlICYmIHRoaXMuZXhjbHVkZWRSb3dzLmxlbmd0aCA9PT0gMCkgfHwgdGhpcy50b3RhbEl0ZW1zID09PSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaXNTb3J0Q29sdW1uKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5ncmlkT3B0aW9ucy5zb3J0YWJsZVByb3BlcnRpZXMgJiYgdGhpcy5ncmlkT3B0aW9ucy5zb3J0YWJsZVByb3BlcnRpZXMuZmluZCgoeCkgPT4geCA9PT0gdmlld0NvbHVtbi5wcm9wKSk7XG4gIH1cblxuICBwdWJsaWMgb3BlbkNvbHVtblNob3dIaWRlRGlhbG9ndWUoKTogdm9pZCB7XG4gICAgbGV0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcbiAgICBkaWFsb2dDb25maWcgPSB0aGlzLmNvbmZpZ3VyZURpYWxvZyhkaWFsb2dDb25maWcpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGF0YUNvbERpc3BDb21wb25lbnQsIGRpYWxvZ0NvbmZpZyk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnN0YXR1cyA9PT0gJ09LJykge1xuICAgICAgICB0aGlzLnZpZXdDb2x1bW5zID0gcmVzdWx0LmNvbHVtbnM7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1hc3RlclRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4Y2x1ZGVkUm93cyA9IFtdO1xuICAgIGlmICghdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucHJpc3RpbmUgJiYgIXRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICAgICAgdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICAgIHRoaXMuQ2hlY2tib3hTZWxlY3QuZW1pdCh7IHJvd3M6IFtdLCBncmlkQXBpOiB0aGlzLmdldEdyaWRBcGkoKSwgY2hlY2tlZDogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLmNoZWNrZWRBbGxFeGNlcHRFeGNsdWRlZFJvd3MoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgICAgIHRoaXMuQ2hlY2tib3hTZWxlY3QuZW1pdCh7IHJvd3M6IFtdLCBncmlkQXBpOiB0aGlzLmdldEdyaWRBcGkoKSwgY2hlY2tlZDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXN0ZXJUb2dnbGVDbGllbnRTaWRlKCk7XG4gICAgICB0aGlzLkNoZWNrYm94U2VsZWN0LmVtaXQoeyByb3dzOiB0aGlzLnJvd3MsIGdyaWRBcGk6IHRoaXMuZ2V0R3JpZEFwaSgpLCBjaGVja2VkOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0NoZWNrYm94U2VsZWN0KHJvdzogSURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyk7XG4gICAgaWYgKHRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlICYmICFpc1NlbGVjdGVkKSB7XG4gICAgICB0aGlzLmV4Y2x1ZGVkUm93cy5wdXNoKHJvdyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlclNlbGVjdGlvbi52YWx1ZSAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLmV4Y2x1ZGVkUm93cy5maW5kSW5kZXgoKHgpID0+IEpTT04uc3RyaW5naWZ5KHgpID09PSBKU09OLnN0cmluZ2lmeShyb3cpKTtcbiAgICAgIGlmIChmaW5kSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkUm93cy5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5DaGVja2JveFNlbGVjdC5lbWl0KHsgcm93czogW3Jvd10sIGdyaWRBcGk6IHRoaXMuZ2V0R3JpZEFwaSgpLCBjaGVja2VkOiBpc1NlbGVjdGVkIH0pO1xuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKChyb3cpID0+IChyb3cuaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrZWRSb3dzID0gdGhpcy5ncmlkQXBpLmdldEFsbENoZWNrZWRSb3dzKCk7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm93ICYmIGNoZWNrZWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSBjaGVja2VkUm93c1tjaGVja2VkUm93cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQWN0aW9uKGFjdGlvbjogSURhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChhY3Rpb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tBZGQoKTogdm9pZCB7XG4gICAgdGhpcy5vbkFkZENsaWNrZWQuZW1pdCgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMub25BZGRDbGljaykgJiYgIXRoaXMub25BZGRDbGljayh1bmRlZmluZWQsIHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25IYW5kbGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQWN0aW9uSGFuZGxlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldElkQ29sdW1uKCk7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YSh7IGN1cnJlbnRQYWdlOiB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFLCBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSB9KTtcbiAgICB0aGlzLmlzU2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUuc2V0VmFsdWUoRGF0YVRhYmxlQ29uc3RhbnRzLkVNUFRZKTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jYW5JbmxpbmVBZGQpIHtcbiAgICAgIGlmICghdGhpcy5oYXNFbXB0eVJvdykge1xuICAgICAgICB0aGlzLmFkZEVtcHR5Um93KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2aWdhdGVQYWdlKEZvcm1UeXBlcy5BZGQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrUm93KGV2ZW50RGF0YTogSURhdGFUYWJsZVJvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZFJvd3MgPSB0aGlzLmdyaWRBcGkuZ2V0QWxsQ2hlY2tlZFJvd3MoKTtcbiAgICBpZiAoY2hlY2tlZFJvd3M/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgoeCkgPT4gKHguaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93LmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFJvdyA9IGV2ZW50RGF0YS5yb3c7XG4gICAgZXZlbnREYXRhLnJvdy5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICBjb25zdCBlbWl0SW5kZXggPSB0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cbiAgICAgID8gZXZlbnREYXRhLnJvdy5yb3dJbmRleCArIHRoaXMucGFnZVNpemUgKiAodGhpcy5jdXJyZW50UGFnZSAtIDEpXG4gICAgICA6IGV2ZW50RGF0YS5yb3cucm93SW5kZXg7XG5cbiAgICB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ID0gZW1pdEluZGV4O1xuICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoZXZlbnREYXRhLnJvdyk7XG4gIH1cblxuICBwdWJsaWMgb25DbGlja1Jvd0FkZChldmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUFkZCAmJiAhdGhpcy5oYXNFbXB0eVJvdykge1xuICAgICAgdGhpcy5hZGRFbXB0eVJvdyhldmVudERhdGEucm93LmRlcHRoICsgMSwgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKGV2ZW50RGF0YS5yb3cpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbGlja0VkaXQoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLm9uQmVmb3JlRWRpdCkgJiYgIXRoaXMub25CZWZvcmVFZGl0KHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzRGF0YUZyb21Sb3dzKHRoaXMucm93cyksIGV2ZW50RGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uRWRpdENsaWNrZWQuZW1pdChldmVudERhdGEpO1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUVkaXQpIHtcbiAgICAgIGlmICghdGhpcy5pc0VkaXRpbmcpIHtcbiAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nKGV2ZW50RGF0YS5yb3csIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9JdGVtKEZvcm1UeXBlcy5FZGl0LCB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0Um93SWQoZXZlbnREYXRhLnJvdykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQ2xvbmUoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jYW5JbmxpbmVBZGQgJiYgIXRoaXMuaGFzRW1wdHlSb3cpIHtcbiAgICAgIGNvbnN0IG5ld0V2ZW50RGF0YSA9IGNsb25lRGVlcChldmVudERhdGEpO1xuICAgICAgdGhpcy5hZGRDbG9uZVJvdyhuZXdFdmVudERhdGEucm93KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbGlja1ZpZXcoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRlVG9JdGVtKEZvcm1UeXBlcy5WaWV3LCB0aGlzLmdldE5hdmlnYXRlSXRlbVZhbHVlKGV2ZW50RGF0YSkpO1xuICB9XG5cbiAgcHVibGljIENvbXBsZXhEZXRhaWxDbGlja2VkKGV2ZW50RGF0YTogSUNsaWNrZWRFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ29tcGxleERldGFpbENsaWNrZWQuZW1pdChldmVudERhdGEpO1xuICB9XG5cbiAgcHVibGljIEFjdGlvbkNsaWNrSGFuZGxlcihhY3Rpb246IElUb3BSaWdodEFjdGlvbik6IHZvaWQge1xuICAgIGlmIChhY3Rpb24uY2xpY2tlZCkge1xuICAgICAgYWN0aW9uLmNsaWNrZWQodGhpcy5zZWxlY3RlZFJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dIaWRlRmlsdGVyVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmlzRmlsdGVyVmlldyA9ICF0aGlzLmlzRmlsdGVyVmlldztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckdsb2JhbEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2xlYXJGaWx0ZXIkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5maWx0ZXJNYW5hZ2VyLmNsZWFyRmlsdGVyUGFyYW1zKCk7XG4gICAgdGhpcy5zZXREYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlKHBhZ2luYXRpb25QYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zLCBzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFBhZ2luYXRpb25EYXRhKHBhZ2luYXRpb25QYXJhbXMpO1xuICAgIGlmICghdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YShzZWxlY3RhYmxlSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RlZmF1bHRGaXJzdFJvd1NlbGVjdGVkKCkgJiYgdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIGlmIChzZWxlY3RhYmxlSW5kZXgpIHtcbiAgICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnBhZ2VTaXplICogKHRoaXMuY3VycmVudFBhZ2UgLSAxKSArIHRoaXMuZ2V0U2VsZWN0YWJsZVZhbGlkSW5kZXgoc2VsZWN0YWJsZUluZGV4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXROZXh0Um93KHRoaXMucGFnZVNpemUgKiAodGhpcy5jdXJyZW50UGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblBhZ2VDaGFuZ2VkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkV4cGFuc2lvblBhbmVsQ2xpY2soZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1hdEV4cGFuc2lvblBhbmVsQ2xpY2tlZC5lbWl0KGV2ZW50RGF0YSk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlU2l6ZShwYWdlU2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YU9uU2l6ZUNoYW5nZWQocGFnZVNpemUpO1xuICAgIGlmICghdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJQYXJhbShjb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiBJRmlsdGVyUGFyYW0ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW0oY29sdW1uKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlcmVkQ29sdW1uKGNvbHVtblByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmZpbHRlckNvbHVtbi5wcm9wID09PSBjb2x1bW5Qcm9wKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgb25GaWx0ZXJDbGlja2VkKGZpbHRlclBhcmFtOiBJRmlsdGVyUGFyYW0pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1hbmFnZXIuc2V0RmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtKTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZmlsdGVyUGlwZS50cmFuc2Zvcm0oXG4gICAgICB0aGlzLnJvd3MsXG4gICAgICB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCksXG4gICAgICB0aGlzLmNvbHVtbnMsXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cbiAgICApO1xuICAgIHRoaXMuc2V0UGFnaW5hdGlvbkRhdGEoeyBjdXJyZW50UGFnZTogdGhpcy5ERUZBVUxUX0lOSVRfUEFHRSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgaWYgKCF0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgdGhpcy5zZXREYXRhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggPSAxLjU7IC8vIHRvIHNraXAgaW5pdCBmaWx0ZXIgdmFsdWUgYXNzaWduXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tFZGl0Q2FuY2VsKGV2ZW50RGF0YTogSURhdGFUYWJsZVJvd0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pc1NlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlU2VydmljZS5pc0VtcHR5Um93KGV2ZW50RGF0YS5yb3cpKSB7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Um93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlUm93RWRpdGluZyhldmVudERhdGEucm93LCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tFZGl0U2F2ZShldmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmJlZm9yZVNhdmVGbikgJiYgIXRoaXMuYmVmb3JlU2F2ZUZuKHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzRGF0YUZyb21Sb3dzKHRoaXMucm93cyksIGV2ZW50RGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NhdmVEYXRhTG9jYWwpIHtcbiAgICAgIHRoaXMub25TYXZlTG9jYWxSb3coZXZlbnREYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZlUm93KGV2ZW50RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoZXZlbnREYXRhOiBJRGF0YVRhYmxlRXhwYW5kQ29sbGFwc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlUm93RXhwYW5kQ29sbGFwc2UoZXZlbnREYXRhLnJvdywgZXZlbnREYXRhLnNob3VsZEV4cGFuZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmF2aWdhdGVJdGVtVmFsdWUoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMucm93TmF2aWdhdGlvblByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFZhbHVlQnlQcm9wZXJ0eU5hbWUoZXZlbnREYXRhLnJvdywgdGhpcy5ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uUHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKGV2ZW50RGF0YS5yb3cpO1xuICB9XG5cbiAgcHVibGljIG5hdmlnYXRlVG9JdGVtKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gdGhpcy5ncmlkT3B0aW9ucy5lZGl0RXh0cmFSb3V0ZVBhcmFtID8gYCR7dHlwZX0vJHtpZH0vJHt0aGlzLmdyaWRPcHRpb25zLmVkaXRFeHRyYVJvdXRlUGFyYW19YCA6IGAke3R5cGV9LyR7aWR9YDtcbiAgICB0aGlzLm5hdmlnYXRlUGFnZSh1cmwpO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tEZWxldGVSb3coZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5EZWxldGVNb2RhbChldmVudERhdGEucm93KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrRGVsZXRlTW9kYWwoc2hvdWxkRGVsZXRlKTogdm9pZCB7XG4gICAgaWYgKHNob3VsZERlbGV0ZSkge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucz8uYWN0aW9uTG9hZGluZyQ/LmRlbGV0ZSQubmV4dCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmlzU2F2ZURhdGFMb2NhbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUxvY2FsUm93KHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dJZCh0aGlzLnJvd1RvRGVsZXRlKSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VMb2NhbERhdGEoQ2hhbmdlVHlwZS5ST1dfREVMRVRFRCk7XG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnM/LmFjdGlvbkxvYWRpbmckPy5kZWxldGUkLm5leHQoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZWxldGVSb3codGhpcy5yb3dUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFZpc2libGVDb2x1bW5MaXN0Q2hhbmdlZChjb2x1bW5MaXN0OiBJRGF0YVRhYmxlQ29sdW1uW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb2x1bW5zID0gY29sdW1uTGlzdDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyU3VicyQubmV4dChudWxsKTtcbiAgICB0aGlzLmNsZWFyU3VicyQuY29tcGxldGUoKTtcbiAgICB0aGlzLmlzQ2xlYXJGaWx0ZXIkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuaXNDbGVhckZpbHRlciQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRhdGFUYWJsZUNvbnRleHQuY2xlYXJEYXRhVGFibGVDb21wb25lbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSBtZXJnZSh0aGlzLmRlZmF1bHRHcmlkT3B0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YSh7XG4gICAgICBjdXJyZW50UGFnZTogaXNVbmRlZmluZWQodGhpcy5pbml0aWFsUGFnZSkgPyB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFIDogdGhpcy5pbml0aWFsUGFnZSxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPElEYXRhVGFibGVSb3c+KCF0aGlzLmlzU2luZ2xlU2VsZWN0LCBbXSk7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQXV0b0NvbHVtbikge1xuICAgICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydGVkQ29sdW1ucyA9IGNsb25lKHRoaXMudmlld0NvbHVtbnMpO1xuICAgIH1cbiAgICB0aGlzLmdldENvbmZpZ3VyZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXREYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgc29ydFRhYmxlKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1RhYmxlSW5FZGl0U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuc29ydGFibGVQcm9wZXJ0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0gPT09IHZpZXdDb2x1bW4ucHJvcCkgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuaXNTb3J0RW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0ge307XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdID0gU29ydERpcmVjdGlvbkVudW0uQVNDO1xuICAgICAgdGhpcy5zb3J0RGF0YSh2aWV3Q29sdW1uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF0gPT09IFNvcnREaXJlY3Rpb25FbnVtLkFTQykge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW5bdmlld0NvbHVtbi5wcm9wXSA9IFNvcnREaXJlY3Rpb25FbnVtLkRFU0M7XG4gICAgICB0aGlzLnNvcnREYXRhKHZpZXdDb2x1bW4sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSB7fTtcbiAgICAgIHRoaXMuc29ydERhdGEodmlld0NvbHVtbiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVSb3cocm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKHJvdyk7XG4gICAgdGhpcy5kZWxldGVJdGVtRm4ocm93SWQsIHJvdy5kYXRhKVxuICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuY2xlYXJTdWJzJCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZE9wdGlvbnM/LmFjdGlvbkxvYWRpbmckPy5kZWxldGUkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc25hY2tiYXJTZXJ2aWNlLnN1Y2Nlc3MoU25hY2tiYXJUeXBlcy5EZWxldGVkLCBTbmFja2JhclR5cGVzLkRlbGV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVMb2NhbFJvdyhyb3dJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uRGVsZXRlQ29tcGxldGVkLmVtaXQoeyByb3c6IHRoaXMuc2VsZWN0ZWRSb3cgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gRW1wdHkgbWV0aG9kIGJsb2NrLlxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoTW9kZWxDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gdGhpcy5zZWFyY2hQaXBlLnRyYW5zZm9ybShcbiAgICAgICAgdGhpcy5yb3dzLFxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlLFxuICAgICAgICB0aGlzLnNlYXJjaENvbHVtbnMsXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbixcbiAgICAgICAgdGhpcy5zZWFyY2hlZFJvd0NvdW50JFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0UGFnaW5hdGlvbkRhdGEoeyBjdXJyZW50UGFnZTogdGhpcy5ERUZBVUxUX0lOSVRfUEFHRSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5pY29uVG9vbHRpcHMgJiYgdGhpcy5ncmlkT3B0aW9ucy5pY29uVG9vbHRpcHNbdGV4dF0pIHtcbiAgICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmljb25Ub29sdGlwc1t0ZXh0XTtcbiAgICB9XG4gICAgcmV0dXJuIHRvb2x0aXBzRGVmYXVsdFZhbHVlW3RleHRdO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGlvbk5hbWUocHJvcDogQWN0aW9uVHlwZXNFbnVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51c2VyTWFuYWdlbWVudFNlcnZpY2UuZ2V0QWN0aW9uTmFtZSh0aGlzLmdyaWRPcHRpb25zLCBwcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWZ0QWN0aW9uTmFtZShwcm9wOiBBY3Rpb25UeXBlc0VudW0pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VtZW50U2VydmljZS5nZXRMZWZ0QWN0aW9uTmFtZSh0aGlzLmdyaWRPcHRpb25zLCBwcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGRhdGE6IElLZXlWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEudGl0bGUpIHtcbiAgICAgIHJldHVybiBkYXRhLnRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gdG9vbHRpcHNEZWZhdWx0VmFsdWVbZGF0YS50aXRsZV07XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU2luZ2xlU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNTaW5nbGVTZWxlY3QgPT09IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlO1xuICB9XG5cbiAgcHVibGljIGRldGVjdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3ROZXh0Um93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTGFzdFJvd0luUGFnZSgpKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgPSB0aGlzLmlzTGFzdFJvd0luTGFzdFBhZ2UoKSA/IDEgOiB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgKyAxO1xuICAgICAgdGhpcy5vbkNoYW5nZVBhZ2UodGhpcy5wYWdpbmF0aW9uUGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdFByZXZpb3VzUm93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRmlyc3RSb3dJblBhZ2UoKSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlID0gdGhpcy5pc0ZpcnN0Um93SW5GaXJzdFBhZ2UoKSA/IHRoaXMucGFnZXNDb3VudCA6IHRoaXMucGFnaW5hdGlvblBhcmFtcy5jdXJyZW50UGFnZSAtIDE7XG4gICAgICB0aGlzLm9uQ2hhbmdlUGFnZSh0aGlzLnBhZ2luYXRpb25QYXJhbXMsICdsYXN0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdE5leHRSb3codGhpcy5zZWxlY3RlZFJvdy5yb3dJbmRleCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmNoZWNrU2VsZWN0ZWRTb3VyY2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIG9uRG91YmxlQ2xpY2tTZXBhcmF0b3IoaW5kZXg6IG51bWJlciwgdmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbikge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5kcmFnZ2FibGUgfHwgIXZpZXdDb2x1bW4uZHJhZ2dhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTtcbiAgICB0aGlzLnJlc2l6aW5nVGggPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGhbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXSBkaXZgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLnJlc2l6aW5nVGQgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXWAsIHRydWUpIGFzIE5vZGVMaXN0O1xuICAgIGlmICghdGhpcy5yZXNpemluZ1RoIHx8ICF0aGlzLnJlc2l6aW5nVGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2aWV3Q29sdW1uLmRvdWJsZUNsaWNrZWQgPSAhdmlld0NvbHVtbi5kb3VibGVDbGlja2VkO1xuICAgIHZpZXdDb2x1bW4uZHJhZ2dlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybWF0VGFibGVEYXRhKHZpZXdDb2x1bW4pO1xuICAgIHRoaXMuZm9ybWF0VGFibGVIZWFkZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWFkZXJTdHlsZShpbmRleDogbnVtYmVyLCB2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogc3RyaW5nW10ge1xuICAgIGxldCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLnZpZXdDb2x1bW5zW2luZGV4XS5kcmFnZ2VkIHx8IHZpZXdDb2x1bW4/LmRvdWJsZUNsaWNrZWQgPT09IHRydWUpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZHJhZy1jb2x1bW4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZml4ZWRXaWR0aERhdGEpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnaGVhZGVyLW1heC13aWR0aCcpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgcHVibGljIG9uU2VwYXJhdG9yTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCB2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTtcbiAgICB0aGlzLmNsaWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZSB8fCAhdmlld0NvbHVtbi5kcmFnZ2FibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZpZXdDb2x1bW4uZHJhZ2dlZCkge1xuICAgICAgICB2aWV3Q29sdW1uLmRyYWdnZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNpemluZ1RoID0gdGhpcy5nZXRTZWxlY3RlZEh0bWwoYHRoW2RhdGEtY29sdW1uLXByb3A9XCIke3ZpZXdDb2x1bW4ucHJvcH1cIl0gZGl2YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLnJlc2l6aW5nVGQgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXWAsIHRydWUpIGFzIE5vZGVMaXN0O1xuICAgICAgY29uc3QgdGREaXYgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXSBkaXZgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuYXBvbGxvRGF0YVRhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFwb2xsby1kZXNpZ24tbmV3LWRhdGEtdGFibGUnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKHRoaXMucmVzaXppbmdUaCkge1xuICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnBhZ2VYO1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSB0aGlzLmdldEFjdHVhbFdpZHRoKHRoaXMucmVzaXppbmdUaCwgdGhpcy5zdGFydFgpO1xuICAgICAgICBjb25zdCB0ZERpdldpZHRoID0gdGhpcy5nZXRBY3R1YWxXaWR0aCh0ZERpdiwgdGhpcy5zdGFydFgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlc2l6aW5nVGQpIHtcbiAgICAgICAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGREaXYuY2xhc3NMaXN0LnJlbW92ZSgnZGF0YS1tYXgtd2lkdGgnKTtcbiAgICAgICAgICAgIHRkRGl2LmNsYXNzTGlzdC5hZGQoJ2RyYWctY29sdW1uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFdpZHRoVG9FbGVtZW50KHRoaXMuc3RhcnRXaWR0aCwgdGREaXZXaWR0aCwgdGhpcy5yZXNpemluZ1RoLm9mZnNldFdpZHRoKTtcbiAgICAgIH1cbiAgICB9LCAyNTApO1xuXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCduby1zZWxlY3QtcmVzaXplJyk7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZHJhZ2dhYmxlICYmIHZpZXdDb2x1bW4uZHJhZ2dhYmxlKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEh0bWwoc2VsZWN0b3I6IHN0cmluZywgaXNTZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChpc1NlbGVjdEFsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YVRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YVRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRhYmxlRGF0YSh2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgaWYgKCF2aWV3Q29sdW1uLmRvdWJsZUNsaWNrZWQpIHtcbiAgICAgIHRoaXMucmVzaXppbmdUZC5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IHRkRGl2ID0gKDxIVE1MRWxlbWVudD5jZWxsKS5xdWVyeVNlbGVjdG9yKCdkaXYnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGREaXYuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1jb2x1bW4nKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZml4ZWRXaWR0aERhdGEpIHtcbiAgICAgICAgICB0ZERpdi5jbGFzc0xpc3QuYWRkKCdkYXRhLW1heC13aWR0aCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNpemluZ1RkLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0ZERpdi5jbGFzc0xpc3QucmVtb3ZlKCdkYXRhLW1heC13aWR0aCcpO1xuICAgICAgICB0ZERpdi5jbGFzc0xpc3QuYWRkKCdkcmFnLWNvbHVtbicpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUYWJsZUhlYWRlcigpIHtcbiAgICB0aGlzLnJlc2l6aW5nVGguc3R5bGUud2lkdGggPSAnJztcbiAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGREaXYuc3R5bGUud2lkdGggPSAnJztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIChldmVudC5wYWdlWCAtIHRoaXMuc3RhcnRYKTtcbiAgICBpZiAodGhpcy5yZXNpemluZ1RoKSB7XG4gICAgICB0aGlzLnNldFdpZHRoVG9FbGVtZW50KHdpZHRoLCB3aWR0aCwgdGhpcy5yZXNpemluZ1RoLm9mZnNldFdpZHRoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ25vLXNlbGVjdC1yZXNpemUnKTtcbiAgICB0aGlzLnJlc2l6aW5nVGggPSBudWxsO1xuICAgIHRoaXMucmVzaXppbmdUZCA9IG51bGw7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRXaWR0aFRvRWxlbWVudCh0aFdpZHRoOiBudW1iZXIsIHRkV2lkdGg6IG51bWJlciwgcHJldmlvdXNUaFdpZHRoOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yZXNpemluZ1RoKSB7XG4gICAgICB0aGlzLnJlc2l6aW5nVGguc3R5bGUud2lkdGggPSBgJHt0aFdpZHRofXB4YDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemluZ1RkKSB7XG4gICAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5kcmFnLWNvbHVtbicpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChkaXYpIHtcbiAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSBgJHt0ZFdpZHRofXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzaXppbmdUaCAmJiB0aGlzLmFwb2xsb0RhdGFUYWJsZSkge1xuICAgICAgY29uc3QgdXBkYXRlZFRhYmxlV2lkdGggPSB0aGlzLmFwb2xsb0RhdGFUYWJsZS5vZmZzZXRXaWR0aCArICh0aGlzLnJlc2l6aW5nVGgub2Zmc2V0V2lkdGggLSBwcmV2aW91c1RoV2lkdGgpO1xuICAgICAgdGhpcy5hcG9sbG9EYXRhVGFibGUuc3R5bGUud2lkdGggPSBgJHt1cGRhdGVkVGFibGVXaWR0aH1weGA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3R1YWxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCwgc3RhcnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCB3aWR0aDogbnVtYmVyO1xuICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgd2lkdGggPSBib3VuZGluZ1JlY3Qud2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG5cbiAgICBpZiAob2Zmc2V0IDwgYm91bmRpbmdSZWN0LndpZHRoKSB7XG4gICAgICB3aWR0aCA9IG9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldCBwYWdlc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmNvdW50IC8gdGhpcy5wYWdlU2l6ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dzQ291bnRJbkN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Um93cyA9IHRoaXMucm93cy5sZW5ndGggLSB0aGlzLnBhZ2VTaXplICogKHRoaXMuY3VycmVudFBhZ2UgLSAxKTtcbiAgICByZXR1cm4gbGVmdFJvd3MgPj0gdGhpcy5wYWdlU2l6ZSA/IHRoaXMucGFnZVNpemUgOiBsZWZ0Um93cztcbiAgfVxuXG4gIHByaXZhdGUgaXNMYXN0Um93SW5QYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93ICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWRSb3cucm93SW5kZXggKyAxKSAvIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucm93c0NvdW50SW5DdXJyZW50UGFnZSB8fCB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICsgMSA9PT0gdGhpcy5jb3VudFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3cgJiYgdGhpcy5zZWxlY3RlZFJvdy5yb3dJbmRleCArIDEgPT09IHRoaXMucm93c0NvdW50SW5DdXJyZW50UGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFJvd0luUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvdyAmJiB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICUgdGhpcy5wYWdlU2l6ZSA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFJvd0luRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRmlyc3RSb3dJblBhZ2UoKSAmJiB0aGlzLmN1cnJlbnRQYWdlID09PSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xhc3RSb3dJbkxhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTGFzdFJvd0luUGFnZSgpICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucGFnZXNDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0Um93Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IGNsb25lKHRoaXMucm93cyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SWRDb2x1bW4oKTogdm9pZCB7XG4gICAgLy8gVG8gZG8gaW1wcm92ZVxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eSkge1xuICAgICAgQ09MVU1OX0lELlBST1AgPSB0aGlzLmdyaWRPcHRpb25zLmlkUHJvcGVydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENPTFVNTl9JRC5QUk9QID0gJ2lkJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFZpZXdDb2x1bW5zKCk7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5hZGRJZENvbHVtbikge1xuICAgICAgdGhpcy5hZGRJZENvbHVtbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRGlhbG9nKGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnKTogTWF0RGlhbG9nQ29uZmlnIHtcbiAgICBkaWFsb2dDb25maWcucG9zaXRpb24gPSB7XG4gICAgICB0b3A6ICcxNXZoJyxcbiAgICAgIGxlZnQ6ICcyMHZ3JyxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5oZWlnaHQgPSAnODB2aCc7XG4gICAgZGlhbG9nQ29uZmlnLndpZHRoID0gJzYwdncnO1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gJ2NvbHVtbnNob3doaWRlLXBhbmVsJztcbiAgICBkaWFsb2dDb25maWcuZGF0YSA9IHtcbiAgICAgIGRlZmF1bHRTb3J0ZWRDb2x1bW5zOiB0aGlzLmRlZmF1bHRTb3J0ZWRDb2x1bW5zLFxuICAgICAgY29sdW1uczogdGhpcy52aWV3Q29sdW1ucyxcbiAgICAgIHN0b3JhZ2VLZXk6IHRoaXMuc3RvcmFnZUtleSxcbiAgICAgIG1ldGFEYXRhQ29sdW1uczogdGhpcy5ncmlkT3B0aW9ucy5tZXRhRGF0YUNvbHVtbnMsXG4gICAgfTtcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gZmFsc2U7XG4gICAgcmV0dXJuIGRpYWxvZ0NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZpZXdDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMudmlld0NvbHVtbnMgPSBjbG9uZSh0aGlzLmNvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCkpO1xuICAgIHRoaXMudmlld0NvbHVtbnMuZm9yRWFjaCgodmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgaWYgKHZpZXdDb2x1bW4uaXNWaXNpYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlld0NvbHVtbi5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXdDb2x1bW4uaXNEaXNwbGF5VmFsdWVBc0Zvcm1Db250cm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlld0NvbHVtbi5pc0Rpc3BsYXlWYWx1ZUFzRm9ybUNvbnRyb2wgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNlYXJjaENvbHVtbnMgPSB0aGlzLmdldFNlYXJjaGFibGVDb2x1bW5zKHRoaXMudmlld0NvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJZENvbHVtbigpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb2x1bW5zLnVuc2hpZnQoe1xuICAgICAgaGVhZGVyOiBDT0xVTU5fSUQuSEVBREVSLFxuICAgICAgcHJvcDogQ09MVU1OX0lELlBST1AsXG4gICAgICB0eXBlOiBDb2x1bW5UeXBlcy5JbnRlZ2VyLFxuICAgICAgaXNSZWFkT25seTogdHJ1ZSxcbiAgICAgIGlzVmlzaWJsZTogZmFsc2UsIC8vIHRoaXMuaXNJZENvbFZpc2libGUsXG4gICAgICBpc0Rpc3BsYXlWYWx1ZUFzRm9ybUNvbnRyb2w6IGZhbHNlLFxuICAgICAgZWRpdERpc2FibGVkTW9kZTogQ29sdW1uRGlzYWJsZU1vZGVzLkFsd2F5c0Rpc2FibGVkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRhKHNlbGVjdGFibGVJbmRleD86IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggKz0gMTtcbiAgICB0aGlzLmlzTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuaXNBdXRvQ29sdW1uKSB7XG4gICAgICB0aGlzLnNldEluaXRBcGlQYXJhbXMoKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseURlZmF1bHRTb3J0aW5nUGFyYW1zKCk7XG4gICAgdGhpcy5nZXRMaXN0Rm4odGhpcy5hcGlSZXFQYXJhbXMpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gVE9ETzogYWRkIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzcG9uc2UuaXRlbXNUb3RhbDtcbiAgICAgICAgICB0aGlzLmluaXRHZXRGdW5jKHJlc3BvbnNlLCBzZWxlY3RhYmxlSW5kZXgpO1xuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzRGVmYXVsdEFsbFJvd1NlbGVjdGVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tYXN0ZXJTZWxlY3Rpb24uc2V0VmFsdWUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm1hc3RlclRvZ2dsZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzVGFibGVEYXRhTG9hZC5lbWl0KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gRW1wdHkgTWV0aG9kIGJsb2NrXG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRBcGlQYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SW5pdEZpbHRlclBhcmFtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0RmlsdGVyUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyTWFuYWdlci5zZXRJbml0RmlsdGVyUGFyYW1zKHRoaXMuY29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRHZXRGdW5jKHJlc3BvbnNlOiBJTGlzdFJlc0FwaTxJS2V5VmFsdWU+LCBzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ID0gdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uID8gcmVzcG9uc2UucmVzdWx0U2V0Lmxlbmd0aCA6IHJlc3BvbnNlLml0ZW1zVG90YWw7XG4gICAgdGhpcy5zZWFyY2hlZFJvd0NvdW50JC5uZXh0KHJlc3BvbnNlLml0ZW1zVG90YWwpO1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzQXV0b0NvbHVtbikge1xuICAgICAgdGhpcy5nZW5lcmF0ZUNvbHVtbnMocmVzcG9uc2UucmVzdWx0U2V0KTtcbiAgICB9XG4gICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NGcm9tUm93c0RhdGEocmVzcG9uc2UucmVzdWx0U2V0KTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lZGl0YWJsZSkge1xuICAgICAgdGhpcy5yb3dzLmZvckVhY2goKHgpID0+ICh4LmlzRWRpdGluZyA9IHRydWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5vcmlnaW5hbFVuc29ydGVkUm93cyA9IGNsb25lRGVlcCh0aGlzLnJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gY2xvbmVEZWVwKHRoaXMucm93cyk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc0NsZWFyRmlsdGVyJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5LnByb3ApIHtcbiAgICAgIHRoaXMuYXBwbHlEZWZhdWx0U29ydCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0VsaWdpYmxlRm9yQWxsQ2hlY2soKSkge1xuICAgICAgdGhpcy5jaGVja2VkQWxsRXhjZXB0RXhjbHVkZWRSb3dzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUm93U2VsZWN0aW9uRW5hYmxlICYmICF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0Um93Q2hlY2tlZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0RlZmF1bHRGaXJzdFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgIC8vIFRPRE8gLSByZWZhY3RvclxuXG4gICAgICB0aGlzLmVtaXROZXh0Um93KHRoaXMuZ2V0U2VsZWN0YWJsZVZhbGlkSW5kZXgoc2VsZWN0YWJsZUluZGV4KSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0VsaWdpYmxlRm9yQWxsQ2hlY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbiAmJiAhdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucHJpc3RpbmUgJiYgdGhpcy5tYXN0ZXJTZWxlY3Rpb24udmFsdWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlVmFsaWRJbmRleChzZWxlY3RhYmxlSW5kZXg6IG51bWJlciB8IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHNlbGVjdGFibGVJbmRleCA9PT0gJ2xhc3QnKSB7XG4gICAgICBzZWxlY3RhYmxlSW5kZXggPSB0aGlzLnBhZ2VTaXplO1xuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyKHNlbGVjdGFibGVJbmRleCkgPiB0aGlzLnJvd3NDb3VudEluQ3VycmVudFBhZ2UgLSAxID8gdGhpcy5yb3dzQ291bnRJbkN1cnJlbnRQYWdlIC0gMSA6IHNlbGVjdGFibGVJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFnaW5hdGlvbkRhdGEocGFnaW5hdGlvblBhcmFtczogSVBhZ2luYXRpb25QYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMgPSBwYWdpbmF0aW9uUGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja2VkQWxsRXhjZXB0RXhjbHVkZWRSb3dzKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9wZXJ0eVdoZW5TZWxlY3Rpb25FbmFibGUodGhpcy5leGNsdWRlZFJvd3MpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgY29uc3QgZXhjbHVkZWRDdXJyZW50UGFnZVJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKCh4KSA9PiB0aGlzLmV4Y2x1ZGVkUm93cy5tYXAoKGUpID0+IEpTT04uc3RyaW5naWZ5KGUpKS5pbmNsdWRlcyhKU09OLnN0cmluZ2lmeSh4KSkpO1xuICAgIHRoaXMucm93c1xuICAgICAgLmZpbHRlcigoeCkgPT4gIWV4Y2x1ZGVkQ3VycmVudFBhZ2VSb3dzLnNvbWUoKHkpID0+IEpTT04uc3RyaW5naWZ5KHgpID09PSBKU09OLnN0cmluZ2lmeSh5KSkpXG4gICAgICAuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbiAmJiBpc0Z1bmN0aW9uKHRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKSAmJiAhdGhpcy5ncmlkT3B0aW9ucy5yb3dEaXNhYmxlRm4ocm93KSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbikge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlEZWZhdWx0U29ydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5Lm9yZGVyID09PSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDKSB7XG4gICAgICB0aGlzLmRvd25Tb3J0KHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdFNvcnRQcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBTb3J0KHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdFNvcnRQcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRTb3J0aW5nUGFyYW1zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5LnByb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSB7fTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5Lm9yZGVyID09PSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDKSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRTb3J0UHJvcGVydHkucHJvcF0gPSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRTb3J0UHJvcGVydHkucHJvcF0gPSBTb3J0RGlyZWN0aW9uRW51bS5BU0M7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYWdpbmF0aW9uRGF0YU9uU2l6ZUNoYW5nZWQocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVBhZ2UodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwgeyByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRGVsZXRlTW9kYWwocm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5yb3dUb0RlbGV0ZSA9IHJvdztcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XG4gICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7XG4gICAgICBtZXNzYWdlOiB0aGlzLmdyaWRPcHRpb25zLmRlbGV0ZU9wdGlvbnMuY29uZmlybWF0aW9uTWVzc2FnZSxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5wb3NpdGlvbiA9IHtcbiAgICAgIHRvcDogJzclJyxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gJ2RlbGV0ZS1tb2RhbC1wYW5lbCc7XG4gICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RGVsZXRlTW9kYWxDb21wb25lbnQ+ID0gdGhpcy5tYXREaWFsb2cub3BlbihEZWxldGVNb2RhbENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICBkaWFsb2dSZWZcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4gdGhpcy5vbkNsaWNrRGVsZXRlTW9kYWwocmVzdWx0KSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVSb3coZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93U2F2ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgIGNvbnN0IHJvdyA9IGV2ZW50RGF0YS5yb3csXG4gICAgICBzYXZlRGF0YSA9IGV2ZW50RGF0YS5zYXZlRGF0YTtcbiAgICBpZiAoc2F2ZURhdGFbQ09MVU1OX0lELlBST1BdID09PSBDT0xVTU5fSUQuRU1QVFlfUk9XX1ZBTCkge1xuICAgICAgdGhpcy5wb3N0RGF0YUZvckFkZChzYXZlRGF0YSwgcm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXREYXRhRm9yRWRpdChzYXZlRGF0YSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc3REYXRhRm9yQWRkKHNhdmVEYXRhOiBJUm93RGF0YSwgcm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG4gICAgcm93LmlzU2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RJdGVtRm4oc2F2ZURhdGEpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXN1bHQ6IElLZXlWYWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyU2VydmljZS5zdWNjZXNzKFNuYWNrYmFyVHlwZXMuU3VjY2VzcywgU25hY2tiYXJUeXBlcy5TdWNjZXNzKTtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5yZWZyZXNoT25BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhc0VtcHR5Um93ID0gZmFsc2U7XG4gICAgICAgICAgICBzYXZlRGF0YVtDT0xVTU5fSUQuUFJPUF0gPSByZXN1bHRbQ09MVU1OX0lELlBST1BdO1xuICAgICAgICAgICAgdGhpcy5zYXZlTG9jYWxSb3cocm93LCBzYXZlRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJvdy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXREYXRhRm9yRWRpdChzYXZlRGF0YTogSVJvd0RhdGEsIHJvdzogSURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgIHJvdy5pc1NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5wdXRJdGVtRm4odGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKHJvdyksIHNhdmVEYXRhKVxuICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuY2xlYXJTdWJzJCkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAocmV0dXJuRGF0YTogSVJvd0RhdGEpID0+IHtcbiAgICAgICAgICBpZiAocmV0dXJuRGF0YSkge1xuICAgICAgICAgICAgc2F2ZURhdGEgPSBtZXJnZShzYXZlRGF0YSwgcmV0dXJuRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyU2VydmljZS5pbmZvKFNuYWNrYmFyVHlwZXMuVXBkYXRlLCBTbmFja2JhclR5cGVzLlVwZGF0ZSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUxvY2FsUm93KHJvdywgc2F2ZURhdGEpO1xuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZUNvbXBsZXRlZC5lbWl0KHsgcm93IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZG93blNvcnQodmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMucm93cy5zb3J0KChpdGVtMSwgaXRlbTIpID0+IHtcbiAgICAgIHJldHVybiBpdGVtMS5kYXRhW3ZpZXdDb2x1bW4ucHJvcF0gPD0gaXRlbTIuZGF0YVt2aWV3Q29sdW1uLnByb3BdID8gMSA6IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuZGV0ZWN0Um93Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwU29ydCh2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzLnNvcnQoKGl0ZW0xLCBpdGVtMikgPT4ge1xuICAgICAgcmV0dXJuIGl0ZW0xLmRhdGFbdmlld0NvbHVtbi5wcm9wXSA+PSBpdGVtMi5kYXRhW3ZpZXdDb2x1bW4ucHJvcF0gPyAxIDogLTE7XG4gICAgfSk7XG4gICAgdGhpcy5kZXRlY3RSb3dDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zb3J0KCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMub3JpZ2luYWxVbnNvcnRlZFJvd3MuZmlsdGVyKChvcmlnaW5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gSlNPTi5zdHJpbmdpZnkocm93LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbC5kYXRhKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNvcnREYXRhKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4sIGlzQXNjZW5kaW5nOiBib29sZWFuLCBpc1Vuc29ydDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1Vuc29ydCkge1xuICAgICAgdGhpcy51bnNvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNBc2NlbmRpbmcgPyB0aGlzLnVwU29ydCh2aWV3Q29sdW1uKSA6IHRoaXMuZG93blNvcnQodmlld0NvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFbXB0eVJvdyhkZXB0aDogbnVtYmVyID0gUk9XLlJPT1RfREVQVEgsIHBhcmVudElkOiBzdHJpbmcgPSBDT0xVTU5fSUQuTk9fUEFSRU5UX1ZBTCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVyTWFuYWdlci5jbGVhckZpbHRlclBhcmFtcygpO1xuICAgIGNvbnN0IG5ld1JvdyA9IHRoaXMuZ2V0RW1wdHlSb3coZGVwdGgsIHBhcmVudElkKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gbmV3Um93O1xuICAgIHRoaXMucm93cyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzV2l0aEluc2VydGVkUm93KHBhcmVudElkLCB0aGlzLnJvd3MsIG5ld1Jvdyk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVtcHR5Um93KCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVtb3ZlTG9jYWxSb3coQ09MVU1OX0lELkVNUFRZX1JPV19WQUwpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNhdmVMb2NhbFJvdyhldmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGVTZXJ2aWNlLmlzRW1wdHlSb3coZXZlbnREYXRhLnJvdykpIHtcbiAgICAgIHRoaXMuYWRkTG9jYWxSb3coZXZlbnREYXRhLnJvdywgZXZlbnREYXRhLnNhdmVEYXRhKTtcbiAgICAgIHRoaXMub25DaGFuZ2VMb2NhbERhdGEoQ2hhbmdlVHlwZS5ST1dfQURERUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRMb2NhbFJvdyhldmVudERhdGEucm93LCBldmVudERhdGEuc2F2ZURhdGEpO1xuICAgICAgdGhpcy5vbkNoYW5nZUxvY2FsRGF0YShDaGFuZ2VUeXBlLlJPV19VUERBVEVEKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZExvY2FsUm93KHJvdzogSURhdGFUYWJsZVJvdywgc2F2ZURhdGE6IElLZXlWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVMb2NhbFJvdyhyb3csIHsgLi4uc2F2ZURhdGEsIGlkOiB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0TmV3Um93SWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZWRpdExvY2FsUm93KHJvdzogSURhdGFUYWJsZVJvdywgc2F2ZURhdGE6IElLZXlWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZUxvY2FsUm93KHJvdywgc2F2ZURhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlTG9jYWxSb3cocm93OiBJRGF0YVRhYmxlUm93LCBzYXZlRGF0YTogSUtleVZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVJvd0RhdGEocm93LCBzYXZlRGF0YSk7XG4gICAgcm93LmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGV0ZWN0Um93Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJvd0RhdGEocm93OiBJRGF0YVRhYmxlUm93LCBzYXZlRGF0YTogSUtleVZhbHVlKTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbihyb3cuZGF0YSwgc2F2ZURhdGEpO1xuICAgIGlmICghaXNVbmRlZmluZWQocm93LmZvcm1Hcm91cCkpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmlsbEZvcm0ocm93LmZvcm1Hcm91cCwgcm93LmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTG9jYWxSb3cocmVtb3ZlUm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgoeCkgPT4geC5kYXRhW0NPTFVNTl9JRC5QUk9QXSA9PT0gcmVtb3ZlUm93SWQpO1xuICAgIHRoaXMucm93cyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzV2l0aFJlbW92ZWRSb3cocmVtb3ZlUm93SWQsIHRoaXMucm93cyk7XG4gICAgaWYgKHRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEF1dG9OZXh0Um93KGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdEZpcnN0Um93U2VsZWN0aW9uICYmIHRoaXMucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggJiYgdGhpcy5yb3dzLmxlbmd0aCAlIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlLS07XG4gICAgICB0aGlzLnNlYXJjaGVkUm93Q291bnQkLm5leHQodGhpcy5yb3dzLmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RBdXRvTmV4dFJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnJvd3MubGVuZ3RoID09PSBpbmRleCA/IHRoaXMucm93cy5sZW5ndGggLSAxIDogaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0Rmlyc3RSb3dTZWxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGVtaXROZXh0Um93KGluZGV4OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgoeCkgPT4gKHguaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93ID0gdGhpcy5yb3dzW2luZGV4XTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cucm93SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMucm93c1tpbmRleF0uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlQm9keS5kZXRlY3RDaGFuZ2UoKTtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQodGhpcy5yb3dzW2luZGV4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZVJvd0VkaXRpbmcocm93OiBJRGF0YVRhYmxlUm93LCBpc0VkaXRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGlzRWRpdGluZztcbiAgICByb3cuaXNFZGl0aW5nID0gaXNFZGl0aW5nO1xuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVSb3dFeHBhbmRDb2xsYXBzZShyb3c6IElEYXRhVGFibGVSb3csIHNob3VsZEV4cGFuZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHJvdy5pc0V4cGFuZGVkID0gc2hvdWxkRXhwYW5kO1xuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbXB0eVJvdyhkZXB0aDogbnVtYmVyLCBwYXJlbnRJZDogc3RyaW5nKTogSURhdGFUYWJsZVJvdyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3coXG4gICAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0RW1wdHlSb3dEYXRhKHRoaXMudmlld0NvbHVtbnMsIHRoaXMuZGVmYXVsdFJvd1ZhbHVlcyksXG4gICAgICBkZXB0aCxcbiAgICAgIHBhcmVudElkLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlTG9jYWxEYXRhKGNoYW5nZVR5cGU6IENoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLk9USEVSKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VMb2NhbERhdGEuZW1pdCh7XG4gICAgICByb3dzRGF0YTogdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NEYXRhRnJvbVJvd3ModGhpcy5yb3dzKSxcbiAgICAgIGNoYW5nZVR5cGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpcmVJbml0Q29tcGxldGVkKCk6IHZvaWQge1xuICAgIHRoaXMub25Jbml0Q29tcGxldGVkLmVtaXQodGhpcy5nZXRHcmlkQXBpKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDbG9uZVJvdyhyb3c6IElEYXRhVGFibGVSb3csIGRlcHRoOiBudW1iZXIgPSBST1cuUk9PVF9ERVBUSCwgcGFyZW50SWQ6IHN0cmluZyA9IENPTFVNTl9JRC5OT19QQVJFTlRfVkFMKTogdm9pZCB7XG4gICAgdGhpcy5oYXNFbXB0eVJvdyA9IHRydWU7XG4gICAgcm93LmRhdGFbQ09MVU1OX0lELlBST1BdID0gQ09MVU1OX0lELkVNUFRZX1JPV19WQUw7XG4gICAgdGhpcy5ncmlkT3B0aW9ucy5jbG9uZU9wdGlvbnMuY29weU9mQ2xvbmFibGVQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcbiAgICAgIHJvdy5kYXRhW3Byb3BlcnR5XSA9IERhdGFUYWJsZUNvbnN0YW50cy5DT1BZX09GICsgcm93LmRhdGFbcHJvcGVydHldO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZW1wdHlWYWx1ZUNvbHVtbnMgPSB0aGlzLnZpZXdDb2x1bW5zLmZpbHRlcigoY29sKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5jbG9uZU9wdGlvbnMuZW1wdHlWYWx1ZVByb3BlcnRpZXMuaW5jbHVkZXMoY29sLnByb3ApO1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5zZXRFbXB0eVZhbHVlc0luUm93RGF0YShyb3csIGVtcHR5VmFsdWVDb2x1bW5zKTtcblxuICAgIGNvbnN0IGNsb25lZFJvdyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3cocm93LmRhdGEsIGRlcHRoLCBwYXJlbnRJZCwgdHJ1ZSk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NXaXRoSW5zZXJ0ZWRSb3cocGFyZW50SWQsIHRoaXMucm93cywgY2xvbmVkUm93KTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gY2xvbmVkUm93O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcmlkQXBpKCk6IEdyaWRBcGkge1xuICAgIHJldHVybiB0aGlzLmdyaWRBcGk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlYXJjaGFibGVDb2x1bW5zKGNvbHVtbnM6IElEYXRhVGFibGVDb2x1bW5bXSk6IElEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChpdGVtLCAncHJvcCcpICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2VhcmNoYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMoaXRlbS5wcm9wKVxuICAgICk7XG4gICAgcmV0dXJuIHNlYXJjaGFibGVDb2x1bW5zLmxlbmd0aCA9PT0gMCA/IGNvbHVtbnMgOiBzZWFyY2hhYmxlQ29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgbWFzdGVyVG9nZ2xlQ2xpZW50U2lkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQoKSA/IHRoaXMuc2VsZWN0aW9uLmNsZWFyKCkgOiB0aGlzLm5vbkRpc2FibGVkUm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclByb3BlcnR5V2hlblNlbGVjdGlvbkVuYWJsZShjaGVja2VkUm93czogSURhdGFUYWJsZVJvd1tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgY2hlY2tlZFJvd3MubGVuZ3RoKSB7XG4gICAgICBjaGVja2VkUm93cy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KCdpc1NlbGVjdGVkJykpIHtcbiAgICAgICAgICBkZWxldGUgcy5pc1NlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KCdyb3dJbmRleCcpKSB7XG4gICAgICAgICAgZGVsZXRlIHMucm93SW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2hlY2tlZFJvd3MoKTogSUNoZWNrZWRSb3dFdmVudCB7XG4gICAgY29uc3QgY2hlY2tlZFJvd3MgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICB0aGlzLmNsZWFyUHJvcGVydHlXaGVuU2VsZWN0aW9uRW5hYmxlKGNoZWNrZWRSb3dzKTtcbiAgICBjb25zdCBwYWdlTWF0Y2hlZFByZXZpb3VzQ2hlY2tlZFJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIHJldHVybiBjaGVja2VkUm93cy5zb21lKChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShyb3cpID09PSBKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFnZVVubWF0Y2hlZENoZWNrZWRSb3dzID0gY2hlY2tlZFJvd3MuZmlsdGVyKChlKSA9PiB7XG4gICAgICByZXR1cm4gcGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzLmZpbmRJbmRleCgobSkgPT4gSlNPTi5zdHJpbmdpZnkoZSkgPT09IEpTT04uc3RyaW5naWZ5KG0pKSA8IDA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzOiBwYWdlTWF0Y2hlZFByZXZpb3VzQ2hlY2tlZFJvd3MsIHBhZ2VVbm1hdGNoZWRDaGVja2VkUm93czogcGFnZVVubWF0Y2hlZENoZWNrZWRSb3dzIH07XG4gIH1cblxuICBwcml2YXRlIG1hc3RlclRvZ2dsZVNlcnZlclNpZGUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja2VkUm93czogSUNoZWNrZWRSb3dFdmVudCA9IHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIHRoaXMuYWRkVW5tYXRjaGVkUm93VG9TZWxlY3Rpb24ocHJldmlvdXNDaGVja2VkUm93cy5wYWdlVW5tYXRjaGVkQ2hlY2tlZFJvd3MpO1xuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoICE9PSBwcmV2aW91c0NoZWNrZWRSb3dzLnBhZ2VNYXRjaGVkUHJldmlvdXNDaGVja2VkUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5tYXRjaGVkUm93VG9TZWxlY3Rpb24ocm93czogSURhdGFUYWJsZVJvd1tdKTogdm9pZCB7XG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Um93Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0NoZWNrZWRSb3dzOiBJQ2hlY2tlZFJvd0V2ZW50ID0gdGhpcy5nZXRDaGVja2VkUm93cygpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRVbm1hdGNoZWRSb3dUb1NlbGVjdGlvbihwcmV2aW91c0NoZWNrZWRSb3dzLnBhZ2VVbm1hdGNoZWRDaGVja2VkUm93cyk7XG5cbiAgICB0aGlzLnJvd3NcbiAgICAgIC5maWx0ZXIoKGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tlZFJvd3MucGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzLnNvbWUoKGl0ZW0pID0+IEpTT04uc3RyaW5naWZ5KGUpID09PSBKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgICB9KVxuICAgICAgLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWREYXRhUm93KGRhdGFSb3dzOiBJRGF0YVRhYmxlUm93W10pOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiBkYXRhUm93cy5maWx0ZXIoKGUpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zb21lKChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShlLmRhdGEpID09PSBKU09OLnN0cmluZ2lmeShpdGVtLmRhdGEpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29sdW1uU291cmNlKHByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMubWV0YURhdGFDb2x1bW5zLmZpbmRJbmRleCgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUgPT09IHByb3BlcnR5KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VUeXBlcy5NRVRBREFUQTtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VUeXBlcy5EQVRBX1NPVVJDRTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29sdW1uc1VzaW5nU3RvcmVkRGF0YShkZWZhdWx0Q29sdW1uczogSURhdGFUYWJsZUNvbHVtbltdKTogSURhdGFUYWJsZUNvbHVtbltdIHtcbiAgICBsZXQgdGVtcENvbGxlY3Rpb246IElEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICAgIHRlbXBDb2xsZWN0aW9uID0gZGVmYXVsdENvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCk7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2VLZXkpIHtcbiAgICAgIHJldHVybiB0ZW1wQ29sbGVjdGlvbjtcbiAgICB9XG4gICAgbGV0IHN0b3JlZENvbHVtbnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXkpO1xuICAgIGlmIChzdG9yZWRDb2x1bW5zICYmIHN0b3JlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgc3RvcmVkQ29sdW1uc1xuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZClcbiAgICAgICAgLmZvckVhY2goKGl0ZW06IExpc3RJdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRlbXBDb2xsZWN0aW9uLmZpbmRJbmRleCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0NvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uID0gdGVtcENvbGxlY3Rpb24uZmluZCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nQ29sdW1uLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgIHZhciB0ZW1wY29sdW1uID0gdGVtcENvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICAgICAgICB0ZW1wQ29sbGVjdGlvbltpbmRleF0gPSBleGlzdGluZ0NvbHVtbjtcbiAgICAgICAgICAgICAgdGVtcENvbGxlY3Rpb25bZXhpc3RpbmdDb2x1bW5JbmRleF0gPSB0ZW1wY29sdW1uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGFkZGVkIGludmlzaWJsZSBjb2x1bW5zIGF0IHRoZSBlbmQgdG8gY29tcGxldGUgdGhlIHNldFxuICAgICAgdGVtcENvbGxlY3Rpb25cbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAmJiBzdG9yZWRDb2x1bW5zLmZpbmRJbmRleCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApIDwgMClcbiAgICAgICAgLmZvckVhY2goKGl0ZW06IElEYXRhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgaXRlbS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0ZWRDaGVja2JveFBhZ2luZ0NvbmZpcm1hdGlvbihzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDb21tb25Db25maXJtTW9kYWxDb21wb25lbnQ+ID0gdGhpcy5tYXREaWFsb2cub3BlbihDb21tb25Db25maXJtTW9kYWxDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNDUwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBib2R5OiB0aGlzLmNvbmZpcm1hdGlvbk1zZ1BhZ2luYXRpb24sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGRpYWxvZ1JlZlxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKClcbiAgICAgIC5zdWJzY3JpYmUoKGNvbmZpcm1hdGlvbikgPT4ge1xuICAgICAgICBpZiAoY29uZmlybWF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHNlbGVjdGFibGVJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NlbGVjdGVkUm93KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZFJvd3MoKS5tYXAoKHgpID0+IHguZGF0YSkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hUYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPj0gMiB8fCByZXMgPT09ICcnKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmNsZWFyU3VicyQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VhcmNoRGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVGaWx0ZXJQYXJhbXMoKTogSUZpbHRlclBhcmFtW10ge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNTZWFyY2hCb3hWaXNpYmxlICYmICF0aGlzLmdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWduKSB7XG4gICAgICByZXR1cm4gW3sgY29sdW1uTmFtZTogJ3NlYXJjaFRleHQnLCBmaWx0ZXJWYWx1ZTogdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSB9LCAuLi50aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlclBhcmFtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWd1cmVkQ29sdW1ucygpOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmdyaWRPcHRpb25zLnN0b3JhZ2VGbikpIHtcbiAgICAgIHRoaXMuc3RvcmFnZUtleSA9IHRoaXMuZ3JpZE9wdGlvbnMuc3RvcmFnZUZuKCk7XG4gICAgICBsZXQgY29sdW1ucyA9IHRoaXMuc2V0Q29sdW1uc1VzaW5nU3RvcmVkRGF0YSh0aGlzLmNvbHVtbnMpO1xuICAgICAgdGhpcy52aWV3Q29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbHVtbnMocm93RGF0YTogSUtleVZhbHVlW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3dEYXRhWzBdKS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiA8SURhdGFUYWJsZUNvbHVtbj57XG4gICAgICAgIGhlYWRlcjogeC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBwcm9wOiB4LFxuICAgICAgICB0eXBlOiBDb2x1bW5UeXBlcy5TdHJpbmcsXG4gICAgICAgIHJlbmRlcmVyVGVtcGxhdGU6IHRoaXMuZ3JpZE9wdGlvbnMucmVuZGVyVGVtcGxhdGVzUHJvcCA/IHRoaXMuZ3JpZE9wdGlvbnMucmVuZGVyVGVtcGxhdGVzUHJvcFt4XSA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgIHRoaXMuZGVmYXVsdFNvcnRlZENvbHVtbnMgPSBjbG9uZSh0aGlzLnZpZXdDb2x1bW5zKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZWFyY2hcIiAqbmdJZj1cImdyaWRPcHRpb25zLmlzU2VhcmNoQm94VmlzaWJsZSAmJiAhZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ25cIj5cbiAgICAgICAgICAgIDxmb3JtIG5nRm9ybT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoYmFyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzdmctaWNvbiBmYS1zb2xpZCBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCB7eyBzZWFyY2hQbGFjZWhvbGRlciB9fVwiIG5hbWU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaFZhbHVlXCIgW2Rpc2FibGVkXT1cImlzU2VhcmNoRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoTW9kZWxDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCIgKm5nSWY9XCIhZ3JpZE9wdGlvbnMuaGlkZVRvcFRvb2xiYXJcIj5cbiAgICAgICAgICAgIDxzZWN0aW9uICpuZ0lmPVwiIWlzT25seVZpZXdcIiBjbGFzcz1cImFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInJvdy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmhhc1Blcm1pc3Npb249XCJnZXRBY3Rpb25OYW1lKGFjdGlvblR5cGVzLkFERClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFncmlkT3B0aW9ucy5hZGRCdXR0b25UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzVGFibGVJbkVkaXRTdGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib25DbGlja0FkZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBpc0Rpc2FibGVkTWFpbkFjdGlvbihhY3Rpb25UeXBlcy5BREQpIHx8IChncmlkT3B0aW9ucy5kaXNhYmxlSWNvbnMgJiYgZ3JpZE9wdGlvbnMuZGlzYWJsZUljb25zLmFkZCQgfGFzeW5jKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwie3tnZXRUb29sdGlwVGV4dCh0b29sVGlwcy5BREQpfX1cIiBjbGFzcz1cInRvb2xiYXItaWNvbiBpY29uLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpc0Rpc2FibGVkTWFpbkFjdGlvbihhY3Rpb25UeXBlcy5BREQpIHx8IChncmlkT3B0aW9ucy5kaXNhYmxlSWNvbnMgJiYgZ3JpZE9wdGlvbnMuZGlzYWJsZUljb25zLmFkZCQgfGFzeW5jKSk/ICdpY29uLWluYWN0aXZlJzogJ2ljb24tYWN0aXZlJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuYWRkQnV0dG9uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZE9wdGlvbnMuYWRkQnV0dG9uVGVtcGxhdGU7XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nJC5nZXRWYWx1ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtZGF0YS10YWJsZS1hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoaXNPbmx5VmlldyAmJiAhaXNWaWV3QWN0aW9uVmlzaWJsZSkgJiYgIWdyaWRPcHRpb25zLmlzUm93QWN0aW9uVmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZEFwaV09XCJncmlkQXBpXCIgW2NhbklubGluZUVkaXRdPVwiY2FuSW5saW5lRWRpdFwiIFtpc1RyZWVHcmlkXT1cImlzVHJlZUdyaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCIgW3NlbGVjdGVkUm93XT1cInNlbGVjdGVkUm93XCIgW2lzSWNvbnNEaXNhYmxlZF09XCJpc0FjdGlvbnNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNFZGl0aW5nXT1cInNlbGVjdGVkUm93Py5pc0VkaXRpbmdcIiBbaXNTYXZpbmddPVwic2VsZWN0ZWRSb3c/LmlzU2F2aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc09ubHlWaWV3XT1cImlzT25seVZpZXdcIiBbaXNFZGl0YWJsZV09XCJpc0VkaXRhYmxlXCIgKGNsaWNrQWRkKT1cIm9uQ2xpY2tBZGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGFzRW1wdHlSb3ddPVwiaGFzRW1wdHlSb3dcIiBbaXNFZGl0aW5nXT1cImlzRWRpdGluZ1wiIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNDbG9uZVZpc2libGVdPVwiaXNDbG9uZVZpc2libGVcIiBbaXNEZWxldGVWaXNpYmxlXT1cIiFjaGVja0RlbGV0ZURpc2FibGVkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtZGF0YS10YWJsZS1hY3Rpb25zPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicm93LWFjdGlvbnNcIiAqbmdJZj1cIiFpc09ubHlWaWV3IHx8IGdyaWRPcHRpb25zLmlzVG9wTGVmdEFjdGlvbnNGb3JjZURpc3BseVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBncmlkT3B0aW9ucy50b3BMZWZ0QWRkaXRpb25hbEFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKmhhc1Blcm1pc3Npb249XCJnZXRMZWZ0QWN0aW9uTmFtZShhY3Rpb24uYWN0aW9uTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBhY3Rpb24uaXNEaXNhYmxlZH1cIiAoY2xpY2spPVwiQWN0aW9uQ2xpY2tIYW5kbGVyKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udEljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaWNvbiAqbmdJZj1cIiFhY3Rpb24uaXNDbGFzc1wiIFt0aXRsZV09XCJnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhY3Rpb24uaWNvbk9yQ2xhc3NOYW1lXCI+PC9hcHAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGlvbi5pc0NsYXNzXCIgdGl0bGU9XCJ7e2dldExlZnRSaWdodEFjdGlvblRleHQoYWN0aW9uKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sYmFyLWljb24ge3sgYWN0aW9uLmljb25PckNsYXNzTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihhY3Rpb24uYWN0aW9uTmFtZT09PWFjdGlvblR5cGVzLlVQTE9BRCAmJiBhY3Rpb24uaXNEaXNhYmxlZCk/ICdpY29uLWluYWN0aXZlJzogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImFjdGlvbi5sb2FkaW5nJCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJtci0xIGFjdGlvbi1sb2FkZXJcIiBbZGlhbWV0ZXJdPVwiMjVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWRPcHRpb25zLmxlZnRBY3Rpb25CdG5UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkT3B0aW9ucy5sZWZ0QWN0aW9uQnRuVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicm93LWFjdGlvbnNcIj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBncmlkT3B0aW9ucy50b3BSaWdodEFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIkFjdGlvbkNsaWNrSGFuZGxlcihhY3Rpb24pXCIgY2xhc3M9XCJmb250SWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pY29uIFt0aXRsZV09XCJnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGFjdGlvbilcIiBbbmFtZV09XCJhY3Rpb24uaWNvblwiPjwvYXBwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMubmV3VGFibGVCdXR0b250ZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZE9wdGlvbnMubmV3VGFibGVCdXR0b250ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2VhcmNoXCIgKm5nSWY9XCJncmlkT3B0aW9ucy5pc1NlYXJjaEJveFZpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbmdGb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaGJhci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzdmctaWNvbiBmYS1zb2xpZCBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgbmFtZT1cInNlYXJjaFwiIFtmb3JtQ29udHJvbF09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NlYXJjaERpc2FibGVkXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoTW9kZWxDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWRPcHRpb25zLmlzRmlsdGVyRW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2hvd0hpZGVGaWx0ZXJWaWV3KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaW5hY3RpdmUtZmlsdGVyXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtZmlsdGVyJzogaXNGaWx0ZXJBcHBsaWVkIH1cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFt0aXRsZV09XCInQ2xlYXInXCIgKGNsaWNrKT1cImNsZWFyR2xvYmFsRmlsdGVyKClcIiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJmYXMgZmEtYnJvb21cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJyb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFncmlkT3B0aW9ucy5oaWRlQ29sdW1uQ29uZmlndXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib3BlbkNvbHVtblNob3dIaWRlRGlhbG9ndWUoKVwiIGNsYXNzPVwiZm9udEljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pY29uIFt0aXRsZV09XCJnZXRUb29sdGlwVGV4dCh0b29sVGlwcy5DT0xVTU5fQ09ORklHVVJBVElPTilcIiBbbmFtZV09XCJJQ09OUy5Db2x1bW5TZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbjwvZGl2PlxuXG48bWF0LWNhcmQgY2xhc3M9XCJ0YWJsZS1jYXJkXCIgW25nQ2xhc3NdPVwieyd0cmFuc3BhcmVudC10YWJsZS1kZXNpZ24nOiBncmlkT3B0aW9ucy5pc1RyYW5zcGFyZW50VGFibGVEZXNpZ259XCI+XG4gICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmckIHwgYXN5bmNcIiBjbGFzcz1cImxvYWRlci1taWRkbGVcIj48L2FwcC1sb2FkZXI+XG5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kYXRhLXRhYmxlXCIgW25nQ2xhc3NdPVwieydkZWZhdWx0LXRhYmxlLWhlaWdodCc6IGlzTG9hZGluZyQuZ2V0VmFsdWUoKSwgJ292ZXJmbG93LXZpc2libGUnOiBncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlIH1cIlxuICAgICAgICAgICAgKHNjcm9sbCk9XCJvblRhYmxlU2Nyb2xsZWQoJGV2ZW50KVwiICNjdXN0b21EYXRhVGFibGUgW25nU3R5bGVdPVwiZ2V0Q3VzdG9tVGFibGVTdHlsZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGFyaWEtZGVzY3JpYmVkYnk9XCJHZW5lcmljIGRhdGEgdGFibGVcIiAqbmdJZj1cIiFncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlIGFwb2xsby1kZXNpZ24tbmV3LWRhdGEtdGFibGVcIiBbbmdDbGFzc109XCJ7ICctdHJlZSc6IGlzVHJlZUdyaWQgfVwiIG1kYlRhYmxlPlxuICAgICAgICAgICAgICAgIDx0aGVhZCAqbmdJZj1cIiFncmlkT3B0aW9ucy5oaWRlVGFibGVIZWFkZXJcIiBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ24gJiYgaXNGaWx0ZXJWaWV3XCIgY2xhc3M9XCJ0YWJsZS1maXJzdC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmlld0NvbHVtbiBvZiB2aWV3Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInZpZXdDb2x1bW4uaXNWaXNpYmxlXCIgc2NvcGU9XCJjb2xcIiBjbGFzcz1cImhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndHJhbnNwYXJlbnQnOiAhdmlld0NvbHVtbi5pc01ldGFEYXRhQ29sdW1uICYmIGdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWdufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWRhdGEtY29sLWZpbHRlciAqbmdJZj1cImlzRmlsdGVyRW5hYmxlKHZpZXdDb2x1bW4ucHJvcClcIiBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmlsdGVyZWRDb2x1bW4nOiBpc0ZpbHRlcmVkQ29sdW1uKHZpZXdDb2x1bW4ucHJvcCl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZpbHRlckNsaWNrZWQpPVwib25GaWx0ZXJDbGlja2VkKCRldmVudClcIiBbZmlsdGVyT3B0aW9uXT1cInZpZXdDb2x1bW4uZmlsdGVyT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtudW1iZXJPZlRhYmxlUmVmcmVzaF09XCJudW1iZXJPZlRhYmxlUmVmcmVzaFwiIFtpc1VwZGF0ZWRGaWx0ZXJEZXNpZ25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNDbGVhckZpbHRlciRdPVwiaXNDbGVhckZpbHRlciRcIiBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtZGF0YS1jb2wtZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtc2Vjb25kLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgICYmICFpc1NpbmdsZVNlbGVjdFwiIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJoYXNTZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwidGFibGUtaGVhZGVyLWNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibWFzdGVyU2VsZWN0aW9uXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgaXNTaW5nbGVTZWxlY3RcIiBjbGFzcz1cImhhc1NlbGVjdGlvblwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2aWV3Q29sdW1uIG9mIHZpZXdDb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwidmlld0NvbHVtbi5pc1Zpc2libGVcIiBzY29wZT1cImNvbFwiIGNsYXNzPVwiaGVhZGVyXCIgW2F0dHIuZGF0YS1jb2x1bW4tcHJvcF09XCJ2aWV3Q29sdW1uLnByb3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RyYW5zcGFyZW50JzogIXZpZXdDb2x1bW4uaXNNZXRhRGF0YUNvbHVtbiAmJiBncmlkT3B0aW9ucy5pc1VwZGF0ZWRUYWJsZURlc2lnbn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRIZWFkZXJTdHlsZShpLCB2aWV3Q29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1kYXRhLWNvbC1maWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRmlsdGVyRW5hYmxlKHZpZXdDb2x1bW4ucHJvcCkgJiYgIWdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWduXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbHRlcmVkQ29sdW1uJzogaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsdGVyQ2xpY2tlZCk9XCJvbkZpbHRlckNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbl09XCJ2aWV3Q29sdW1uLmZpbHRlck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bWJlck9mVGFibGVSZWZyZXNoXT1cIm51bWJlck9mVGFibGVSZWZyZXNoXCIgW2lzQ2xlYXJGaWx0ZXIkXT1cImlzQ2xlYXJGaWx0ZXIkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWRhdGEtY29sLWZpbHRlcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXJcIiBbbmdDbGFzc109XCJ7J3NvcnQtY29sdW1uJzogaXNTb3J0Q29sdW1uKHZpZXdDb2x1bW4pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRUYWJsZSh2aWV3Q29sdW1uKVwiPnt7IHZpZXdDb2x1bW4uaGVhZGVyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdDb2x1bW4uaGVhZGVySWNvbkNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIiBbbmdDbGFzc109XCJ2aWV3Q29sdW1uLmhlYWRlckljb25DbGFzc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF09PT0gc29ydERpcmVjdGlvbkVudW0uREVTQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dfZG93bndhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdPT09IHNvcnREaXJlY3Rpb25FbnVtLkFTQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dfdXB3YXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ24gJiYgaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiZmFzIGZhLWZpbHRlciBhY3RpdmUtZmlsdGVyXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyaWRPcHRpb25zLmRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGVhZGVyLXNlcGFyYXRvcic6IHRydWUsICdjb2wtcmVzaXplLWN1cnNvcic6IHZpZXdDb2x1bW4uZHJhZ2dhYmxlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25TZXBhcmF0b3JNb3VzZURvd24oJGV2ZW50LCBpLCB2aWV3Q29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2tTZXBhcmF0b3IoaSwgdmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhKGlzT25seVZpZXcgJiYgIWlzVmlld0FjdGlvblZpc2libGUpICYmIGdyaWRPcHRpb25zLmlzUm93QWN0aW9uVmlzaWJsZVwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uczwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwieyd0cmFuc3BhcmVudCc6IGdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWdufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncmlkT3B0aW9ucy5ncmlkTWVudU9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuZ3JpZE1lbnVPcHRpb25zLmlzTWVudUVuYWJsZWRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaGFzRml4ZWRGaXJzdFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIShpc0xvYWRpbmckIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgICYmICFpc1NpbmdsZVNlbGVjdFwiIGNsYXNzPVwidHJhbnNwYXJlbnRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlICYmIGlzU2luZ2xlU2VsZWN0XCIgY2xhc3M9XCJ0cmFuc3BhcmVudFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmlld0NvbHVtbiBvZiB2aWV3Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlld0NvbHVtbi5maXhlZEZpcnN0Um93VGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGNvbDogdmlld0NvbHVtbiB9IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5ICpuZ0lmPVwiIWlzTG9hZGluZyQuZ2V0VmFsdWUoKVwiIGFwcC1kYXRhLXRhYmxlLWJvZHkgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCJyb3dzIHwgY29sdW1uRmlsdGVyIDogZmlsdGVyTWFuYWdlci5nZXRGaWx0ZXJQYXJhbXMoKSA6IGNvbHVtbnM6IGdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdmlld0NvbHVtbnNdPVwidmlld0NvbHVtbnNcIiBbY2FuSW5saW5lRWRpdF09XCJjYW5JbmxpbmVFZGl0XCIgW2lzVHJlZUdyaWRdPVwiaXNUcmVlR3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFtpc09ubHlWaWV3XT1cImlzT25seVZpZXdcIiBbc2VhcmNoZWRSb3dDb3VudCRdPVwic2VhcmNoZWRSb3dDb3VudCRcIiBbb25BZGRDbGlja109XCJvbkFkZENsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXdSb3ddPVwiaXNPbmx5Vmlld1Jvd1wiIFtpc0RlbGV0ZURpc2FibGVkXT1cImlzRGVsZXRlRGlzYWJsZWRcIiBbc2VhcmNoXT1cInNlYXJjaFZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRpb25QYXJhbXNdPVwicGFnaW5hdGlvblBhcmFtc1wiIFtoYXNFbXB0eVJvd109XCJoYXNFbXB0eVJvd1wiIFtpc0VkaXRpbmddPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUm93U2VsZWN0aW9uRW5hYmxlXT1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgW3NlYXJjaENvbHVtbnNdPVwic2VhcmNoQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpc0Nsb25lVmlzaWJsZV09XCJpc0Nsb25lVmlzaWJsZVwiIChjbGlja0VkaXQpPVwib25DbGlja0VkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0Nsb25lKT1cIm9uQ2xpY2tDbG9uZSgkZXZlbnQpXCIgKGNsaWNrQWN0aW9uKT1cIm9uQ2xpY2tBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0VkaXRDYW5jZWwpPVwib25DbGlja0VkaXRDYW5jZWwoJGV2ZW50KVwiIChjbGlja0VkaXRTYXZlKT1cIm9uQ2xpY2tFZGl0U2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrRGVsZXRlKT1cIm9uQ2xpY2tEZWxldGVSb3coJGV2ZW50KVwiIChjbGlja1ZpZXcpPVwib25DbGlja1ZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0FkZCk9XCJvbkNsaWNrUm93QWRkKCRldmVudClcIiAoY2xpY2tSb3cpPVwib25DbGlja1JvdygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV4cGFuZENvbGxhcHNlKT1cIm9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjb21wbGV4RGV0YWlsQ2xpY2tlZCk9XCJDb21wbGV4RGV0YWlsQ2xpY2tlZCgkZXZlbnQpXCIgW2lzUm93VW5jaGVja2VkXT1cImlzUm93VW5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgKENoZWNrYm94U2VsZWN0KT1cImlzQ2hlY2tib3hTZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG5cbiAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZGlzcGxheU1vZGU9XCJmbGF0XCIgbXVsdGkgY2xhc3M9XCJtYXQtdGFibGVcIiAqbmdJZj1cImdyaWRPcHRpb25zLmlzQWNjb3JkaW9uVGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nSWY9XCIhZ3JpZE9wdGlvbnMuaGlkZVRhYmxlSGVhZGVyXCIgY2xhc3M9XCJtYXNrLWJvZHkgaGVhZGVyLXBhbmVsXCIgaGlkZVRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciAoa2V5ZG93bi5FbnRlcik9XCIkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sbGFwc2VkSGVpZ2h0XT1cIidhdXRvJ1wiIFtleHBhbmRlZEhlaWdodF09XCInYXV0bydcIiBjbGFzcz1cIm1hdC1yb3cgaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtY2hlY2tib3hSb3dcIiAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlICAmJiAhaXNTaW5nbGVTZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIiBbKG5nTW9kZWwpXT1cIm1hc3RlclNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2aWV3Q29sdW1uIG9mIHZpZXdDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2aWV3Q29sdW1uLmlzVmlzaWJsZVwiIHNjb3BlPVwiY29sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsIGQtaW5saW5lLWJsb2NrXCIgW25nQ2xhc3NdPVwidmlld0NvbHVtbi5jdXN0b21Dc3NDbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1kYXRhLWNvbC1maWx0ZXIgY2xhc3M9XCJmaWx0ZXItY29sdW1uXCIgKm5nSWY9XCJpc0ZpbHRlckVuYWJsZSh2aWV3Q29sdW1uLnByb3ApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbHRlcmVkQ29sdW1uJzogaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsdGVyQ2xpY2tlZCk9XCJvbkZpbHRlckNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbl09XCJ2aWV3Q29sdW1uLmZpbHRlck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bWJlck9mVGFibGVSZWZyZXNoXT1cIm51bWJlck9mVGFibGVSZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWRhdGEtY29sLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwibm9uRmlsdGVyQ2xhc3NOYW1lKHZpZXdDb2x1bW4ucHJvcClcIiBjbGFzcz1cInRhYmxlIC5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0VGFibGUodmlld0NvbHVtbilcIj57eyB2aWV3Q29sdW1uLmhlYWRlciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydC1pY29uXCIgKm5nSWY9XCJzb3J0ZWRDb2x1bW5bdmlld0NvbHVtbi5wcm9wXT09J0Rvd25Tb3J0ZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd19kb3dud2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtaWNvblwiICpuZ0lmPVwic29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF09PSdVcFNvcnRlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93X3Vwd2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzTG9hZGluZyQuZ2V0VmFsdWUoKVwiIGFwcC1kYXRhLXRhYmxlLWJvZHkgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwicm93cyB8IGNvbHVtbkZpbHRlciA6IGZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCkgOiBjb2x1bW5zOiBncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbHVtbnNdPVwidmlld0NvbHVtbnNcIiBbY2FuSW5saW5lRWRpdF09XCJjYW5JbmxpbmVFZGl0XCIgW2lzVHJlZUdyaWRdPVwiaXNUcmVlR3JpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXddPVwiaXNPbmx5Vmlld1wiIFtzZWFyY2hlZFJvd0NvdW50JF09XCJzZWFyY2hlZFJvd0NvdW50JFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXdSb3ddPVwiaXNPbmx5Vmlld1Jvd1wiIFtpc0RlbGV0ZURpc2FibGVkXT1cImlzRGVsZXRlRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwic2VhcmNoVmFsdWUudmFsdWVcIiBbcGFnaW5hdGlvblBhcmFtc109XCJwYWdpbmF0aW9uUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzRW1wdHlSb3ddPVwiaGFzRW1wdHlSb3dcIiBbaXNFZGl0aW5nXT1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUm93U2VsZWN0aW9uRW5hYmxlXT1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgW3NlYXJjaENvbHVtbnNdPVwic2VhcmNoQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzQ2xvbmVWaXNpYmxlXT1cImlzQ2xvbmVWaXNpYmxlXCIgKGNsaWNrRWRpdCk9XCJvbkNsaWNrRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0RXhwYW5zaW9uUGFuZWxDbGlja2VkKT1cIm9uRXhwYW5zaW9uUGFuZWxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tDbG9uZSk9XCJvbkNsaWNrQ2xvbmUoJGV2ZW50KVwiIChjbGlja0FjdGlvbik9XCJvbkNsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0VkaXRDYW5jZWwpPVwib25DbGlja0VkaXRDYW5jZWwoJGV2ZW50KVwiIChjbGlja0VkaXRTYXZlKT1cIm9uQ2xpY2tFZGl0U2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tEZWxldGUpPVwib25DbGlja0RlbGV0ZVJvdygkZXZlbnQpXCIgKGNsaWNrVmlldyk9XCJvbkNsaWNrVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tBZGQpPVwib25DbGlja1Jvd0FkZCgkZXZlbnQpXCIgKGNsaWNrUm93KT1cIm9uQ2xpY2tSb3coJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV4cGFuZENvbGxhcHNlKT1cIm9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXhEZXRhaWxDbGlja2VkKT1cIkNvbXBsZXhEZXRhaWxDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDaGVja2JveFNlbGVjdCk9XCJpc0NoZWNrYm94U2VsZWN0KCRldmVudClcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzZWN0aW9uICpuZ0lmPVwiaGFzUGFnaW5hdGlvbiAmJiBzZWxlY3Rpb25cIiBjbGFzcz1cInBhZ2luYXRpb25cIj5cbiAgICAgICAgICAgIDxhcHAtZGF0YS1wYWdpbmF0aW9uIFtzZWxlY3Rpb25Db3VudF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXCIgY2xhc3M9XCJ0YWJsZS1wYWdpbmF0aW9uLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsndHJhbnNwYXJlbnQtdGFibGUtZGVzaWduJzogZ3JpZE9wdGlvbnMuaXNUcmFuc3BhcmVudFRhYmxlRGVzaWdufVwiICBbdG90YWxSb3dDb3VudCRdPVwidGhpcy5zZWFyY2hlZFJvd0NvdW50JFwiXG4gICAgICAgICAgICAgICAgW2NvdW50XT1cImNvdW50XCIgW3BhZ2VdPVwicGFnaW5hdGlvblBhcmFtcy5jdXJyZW50UGFnZVwiIFtzaXplXT1cInBhZ2luYXRpb25QYXJhbXMucGFnZVNpemVcIiBbaGFzRHJvcGRvd25TdHlsZVBhZ2VTaXplXT1cImdyaWRPcHRpb25zLmhhc0Ryb3Bkb3duU3R5bGVQYWdlU2l6ZSA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlUGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtZGF0YS1wYWdpbmF0aW9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD4iXX0=