class ZkXmlELParser extends ClassXmlFlowELParser {

	private final ZkParserHelper zkParserHelper;

	public ZkXmlELParser() {
		LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();

		try {
			ZkParserVO zkParserVO = null;
			if (MapUtil.isNotEmpty((liteflowConfig.getRuleSourceExtDataMap()))) {
				zkParserVO = BeanUtil.toBean(liteflowConfig.getRuleSourceExtDataMap(), ZkParserVO.class,
						CopyOptions.create());
			}
			else if (StrUtil.isNotBlank(liteflowConfig.getRuleSourceExtData())) {
				zkParserVO = JsonUtil.parseObject(liteflowConfig.getRuleSourceExtData(), ZkParserVO.class);
			}

			if (Objects.isNull(zkParserVO)) {
				throw new ZkException("rule-source-ext-data is empty");
			}

			if (StrUtil.isBlank(zkParserVO.getChainPath())) {
				throw new ZkException("You must configure the chainPath property");
			}
			if (StrUtil.isBlank(zkParserVO.getConnectStr())) {
				throw new ZkException("zk connect string is empty");
			}

			zkParserHelper = new ZkParserHelper(zkParserVO);
		}
		catch (Exception e) {
			throw new ZkException(e.getMessage());
		}
	}

	@Override
	public String parseCustom() {<FILL_FUNCTION_BODY>}

}

		try {
			String content = zkParserHelper.getContent();

			FlowInitHook.addHook(() -> {
				zkParserHelper.listenZkNode();
				return true;
			});

			return content;
		}
		catch (Exception e) {
			throw new ZkException(e.getMessage());
		}
	
<methods>public non-sealed void <init>() ,public abstract java.lang.String parseCustom() ,public void parseMain(List<java.lang.String>) throws java.lang.Exception<variables>