{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,8 +1,8 @@\n-Zip file size: 492874 bytes, number of entries: 374\n+Zip file size: 495298 bytes, number of entries: 374\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 com/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 com/alibaba/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 com/alibaba/dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 com/alibaba/dubbo/common/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 com/alibaba/dubbo/common/extension/\n@@ -73,148 +73,148 @@\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-common/\n -rw-r--r--  2.0 unx     1875 b- defN 20-Apr-01 08:04 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 20-Apr-01 08:04 META-INF/LICENSE\n -rw-r--r--  2.0 unx      169 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n -rw-r--r--  2.0 unx     1487 b- defN 20-Apr-01 08:04 com/alibaba/dubbo/common/extension/Activate.java\n--rw-r--r--  2.0 unx     2623 b- defN 20-Apr-01 08:04 com/alibaba/dubbo/config/annotation/Reference.java\n--rw-r--r--  2.0 unx     2711 b- defN 20-Apr-01 08:04 com/alibaba/dubbo/config/annotation/Service.java\n--rw-r--r--  2.0 unx     4343 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/BaseServiceMetadata.java\n--rw-r--r--  2.0 unx     1362 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Experimental.java\n+-rw-r--r--  2.0 unx     2736 b- defN 20-Apr-01 08:04 com/alibaba/dubbo/config/annotation/Reference.java\n+-rw-r--r--  2.0 unx     2831 b- defN 20-Apr-01 08:04 com/alibaba/dubbo/config/annotation/Service.java\n+-rw-r--r--  2.0 unx     4480 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/BaseServiceMetadata.java\n+-rw-r--r--  2.0 unx     1399 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Experimental.java\n -rw-r--r--  2.0 unx     2475 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Extension.java\n -rw-r--r--  2.0 unx     1183 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Node.java\n -rw-r--r--  2.0 unx     8858 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Parameters.java\n -rw-r--r--  2.0 unx     1000 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Resetable.java\n -rw-r--r--  2.0 unx    70537 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/URL.java\n -rw-r--r--  2.0 unx    13668 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/URLBuilder.java\n--rw-r--r--  2.0 unx    13473 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/URLStrParser.java\n--rw-r--r--  2.0 unx     9765 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Version.java\n+-rw-r--r--  2.0 unx    13840 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/URLStrParser.java\n+-rw-r--r--  2.0 unx    10043 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/Version.java\n -rw-r--r--  2.0 unx     1364 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/beanutil/JavaBeanAccessor.java\n--rw-r--r--  2.0 unx     6309 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/beanutil/JavaBeanDescriptor.java\n--rw-r--r--  2.0 unx    20174 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/beanutil/JavaBeanSerializeUtil.java\n--rw-r--r--  2.0 unx    13023 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/ClassGenerator.java\n--rw-r--r--  2.0 unx     3506 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/CustomizedLoaderClassPath.java\n+-rw-r--r--  2.0 unx     6516 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/beanutil/JavaBeanDescriptor.java\n+-rw-r--r--  2.0 unx    20660 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/beanutil/JavaBeanSerializeUtil.java\n+-rw-r--r--  2.0 unx    13410 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/ClassGenerator.java\n+-rw-r--r--  2.0 unx     3611 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/CustomizedLoaderClassPath.java\n -rw-r--r--  2.0 unx     8215 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/Mixin.java\n -rw-r--r--  2.0 unx     1182 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/NoSuchMethodException.java\n -rw-r--r--  2.0 unx     1190 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/NoSuchPropertyException.java\n -rw-r--r--  2.0 unx    12109 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/Proxy.java\n -rw-r--r--  2.0 unx    17928 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/bytecode/Wrapper.java\n -rw-r--r--  2.0 unx     1255 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/Compiler.java\n -rw-r--r--  2.0 unx     2843 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/support/AbstractCompiler.java\n -rw-r--r--  2.0 unx     1843 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java\n -rw-r--r--  2.0 unx    15556 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/support/ClassUtils.java\n -rw-r--r--  2.0 unx     5050 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/support/CtClassBuilder.java\n -rw-r--r--  2.0 unx     3504 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/support/JavassistCompiler.java\n -rw-r--r--  2.0 unx    11461 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/compiler/support/JdkCompiler.java\n--rw-r--r--  2.0 unx     4350 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/CompositeConfiguration.java\n--rw-r--r--  2.0 unx     6853 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/Configuration.java\n--rw-r--r--  2.0 unx     4779 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/ConfigurationUtils.java\n--rw-r--r--  2.0 unx    10005 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/Environment.java\n--rw-r--r--  2.0 unx     1267 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/EnvironmentConfiguration.java\n--rw-r--r--  2.0 unx     1904 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/InmemoryConfiguration.java\n--rw-r--r--  2.0 unx     1201 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/OrderedPropertiesProvider.java\n--rw-r--r--  2.0 unx     2636 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/PropertiesConfiguration.java\n--rw-r--r--  2.0 unx     1197 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/SystemConfiguration.java\n--rw-r--r--  2.0 unx     9806 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java\n--rw-r--r--  2.0 unx     1739 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java\n--rw-r--r--  2.0 unx     1096 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/ConfigChangeType.java\n--rw-r--r--  2.0 unx     2827 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/ConfigChangedEvent.java\n--rw-r--r--  2.0 unx     1297 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/ConfigurationListener.java\n--rw-r--r--  2.0 unx     1095 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/Constants.java\n--rw-r--r--  2.0 unx     9201 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java\n--rw-r--r--  2.0 unx     1987 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java\n--rw-r--r--  2.0 unx     7035 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/TreePathDynamicConfiguration.java\n--rw-r--r--  2.0 unx    22570 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java\n--rw-r--r--  2.0 unx     1487 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactory.java\n--rw-r--r--  2.0 unx     2215 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java\n--rw-r--r--  2.0 unx     1316 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfigurationFactory.java\n--rw-r--r--  2.0 unx     3914 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java\n--rw-r--r--  2.0 unx    10256 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/CommonConstants.java\n--rw-r--r--  2.0 unx      959 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/FilterConstants.java\n--rw-r--r--  2.0 unx     1071 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/QosConstants.java\n--rw-r--r--  2.0 unx     3469 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/RegistryConstants.java\n--rw-r--r--  2.0 unx      950 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/RemotingConstants.java\n--rw-r--r--  2.0 unx      949 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/context/FrameworkExt.java\n--rw-r--r--  2.0 unx     1469 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/context/Lifecycle.java\n--rw-r--r--  2.0 unx     1146 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/context/LifecycleAdapter.java\n--rw-r--r--  2.0 unx     3680 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/Converter.java\n--rw-r--r--  2.0 unx     1041 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringConverter.java\n--rw-r--r--  2.0 unx     1330 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToBooleanConverter.java\n--rw-r--r--  2.0 unx     1300 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToCharArrayConverter.java\n--rw-r--r--  2.0 unx     1498 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToCharacterConverter.java\n--rw-r--r--  2.0 unx     1326 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToDoubleConverter.java\n--rw-r--r--  2.0 unx     1320 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToFloatConverter.java\n--rw-r--r--  2.0 unx     1326 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToIntegerConverter.java\n--rw-r--r--  2.0 unx     1316 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToLongConverter.java\n--rw-r--r--  2.0 unx     1267 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToOptionalConverter.java\n--rw-r--r--  2.0 unx     1321 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToShortConverter.java\n--rw-r--r--  2.0 unx     1106 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToStringConverter.java\n--rw-r--r--  2.0 unx     3377 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/MultiValueConverter.java\n--rw-r--r--  2.0 unx     1908 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java\n--rw-r--r--  2.0 unx     1295 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java\n--rw-r--r--  2.0 unx     1336 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java\n--rw-r--r--  2.0 unx     1238 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java\n--rw-r--r--  2.0 unx     1215 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java\n--rw-r--r--  2.0 unx     3106 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java\n--rw-r--r--  2.0 unx     1208 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToListConverter.java\n--rw-r--r--  2.0 unx     2163 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToMultiValueConverter.java\n--rw-r--r--  2.0 unx     1265 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java\n--rw-r--r--  2.0 unx     1239 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java\n--rw-r--r--  2.0 unx     1199 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToSetConverter.java\n--rw-r--r--  2.0 unx     1225 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java\n--rw-r--r--  2.0 unx     1291 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java\n+-rw-r--r--  2.0 unx     4477 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/CompositeConfiguration.java\n+-rw-r--r--  2.0 unx     7032 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/Configuration.java\n+-rw-r--r--  2.0 unx     4912 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/ConfigurationUtils.java\n+-rw-r--r--  2.0 unx    10238 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/Environment.java\n+-rw-r--r--  2.0 unx     1302 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/EnvironmentConfiguration.java\n+-rw-r--r--  2.0 unx     1968 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/InmemoryConfiguration.java\n+-rw-r--r--  2.0 unx     1245 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/OrderedPropertiesProvider.java\n+-rw-r--r--  2.0 unx     2700 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/PropertiesConfiguration.java\n+-rw-r--r--  2.0 unx     1230 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/SystemConfiguration.java\n+-rw-r--r--  2.0 unx    10112 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java\n+-rw-r--r--  2.0 unx     1782 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java\n+-rw-r--r--  2.0 unx     1133 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/ConfigChangeType.java\n+-rw-r--r--  2.0 unx     2921 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/ConfigChangedEvent.java\n+-rw-r--r--  2.0 unx     1330 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/ConfigurationListener.java\n+-rw-r--r--  2.0 unx     1120 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/Constants.java\n+-rw-r--r--  2.0 unx     9446 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java\n+-rw-r--r--  2.0 unx     2033 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java\n+-rw-r--r--  2.0 unx     7221 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/TreePathDynamicConfiguration.java\n+-rw-r--r--  2.0 unx    23176 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java\n+-rw-r--r--  2.0 unx     1522 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactory.java\n+-rw-r--r--  2.0 unx     2287 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java\n+-rw-r--r--  2.0 unx     1349 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfigurationFactory.java\n+-rw-r--r--  2.0 unx     4015 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java\n+-rw-r--r--  2.0 unx    10649 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/CommonConstants.java\n+-rw-r--r--  2.0 unx      983 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/FilterConstants.java\n+-rw-r--r--  2.0 unx     1103 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/QosConstants.java\n+-rw-r--r--  2.0 unx     3591 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/RegistryConstants.java\n+-rw-r--r--  2.0 unx      976 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/constants/RemotingConstants.java\n+-rw-r--r--  2.0 unx      973 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/context/FrameworkExt.java\n+-rw-r--r--  2.0 unx     1517 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/context/Lifecycle.java\n+-rw-r--r--  2.0 unx     1181 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/context/LifecycleAdapter.java\n+-rw-r--r--  2.0 unx     3788 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/Converter.java\n+-rw-r--r--  2.0 unx     1068 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringConverter.java\n+-rw-r--r--  2.0 unx     1368 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToBooleanConverter.java\n+-rw-r--r--  2.0 unx     1339 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToCharArrayConverter.java\n+-rw-r--r--  2.0 unx     1542 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToCharacterConverter.java\n+-rw-r--r--  2.0 unx     1365 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToDoubleConverter.java\n+-rw-r--r--  2.0 unx     1358 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToFloatConverter.java\n+-rw-r--r--  2.0 unx     1364 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToIntegerConverter.java\n+-rw-r--r--  2.0 unx     1355 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToLongConverter.java\n+-rw-r--r--  2.0 unx     1307 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToOptionalConverter.java\n+-rw-r--r--  2.0 unx     1360 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToShortConverter.java\n+-rw-r--r--  2.0 unx     1136 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/StringToStringConverter.java\n+-rw-r--r--  2.0 unx     3469 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/MultiValueConverter.java\n+-rw-r--r--  2.0 unx     1968 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java\n+-rw-r--r--  2.0 unx     1328 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java\n+-rw-r--r--  2.0 unx     1370 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java\n+-rw-r--r--  2.0 unx     1271 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java\n+-rw-r--r--  2.0 unx     1248 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java\n+-rw-r--r--  2.0 unx     3186 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java\n+-rw-r--r--  2.0 unx     1241 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToListConverter.java\n+-rw-r--r--  2.0 unx     2224 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToMultiValueConverter.java\n+-rw-r--r--  2.0 unx     1299 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java\n+-rw-r--r--  2.0 unx     1273 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java\n+-rw-r--r--  2.0 unx     1232 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToSetConverter.java\n+-rw-r--r--  2.0 unx     1258 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java\n+-rw-r--r--  2.0 unx     1324 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java\n -rw-r--r--  2.0 unx     3450 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/Activate.java\n--rw-r--r--  2.0 unx     2631 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/Adaptive.java\n--rw-r--r--  2.0 unx    15367 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/AdaptiveClassCodeGenerator.java\n+-rw-r--r--  2.0 unx     2690 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/Adaptive.java\n+-rw-r--r--  2.0 unx    15763 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/AdaptiveClassCodeGenerator.java\n -rw-r--r--  2.0 unx     1209 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/DisableInject.java\n--rw-r--r--  2.0 unx     1165 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java\n--rw-r--r--  2.0 unx     1220 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/DubboLoadingStrategy.java\n+-rw-r--r--  2.0 unx     1200 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java\n+-rw-r--r--  2.0 unx     1262 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/DubboLoadingStrategy.java\n -rw-r--r--  2.0 unx     1146 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/ExtensionFactory.java\n--rw-r--r--  2.0 unx    40175 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/ExtensionLoader.java\n--rw-r--r--  2.0 unx     1422 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/LoadingStrategy.java\n+-rw-r--r--  2.0 unx    41222 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/ExtensionLoader.java\n+-rw-r--r--  2.0 unx     1464 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/LoadingStrategy.java\n -rw-r--r--  2.0 unx     2354 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/SPI.java\n--rw-r--r--  2.0 unx     1225 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/ServicesLoadingStrategy.java\n--rw-r--r--  2.0 unx     1296 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/Wrapper.java\n+-rw-r--r--  2.0 unx     1266 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/ServicesLoadingStrategy.java\n+-rw-r--r--  2.0 unx     1333 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/Wrapper.java\n -rw-r--r--  2.0 unx     2048 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/factory/AdaptiveExtensionFactory.java\n -rw-r--r--  2.0 unx     1551 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/factory/SpiExtensionFactory.java\n -rw-r--r--  2.0 unx     4564 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/support/ActivateComparator.java\n--rw-r--r--  2.0 unx     3066 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/support/WrapperComparator.java\n--rw-r--r--  2.0 unx     2341 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/Predicates.java\n--rw-r--r--  2.0 unx     2683 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/Streams.java\n--rw-r--r--  2.0 unx     1592 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/ThrowableAction.java\n--rw-r--r--  2.0 unx     2032 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/ThrowableConsumer.java\n--rw-r--r--  2.0 unx     2181 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/ThrowableFunction.java\n--rw-r--r--  2.0 unx     1561 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/infra/InfraAdapter.java\n--rw-r--r--  2.0 unx     1284 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/infra/support/CmdbAdapter.java\n--rw-r--r--  2.0 unx     2901 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/infra/support/EnvironmentAdapter.java\n--rw-r--r--  2.0 unx    25880 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/Bytes.java\n--rw-r--r--  2.0 unx     6914 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/StreamUtils.java\n--rw-r--r--  2.0 unx     3051 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeByteArrayInputStream.java\n--rw-r--r--  2.0 unx     2958 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeByteArrayOutputStream.java\n+-rw-r--r--  2.0 unx     3160 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/extension/support/WrapperComparator.java\n+-rw-r--r--  2.0 unx     2415 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/Predicates.java\n+-rw-r--r--  2.0 unx     2754 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/Streams.java\n+-rw-r--r--  2.0 unx     1643 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/ThrowableAction.java\n+-rw-r--r--  2.0 unx     2098 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/ThrowableConsumer.java\n+-rw-r--r--  2.0 unx     2252 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/function/ThrowableFunction.java\n+-rw-r--r--  2.0 unx     1607 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/infra/InfraAdapter.java\n+-rw-r--r--  2.0 unx     1323 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/infra/support/CmdbAdapter.java\n+-rw-r--r--  2.0 unx     2973 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/infra/support/EnvironmentAdapter.java\n+-rw-r--r--  2.0 unx    26815 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/Bytes.java\n+-rw-r--r--  2.0 unx     7145 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/StreamUtils.java\n+-rw-r--r--  2.0 unx     3169 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeByteArrayInputStream.java\n+-rw-r--r--  2.0 unx     3059 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeByteArrayOutputStream.java\n -rw-r--r--  2.0 unx     3173 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeStringReader.java\n--rw-r--r--  2.0 unx     2773 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeStringWriter.java\n--rw-r--r--  2.0 unx    17621 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/GenericJSONConverter.java\n+-rw-r--r--  2.0 unx     2879 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/io/UnsafeStringWriter.java\n+-rw-r--r--  2.0 unx    18149 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/GenericJSONConverter.java\n -rw-r--r--  2.0 unx    13189 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/J2oVisitor.java\n -rw-r--r--  2.0 unx    27300 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSON.java\n -rw-r--r--  2.0 unx     4912 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONArray.java\n -rw-r--r--  2.0 unx     1461 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONConverter.java\n -rw-r--r--  2.0 unx     1198 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONNode.java\n -rw-r--r--  2.0 unx     5627 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONObject.java\n -rw-r--r--  2.0 unx     2214 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONReader.java\n -rw-r--r--  2.0 unx     2247 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONToken.java\n -rw-r--r--  2.0 unx     2796 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONVisitor.java\n -rw-r--r--  2.0 unx     8159 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/JSONWriter.java\n -rw-r--r--  2.0 unx     1161 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/ParseException.java\n--rw-r--r--  2.0 unx    29369 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/Yylex.java\n--rw-r--r--  2.0 unx     2306 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/lang/Prioritized.java\n--rw-r--r--  2.0 unx     1160 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/lang/ShutdownHookCallback.java\n--rw-r--r--  2.0 unx     2336 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/lang/ShutdownHookCallbacks.java\n+-rw-r--r--  2.0 unx    30215 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/json/Yylex.java\n+-rw-r--r--  2.0 unx     2382 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/lang/Prioritized.java\n+-rw-r--r--  2.0 unx     1195 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/lang/ShutdownHookCallback.java\n+-rw-r--r--  2.0 unx     2407 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/lang/ShutdownHookCallbacks.java\n -rw-r--r--  2.0 unx     1214 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/Level.java\n--rw-r--r--  2.0 unx     3800 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/Logger.java\n+-rw-r--r--  2.0 unx     3970 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/Logger.java\n -rw-r--r--  2.0 unx     1861 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/LoggerAdapter.java\n -rw-r--r--  2.0 unx     5253 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/LoggerFactory.java\n -rw-r--r--  2.0 unx     3342 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/jcl/JclLogger.java\n -rw-r--r--  2.0 unx     1784 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java\n -rw-r--r--  2.0 unx     3355 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/jdk/JdkLogger.java\n -rw-r--r--  2.0 unx     4860 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/jdk/JdkLoggerAdapter.java\n -rw-r--r--  2.0 unx     3681 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/log4j/Log4jLogger.java\n@@ -226,151 +226,151 @@\n -rw-r--r--  2.0 unx     5045 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/logger/support/FailsafeLogger.java\n -rw-r--r--  2.0 unx     1885 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/status/Status.java\n -rw-r--r--  2.0 unx     1074 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/status/StatusChecker.java\n -rw-r--r--  2.0 unx     2215 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/status/support/LoadStatusChecker.java\n -rw-r--r--  2.0 unx     1793 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/status/support/MemoryStatusChecker.java\n -rw-r--r--  2.0 unx     2004 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/status/support/StatusUtils.java\n -rw-r--r--  2.0 unx     1280 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/store/DataStore.java\n--rw-r--r--  2.0 unx     2247 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/store/support/SimpleDataStore.java\n--rw-r--r--  2.0 unx     1849 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalRunnable.java\n+-rw-r--r--  2.0 unx     2312 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/store/support/SimpleDataStore.java\n+-rw-r--r--  2.0 unx     1902 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalRunnable.java\n -rw-r--r--  2.0 unx     2445 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalThread.java\n--rw-r--r--  2.0 unx     6904 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalThreadLocal.java\n--rw-r--r--  2.0 unx     5464 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalThreadLocalMap.java\n--rw-r--r--  2.0 unx     1630 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/NamedInternalThreadFactory.java\n--rw-r--r--  2.0 unx     1355 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/ThreadPool.java\n--rw-r--r--  2.0 unx     6805 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/ThreadlessExecutor.java\n--rw-r--r--  2.0 unx     2316 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/concurrent/ScheduledCompletableFuture.java\n--rw-r--r--  2.0 unx     1243 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/event/ThreadPoolExhaustedEvent.java\n--rw-r--r--  2.0 unx     7728 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java\n--rw-r--r--  2.0 unx     2329 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java\n--rw-r--r--  2.0 unx     2042 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/manager/Ring.java\n+-rw-r--r--  2.0 unx     7102 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalThreadLocal.java\n+-rw-r--r--  2.0 unx     5631 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/InternalThreadLocalMap.java\n+-rw-r--r--  2.0 unx     1677 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadlocal/NamedInternalThreadFactory.java\n+-rw-r--r--  2.0 unx     1397 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/ThreadPool.java\n+-rw-r--r--  2.0 unx     7007 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/ThreadlessExecutor.java\n+-rw-r--r--  2.0 unx     2381 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/concurrent/ScheduledCompletableFuture.java\n+-rw-r--r--  2.0 unx     1281 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/event/ThreadPoolExhaustedEvent.java\n+-rw-r--r--  2.0 unx     7903 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java\n+-rw-r--r--  2.0 unx     2400 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java\n+-rw-r--r--  2.0 unx     2108 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/manager/Ring.java\n -rw-r--r--  2.0 unx     5991 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/AbortPolicyWithReport.java\n -rw-r--r--  2.0 unx     3197 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/cached/CachedThreadPool.java\n--rw-r--r--  2.0 unx     3009 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/eager/EagerThreadPool.java\n+-rw-r--r--  2.0 unx     3074 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/eager/EagerThreadPool.java\n -rw-r--r--  2.0 unx     3262 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/eager/EagerThreadPoolExecutor.java\n -rw-r--r--  2.0 unx     2951 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/eager/TaskQueue.java\n -rw-r--r--  2.0 unx     2723 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/fixed/FixedThreadPool.java\n--rw-r--r--  2.0 unx     2933 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/limited/LimitedThreadPool.java\n--rw-r--r--  2.0 unx    31161 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/timer/HashedWheelTimer.java\n+-rw-r--r--  2.0 unx     2992 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/threadpool/support/limited/LimitedThreadPool.java\n+-rw-r--r--  2.0 unx    31975 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/timer/HashedWheelTimer.java\n -rw-r--r--  2.0 unx     1692 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/timer/Timeout.java\n -rw-r--r--  2.0 unx     1897 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/timer/Timer.java\n -rw-r--r--  2.0 unx     1175 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/timer/TimerTask.java\n--rw-r--r--  2.0 unx    21253 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/AnnotationUtils.java\n--rw-r--r--  2.0 unx     2358 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ArrayUtils.java\n+-rw-r--r--  2.0 unx    21735 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/AnnotationUtils.java\n+-rw-r--r--  2.0 unx     2437 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ArrayUtils.java\n -rw-r--r--  2.0 unx     1438 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Assert.java\n -rw-r--r--  2.0 unx     4681 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/AtomicPositiveInteger.java\n -rw-r--r--  2.0 unx     4986 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/CIDRUtils.java\n--rw-r--r--  2.0 unx     1296 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/CharSequenceComparator.java\n--rw-r--r--  2.0 unx     5560 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ClassHelper.java\n--rw-r--r--  2.0 unx    17955 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ClassUtils.java\n+-rw-r--r--  2.0 unx     1333 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/CharSequenceComparator.java\n+-rw-r--r--  2.0 unx     5713 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ClassHelper.java\n+-rw-r--r--  2.0 unx    18451 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ClassUtils.java\n -rw-r--r--  2.0 unx    11618 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/CollectionUtils.java\n--rw-r--r--  2.0 unx     9054 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/CompatibleTypeUtils.java\n+-rw-r--r--  2.0 unx     9283 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/CompatibleTypeUtils.java\n -rw-r--r--  2.0 unx     4553 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ConcurrentHashSet.java\n -rw-r--r--  2.0 unx    12213 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ConfigUtils.java\n--rw-r--r--  2.0 unx     2212 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/DefaultPage.java\n+-rw-r--r--  2.0 unx     2294 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/DefaultPage.java\n -rw-r--r--  2.0 unx     2063 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/DubboAppender.java\n--rw-r--r--  2.0 unx     5181 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ExecutorUtil.java\n--rw-r--r--  2.0 unx     4929 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/FieldUtils.java\n+-rw-r--r--  2.0 unx     5321 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ExecutorUtil.java\n+-rw-r--r--  2.0 unx     5071 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/FieldUtils.java\n -rw-r--r--  2.0 unx     1091 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Holder.java\n -rw-r--r--  2.0 unx     8471 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/IOUtils.java\n -rw-r--r--  2.0 unx     4172 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/JVMUtil.java\n--rw-r--r--  2.0 unx     8550 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/LFUCache.java\n+-rw-r--r--  2.0 unx     8835 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/LFUCache.java\n -rw-r--r--  2.0 unx     3010 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/LRUCache.java\n -rw-r--r--  2.0 unx     3498 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Log.java\n -rw-r--r--  2.0 unx     4289 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/LogHelper.java\n -rw-r--r--  2.0 unx     4258 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/LogUtil.java\n--rw-r--r--  2.0 unx     2400 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/MemberUtils.java\n--rw-r--r--  2.0 unx     2361 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/MethodComparator.java\n--rw-r--r--  2.0 unx    14795 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/MethodUtils.java\n+-rw-r--r--  2.0 unx     2461 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/MemberUtils.java\n+-rw-r--r--  2.0 unx     2432 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/MethodComparator.java\n+-rw-r--r--  2.0 unx    15184 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/MethodUtils.java\n -rw-r--r--  2.0 unx     2139 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/NamedThreadFactory.java\n -rw-r--r--  2.0 unx    24007 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/NetUtils.java\n--rw-r--r--  2.0 unx     2067 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Page.java\n--rw-r--r--  2.0 unx     2394 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/PathUtils.java\n+-rw-r--r--  2.0 unx     2154 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Page.java\n+-rw-r--r--  2.0 unx     2468 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/PathUtils.java\n -rw-r--r--  2.0 unx    33568 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/PojoUtils.java\n--rw-r--r--  2.0 unx    47389 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ReflectUtils.java\n--rw-r--r--  2.0 unx     5895 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/SerializeClassChecker.java\n--rw-r--r--  2.0 unx     4554 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ServiceAnnotationResolver.java\n--rw-r--r--  2.0 unx     3261 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Stack.java\n--rw-r--r--  2.0 unx     2588 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/StringConstantFieldValuePredicate.java\n+-rw-r--r--  2.0 unx    48784 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ReflectUtils.java\n+-rw-r--r--  2.0 unx     6045 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/SerializeClassChecker.java\n+-rw-r--r--  2.0 unx     4686 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/ServiceAnnotationResolver.java\n+-rw-r--r--  2.0 unx     3403 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Stack.java\n+-rw-r--r--  2.0 unx     2655 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/StringConstantFieldValuePredicate.java\n -rw-r--r--  2.0 unx    37744 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/StringUtils.java\n--rw-r--r--  2.0 unx     8696 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/TypeUtils.java\n+-rw-r--r--  2.0 unx     8920 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/TypeUtils.java\n -rw-r--r--  2.0 unx    25423 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/UrlUtils.java\n--rw-r--r--  2.0 unx     9926 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Utf8Utils.java\n--rw-r--r--  2.0 unx    25642 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractConfig.java\n--rw-r--r--  2.0 unx    24311 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractInterfaceConfig.java\n--rw-r--r--  2.0 unx     4661 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractMethodConfig.java\n--rw-r--r--  2.0 unx     5621 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractReferenceConfig.java\n--rw-r--r--  2.0 unx     6722 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractServiceConfig.java\n--rw-r--r--  2.0 unx    13583 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ApplicationConfig.java\n--rw-r--r--  2.0 unx     2126 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ArgumentConfig.java\n--rw-r--r--  2.0 unx     8859 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConfigCenterConfig.java\n--rw-r--r--  2.0 unx     2849 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/Constants.java\n--rw-r--r--  2.0 unx     3568 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConsumerConfig.java\n--rw-r--r--  2.0 unx     6022 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MetadataReportConfig.java\n--rw-r--r--  2.0 unx     8564 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MethodConfig.java\n--rw-r--r--  2.0 unx     1626 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MetricsConfig.java\n--rw-r--r--  2.0 unx     3573 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ModuleConfig.java\n--rw-r--r--  2.0 unx     3712 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MonitorConfig.java\n--rw-r--r--  2.0 unx    13245 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ProtocolConfig.java\n--rw-r--r--  2.0 unx    10388 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ProviderConfig.java\n--rw-r--r--  2.0 unx     8359 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ReferenceConfigBase.java\n--rw-r--r--  2.0 unx    13074 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/RegistryConfig.java\n--rw-r--r--  2.0 unx    13449 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ServiceConfigBase.java\n--rw-r--r--  2.0 unx     7142 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/SslConfig.java\n--rw-r--r--  2.0 unx     1444 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Argument.java\n--rw-r--r--  2.0 unx     7538 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/DubboReference.java\n--rw-r--r--  2.0 unx     6794 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/DubboService.java\n--rw-r--r--  2.0 unx     1873 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Method.java\n--rw-r--r--  2.0 unx     7067 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Reference.java\n--rw-r--r--  2.0 unx     6844 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Service.java\n--rw-r--r--  2.0 unx     1937 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/context/ConfigConfigurationAdapter.java\n--rw-r--r--  2.0 unx    18420 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/context/ConfigManager.java\n--rw-r--r--  2.0 unx     2038 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/support/Parameter.java\n--rw-r--r--  2.0 unx     5846 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/AbstractEventDispatcher.java\n--rw-r--r--  2.0 unx     1371 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/ConditionalEventListener.java\n--rw-r--r--  2.0 unx     1124 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/DirectEventDispatcher.java\n--rw-r--r--  2.0 unx     1566 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/Event.java\n--rw-r--r--  2.0 unx     2268 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/EventDispatcher.java\n--rw-r--r--  2.0 unx     4714 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/EventListener.java\n--rw-r--r--  2.0 unx     1123 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/GenericEvent.java\n--rw-r--r--  2.0 unx     4621 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/GenericEventListener.java\n--rw-r--r--  2.0 unx     5306 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/Listenable.java\n--rw-r--r--  2.0 unx     1213 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/ParallelEventDispatcher.java\n--rw-r--r--  2.0 unx      996 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ApplicationInitListener.java\n--rw-r--r--  2.0 unx     4776 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ApplicationModel.java\n--rw-r--r--  2.0 unx     2617 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/AsyncMethodInfo.java\n--rw-r--r--  2.0 unx      964 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/BuiltinServiceDetector.java\n--rw-r--r--  2.0 unx     3054 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ConsumerMethodModel.java\n--rw-r--r--  2.0 unx     7069 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ConsumerModel.java\n--rw-r--r--  2.0 unx     2992 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/MethodDescriptor.java\n--rw-r--r--  2.0 unx     2673 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ProviderMethodModel.java\n--rw-r--r--  2.0 unx     6669 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ProviderModel.java\n--rw-r--r--  2.0 unx     4362 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ServiceDescriptor.java\n--rw-r--r--  2.0 unx     3100 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ServiceMetadata.java\n--rw-r--r--  2.0 unx     7293 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ServiceRepository.java\n--rw-r--r--  2.0 unx      897 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/Destroyable.java\n--rw-r--r--  2.0 unx     1041 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/EchoService.java\n--rw-r--r--  2.0 unx     1062 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/EchoServiceDetector.java\n--rw-r--r--  2.0 unx     1993 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/GenericException.java\n--rw-r--r--  2.0 unx     1886 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/GenericService.java\n--rw-r--r--  2.0 unx     1068 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/GenericServiceDetector.java\n--rw-r--r--  2.0 unx     2889 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/support/GroupServiceKeyCache.java\n--rw-r--r--  2.0 unx     4189 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/support/ProtocolUtils.java\n+-rw-r--r--  2.0 unx    10155 b- defN 20-Apr-01 08:04 org/apache/dubbo/common/utils/Utf8Utils.java\n+-rw-r--r--  2.0 unx    26256 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractConfig.java\n+-rw-r--r--  2.0 unx    25069 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractInterfaceConfig.java\n+-rw-r--r--  2.0 unx     4869 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractMethodConfig.java\n+-rw-r--r--  2.0 unx     5847 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractReferenceConfig.java\n+-rw-r--r--  2.0 unx     7013 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/AbstractServiceConfig.java\n+-rw-r--r--  2.0 unx    14087 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ApplicationConfig.java\n+-rw-r--r--  2.0 unx     2209 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ArgumentConfig.java\n+-rw-r--r--  2.0 unx     9148 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConfigCenterConfig.java\n+-rw-r--r--  2.0 unx     2969 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/Constants.java\n+-rw-r--r--  2.0 unx     3703 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConsumerConfig.java\n+-rw-r--r--  2.0 unx     6249 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MetadataReportConfig.java\n+-rw-r--r--  2.0 unx     8896 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MethodConfig.java\n+-rw-r--r--  2.0 unx     1679 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MetricsConfig.java\n+-rw-r--r--  2.0 unx     3726 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ModuleConfig.java\n+-rw-r--r--  2.0 unx     3872 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/MonitorConfig.java\n+-rw-r--r--  2.0 unx    13843 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ProtocolConfig.java\n+-rw-r--r--  2.0 unx    10860 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ProviderConfig.java\n+-rw-r--r--  2.0 unx     8623 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ReferenceConfigBase.java\n+-rw-r--r--  2.0 unx    13607 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/RegistryConfig.java\n+-rw-r--r--  2.0 unx    13864 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ServiceConfigBase.java\n+-rw-r--r--  2.0 unx     7330 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/SslConfig.java\n+-rw-r--r--  2.0 unx     1488 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Argument.java\n+-rw-r--r--  2.0 unx     7836 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/DubboReference.java\n+-rw-r--r--  2.0 unx     7072 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/DubboService.java\n+-rw-r--r--  2.0 unx     1944 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Method.java\n+-rw-r--r--  2.0 unx     7349 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Reference.java\n+-rw-r--r--  2.0 unx     7125 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/annotation/Service.java\n+-rw-r--r--  2.0 unx     1985 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/context/ConfigConfigurationAdapter.java\n+-rw-r--r--  2.0 unx    18951 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/context/ConfigManager.java\n+-rw-r--r--  2.0 unx     2099 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/support/Parameter.java\n+-rw-r--r--  2.0 unx     6014 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/AbstractEventDispatcher.java\n+-rw-r--r--  2.0 unx     1406 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/ConditionalEventListener.java\n+-rw-r--r--  2.0 unx     1154 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/DirectEventDispatcher.java\n+-rw-r--r--  2.0 unx     1615 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/Event.java\n+-rw-r--r--  2.0 unx     2334 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/EventDispatcher.java\n+-rw-r--r--  2.0 unx     4832 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/EventListener.java\n+-rw-r--r--  2.0 unx     1157 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/GenericEvent.java\n+-rw-r--r--  2.0 unx     4751 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/GenericEventListener.java\n+-rw-r--r--  2.0 unx     5437 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/Listenable.java\n+-rw-r--r--  2.0 unx     1245 b- defN 20-Apr-01 08:04 org/apache/dubbo/event/ParallelEventDispatcher.java\n+-rw-r--r--  2.0 unx     1022 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ApplicationInitListener.java\n+-rw-r--r--  2.0 unx     4904 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ApplicationModel.java\n+-rw-r--r--  2.0 unx     2704 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/AsyncMethodInfo.java\n+-rw-r--r--  2.0 unx      990 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/BuiltinServiceDetector.java\n+-rw-r--r--  2.0 unx     3155 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ConsumerMethodModel.java\n+-rw-r--r--  2.0 unx     7288 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ConsumerModel.java\n+-rw-r--r--  2.0 unx     3085 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/MethodDescriptor.java\n+-rw-r--r--  2.0 unx     2753 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ProviderMethodModel.java\n+-rw-r--r--  2.0 unx     6874 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ProviderModel.java\n+-rw-r--r--  2.0 unx     4481 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ServiceDescriptor.java\n+-rw-r--r--  2.0 unx     3202 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ServiceMetadata.java\n+-rw-r--r--  2.0 unx     7478 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/model/ServiceRepository.java\n+-rw-r--r--  2.0 unx      920 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/Destroyable.java\n+-rw-r--r--  2.0 unx     1073 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/EchoService.java\n+-rw-r--r--  2.0 unx     1090 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/EchoServiceDetector.java\n+-rw-r--r--  2.0 unx     2057 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/GenericException.java\n+-rw-r--r--  2.0 unx     1933 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/GenericService.java\n+-rw-r--r--  2.0 unx     1096 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/service/GenericServiceDetector.java\n+-rw-r--r--  2.0 unx     2960 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/support/GroupServiceKeyCache.java\n+-rw-r--r--  2.0 unx     4280 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/support/ProtocolUtils.java\n -rw-r--r--  2.0 unx      194 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.compiler.Compiler\n--rw-r--r--  2.0 unx      174 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory\n--rw-r--r--  2.0 unx      163 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.context.FrameworkExt\n--rw-r--r--  2.0 unx      786 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter\n--rw-r--r--  2.0 unx     1022 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter\n+-rw-r--r--  2.0 unx      175 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory\n+-rw-r--r--  2.0 unx      165 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.context.FrameworkExt\n+-rw-r--r--  2.0 unx      796 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter\n+-rw-r--r--  2.0 unx     1034 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter\n -rw-r--r--  2.0 unx      142 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionFactory\n -rw-r--r--  2.0 unx       68 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.infra.InfraAdapter\n -rw-r--r--  2.0 unx      306 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.logger.LoggerAdapter\n -rw-r--r--  2.0 unx      128 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.status.StatusChecker\n -rw-r--r--  2.0 unx       60 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.store.DataStore\n -rw-r--r--  2.0 unx      297 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.ThreadPool\n -rw-r--r--  2.0 unx       76 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.manager.ExecutorRepository\n--rw-r--r--  2.0 unx      108 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher\n--rw-r--r--  2.0 unx      113 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector\n--rw-r--r--  2.0 unx      175 b- defN 20-Apr-01 08:04 META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy\n--rw-r--r--  2.0 unx     4520 b- defN 20-Apr-01 08:04 security/serialize.blockedlist\n--rw-r--r--  2.0 unx     2978 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-common/pom.xml\n+-rw-r--r--  2.0 unx      110 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher\n+-rw-r--r--  2.0 unx      114 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector\n+-rw-r--r--  2.0 unx      177 b- defN 20-Apr-01 08:04 META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy\n+-rw-r--r--  2.0 unx     4686 b- defN 20-Apr-01 08:04 security/serialize.blockedlist\n+-rw-r--r--  2.0 unx     2896 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-common/pom.xml\n -rw-r--r--  2.0 unx       67 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-common/pom.properties\n-374 files, 1593404 bytes uncompressed, 427518 bytes compressed:  73.2%\n+374 files, 1624216 bytes uncompressed, 429942 bytes compressed:  73.5%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -1417,17145 +1417,17145 @@\n 0280E Extract Zip Spec      14 (20) '2.0'\n 0280F Extract OS            00 (0) 'MS-DOS'\n 02810 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n 02812 Compression Method    0008 (8) 'Deflated'\n 02814 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-02818 CRC                   9122A7A7 (2434967463)\n-0281C Compressed Size       000003B9 (953)\n-02820 Uncompressed Size     00000A3F (2623)\n+02818 CRC                   79620788 (2036467592)\n+0281C Compressed Size       000003C0 (960)\n+02820 Uncompressed Size     00000AB0 (2736)\n 02824 Filename Length       0032 (50)\n 02826 Extra Length          0000 (0)\n 02828 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x2828: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 0285A PAYLOAD\n \n-02C13 LOCAL HEADER #80      04034B50 (67324752)\n-02C17 Extract Zip Spec      14 (20) '2.0'\n-02C18 Extract OS            00 (0) 'MS-DOS'\n-02C19 General Purpose Flag  0800 (2048)\n+02C1A LOCAL HEADER #80      04034B50 (67324752)\n+02C1E Extract Zip Spec      14 (20) '2.0'\n+02C1F Extract OS            00 (0) 'MS-DOS'\n+02C20 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-02C1B Compression Method    0008 (8) 'Deflated'\n-02C1D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-02C21 CRC                   3228CAA5 (841534117)\n-02C25 Compressed Size       000003C2 (962)\n-02C29 Uncompressed Size     00000A97 (2711)\n-02C2D Filename Length       0030 (48)\n-02C2F Extra Length          0000 (0)\n-02C31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+02C22 Compression Method    0008 (8) 'Deflated'\n+02C24 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+02C28 CRC                   C8043322 (3355718434)\n+02C2C Compressed Size       000003CA (970)\n+02C30 Uncompressed Size     00000B0F (2831)\n+02C34 Filename Length       0030 (48)\n+02C36 Extra Length          0000 (0)\n+02C38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2C31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2C38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-02C61 PAYLOAD\n+02C68 PAYLOAD\n \n-03023 LOCAL HEADER #81      04034B50 (67324752)\n-03027 Extract Zip Spec      14 (20) '2.0'\n-03028 Extract OS            00 (0) 'MS-DOS'\n-03029 General Purpose Flag  0800 (2048)\n+03032 LOCAL HEADER #81      04034B50 (67324752)\n+03036 Extract Zip Spec      14 (20) '2.0'\n+03037 Extract OS            00 (0) 'MS-DOS'\n+03038 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0302B Compression Method    0008 (8) 'Deflated'\n-0302D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03031 CRC                   4059C95D (1079626077)\n-03035 Compressed Size       00000507 (1287)\n-03039 Uncompressed Size     000010F7 (4343)\n-0303D Filename Length       0030 (48)\n-0303F Extra Length          0000 (0)\n-03041 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0303A Compression Method    0008 (8) 'Deflated'\n+0303C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03040 CRC                   7A6AA41E (2053809182)\n+03044 Compressed Size       00000512 (1298)\n+03048 Uncompressed Size     00001180 (4480)\n+0304C Filename Length       0030 (48)\n+0304E Extra Length          0000 (0)\n+03050 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3041: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3050: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-03071 PAYLOAD\n+03080 PAYLOAD\n \n-03578 LOCAL HEADER #82      04034B50 (67324752)\n-0357C Extract Zip Spec      14 (20) '2.0'\n-0357D Extract OS            00 (0) 'MS-DOS'\n-0357E General Purpose Flag  0800 (2048)\n+03592 LOCAL HEADER #82      04034B50 (67324752)\n+03596 Extract Zip Spec      14 (20) '2.0'\n+03597 Extract OS            00 (0) 'MS-DOS'\n+03598 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03580 Compression Method    0008 (8) 'Deflated'\n-03582 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03586 CRC                   BF971C06 (3214351366)\n-0358A Compressed Size       000002AE (686)\n-0358E Uncompressed Size     00000552 (1362)\n-03592 Filename Length       0029 (41)\n-03594 Extra Length          0000 (0)\n-03596 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0359A Compression Method    0008 (8) 'Deflated'\n+0359C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+035A0 CRC                   00F537FE (16070654)\n+035A4 Compressed Size       000002B7 (695)\n+035A8 Uncompressed Size     00000577 (1399)\n+035AC Filename Length       0029 (41)\n+035AE Extra Length          0000 (0)\n+035B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3596: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x35B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-035BF PAYLOAD\n+035D9 PAYLOAD\n \n-0386D LOCAL HEADER #83      04034B50 (67324752)\n-03871 Extract Zip Spec      14 (20) '2.0'\n-03872 Extract OS            00 (0) 'MS-DOS'\n-03873 General Purpose Flag  0800 (2048)\n+03890 LOCAL HEADER #83      04034B50 (67324752)\n+03894 Extract Zip Spec      14 (20) '2.0'\n+03895 Extract OS            00 (0) 'MS-DOS'\n+03896 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03875 Compression Method    0008 (8) 'Deflated'\n-03877 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0387B CRC                   1CCCA507 (483173639)\n-0387F Compressed Size       0000046C (1132)\n-03883 Uncompressed Size     000009AB (2475)\n-03887 Filename Length       0026 (38)\n-03889 Extra Length          0000 (0)\n-0388B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03898 Compression Method    0008 (8) 'Deflated'\n+0389A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0389E CRC                   1CCCA507 (483173639)\n+038A2 Compressed Size       0000046C (1132)\n+038A6 Uncompressed Size     000009AB (2475)\n+038AA Filename Length       0026 (38)\n+038AC Extra Length          0000 (0)\n+038AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x388B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-038B1 PAYLOAD\n+038D4 PAYLOAD\n \n-03D1D LOCAL HEADER #84      04034B50 (67324752)\n-03D21 Extract Zip Spec      14 (20) '2.0'\n-03D22 Extract OS            00 (0) 'MS-DOS'\n-03D23 General Purpose Flag  0800 (2048)\n+03D40 LOCAL HEADER #84      04034B50 (67324752)\n+03D44 Extract Zip Spec      14 (20) '2.0'\n+03D45 Extract OS            00 (0) 'MS-DOS'\n+03D46 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03D25 Compression Method    0008 (8) 'Deflated'\n-03D27 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03D2B CRC                   0622E0A0 (102949024)\n-03D2F Compressed Size       00000264 (612)\n-03D33 Uncompressed Size     0000049F (1183)\n-03D37 Filename Length       0021 (33)\n-03D39 Extra Length          0000 (0)\n-03D3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03D48 Compression Method    0008 (8) 'Deflated'\n+03D4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03D4E CRC                   0622E0A0 (102949024)\n+03D52 Compressed Size       00000264 (612)\n+03D56 Uncompressed Size     0000049F (1183)\n+03D5A Filename Length       0021 (33)\n+03D5C Extra Length          0000 (0)\n+03D5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-03D5C PAYLOAD\n+03D7F PAYLOAD\n \n-03FC0 LOCAL HEADER #85      04034B50 (67324752)\n-03FC4 Extract Zip Spec      14 (20) '2.0'\n-03FC5 Extract OS            00 (0) 'MS-DOS'\n-03FC6 General Purpose Flag  0800 (2048)\n+03FE3 LOCAL HEADER #85      04034B50 (67324752)\n+03FE7 Extract Zip Spec      14 (20) '2.0'\n+03FE8 Extract OS            00 (0) 'MS-DOS'\n+03FE9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03FC8 Compression Method    0008 (8) 'Deflated'\n-03FCA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03FCE CRC                   3DF15F74 (1039228788)\n-03FD2 Compressed Size       00000650 (1616)\n-03FD6 Uncompressed Size     0000229A (8858)\n-03FDA Filename Length       0027 (39)\n-03FDC Extra Length          0000 (0)\n-03FDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03FEB Compression Method    0008 (8) 'Deflated'\n+03FED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03FF1 CRC                   3DF15F74 (1039228788)\n+03FF5 Compressed Size       00000650 (1616)\n+03FF9 Uncompressed Size     0000229A (8858)\n+03FFD Filename Length       0027 (39)\n+03FFF Extra Length          0000 (0)\n+04001 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3FDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4001: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-04005 PAYLOAD\n+04028 PAYLOAD\n \n-04655 LOCAL HEADER #86      04034B50 (67324752)\n-04659 Extract Zip Spec      14 (20) '2.0'\n-0465A Extract OS            00 (0) 'MS-DOS'\n-0465B General Purpose Flag  0800 (2048)\n+04678 LOCAL HEADER #86      04034B50 (67324752)\n+0467C Extract Zip Spec      14 (20) '2.0'\n+0467D Extract OS            00 (0) 'MS-DOS'\n+0467E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0465D Compression Method    0008 (8) 'Deflated'\n-0465F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-04663 CRC                   52712A03 (1383148035)\n-04667 Compressed Size       00000226 (550)\n-0466B Uncompressed Size     000003E8 (1000)\n-0466F Filename Length       0026 (38)\n-04671 Extra Length          0000 (0)\n-04673 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+04680 Compression Method    0008 (8) 'Deflated'\n+04682 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+04686 CRC                   52712A03 (1383148035)\n+0468A Compressed Size       00000226 (550)\n+0468E Uncompressed Size     000003E8 (1000)\n+04692 Filename Length       0026 (38)\n+04694 Extra Length          0000 (0)\n+04696 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4673: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4696: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-04699 PAYLOAD\n+046BC PAYLOAD\n \n-048BF LOCAL HEADER #87      04034B50 (67324752)\n-048C3 Extract Zip Spec      14 (20) '2.0'\n-048C4 Extract OS            00 (0) 'MS-DOS'\n-048C5 General Purpose Flag  0800 (2048)\n+048E2 LOCAL HEADER #87      04034B50 (67324752)\n+048E6 Extract Zip Spec      14 (20) '2.0'\n+048E7 Extract OS            00 (0) 'MS-DOS'\n+048E8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-048C7 Compression Method    0008 (8) 'Deflated'\n-048C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-048CD CRC                   4B96BF4D (1268170573)\n-048D1 Compressed Size       00002661 (9825)\n-048D5 Uncompressed Size     00011389 (70537)\n-048D9 Filename Length       0020 (32)\n-048DB Extra Length          0000 (0)\n-048DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+048EA Compression Method    0008 (8) 'Deflated'\n+048EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+048F0 CRC                   4B96BF4D (1268170573)\n+048F4 Compressed Size       00002661 (9825)\n+048F8 Uncompressed Size     00011389 (70537)\n+048FC Filename Length       0020 (32)\n+048FE Extra Length          0000 (0)\n+04900 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4900: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-048FD PAYLOAD\n+04920 PAYLOAD\n \n-06F5E LOCAL HEADER #88      04034B50 (67324752)\n-06F62 Extract Zip Spec      14 (20) '2.0'\n-06F63 Extract OS            00 (0) 'MS-DOS'\n-06F64 General Purpose Flag  0800 (2048)\n+06F81 LOCAL HEADER #88      04034B50 (67324752)\n+06F85 Extract Zip Spec      14 (20) '2.0'\n+06F86 Extract OS            00 (0) 'MS-DOS'\n+06F87 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-06F66 Compression Method    0008 (8) 'Deflated'\n-06F68 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-06F6C CRC                   E6F6EE92 (3874942610)\n-06F70 Compressed Size       00000984 (2436)\n-06F74 Uncompressed Size     00003564 (13668)\n-06F78 Filename Length       0027 (39)\n-06F7A Extra Length          0000 (0)\n-06F7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+06F89 Compression Method    0008 (8) 'Deflated'\n+06F8B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+06F8F CRC                   E6F6EE92 (3874942610)\n+06F93 Compressed Size       00000984 (2436)\n+06F97 Uncompressed Size     00003564 (13668)\n+06F9B Filename Length       0027 (39)\n+06F9D Extra Length          0000 (0)\n+06F9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6F7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-06FA3 PAYLOAD\n+06FC6 PAYLOAD\n \n-07927 LOCAL HEADER #89      04034B50 (67324752)\n-0792B Extract Zip Spec      14 (20) '2.0'\n-0792C Extract OS            00 (0) 'MS-DOS'\n-0792D General Purpose Flag  0800 (2048)\n+0794A LOCAL HEADER #89      04034B50 (67324752)\n+0794E Extract Zip Spec      14 (20) '2.0'\n+0794F Extract OS            00 (0) 'MS-DOS'\n+07950 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0792F Compression Method    0008 (8) 'Deflated'\n-07931 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-07935 CRC                   8B1361FF (2333303295)\n-07939 Compressed Size       00000BD3 (3027)\n-0793D Uncompressed Size     000034A1 (13473)\n-07941 Filename Length       0029 (41)\n-07943 Extra Length          0000 (0)\n-07945 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+07952 Compression Method    0008 (8) 'Deflated'\n+07954 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+07958 CRC                   D525E52E (3576030510)\n+0795C Compressed Size       00000BEA (3050)\n+07960 Uncompressed Size     00003610 (13840)\n+07964 Filename Length       0029 (41)\n+07966 Extra Length          0000 (0)\n+07968 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7945: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7968: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0796E PAYLOAD\n+07991 PAYLOAD\n \n-08541 LOCAL HEADER #90      04034B50 (67324752)\n-08545 Extract Zip Spec      14 (20) '2.0'\n-08546 Extract OS            00 (0) 'MS-DOS'\n-08547 General Purpose Flag  0800 (2048)\n+0857B LOCAL HEADER #90      04034B50 (67324752)\n+0857F Extract Zip Spec      14 (20) '2.0'\n+08580 Extract OS            00 (0) 'MS-DOS'\n+08581 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-08549 Compression Method    0008 (8) 'Deflated'\n-0854B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0854F CRC                   F43D3BE1 (4097653729)\n-08553 Compressed Size       00000B7F (2943)\n-08557 Uncompressed Size     00002625 (9765)\n-0855B Filename Length       0024 (36)\n-0855D Extra Length          0000 (0)\n-0855F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+08583 Compression Method    0008 (8) 'Deflated'\n+08585 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+08589 CRC                   82E9AE97 (2196352663)\n+0858D Compressed Size       00000B94 (2964)\n+08591 Uncompressed Size     0000273B (10043)\n+08595 Filename Length       0024 (36)\n+08597 Extra Length          0000 (0)\n+08599 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x855F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x8599: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-08583 PAYLOAD\n+085BD PAYLOAD\n \n-09102 LOCAL HEADER #91      04034B50 (67324752)\n-09106 Extract Zip Spec      14 (20) '2.0'\n-09107 Extract OS            00 (0) 'MS-DOS'\n-09108 General Purpose Flag  0800 (2048)\n+09151 LOCAL HEADER #91      04034B50 (67324752)\n+09155 Extract Zip Spec      14 (20) '2.0'\n+09156 Extract OS            00 (0) 'MS-DOS'\n+09157 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0910A Compression Method    0008 (8) 'Deflated'\n-0910C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-09110 CRC                   62810B39 (1652624185)\n-09114 Compressed Size       0000027B (635)\n-09118 Uncompressed Size     00000554 (1364)\n-0911C Filename Length       0036 (54)\n-0911E Extra Length          0000 (0)\n-09120 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+09159 Compression Method    0008 (8) 'Deflated'\n+0915B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0915F CRC                   62810B39 (1652624185)\n+09163 Compressed Size       0000027B (635)\n+09167 Uncompressed Size     00000554 (1364)\n+0916B Filename Length       0036 (54)\n+0916D Extra Length          0000 (0)\n+0916F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9120: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x916F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09156 PAYLOAD\n+091A5 PAYLOAD\n \n-093D1 LOCAL HEADER #92      04034B50 (67324752)\n-093D5 Extract Zip Spec      14 (20) '2.0'\n-093D6 Extract OS            00 (0) 'MS-DOS'\n-093D7 General Purpose Flag  0800 (2048)\n+09420 LOCAL HEADER #92      04034B50 (67324752)\n+09424 Extract Zip Spec      14 (20) '2.0'\n+09425 Extract OS            00 (0) 'MS-DOS'\n+09426 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-093D9 Compression Method    0008 (8) 'Deflated'\n-093DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-093DF CRC                   F49AF035 (4103794741)\n-093E3 Compressed Size       0000065D (1629)\n-093E7 Uncompressed Size     000018A5 (6309)\n-093EB Filename Length       0038 (56)\n-093ED Extra Length          0000 (0)\n-093EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+09428 Compression Method    0008 (8) 'Deflated'\n+0942A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0942E CRC                   7918064D (2031617613)\n+09432 Compressed Size       00000668 (1640)\n+09436 Uncompressed Size     00001974 (6516)\n+0943A Filename Length       0038 (56)\n+0943C Extra Length          0000 (0)\n+0943E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x93EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x943E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09427 PAYLOAD\n+09476 PAYLOAD\n \n-09A84 LOCAL HEADER #93      04034B50 (67324752)\n-09A88 Extract Zip Spec      14 (20) '2.0'\n-09A89 Extract OS            00 (0) 'MS-DOS'\n-09A8A General Purpose Flag  0800 (2048)\n+09ADE LOCAL HEADER #93      04034B50 (67324752)\n+09AE2 Extract Zip Spec      14 (20) '2.0'\n+09AE3 Extract OS            00 (0) 'MS-DOS'\n+09AE4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-09A8C Compression Method    0008 (8) 'Deflated'\n-09A8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-09A92 CRC                   11EE6DF6 (300838390)\n-09A96 Compressed Size       00000EF2 (3826)\n-09A9A Uncompressed Size     00004ECE (20174)\n-09A9E Filename Length       003B (59)\n-09AA0 Extra Length          0000 (0)\n-09AA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+09AE6 Compression Method    0008 (8) 'Deflated'\n+09AE8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+09AEC CRC                   9C935B9B (2626902939)\n+09AF0 Compressed Size       00000F0B (3851)\n+09AF4 Uncompressed Size     000050B4 (20660)\n+09AF8 Filename Length       003B (59)\n+09AFA Extra Length          0000 (0)\n+09AFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9AA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x9AFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09ADD PAYLOAD\n+09B37 PAYLOAD\n \n-0A9CF LOCAL HEADER #94      04034B50 (67324752)\n-0A9D3 Extract Zip Spec      14 (20) '2.0'\n-0A9D4 Extract OS            00 (0) 'MS-DOS'\n-0A9D5 General Purpose Flag  0800 (2048)\n+0AA42 LOCAL HEADER #94      04034B50 (67324752)\n+0AA46 Extract Zip Spec      14 (20) '2.0'\n+0AA47 Extract OS            00 (0) 'MS-DOS'\n+0AA48 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A9D7 Compression Method    0008 (8) 'Deflated'\n-0A9D9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0A9DD CRC                   87F19404 (2280756228)\n-0A9E1 Compressed Size       00000AF9 (2809)\n-0A9E5 Uncompressed Size     000032DF (13023)\n-0A9E9 Filename Length       0034 (52)\n-0A9EB Extra Length          0000 (0)\n-0A9ED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0AA4A Compression Method    0008 (8) 'Deflated'\n+0AA4C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0AA50 CRC                   2B1352F9 (722686713)\n+0AA54 Compressed Size       00000B08 (2824)\n+0AA58 Uncompressed Size     00003462 (13410)\n+0AA5C Filename Length       0034 (52)\n+0AA5E Extra Length          0000 (0)\n+0AA60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA9ED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xAA60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AA21 PAYLOAD\n+0AA94 PAYLOAD\n \n-0B51A LOCAL HEADER #95      04034B50 (67324752)\n-0B51E Extract Zip Spec      14 (20) '2.0'\n-0B51F Extract OS            00 (0) 'MS-DOS'\n-0B520 General Purpose Flag  0800 (2048)\n+0B59C LOCAL HEADER #95      04034B50 (67324752)\n+0B5A0 Extract Zip Spec      14 (20) '2.0'\n+0B5A1 Extract OS            00 (0) 'MS-DOS'\n+0B5A2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B522 Compression Method    0008 (8) 'Deflated'\n-0B524 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0B528 CRC                   AA2CE6AF (2855069359)\n-0B52C Compressed Size       000004D5 (1237)\n-0B530 Uncompressed Size     00000DB2 (3506)\n-0B534 Filename Length       003F (63)\n-0B536 Extra Length          0000 (0)\n-0B538 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B5A4 Compression Method    0008 (8) 'Deflated'\n+0B5A6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0B5AA CRC                   50C2BDD7 (1354939863)\n+0B5AE Compressed Size       000004E2 (1250)\n+0B5B2 Uncompressed Size     00000E1B (3611)\n+0B5B6 Filename Length       003F (63)\n+0B5B8 Extra Length          0000 (0)\n+0B5BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB538: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB5BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B577 PAYLOAD\n+0B5F9 PAYLOAD\n \n-0BA4C LOCAL HEADER #96      04034B50 (67324752)\n-0BA50 Extract Zip Spec      14 (20) '2.0'\n-0BA51 Extract OS            00 (0) 'MS-DOS'\n-0BA52 General Purpose Flag  0800 (2048)\n+0BADB LOCAL HEADER #96      04034B50 (67324752)\n+0BADF Extract Zip Spec      14 (20) '2.0'\n+0BAE0 Extract OS            00 (0) 'MS-DOS'\n+0BAE1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0BA54 Compression Method    0008 (8) 'Deflated'\n-0BA56 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0BA5A CRC                   4F0E9D5D (1326357853)\n-0BA5E Compressed Size       00000852 (2130)\n-0BA62 Uncompressed Size     00002017 (8215)\n-0BA66 Filename Length       002B (43)\n-0BA68 Extra Length          0000 (0)\n-0BA6A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0BAE3 Compression Method    0008 (8) 'Deflated'\n+0BAE5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0BAE9 CRC                   4F0E9D5D (1326357853)\n+0BAED Compressed Size       00000852 (2130)\n+0BAF1 Uncompressed Size     00002017 (8215)\n+0BAF5 Filename Length       002B (43)\n+0BAF7 Extra Length          0000 (0)\n+0BAF9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xBA6A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xBAF9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0BA95 PAYLOAD\n+0BB24 PAYLOAD\n \n-0C2E7 LOCAL HEADER #97      04034B50 (67324752)\n-0C2EB Extract Zip Spec      14 (20) '2.0'\n-0C2EC Extract OS            00 (0) 'MS-DOS'\n-0C2ED General Purpose Flag  0800 (2048)\n+0C376 LOCAL HEADER #97      04034B50 (67324752)\n+0C37A Extract Zip Spec      14 (20) '2.0'\n+0C37B Extract OS            00 (0) 'MS-DOS'\n+0C37C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C2EF Compression Method    0008 (8) 'Deflated'\n-0C2F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C2F5 CRC                   35B34ECC (900943564)\n-0C2F9 Compressed Size       00000276 (630)\n-0C2FD Uncompressed Size     0000049E (1182)\n-0C301 Filename Length       003B (59)\n-0C303 Extra Length          0000 (0)\n-0C305 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C37E Compression Method    0008 (8) 'Deflated'\n+0C380 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C384 CRC                   35B34ECC (900943564)\n+0C388 Compressed Size       00000276 (630)\n+0C38C Uncompressed Size     0000049E (1182)\n+0C390 Filename Length       003B (59)\n+0C392 Extra Length          0000 (0)\n+0C394 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC305: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC394: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C340 PAYLOAD\n+0C3CF PAYLOAD\n \n-0C5B6 LOCAL HEADER #98      04034B50 (67324752)\n-0C5BA Extract Zip Spec      14 (20) '2.0'\n-0C5BB Extract OS            00 (0) 'MS-DOS'\n-0C5BC General Purpose Flag  0800 (2048)\n+0C645 LOCAL HEADER #98      04034B50 (67324752)\n+0C649 Extract Zip Spec      14 (20) '2.0'\n+0C64A Extract OS            00 (0) 'MS-DOS'\n+0C64B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C5BE Compression Method    0008 (8) 'Deflated'\n-0C5C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C5C4 CRC                   AE36D6DB (2922829531)\n-0C5C8 Compressed Size       00000275 (629)\n-0C5CC Uncompressed Size     000004A6 (1190)\n-0C5D0 Filename Length       003D (61)\n-0C5D2 Extra Length          0000 (0)\n-0C5D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C64D Compression Method    0008 (8) 'Deflated'\n+0C64F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C653 CRC                   AE36D6DB (2922829531)\n+0C657 Compressed Size       00000275 (629)\n+0C65B Uncompressed Size     000004A6 (1190)\n+0C65F Filename Length       003D (61)\n+0C661 Extra Length          0000 (0)\n+0C663 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC663: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C611 PAYLOAD\n+0C6A0 PAYLOAD\n \n-0C886 LOCAL HEADER #99      04034B50 (67324752)\n-0C88A Extract Zip Spec      14 (20) '2.0'\n-0C88B Extract OS            00 (0) 'MS-DOS'\n-0C88C General Purpose Flag  0800 (2048)\n+0C915 LOCAL HEADER #99      04034B50 (67324752)\n+0C919 Extract Zip Spec      14 (20) '2.0'\n+0C91A Extract OS            00 (0) 'MS-DOS'\n+0C91B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C88E Compression Method    0008 (8) 'Deflated'\n-0C890 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C894 CRC                   693DBCBA (1765653690)\n-0C898 Compressed Size       00000C43 (3139)\n-0C89C Uncompressed Size     00002F4D (12109)\n-0C8A0 Filename Length       002B (43)\n-0C8A2 Extra Length          0000 (0)\n-0C8A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C91D Compression Method    0008 (8) 'Deflated'\n+0C91F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C923 CRC                   693DBCBA (1765653690)\n+0C927 Compressed Size       00000C43 (3139)\n+0C92B Uncompressed Size     00002F4D (12109)\n+0C92F Filename Length       002B (43)\n+0C931 Extra Length          0000 (0)\n+0C933 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC933: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C8CF PAYLOAD\n+0C95E PAYLOAD\n \n-0D512 LOCAL HEADER #100     04034B50 (67324752)\n-0D516 Extract Zip Spec      14 (20) '2.0'\n-0D517 Extract OS            00 (0) 'MS-DOS'\n-0D518 General Purpose Flag  0800 (2048)\n+0D5A1 LOCAL HEADER #100     04034B50 (67324752)\n+0D5A5 Extract Zip Spec      14 (20) '2.0'\n+0D5A6 Extract OS            00 (0) 'MS-DOS'\n+0D5A7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D51A Compression Method    0008 (8) 'Deflated'\n-0D51C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0D520 CRC                   44BCC62B (1153222187)\n-0D524 Compressed Size       00000F74 (3956)\n-0D528 Uncompressed Size     00004608 (17928)\n-0D52C Filename Length       002D (45)\n-0D52E Extra Length          0000 (0)\n-0D530 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D5A9 Compression Method    0008 (8) 'Deflated'\n+0D5AB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0D5AF CRC                   44BCC62B (1153222187)\n+0D5B3 Compressed Size       00000F74 (3956)\n+0D5B7 Uncompressed Size     00004608 (17928)\n+0D5BB Filename Length       002D (45)\n+0D5BD Extra Length          0000 (0)\n+0D5BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD530: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD5BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D55D PAYLOAD\n+0D5EC PAYLOAD\n \n-0E4D1 LOCAL HEADER #101     04034B50 (67324752)\n-0E4D5 Extract Zip Spec      14 (20) '2.0'\n-0E4D6 Extract OS            00 (0) 'MS-DOS'\n-0E4D7 General Purpose Flag  0800 (2048)\n+0E560 LOCAL HEADER #101     04034B50 (67324752)\n+0E564 Extract Zip Spec      14 (20) '2.0'\n+0E565 Extract OS            00 (0) 'MS-DOS'\n+0E566 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E4D9 Compression Method    0008 (8) 'Deflated'\n-0E4DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0E4DF CRC                   01EEDE5E (32431710)\n-0E4E3 Compressed Size       0000028F (655)\n-0E4E7 Uncompressed Size     000004E7 (1255)\n-0E4EB Filename Length       002E (46)\n-0E4ED Extra Length          0000 (0)\n-0E4EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E568 Compression Method    0008 (8) 'Deflated'\n+0E56A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E56E CRC                   01EEDE5E (32431710)\n+0E572 Compressed Size       0000028F (655)\n+0E576 Uncompressed Size     000004E7 (1255)\n+0E57A Filename Length       002E (46)\n+0E57C Extra Length          0000 (0)\n+0E57E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE4EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE57E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E51D PAYLOAD\n+0E5AC PAYLOAD\n \n-0E7AC LOCAL HEADER #102     04034B50 (67324752)\n-0E7B0 Extract Zip Spec      14 (20) '2.0'\n-0E7B1 Extract OS            00 (0) 'MS-DOS'\n-0E7B2 General Purpose Flag  0800 (2048)\n+0E83B LOCAL HEADER #102     04034B50 (67324752)\n+0E83F Extract Zip Spec      14 (20) '2.0'\n+0E840 Extract OS            00 (0) 'MS-DOS'\n+0E841 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E7B4 Compression Method    0008 (8) 'Deflated'\n-0E7B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0E7BA CRC                   20854F04 (545607428)\n-0E7BE Compressed Size       00000490 (1168)\n-0E7C2 Uncompressed Size     00000B1B (2843)\n-0E7C6 Filename Length       003E (62)\n-0E7C8 Extra Length          0000 (0)\n-0E7CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E843 Compression Method    0008 (8) 'Deflated'\n+0E845 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E849 CRC                   20854F04 (545607428)\n+0E84D Compressed Size       00000490 (1168)\n+0E851 Uncompressed Size     00000B1B (2843)\n+0E855 Filename Length       003E (62)\n+0E857 Extra Length          0000 (0)\n+0E859 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE7CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE859: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E808 PAYLOAD\n+0E897 PAYLOAD\n \n-0EC98 LOCAL HEADER #103     04034B50 (67324752)\n-0EC9C Extract Zip Spec      14 (20) '2.0'\n-0EC9D Extract OS            00 (0) 'MS-DOS'\n-0EC9E General Purpose Flag  0800 (2048)\n+0ED27 LOCAL HEADER #103     04034B50 (67324752)\n+0ED2B Extract Zip Spec      14 (20) '2.0'\n+0ED2C Extract OS            00 (0) 'MS-DOS'\n+0ED2D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0ECA0 Compression Method    0008 (8) 'Deflated'\n-0ECA2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0ECA6 CRC                   D19D012A (3516727594)\n-0ECAA Compressed Size       00000338 (824)\n-0ECAE Uncompressed Size     00000733 (1843)\n-0ECB2 Filename Length       003E (62)\n-0ECB4 Extra Length          0000 (0)\n-0ECB6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0ED2F Compression Method    0008 (8) 'Deflated'\n+0ED31 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0ED35 CRC                   D19D012A (3516727594)\n+0ED39 Compressed Size       00000338 (824)\n+0ED3D Uncompressed Size     00000733 (1843)\n+0ED41 Filename Length       003E (62)\n+0ED43 Extra Length          0000 (0)\n+0ED45 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECB6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED45: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0ECF4 PAYLOAD\n+0ED83 PAYLOAD\n \n-0F02C LOCAL HEADER #104     04034B50 (67324752)\n-0F030 Extract Zip Spec      14 (20) '2.0'\n-0F031 Extract OS            00 (0) 'MS-DOS'\n-0F032 General Purpose Flag  0800 (2048)\n+0F0BB LOCAL HEADER #104     04034B50 (67324752)\n+0F0BF Extract Zip Spec      14 (20) '2.0'\n+0F0C0 Extract OS            00 (0) 'MS-DOS'\n+0F0C1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F034 Compression Method    0008 (8) 'Deflated'\n-0F036 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0F03A CRC                   489CA2B6 (1218224822)\n-0F03E Compressed Size       00000D33 (3379)\n-0F042 Uncompressed Size     00003CC4 (15556)\n-0F046 Filename Length       0038 (56)\n-0F048 Extra Length          0000 (0)\n-0F04A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F0C3 Compression Method    0008 (8) 'Deflated'\n+0F0C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0F0C9 CRC                   489CA2B6 (1218224822)\n+0F0CD Compressed Size       00000D33 (3379)\n+0F0D1 Uncompressed Size     00003CC4 (15556)\n+0F0D5 Filename Length       0038 (56)\n+0F0D7 Extra Length          0000 (0)\n+0F0D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF04A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F082 PAYLOAD\n+0F111 PAYLOAD\n \n-0FDB5 LOCAL HEADER #105     04034B50 (67324752)\n-0FDB9 Extract Zip Spec      14 (20) '2.0'\n-0FDBA Extract OS            00 (0) 'MS-DOS'\n-0FDBB General Purpose Flag  0800 (2048)\n+0FE44 LOCAL HEADER #105     04034B50 (67324752)\n+0FE48 Extract Zip Spec      14 (20) '2.0'\n+0FE49 Extract OS            00 (0) 'MS-DOS'\n+0FE4A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0FDBD Compression Method    0008 (8) 'Deflated'\n-0FDBF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0FDC3 CRC                   BD63F8B8 (3177445560)\n-0FDC7 Compressed Size       000005F8 (1528)\n-0FDCB Uncompressed Size     000013BA (5050)\n-0FDCF Filename Length       003C (60)\n-0FDD1 Extra Length          0000 (0)\n-0FDD3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FE4C Compression Method    0008 (8) 'Deflated'\n+0FE4E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0FE52 CRC                   BD63F8B8 (3177445560)\n+0FE56 Compressed Size       000005F8 (1528)\n+0FE5A Uncompressed Size     000013BA (5050)\n+0FE5E Filename Length       003C (60)\n+0FE60 Extra Length          0000 (0)\n+0FE62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFDD3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFE62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FE0F PAYLOAD\n+0FE9E PAYLOAD\n \n-10407 LOCAL HEADER #106     04034B50 (67324752)\n-1040B Extract Zip Spec      14 (20) '2.0'\n-1040C Extract OS            00 (0) 'MS-DOS'\n-1040D General Purpose Flag  0800 (2048)\n+10496 LOCAL HEADER #106     04034B50 (67324752)\n+1049A Extract Zip Spec      14 (20) '2.0'\n+1049B Extract OS            00 (0) 'MS-DOS'\n+1049C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1040F Compression Method    0008 (8) 'Deflated'\n-10411 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-10415 CRC                   C96B89A9 (3379268009)\n-10419 Compressed Size       0000053B (1339)\n-1041D Uncompressed Size     00000DB0 (3504)\n-10421 Filename Length       003F (63)\n-10423 Extra Length          0000 (0)\n-10425 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1049E Compression Method    0008 (8) 'Deflated'\n+104A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+104A4 CRC                   C96B89A9 (3379268009)\n+104A8 Compressed Size       0000053B (1339)\n+104AC Uncompressed Size     00000DB0 (3504)\n+104B0 Filename Length       003F (63)\n+104B2 Extra Length          0000 (0)\n+104B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x10425: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x104B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-10464 PAYLOAD\n+104F3 PAYLOAD\n \n-1099F LOCAL HEADER #107     04034B50 (67324752)\n-109A3 Extract Zip Spec      14 (20) '2.0'\n-109A4 Extract OS            00 (0) 'MS-DOS'\n-109A5 General Purpose Flag  0800 (2048)\n+10A2E LOCAL HEADER #107     04034B50 (67324752)\n+10A32 Extract Zip Spec      14 (20) '2.0'\n+10A33 Extract OS            00 (0) 'MS-DOS'\n+10A34 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-109A7 Compression Method    0008 (8) 'Deflated'\n-109A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-109AD CRC                   3FE3ACCB (1071885515)\n-109B1 Compressed Size       00000B15 (2837)\n-109B5 Uncompressed Size     00002CC5 (11461)\n-109B9 Filename Length       0039 (57)\n-109BB Extra Length          0000 (0)\n-109BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+10A36 Compression Method    0008 (8) 'Deflated'\n+10A38 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+10A3C CRC                   3FE3ACCB (1071885515)\n+10A40 Compressed Size       00000B15 (2837)\n+10A44 Uncompressed Size     00002CC5 (11461)\n+10A48 Filename Length       0039 (57)\n+10A4A Extra Length          0000 (0)\n+10A4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x109BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10A4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-109F6 PAYLOAD\n+10A85 PAYLOAD\n \n-1150B LOCAL HEADER #108     04034B50 (67324752)\n-1150F Extract Zip Spec      14 (20) '2.0'\n-11510 Extract OS            00 (0) 'MS-DOS'\n-11511 General Purpose Flag  0800 (2048)\n+1159A LOCAL HEADER #108     04034B50 (67324752)\n+1159E Extract Zip Spec      14 (20) '2.0'\n+1159F Extract OS            00 (0) 'MS-DOS'\n+115A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11513 Compression Method    0008 (8) 'Deflated'\n-11515 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-11519 CRC                   F325AC46 (4079332422)\n-1151D Compressed Size       00000588 (1416)\n-11521 Uncompressed Size     000010FE (4350)\n-11525 Filename Length       003A (58)\n-11527 Extra Length          0000 (0)\n-11529 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+115A2 Compression Method    0008 (8) 'Deflated'\n+115A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+115A8 CRC                   A81790A7 (2820116647)\n+115AC Compressed Size       00000596 (1430)\n+115B0 Uncompressed Size     0000117D (4477)\n+115B4 Filename Length       003A (58)\n+115B6 Extra Length          0000 (0)\n+115B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11529: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x115B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11563 PAYLOAD\n+115F2 PAYLOAD\n \n-11AEB LOCAL HEADER #109     04034B50 (67324752)\n-11AEF Extract Zip Spec      14 (20) '2.0'\n-11AF0 Extract OS            00 (0) 'MS-DOS'\n-11AF1 General Purpose Flag  0800 (2048)\n+11B88 LOCAL HEADER #109     04034B50 (67324752)\n+11B8C Extract Zip Spec      14 (20) '2.0'\n+11B8D Extract OS            00 (0) 'MS-DOS'\n+11B8E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11AF3 Compression Method    0008 (8) 'Deflated'\n-11AF5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-11AF9 CRC                   9BAFC26A (2611987050)\n-11AFD Compressed Size       000007B7 (1975)\n-11B01 Uncompressed Size     00001AC5 (6853)\n-11B05 Filename Length       0031 (49)\n-11B07 Extra Length          0000 (0)\n-11B09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11B90 Compression Method    0008 (8) 'Deflated'\n+11B92 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+11B96 CRC                   AB15E1E2 (2870338018)\n+11B9A Compressed Size       000007C7 (1991)\n+11B9E Uncompressed Size     00001B78 (7032)\n+11BA2 Filename Length       0031 (49)\n+11BA4 Extra Length          0000 (0)\n+11BA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11B09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x11BA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11B3A PAYLOAD\n+11BD7 PAYLOAD\n \n-122F1 LOCAL HEADER #110     04034B50 (67324752)\n-122F5 Extract Zip Spec      14 (20) '2.0'\n-122F6 Extract OS            00 (0) 'MS-DOS'\n-122F7 General Purpose Flag  0800 (2048)\n+1239E LOCAL HEADER #110     04034B50 (67324752)\n+123A2 Extract Zip Spec      14 (20) '2.0'\n+123A3 Extract OS            00 (0) 'MS-DOS'\n+123A4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-122F9 Compression Method    0008 (8) 'Deflated'\n-122FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-122FF CRC                   68B50306 (1756693254)\n-12303 Compressed Size       00000597 (1431)\n-12307 Uncompressed Size     000012AB (4779)\n-1230B Filename Length       0036 (54)\n-1230D Extra Length          0000 (0)\n-1230F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+123A6 Compression Method    0008 (8) 'Deflated'\n+123A8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+123AC CRC                   7B55AE57 (2069212759)\n+123B0 Compressed Size       000005A3 (1443)\n+123B4 Uncompressed Size     00001330 (4912)\n+123B8 Filename Length       0036 (54)\n+123BA Extra Length          0000 (0)\n+123BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1230F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x123BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12345 PAYLOAD\n+123F2 PAYLOAD\n \n-128DC LOCAL HEADER #111     04034B50 (67324752)\n-128E0 Extract Zip Spec      14 (20) '2.0'\n-128E1 Extract OS            00 (0) 'MS-DOS'\n-128E2 General Purpose Flag  0800 (2048)\n+12995 LOCAL HEADER #111     04034B50 (67324752)\n+12999 Extract Zip Spec      14 (20) '2.0'\n+1299A Extract OS            00 (0) 'MS-DOS'\n+1299B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-128E4 Compression Method    0008 (8) 'Deflated'\n-128E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-128EA CRC                   0BFFCD1E (201313566)\n-128EE Compressed Size       000008D8 (2264)\n-128F2 Uncompressed Size     00002715 (10005)\n-128F6 Filename Length       002F (47)\n-128F8 Extra Length          0000 (0)\n-128FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1299D Compression Method    0008 (8) 'Deflated'\n+1299F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+129A3 CRC                   8F24621B (2401526299)\n+129A7 Compressed Size       000008E8 (2280)\n+129AB Uncompressed Size     000027FE (10238)\n+129AF Filename Length       002F (47)\n+129B1 Extra Length          0000 (0)\n+129B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x128FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x129B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12929 PAYLOAD\n+129E2 PAYLOAD\n \n-13201 LOCAL HEADER #112     04034B50 (67324752)\n-13205 Extract Zip Spec      14 (20) '2.0'\n-13206 Extract OS            00 (0) 'MS-DOS'\n-13207 General Purpose Flag  0800 (2048)\n+132CA LOCAL HEADER #112     04034B50 (67324752)\n+132CE Extract Zip Spec      14 (20) '2.0'\n+132CF Extract OS            00 (0) 'MS-DOS'\n+132D0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13209 Compression Method    0008 (8) 'Deflated'\n-1320B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1320F CRC                   94D758DF (2497140959)\n-13213 Compressed Size       00000294 (660)\n-13217 Uncompressed Size     000004F3 (1267)\n-1321B Filename Length       003C (60)\n-1321D Extra Length          0000 (0)\n-1321F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+132D2 Compression Method    0008 (8) 'Deflated'\n+132D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+132D8 CRC                   2A9E8F07 (715034375)\n+132DC Compressed Size       0000029C (668)\n+132E0 Uncompressed Size     00000516 (1302)\n+132E4 Filename Length       003C (60)\n+132E6 Extra Length          0000 (0)\n+132E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1321F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x132E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1325B PAYLOAD\n+13324 PAYLOAD\n \n-134EF LOCAL HEADER #113     04034B50 (67324752)\n-134F3 Extract Zip Spec      14 (20) '2.0'\n-134F4 Extract OS            00 (0) 'MS-DOS'\n-134F5 General Purpose Flag  0800 (2048)\n+135C0 LOCAL HEADER #113     04034B50 (67324752)\n+135C4 Extract Zip Spec      14 (20) '2.0'\n+135C5 Extract OS            00 (0) 'MS-DOS'\n+135C6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-134F7 Compression Method    0008 (8) 'Deflated'\n-134F9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-134FD CRC                   778123FC (2004952060)\n-13501 Compressed Size       00000346 (838)\n-13505 Uncompressed Size     00000770 (1904)\n-13509 Filename Length       0039 (57)\n-1350B Extra Length          0000 (0)\n-1350D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+135C8 Compression Method    0008 (8) 'Deflated'\n+135CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+135CE CRC                   C6D0F0BC (3335581884)\n+135D2 Compressed Size       0000034F (847)\n+135D6 Uncompressed Size     000007B0 (1968)\n+135DA Filename Length       0039 (57)\n+135DC Extra Length          0000 (0)\n+135DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1350D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x135DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13546 PAYLOAD\n+13617 PAYLOAD\n \n-1388C LOCAL HEADER #114     04034B50 (67324752)\n-13890 Extract Zip Spec      14 (20) '2.0'\n-13891 Extract OS            00 (0) 'MS-DOS'\n-13892 General Purpose Flag  0800 (2048)\n+13966 LOCAL HEADER #114     04034B50 (67324752)\n+1396A Extract Zip Spec      14 (20) '2.0'\n+1396B Extract OS            00 (0) 'MS-DOS'\n+1396C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13894 Compression Method    0008 (8) 'Deflated'\n-13896 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1389A CRC                   041CAAC9 (68987593)\n-1389E Compressed Size       00000273 (627)\n-138A2 Uncompressed Size     000004B1 (1201)\n-138A6 Filename Length       003D (61)\n-138A8 Extra Length          0000 (0)\n-138AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1396E Compression Method    0008 (8) 'Deflated'\n+13970 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13974 CRC                   A545EC4C (2772823116)\n+13978 Compressed Size       0000027C (636)\n+1397C Uncompressed Size     000004DD (1245)\n+13980 Filename Length       003D (61)\n+13982 Extra Length          0000 (0)\n+13984 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x138AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13984: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-138E7 PAYLOAD\n+139C1 PAYLOAD\n \n-13B5A LOCAL HEADER #115     04034B50 (67324752)\n-13B5E Extract Zip Spec      14 (20) '2.0'\n-13B5F Extract OS            00 (0) 'MS-DOS'\n-13B60 General Purpose Flag  0800 (2048)\n+13C3D LOCAL HEADER #115     04034B50 (67324752)\n+13C41 Extract Zip Spec      14 (20) '2.0'\n+13C42 Extract OS            00 (0) 'MS-DOS'\n+13C43 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13B62 Compression Method    0008 (8) 'Deflated'\n-13B64 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13B68 CRC                   01D0CBB6 (30460854)\n-13B6C Compressed Size       000003B8 (952)\n-13B70 Uncompressed Size     00000A4C (2636)\n-13B74 Filename Length       003B (59)\n-13B76 Extra Length          0000 (0)\n-13B78 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13C45 Compression Method    0008 (8) 'Deflated'\n+13C47 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13C4B CRC                   8BA4EDED (2342841837)\n+13C4F Compressed Size       000003C0 (960)\n+13C53 Uncompressed Size     00000A8C (2700)\n+13C57 Filename Length       003B (59)\n+13C59 Extra Length          0000 (0)\n+13C5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13B78: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13C5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13BB3 PAYLOAD\n+13C96 PAYLOAD\n \n-13F6B LOCAL HEADER #116     04034B50 (67324752)\n-13F6F Extract Zip Spec      14 (20) '2.0'\n-13F70 Extract OS            00 (0) 'MS-DOS'\n-13F71 General Purpose Flag  0800 (2048)\n+14056 LOCAL HEADER #116     04034B50 (67324752)\n+1405A Extract Zip Spec      14 (20) '2.0'\n+1405B Extract OS            00 (0) 'MS-DOS'\n+1405C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13F73 Compression Method    0008 (8) 'Deflated'\n-13F75 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13F79 CRC                   790D5CAF (2030918831)\n-13F7D Compressed Size       00000288 (648)\n-13F81 Uncompressed Size     000004AD (1197)\n-13F85 Filename Length       0037 (55)\n-13F87 Extra Length          0000 (0)\n-13F89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1405E Compression Method    0008 (8) 'Deflated'\n+14060 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14064 CRC                   C8BED78D (3367950221)\n+14068 Compressed Size       00000290 (656)\n+1406C Uncompressed Size     000004CE (1230)\n+14070 Filename Length       0037 (55)\n+14072 Extra Length          0000 (0)\n+14074 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13F89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14074: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13FC0 PAYLOAD\n+140AB PAYLOAD\n \n-14248 LOCAL HEADER #117     04034B50 (67324752)\n-1424C Extract Zip Spec      14 (20) '2.0'\n-1424D Extract OS            00 (0) 'MS-DOS'\n-1424E General Purpose Flag  0800 (2048)\n+1433B LOCAL HEADER #117     04034B50 (67324752)\n+1433F Extract Zip Spec      14 (20) '2.0'\n+14340 Extract OS            00 (0) 'MS-DOS'\n+14341 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14250 Compression Method    0008 (8) 'Deflated'\n-14252 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14256 CRC                   A679BD52 (2792996178)\n-1425A Compressed Size       0000095F (2399)\n-1425E Uncompressed Size     0000264E (9806)\n-14262 Filename Length       004D (77)\n-14264 Extra Length          0000 (0)\n-14266 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14343 Compression Method    0008 (8) 'Deflated'\n+14345 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14349 CRC                   8153B7AF (2169747375)\n+1434D Compressed Size       00000970 (2416)\n+14351 Uncompressed Size     00002780 (10112)\n+14355 Filename Length       004D (77)\n+14357 Extra Length          0000 (0)\n+14359 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14266: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14359: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-142B3 PAYLOAD\n+143A6 PAYLOAD\n \n-14C12 LOCAL HEADER #118     04034B50 (67324752)\n-14C16 Extract Zip Spec      14 (20) '2.0'\n-14C17 Extract OS            00 (0) 'MS-DOS'\n-14C18 General Purpose Flag  0800 (2048)\n+14D16 LOCAL HEADER #118     04034B50 (67324752)\n+14D1A Extract Zip Spec      14 (20) '2.0'\n+14D1B Extract OS            00 (0) 'MS-DOS'\n+14D1C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14C1A Compression Method    0008 (8) 'Deflated'\n-14C1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14C20 CRC                   5C1CB033 (1545383987)\n-14C24 Compressed Size       0000032F (815)\n-14C28 Uncompressed Size     000006CB (1739)\n-14C2C Filename Length       0054 (84)\n-14C2E Extra Length          0000 (0)\n-14C30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14D1E Compression Method    0008 (8) 'Deflated'\n+14D20 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14D24 CRC                   B055C4D7 (2958410967)\n+14D28 Compressed Size       00000337 (823)\n+14D2C Uncompressed Size     000006F6 (1782)\n+14D30 Filename Length       0054 (84)\n+14D32 Extra Length          0000 (0)\n+14D34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14C30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14D34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14C84 PAYLOAD\n+14D88 PAYLOAD\n \n-14FB3 LOCAL HEADER #119     04034B50 (67324752)\n-14FB7 Extract Zip Spec      14 (20) '2.0'\n-14FB8 Extract OS            00 (0) 'MS-DOS'\n-14FB9 General Purpose Flag  0800 (2048)\n+150BF LOCAL HEADER #119     04034B50 (67324752)\n+150C3 Extract Zip Spec      14 (20) '2.0'\n+150C4 Extract OS            00 (0) 'MS-DOS'\n+150C5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14FBB Compression Method    0008 (8) 'Deflated'\n-14FBD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14FC1 CRC                   E6853BBE (3867491262)\n-14FC5 Compressed Size       00000241 (577)\n-14FC9 Uncompressed Size     00000448 (1096)\n-14FCD Filename Length       0041 (65)\n-14FCF Extra Length          0000 (0)\n-14FD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+150C7 Compression Method    0008 (8) 'Deflated'\n+150C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+150CD CRC                   46172F4A (1175924554)\n+150D1 Compressed Size       0000024D (589)\n+150D5 Uncompressed Size     0000046D (1133)\n+150D9 Filename Length       0041 (65)\n+150DB Extra Length          0000 (0)\n+150DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14FD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x150DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15012 PAYLOAD\n+1511E PAYLOAD\n \n-15253 LOCAL HEADER #120     04034B50 (67324752)\n-15257 Extract Zip Spec      14 (20) '2.0'\n-15258 Extract OS            00 (0) 'MS-DOS'\n-15259 General Purpose Flag  0800 (2048)\n+1536B LOCAL HEADER #120     04034B50 (67324752)\n+1536F Extract Zip Spec      14 (20) '2.0'\n+15370 Extract OS            00 (0) 'MS-DOS'\n+15371 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1525B Compression Method    0008 (8) 'Deflated'\n-1525D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15261 CRC                   B9E6C475 (3118908533)\n-15265 Compressed Size       000003ED (1005)\n-15269 Uncompressed Size     00000B0B (2827)\n-1526D Filename Length       0043 (67)\n-1526F Extra Length          0000 (0)\n-15271 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15373 Compression Method    0008 (8) 'Deflated'\n+15375 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15379 CRC                   D56D83FB (3580724219)\n+1537D Compressed Size       000003F6 (1014)\n+15381 Uncompressed Size     00000B69 (2921)\n+15385 Filename Length       0043 (67)\n+15387 Extra Length          0000 (0)\n+15389 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15271: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15389: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-152B4 PAYLOAD\n+153CC PAYLOAD\n \n-156A1 LOCAL HEADER #121     04034B50 (67324752)\n-156A5 Extract Zip Spec      14 (20) '2.0'\n-156A6 Extract OS            00 (0) 'MS-DOS'\n-156A7 General Purpose Flag  0800 (2048)\n+157C2 LOCAL HEADER #121     04034B50 (67324752)\n+157C6 Extract Zip Spec      14 (20) '2.0'\n+157C7 Extract OS            00 (0) 'MS-DOS'\n+157C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-156A9 Compression Method    0008 (8) 'Deflated'\n-156AB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-156AF CRC                   74E6231A (1961239322)\n-156B3 Compressed Size       000002A7 (679)\n-156B7 Uncompressed Size     00000511 (1297)\n-156BB Filename Length       0046 (70)\n-156BD Extra Length          0000 (0)\n-156BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+157CA Compression Method    0008 (8) 'Deflated'\n+157CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+157D0 CRC                   69A63658 (1772500568)\n+157D4 Compressed Size       000002B1 (689)\n+157D8 Uncompressed Size     00000532 (1330)\n+157DC Filename Length       0046 (70)\n+157DE Extra Length          0000 (0)\n+157E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x156BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x157E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15705 PAYLOAD\n+15826 PAYLOAD\n \n-159AC LOCAL HEADER #122     04034B50 (67324752)\n-159B0 Extract Zip Spec      14 (20) '2.0'\n-159B1 Extract OS            00 (0) 'MS-DOS'\n-159B2 General Purpose Flag  0800 (2048)\n+15AD7 LOCAL HEADER #122     04034B50 (67324752)\n+15ADB Extract Zip Spec      14 (20) '2.0'\n+15ADC Extract OS            00 (0) 'MS-DOS'\n+15ADD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-159B4 Compression Method    0008 (8) 'Deflated'\n-159B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-159BA CRC                   695FC9AE (1767885230)\n-159BE Compressed Size       00000254 (596)\n-159C2 Uncompressed Size     00000447 (1095)\n-159C6 Filename Length       003A (58)\n-159C8 Extra Length          0000 (0)\n-159CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15ADF Compression Method    0008 (8) 'Deflated'\n+15AE1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15AE5 CRC                   01D091A7 (30445991)\n+15AE9 Compressed Size       0000025B (603)\n+15AED Uncompressed Size     00000460 (1120)\n+15AF1 Filename Length       003A (58)\n+15AF3 Extra Length          0000 (0)\n+15AF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x159CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15AF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15A04 PAYLOAD\n+15B2F PAYLOAD\n \n-15C58 LOCAL HEADER #123     04034B50 (67324752)\n-15C5C Extract Zip Spec      14 (20) '2.0'\n-15C5D Extract OS            00 (0) 'MS-DOS'\n-15C5E General Purpose Flag  0800 (2048)\n+15D8A LOCAL HEADER #123     04034B50 (67324752)\n+15D8E Extract Zip Spec      14 (20) '2.0'\n+15D8F Extract OS            00 (0) 'MS-DOS'\n+15D90 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15C60 Compression Method    0008 (8) 'Deflated'\n-15C62 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15C66 CRC                   1744C936 (390383926)\n-15C6A Compressed Size       000008C8 (2248)\n-15C6E Uncompressed Size     000023F1 (9201)\n-15C72 Filename Length       0045 (69)\n-15C74 Extra Length          0000 (0)\n-15C76 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15D92 Compression Method    0008 (8) 'Deflated'\n+15D94 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15D98 CRC                   FCBE727C (4240339580)\n+15D9C Compressed Size       000008D8 (2264)\n+15DA0 Uncompressed Size     000024E6 (9446)\n+15DA4 Filename Length       0045 (69)\n+15DA6 Extra Length          0000 (0)\n+15DA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15C76: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15DA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15CBB PAYLOAD\n+15DED PAYLOAD\n \n-16583 LOCAL HEADER #124     04034B50 (67324752)\n-16587 Extract Zip Spec      14 (20) '2.0'\n-16588 Extract OS            00 (0) 'MS-DOS'\n-16589 General Purpose Flag  0800 (2048)\n+166C5 LOCAL HEADER #124     04034B50 (67324752)\n+166C9 Extract Zip Spec      14 (20) '2.0'\n+166CA Extract OS            00 (0) 'MS-DOS'\n+166CB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1658B Compression Method    0008 (8) 'Deflated'\n-1658D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-16591 CRC                   287FAB99 (679455641)\n-16595 Compressed Size       0000033C (828)\n-16599 Uncompressed Size     000007C3 (1987)\n-1659D Filename Length       004C (76)\n-1659F Extra Length          0000 (0)\n-165A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+166CD Compression Method    0008 (8) 'Deflated'\n+166CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+166D3 CRC                   E7C23E33 (3888266803)\n+166D7 Compressed Size       00000343 (835)\n+166DB Uncompressed Size     000007F1 (2033)\n+166DF Filename Length       004C (76)\n+166E1 Extra Length          0000 (0)\n+166E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x165A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x166E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-165ED PAYLOAD\n+1672F PAYLOAD\n \n-16929 LOCAL HEADER #125     04034B50 (67324752)\n-1692D Extract Zip Spec      14 (20) '2.0'\n-1692E Extract OS            00 (0) 'MS-DOS'\n-1692F General Purpose Flag  0800 (2048)\n+16A72 LOCAL HEADER #125     04034B50 (67324752)\n+16A76 Extract Zip Spec      14 (20) '2.0'\n+16A77 Extract OS            00 (0) 'MS-DOS'\n+16A78 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-16931 Compression Method    0008 (8) 'Deflated'\n-16933 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-16937 CRC                   9083C03B (2424553531)\n-1693B Compressed Size       0000072C (1836)\n-1693F Uncompressed Size     00001B7B (7035)\n-16943 Filename Length       004D (77)\n-16945 Extra Length          0000 (0)\n-16947 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+16A7A Compression Method    0008 (8) 'Deflated'\n+16A7C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+16A80 CRC                   A4ED9691 (2767034001)\n+16A84 Compressed Size       00000739 (1849)\n+16A88 Uncompressed Size     00001C35 (7221)\n+16A8C Filename Length       004D (77)\n+16A8E Extra Length          0000 (0)\n+16A90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16947: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x16A90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16994 PAYLOAD\n+16ADD PAYLOAD\n \n-170C0 LOCAL HEADER #126     04034B50 (67324752)\n-170C4 Extract Zip Spec      14 (20) '2.0'\n-170C5 Extract OS            00 (0) 'MS-DOS'\n-170C6 General Purpose Flag  0800 (2048)\n+17216 LOCAL HEADER #126     04034B50 (67324752)\n+1721A Extract Zip Spec      14 (20) '2.0'\n+1721B Extract OS            00 (0) 'MS-DOS'\n+1721C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-170C8 Compression Method    0008 (8) 'Deflated'\n-170CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-170CE CRC                   F23B4D60 (4063972704)\n-170D2 Compressed Size       00001468 (5224)\n-170D6 Uncompressed Size     0000582A (22570)\n-170DA Filename Length       0054 (84)\n-170DC Extra Length          0000 (0)\n-170DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1721E Compression Method    0008 (8) 'Deflated'\n+17220 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+17224 CRC                   BAE14165 (3135324517)\n+17228 Compressed Size       00001488 (5256)\n+1722C Uncompressed Size     00005A88 (23176)\n+17230 Filename Length       0054 (84)\n+17232 Extra Length          0000 (0)\n+17234 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x170DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x17234: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-17132 PAYLOAD\n+17288 PAYLOAD\n \n-1859A LOCAL HEADER #127     04034B50 (67324752)\n-1859E Extract Zip Spec      14 (20) '2.0'\n-1859F Extract OS            00 (0) 'MS-DOS'\n-185A0 General Purpose Flag  0800 (2048)\n+18710 LOCAL HEADER #127     04034B50 (67324752)\n+18714 Extract Zip Spec      14 (20) '2.0'\n+18715 Extract OS            00 (0) 'MS-DOS'\n+18716 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-185A2 Compression Method    0008 (8) 'Deflated'\n-185A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-185A8 CRC                   E57CCA12 (3850160658)\n-185AC Compressed Size       0000029B (667)\n-185B0 Uncompressed Size     000005CF (1487)\n-185B4 Filename Length       005B (91)\n-185B6 Extra Length          0000 (0)\n-185B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+18718 Compression Method    0008 (8) 'Deflated'\n+1871A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1871E CRC                   BA62C70E (3127035662)\n+18722 Compressed Size       000002A4 (676)\n+18726 Uncompressed Size     000005F2 (1522)\n+1872A Filename Length       005B (91)\n+1872C Extra Length          0000 (0)\n+1872E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x185B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1872E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-18613 PAYLOAD\n+18789 PAYLOAD\n \n-188AE LOCAL HEADER #128     04034B50 (67324752)\n-188B2 Extract Zip Spec      14 (20) '2.0'\n-188B3 Extract OS            00 (0) 'MS-DOS'\n-188B4 General Purpose Flag  0800 (2048)\n+18A2D LOCAL HEADER #128     04034B50 (67324752)\n+18A31 Extract Zip Spec      14 (20) '2.0'\n+18A32 Extract OS            00 (0) 'MS-DOS'\n+18A33 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-188B6 Compression Method    0008 (8) 'Deflated'\n-188B8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-188BC CRC                   B946295F (3108383071)\n-188C0 Compressed Size       00000376 (886)\n-188C4 Uncompressed Size     000008A7 (2215)\n-188C8 Filename Length       004C (76)\n-188CA Extra Length          0000 (0)\n-188CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+18A35 Compression Method    0008 (8) 'Deflated'\n+18A37 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+18A3B CRC                   B653D686 (3058947718)\n+18A3F Compressed Size       0000037B (891)\n+18A43 Uncompressed Size     000008EF (2287)\n+18A47 Filename Length       004C (76)\n+18A49 Extra Length          0000 (0)\n+18A4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x188CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x18A4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-18918 PAYLOAD\n+18A97 PAYLOAD\n \n-18C8E LOCAL HEADER #129     04034B50 (67324752)\n-18C92 Extract Zip Spec      14 (20) '2.0'\n-18C93 Extract OS            00 (0) 'MS-DOS'\n-18C94 General Purpose Flag  0800 (2048)\n+18E12 LOCAL HEADER #129     04034B50 (67324752)\n+18E16 Extract Zip Spec      14 (20) '2.0'\n+18E17 Extract OS            00 (0) 'MS-DOS'\n+18E18 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18C96 Compression Method    0008 (8) 'Deflated'\n-18C98 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-18C9C CRC                   208B91F5 (546017781)\n-18CA0 Compressed Size       00000272 (626)\n-18CA4 Uncompressed Size     00000524 (1316)\n-18CA8 Filename Length       0053 (83)\n-18CAA Extra Length          0000 (0)\n-18CAC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+18E1A Compression Method    0008 (8) 'Deflated'\n+18E1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+18E20 CRC                   0495D293 (76927635)\n+18E24 Compressed Size       0000027B (635)\n+18E28 Uncompressed Size     00000545 (1349)\n+18E2C Filename Length       0053 (83)\n+18E2E Extra Length          0000 (0)\n+18E30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x18CAC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x18E30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-18CFF PAYLOAD\n+18E83 PAYLOAD\n \n-18F71 LOCAL HEADER #130     04034B50 (67324752)\n-18F75 Extract Zip Spec      14 (20) '2.0'\n-18F76 Extract OS            00 (0) 'MS-DOS'\n-18F77 General Purpose Flag  0800 (2048)\n+190FE LOCAL HEADER #130     04034B50 (67324752)\n+19102 Extract Zip Spec      14 (20) '2.0'\n+19103 Extract OS            00 (0) 'MS-DOS'\n+19104 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18F79 Compression Method    0008 (8) 'Deflated'\n-18F7B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-18F7F CRC                   C03FB50A (3225400586)\n-18F83 Compressed Size       00000492 (1170)\n-18F87 Uncompressed Size     00000F4A (3914)\n-18F8B Filename Length       0056 (86)\n-18F8D Extra Length          0000 (0)\n-18F8F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+19106 Compression Method    0008 (8) 'Deflated'\n+19108 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1910C CRC                   2171436F (561070959)\n+19110 Compressed Size       0000049C (1180)\n+19114 Uncompressed Size     00000FAF (4015)\n+19118 Filename Length       0056 (86)\n+1911A Extra Length          0000 (0)\n+1911C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x18F8F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1911C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-18FE5 PAYLOAD\n+19172 PAYLOAD\n \n-19477 LOCAL HEADER #131     04034B50 (67324752)\n-1947B Extract Zip Spec      14 (20) '2.0'\n-1947C Extract OS            00 (0) 'MS-DOS'\n-1947D General Purpose Flag  0800 (2048)\n+1960E LOCAL HEADER #131     04034B50 (67324752)\n+19612 Extract Zip Spec      14 (20) '2.0'\n+19613 Extract OS            00 (0) 'MS-DOS'\n+19614 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1947F Compression Method    0008 (8) 'Deflated'\n-19481 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-19485 CRC                   2CFFA2CA (754950858)\n-19489 Compressed Size       00000CF7 (3319)\n-1948D Uncompressed Size     00002810 (10256)\n-19491 Filename Length       0036 (54)\n-19493 Extra Length          0000 (0)\n-19495 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+19616 Compression Method    0008 (8) 'Deflated'\n+19618 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1961C CRC                   2E0F2713 (772744979)\n+19620 Compressed Size       00000D0C (3340)\n+19624 Uncompressed Size     00002999 (10649)\n+19628 Filename Length       0036 (54)\n+1962A Extra Length          0000 (0)\n+1962C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x19495: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1962C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-194CB PAYLOAD\n+19662 PAYLOAD\n \n-1A1C2 LOCAL HEADER #132     04034B50 (67324752)\n-1A1C6 Extract Zip Spec      14 (20) '2.0'\n-1A1C7 Extract OS            00 (0) 'MS-DOS'\n-1A1C8 General Purpose Flag  0800 (2048)\n+1A36E LOCAL HEADER #132     04034B50 (67324752)\n+1A372 Extract Zip Spec      14 (20) '2.0'\n+1A373 Extract OS            00 (0) 'MS-DOS'\n+1A374 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A1CA Compression Method    0008 (8) 'Deflated'\n-1A1CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1A1D0 CRC                   A6E18129 (2799796521)\n-1A1D4 Compressed Size       00000222 (546)\n-1A1D8 Uncompressed Size     000003BF (959)\n-1A1DC Filename Length       0036 (54)\n-1A1DE Extra Length          0000 (0)\n-1A1E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1A376 Compression Method    0008 (8) 'Deflated'\n+1A378 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1A37C CRC                   B7E4B654 (3085219412)\n+1A380 Compressed Size       0000022A (554)\n+1A384 Uncompressed Size     000003D7 (983)\n+1A388 Filename Length       0036 (54)\n+1A38A Extra Length          0000 (0)\n+1A38C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A1E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1A38C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A216 PAYLOAD\n+1A3C2 PAYLOAD\n \n-1A438 LOCAL HEADER #133     04034B50 (67324752)\n-1A43C Extract Zip Spec      14 (20) '2.0'\n-1A43D Extract OS            00 (0) 'MS-DOS'\n-1A43E General Purpose Flag  0800 (2048)\n+1A5EC LOCAL HEADER #133     04034B50 (67324752)\n+1A5F0 Extract Zip Spec      14 (20) '2.0'\n+1A5F1 Extract OS            00 (0) 'MS-DOS'\n+1A5F2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A440 Compression Method    0008 (8) 'Deflated'\n-1A442 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1A446 CRC                   0D4F07B4 (223283124)\n-1A44A Compressed Size       00000250 (592)\n-1A44E Uncompressed Size     0000042F (1071)\n-1A452 Filename Length       0033 (51)\n-1A454 Extra Length          0000 (0)\n-1A456 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1A5F4 Compression Method    0008 (8) 'Deflated'\n+1A5F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1A5FA CRC                   67723A29 (1735539241)\n+1A5FE Compressed Size       00000257 (599)\n+1A602 Uncompressed Size     0000044F (1103)\n+1A606 Filename Length       0033 (51)\n+1A608 Extra Length          0000 (0)\n+1A60A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A456: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1A60A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A489 PAYLOAD\n+1A63D PAYLOAD\n \n-1A6D9 LOCAL HEADER #134     04034B50 (67324752)\n-1A6DD Extract Zip Spec      14 (20) '2.0'\n-1A6DE Extract OS            00 (0) 'MS-DOS'\n-1A6DF General Purpose Flag  0800 (2048)\n+1A894 LOCAL HEADER #134     04034B50 (67324752)\n+1A898 Extract Zip Spec      14 (20) '2.0'\n+1A899 Extract OS            00 (0) 'MS-DOS'\n+1A89A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A6E1 Compression Method    0008 (8) 'Deflated'\n-1A6E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1A6E7 CRC                   E90F01CB (3910074827)\n-1A6EB Compressed Size       000004E1 (1249)\n-1A6EF Uncompressed Size     00000D8D (3469)\n-1A6F3 Filename Length       0038 (56)\n-1A6F5 Extra Length          0000 (0)\n-1A6F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1A89C Compression Method    0008 (8) 'Deflated'\n+1A89E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1A8A2 CRC                   EBE34920 (3957541152)\n+1A8A6 Compressed Size       000004EB (1259)\n+1A8AA Uncompressed Size     00000E07 (3591)\n+1A8AE Filename Length       0038 (56)\n+1A8B0 Extra Length          0000 (0)\n+1A8B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A6F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1A8B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A72F PAYLOAD\n+1A8EA PAYLOAD\n \n-1AC10 LOCAL HEADER #135     04034B50 (67324752)\n-1AC14 Extract Zip Spec      14 (20) '2.0'\n-1AC15 Extract OS            00 (0) 'MS-DOS'\n-1AC16 General Purpose Flag  0800 (2048)\n+1ADD5 LOCAL HEADER #135     04034B50 (67324752)\n+1ADD9 Extract Zip Spec      14 (20) '2.0'\n+1ADDA Extract OS            00 (0) 'MS-DOS'\n+1ADDB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1AC18 Compression Method    0008 (8) 'Deflated'\n-1AC1A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1AC1E CRC                   1B8CE743 (462219075)\n-1AC22 Compressed Size       0000021E (542)\n-1AC26 Uncompressed Size     000003B6 (950)\n-1AC2A Filename Length       0038 (56)\n-1AC2C Extra Length          0000 (0)\n-1AC2E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1ADDD Compression Method    0008 (8) 'Deflated'\n+1ADDF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1ADE3 CRC                   F01E112A (4028502314)\n+1ADE7 Compressed Size       00000224 (548)\n+1ADEB Uncompressed Size     000003D0 (976)\n+1ADEF Filename Length       0038 (56)\n+1ADF1 Extra Length          0000 (0)\n+1ADF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1AC2E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1ADF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1AC66 PAYLOAD\n+1AE2B PAYLOAD\n \n-1AE84 LOCAL HEADER #136     04034B50 (67324752)\n-1AE88 Extract Zip Spec      14 (20) '2.0'\n-1AE89 Extract OS            00 (0) 'MS-DOS'\n-1AE8A General Purpose Flag  0800 (2048)\n+1B04F LOCAL HEADER #136     04034B50 (67324752)\n+1B053 Extract Zip Spec      14 (20) '2.0'\n+1B054 Extract OS            00 (0) 'MS-DOS'\n+1B055 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1AE8C Compression Method    0008 (8) 'Deflated'\n-1AE8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1AE92 CRC                   94BF4E7B (2495565435)\n-1AE96 Compressed Size       00000219 (537)\n-1AE9A Uncompressed Size     000003B5 (949)\n-1AE9E Filename Length       0031 (49)\n-1AEA0 Extra Length          0000 (0)\n-1AEA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B057 Compression Method    0008 (8) 'Deflated'\n+1B059 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B05D CRC                   16DF264E (383723086)\n+1B061 Compressed Size       00000221 (545)\n+1B065 Uncompressed Size     000003CD (973)\n+1B069 Filename Length       0031 (49)\n+1B06B Extra Length          0000 (0)\n+1B06D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1AEA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B06D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1AED3 PAYLOAD\n+1B09E PAYLOAD\n \n-1B0EC LOCAL HEADER #137     04034B50 (67324752)\n-1B0F0 Extract Zip Spec      14 (20) '2.0'\n-1B0F1 Extract OS            00 (0) 'MS-DOS'\n-1B0F2 General Purpose Flag  0800 (2048)\n+1B2BF LOCAL HEADER #137     04034B50 (67324752)\n+1B2C3 Extract Zip Spec      14 (20) '2.0'\n+1B2C4 Extract OS            00 (0) 'MS-DOS'\n+1B2C5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B0F4 Compression Method    0008 (8) 'Deflated'\n-1B0F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B0FA CRC                   01244711 (19154705)\n-1B0FE Compressed Size       00000293 (659)\n-1B102 Uncompressed Size     000005BD (1469)\n-1B106 Filename Length       002E (46)\n-1B108 Extra Length          0000 (0)\n-1B10A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B2C7 Compression Method    0008 (8) 'Deflated'\n+1B2C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B2CD CRC                   66454DE7 (1715817959)\n+1B2D1 Compressed Size       0000029A (666)\n+1B2D5 Uncompressed Size     000005ED (1517)\n+1B2D9 Filename Length       002E (46)\n+1B2DB Extra Length          0000 (0)\n+1B2DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B10A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B2DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B138 PAYLOAD\n+1B30B PAYLOAD\n \n-1B3CB LOCAL HEADER #138     04034B50 (67324752)\n-1B3CF Extract Zip Spec      14 (20) '2.0'\n-1B3D0 Extract OS            00 (0) 'MS-DOS'\n-1B3D1 General Purpose Flag  0800 (2048)\n+1B5A5 LOCAL HEADER #138     04034B50 (67324752)\n+1B5A9 Extract Zip Spec      14 (20) '2.0'\n+1B5AA Extract OS            00 (0) 'MS-DOS'\n+1B5AB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B3D3 Compression Method    0008 (8) 'Deflated'\n-1B3D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B3D9 CRC                   8B9FA779 (2342496121)\n-1B3DD Compressed Size       00000248 (584)\n-1B3E1 Uncompressed Size     0000047A (1146)\n-1B3E5 Filename Length       0035 (53)\n-1B3E7 Extra Length          0000 (0)\n-1B3E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B5AD Compression Method    0008 (8) 'Deflated'\n+1B5AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B5B3 CRC                   F8009358 (4160787288)\n+1B5B7 Compressed Size       0000024E (590)\n+1B5BB Uncompressed Size     0000049D (1181)\n+1B5BF Filename Length       0035 (53)\n+1B5C1 Extra Length          0000 (0)\n+1B5C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B3E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B5C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B41E PAYLOAD\n+1B5F8 PAYLOAD\n \n-1B666 LOCAL HEADER #139     04034B50 (67324752)\n-1B66A Extract Zip Spec      14 (20) '2.0'\n-1B66B Extract OS            00 (0) 'MS-DOS'\n-1B66C General Purpose Flag  0800 (2048)\n+1B846 LOCAL HEADER #139     04034B50 (67324752)\n+1B84A Extract Zip Spec      14 (20) '2.0'\n+1B84B Extract OS            00 (0) 'MS-DOS'\n+1B84C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B66E Compression Method    0008 (8) 'Deflated'\n-1B670 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B674 CRC                   6A25F272 (1780871794)\n-1B678 Compressed Size       000004C1 (1217)\n-1B67C Uncompressed Size     00000E60 (3680)\n-1B680 Filename Length       002E (46)\n-1B682 Extra Length          0000 (0)\n-1B684 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B84E Compression Method    0008 (8) 'Deflated'\n+1B850 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B854 CRC                   C8C419A3 (3368294819)\n+1B858 Compressed Size       000004CC (1228)\n+1B85C Uncompressed Size     00000ECC (3788)\n+1B860 Filename Length       002E (46)\n+1B862 Extra Length          0000 (0)\n+1B864 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B684: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B864: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B6B2 PAYLOAD\n+1B892 PAYLOAD\n \n-1BB73 LOCAL HEADER #140     04034B50 (67324752)\n-1BB77 Extract Zip Spec      14 (20) '2.0'\n-1BB78 Extract OS            00 (0) 'MS-DOS'\n-1BB79 General Purpose Flag  0800 (2048)\n+1BD5E LOCAL HEADER #140     04034B50 (67324752)\n+1BD62 Extract Zip Spec      14 (20) '2.0'\n+1BD63 Extract OS            00 (0) 'MS-DOS'\n+1BD64 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1BB7B Compression Method    0008 (8) 'Deflated'\n-1BB7D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1BB81 CRC                   94774B8E (2490846094)\n-1BB85 Compressed Size       0000024C (588)\n-1BB89 Uncompressed Size     00000411 (1041)\n-1BB8D Filename Length       0034 (52)\n-1BB8F Extra Length          0000 (0)\n-1BB91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1BD66 Compression Method    0008 (8) 'Deflated'\n+1BD68 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1BD6C CRC                   C31C00DA (3273392346)\n+1BD70 Compressed Size       00000255 (597)\n+1BD74 Uncompressed Size     0000042C (1068)\n+1BD78 Filename Length       0034 (52)\n+1BD7A Extra Length          0000 (0)\n+1BD7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BB91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BD7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BBC5 PAYLOAD\n+1BDB0 PAYLOAD\n \n-1BE11 LOCAL HEADER #141     04034B50 (67324752)\n-1BE15 Extract Zip Spec      14 (20) '2.0'\n-1BE16 Extract OS            00 (0) 'MS-DOS'\n-1BE17 General Purpose Flag  0800 (2048)\n+1C005 LOCAL HEADER #141     04034B50 (67324752)\n+1C009 Extract Zip Spec      14 (20) '2.0'\n+1C00A Extract OS            00 (0) 'MS-DOS'\n+1C00B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1BE19 Compression Method    0008 (8) 'Deflated'\n-1BE1B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1BE1F CRC                   A95D9412 (2841482258)\n-1BE23 Compressed Size       000002B6 (694)\n-1BE27 Uncompressed Size     00000532 (1330)\n-1BE2B Filename Length       003D (61)\n-1BE2D Extra Length          0000 (0)\n-1BE2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C00D Compression Method    0008 (8) 'Deflated'\n+1C00F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C013 CRC                   C4FF04D7 (3305047255)\n+1C017 Compressed Size       000002C0 (704)\n+1C01B Uncompressed Size     00000558 (1368)\n+1C01F Filename Length       003D (61)\n+1C021 Extra Length          0000 (0)\n+1C023 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BE2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C023: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BE6C PAYLOAD\n+1C060 PAYLOAD\n \n-1C122 LOCAL HEADER #142     04034B50 (67324752)\n-1C126 Extract Zip Spec      14 (20) '2.0'\n-1C127 Extract OS            00 (0) 'MS-DOS'\n-1C128 General Purpose Flag  0800 (2048)\n+1C320 LOCAL HEADER #142     04034B50 (67324752)\n+1C324 Extract Zip Spec      14 (20) '2.0'\n+1C325 Extract OS            00 (0) 'MS-DOS'\n+1C326 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C12A Compression Method    0008 (8) 'Deflated'\n-1C12C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1C130 CRC                   578BE304 (1468785412)\n-1C134 Compressed Size       000002B2 (690)\n-1C138 Uncompressed Size     00000514 (1300)\n-1C13C Filename Length       003F (63)\n-1C13E Extra Length          0000 (0)\n-1C140 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C328 Compression Method    0008 (8) 'Deflated'\n+1C32A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C32E CRC                   B8E6EA58 (3102141016)\n+1C332 Compressed Size       000002BB (699)\n+1C336 Uncompressed Size     0000053B (1339)\n+1C33A Filename Length       003F (63)\n+1C33C Extra Length          0000 (0)\n+1C33E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C140: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C33E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C17F PAYLOAD\n+1C37D PAYLOAD\n \n-1C431 LOCAL HEADER #143     04034B50 (67324752)\n-1C435 Extract Zip Spec      14 (20) '2.0'\n-1C436 Extract OS            00 (0) 'MS-DOS'\n-1C437 General Purpose Flag  0800 (2048)\n+1C638 LOCAL HEADER #143     04034B50 (67324752)\n+1C63C Extract Zip Spec      14 (20) '2.0'\n+1C63D Extract OS            00 (0) 'MS-DOS'\n+1C63E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C439 Compression Method    0008 (8) 'Deflated'\n-1C43B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1C43F CRC                   8AE0BB27 (2329983783)\n-1C443 Compressed Size       000002F3 (755)\n-1C447 Uncompressed Size     000005DA (1498)\n-1C44B Filename Length       003F (63)\n-1C44D Extra Length          0000 (0)\n-1C44F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C640 Compression Method    0008 (8) 'Deflated'\n+1C642 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C646 CRC                   27EF74B8 (670004408)\n+1C64A Compressed Size       000002FD (765)\n+1C64E Uncompressed Size     00000606 (1542)\n+1C652 Filename Length       003F (63)\n+1C654 Extra Length          0000 (0)\n+1C656 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C44F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C656: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C48E PAYLOAD\n+1C695 PAYLOAD\n \n-1C781 LOCAL HEADER #144     04034B50 (67324752)\n-1C785 Extract Zip Spec      14 (20) '2.0'\n-1C786 Extract OS            00 (0) 'MS-DOS'\n-1C787 General Purpose Flag  0800 (2048)\n+1C992 LOCAL HEADER #144     04034B50 (67324752)\n+1C996 Extract Zip Spec      14 (20) '2.0'\n+1C997 Extract OS            00 (0) 'MS-DOS'\n+1C998 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C789 Compression Method    0008 (8) 'Deflated'\n-1C78B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1C78F CRC                   D8EB7635 (3639309877)\n-1C793 Compressed Size       000002B6 (694)\n-1C797 Uncompressed Size     0000052E (1326)\n-1C79B Filename Length       003C (60)\n-1C79D Extra Length          0000 (0)\n-1C79F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C99A Compression Method    0008 (8) 'Deflated'\n+1C99C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C9A0 CRC                   3F610BCB (1063324619)\n+1C9A4 Compressed Size       000002C0 (704)\n+1C9A8 Uncompressed Size     00000555 (1365)\n+1C9AC Filename Length       003C (60)\n+1C9AE Extra Length          0000 (0)\n+1C9B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C79F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C9B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C7DB PAYLOAD\n+1C9EC PAYLOAD\n \n-1CA91 LOCAL HEADER #145     04034B50 (67324752)\n-1CA95 Extract Zip Spec      14 (20) '2.0'\n-1CA96 Extract OS            00 (0) 'MS-DOS'\n-1CA97 General Purpose Flag  0800 (2048)\n+1CCAC LOCAL HEADER #145     04034B50 (67324752)\n+1CCB0 Extract Zip Spec      14 (20) '2.0'\n+1CCB1 Extract OS            00 (0) 'MS-DOS'\n+1CCB2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1CA99 Compression Method    0008 (8) 'Deflated'\n-1CA9B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1CA9F CRC                   7C7DD03D (2088620093)\n-1CAA3 Compressed Size       000002B5 (693)\n-1CAA7 Uncompressed Size     00000528 (1320)\n-1CAAB Filename Length       003B (59)\n-1CAAD Extra Length          0000 (0)\n-1CAAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1CCB4 Compression Method    0008 (8) 'Deflated'\n+1CCB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1CCBA CRC                   15F2A538 (368223544)\n+1CCBE Compressed Size       000002BE (702)\n+1CCC2 Uncompressed Size     0000054E (1358)\n+1CCC6 Filename Length       003B (59)\n+1CCC8 Extra Length          0000 (0)\n+1CCCA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1CAAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1CCCA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1CAEA PAYLOAD\n+1CD05 PAYLOAD\n \n-1CD9F LOCAL HEADER #146     04034B50 (67324752)\n-1CDA3 Extract Zip Spec      14 (20) '2.0'\n-1CDA4 Extract OS            00 (0) 'MS-DOS'\n-1CDA5 General Purpose Flag  0800 (2048)\n+1CFC3 LOCAL HEADER #146     04034B50 (67324752)\n+1CFC7 Extract Zip Spec      14 (20) '2.0'\n+1CFC8 Extract OS            00 (0) 'MS-DOS'\n+1CFC9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1CDA7 Compression Method    0008 (8) 'Deflated'\n-1CDA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1CDAD CRC                   39AACB0F (967494415)\n-1CDB1 Compressed Size       000002B2 (690)\n-1CDB5 Uncompressed Size     0000052E (1326)\n-1CDB9 Filename Length       003D (61)\n-1CDBB Extra Length          0000 (0)\n-1CDBD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1CFCB Compression Method    0008 (8) 'Deflated'\n+1CFCD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1CFD1 CRC                   DB3985F1 (3677980145)\n+1CFD5 Compressed Size       000002BC (700)\n+1CFD9 Uncompressed Size     00000554 (1364)\n+1CFDD Filename Length       003D (61)\n+1CFDF Extra Length          0000 (0)\n+1CFE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1CDBD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1CFE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1CDFA PAYLOAD\n+1D01E PAYLOAD\n \n-1D0AC LOCAL HEADER #147     04034B50 (67324752)\n-1D0B0 Extract Zip Spec      14 (20) '2.0'\n-1D0B1 Extract OS            00 (0) 'MS-DOS'\n-1D0B2 General Purpose Flag  0800 (2048)\n+1D2DA LOCAL HEADER #147     04034B50 (67324752)\n+1D2DE Extract Zip Spec      14 (20) '2.0'\n+1D2DF Extract OS            00 (0) 'MS-DOS'\n+1D2E0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1D0B4 Compression Method    0008 (8) 'Deflated'\n-1D0B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1D0BA CRC                   5BF59138 (1542820152)\n-1D0BE Compressed Size       000002B4 (692)\n-1D0C2 Uncompressed Size     00000524 (1316)\n-1D0C6 Filename Length       003A (58)\n-1D0C8 Extra Length          0000 (0)\n-1D0CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1D2E2 Compression Method    0008 (8) 'Deflated'\n+1D2E4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1D2E8 CRC                   7AC3DE73 (2059656819)\n+1D2EC Compressed Size       000002BF (703)\n+1D2F0 Uncompressed Size     0000054B (1355)\n+1D2F4 Filename Length       003A (58)\n+1D2F6 Extra Length          0000 (0)\n+1D2F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1D0CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1D2F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1D104 PAYLOAD\n+1D332 PAYLOAD\n \n-1D3B8 LOCAL HEADER #148     04034B50 (67324752)\n-1D3BC Extract Zip Spec      14 (20) '2.0'\n-1D3BD Extract OS            00 (0) 'MS-DOS'\n-1D3BE General Purpose Flag  0800 (2048)\n+1D5F1 LOCAL HEADER #148     04034B50 (67324752)\n+1D5F5 Extract Zip Spec      14 (20) '2.0'\n+1D5F6 Extract OS            00 (0) 'MS-DOS'\n+1D5F7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1D3C0 Compression Method    0008 (8) 'Deflated'\n-1D3C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1D3C6 CRC                   9AA4AEC4 (2594483908)\n-1D3CA Compressed Size       00000295 (661)\n-1D3CE Uncompressed Size     000004F3 (1267)\n-1D3D2 Filename Length       003E (62)\n-1D3D4 Extra Length          0000 (0)\n-1D3D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1D5F9 Compression Method    0008 (8) 'Deflated'\n+1D5FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1D5FF CRC                   190CB88A (420264074)\n+1D603 Compressed Size       0000029F (671)\n+1D607 Uncompressed Size     0000051B (1307)\n+1D60B Filename Length       003E (62)\n+1D60D Extra Length          0000 (0)\n+1D60F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1D3D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1D60F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1D414 PAYLOAD\n+1D64D PAYLOAD\n \n-1D6A9 LOCAL HEADER #149     04034B50 (67324752)\n-1D6AD Extract Zip Spec      14 (20) '2.0'\n-1D6AE Extract OS            00 (0) 'MS-DOS'\n-1D6AF General Purpose Flag  0800 (2048)\n+1D8EC LOCAL HEADER #149     04034B50 (67324752)\n+1D8F0 Extract Zip Spec      14 (20) '2.0'\n+1D8F1 Extract OS            00 (0) 'MS-DOS'\n+1D8F2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1D6B1 Compression Method    0008 (8) 'Deflated'\n-1D6B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1D6B7 CRC                   FD88956D (4253586797)\n-1D6BB Compressed Size       000002B4 (692)\n-1D6BF Uncompressed Size     00000529 (1321)\n-1D6C3 Filename Length       003B (59)\n-1D6C5 Extra Length          0000 (0)\n-1D6C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1D8F4 Compression Method    0008 (8) 'Deflated'\n+1D8F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1D8FA CRC                   94D0E691 (2496718481)\n+1D8FE Compressed Size       000002BF (703)\n+1D902 Uncompressed Size     00000550 (1360)\n+1D906 Filename Length       003B (59)\n+1D908 Extra Length          0000 (0)\n+1D90A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1D6C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1D90A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1D702 PAYLOAD\n+1D945 PAYLOAD\n \n-1D9B6 LOCAL HEADER #150     04034B50 (67324752)\n-1D9BA Extract Zip Spec      14 (20) '2.0'\n-1D9BB Extract OS            00 (0) 'MS-DOS'\n-1D9BC General Purpose Flag  0800 (2048)\n+1DC04 LOCAL HEADER #150     04034B50 (67324752)\n+1DC08 Extract Zip Spec      14 (20) '2.0'\n+1DC09 Extract OS            00 (0) 'MS-DOS'\n+1DC0A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1D9BE Compression Method    0008 (8) 'Deflated'\n-1D9C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1D9C4 CRC                   88F80863 (2297956451)\n-1D9C8 Compressed Size       0000025F (607)\n-1D9CC Uncompressed Size     00000452 (1106)\n-1D9D0 Filename Length       003C (60)\n-1D9D2 Extra Length          0000 (0)\n-1D9D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1DC0C Compression Method    0008 (8) 'Deflated'\n+1DC0E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1DC12 CRC                   E4FF1EF0 (3841924848)\n+1DC16 Compressed Size       00000267 (615)\n+1DC1A Uncompressed Size     00000470 (1136)\n+1DC1E Filename Length       003C (60)\n+1DC20 Extra Length          0000 (0)\n+1DC22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1D9D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1DC22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1DA10 PAYLOAD\n+1DC5E PAYLOAD\n \n-1DC6F LOCAL HEADER #151     04034B50 (67324752)\n-1DC73 Extract Zip Spec      14 (20) '2.0'\n-1DC74 Extract OS            00 (0) 'MS-DOS'\n-1DC75 General Purpose Flag  0800 (2048)\n+1DEC5 LOCAL HEADER #151     04034B50 (67324752)\n+1DEC9 Extract Zip Spec      14 (20) '2.0'\n+1DECA Extract OS            00 (0) 'MS-DOS'\n+1DECB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1DC77 Compression Method    0008 (8) 'Deflated'\n-1DC79 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1DC7D CRC                   56E92431 (1458119729)\n-1DC81 Compressed Size       000004C7 (1223)\n-1DC85 Uncompressed Size     00000D31 (3377)\n-1DC89 Filename Length       0041 (65)\n-1DC8B Extra Length          0000 (0)\n-1DC8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1DECD Compression Method    0008 (8) 'Deflated'\n+1DECF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1DED3 CRC                   54CD8A2A (1422756394)\n+1DED7 Compressed Size       000004D2 (1234)\n+1DEDB Uncompressed Size     00000D8D (3469)\n+1DEDF Filename Length       0041 (65)\n+1DEE1 Extra Length          0000 (0)\n+1DEE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1DC8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1DEE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1DCCE PAYLOAD\n+1DF24 PAYLOAD\n \n-1E195 LOCAL HEADER #152     04034B50 (67324752)\n-1E199 Extract Zip Spec      14 (20) '2.0'\n-1E19A Extract OS            00 (0) 'MS-DOS'\n-1E19B General Purpose Flag  0800 (2048)\n+1E3F6 LOCAL HEADER #152     04034B50 (67324752)\n+1E3FA Extract Zip Spec      14 (20) '2.0'\n+1E3FB Extract OS            00 (0) 'MS-DOS'\n+1E3FC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1E19D Compression Method    0008 (8) 'Deflated'\n-1E19F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1E1A3 CRC                   54A7512C (1420251436)\n-1E1A7 Compressed Size       0000037E (894)\n-1E1AB Uncompressed Size     00000774 (1908)\n-1E1AF Filename Length       0044 (68)\n-1E1B1 Extra Length          0000 (0)\n-1E1B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1E3FE Compression Method    0008 (8) 'Deflated'\n+1E400 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1E404 CRC                   6FAB873E (1873512254)\n+1E408 Compressed Size       00000388 (904)\n+1E40C Uncompressed Size     000007B0 (1968)\n+1E410 Filename Length       0044 (68)\n+1E412 Extra Length          0000 (0)\n+1E414 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1E1B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E414: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1E1F7 PAYLOAD\n+1E458 PAYLOAD\n \n-1E575 LOCAL HEADER #153     04034B50 (67324752)\n-1E579 Extract Zip Spec      14 (20) '2.0'\n-1E57A Extract OS            00 (0) 'MS-DOS'\n-1E57B General Purpose Flag  0800 (2048)\n+1E7E0 LOCAL HEADER #153     04034B50 (67324752)\n+1E7E4 Extract Zip Spec      14 (20) '2.0'\n+1E7E5 Extract OS            00 (0) 'MS-DOS'\n+1E7E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1E57D Compression Method    0008 (8) 'Deflated'\n-1E57F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1E583 CRC                   44B63BF0 (1152793584)\n-1E587 Compressed Size       000002B1 (689)\n-1E58B Uncompressed Size     0000050F (1295)\n-1E58F Filename Length       004C (76)\n-1E591 Extra Length          0000 (0)\n-1E593 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1E7E8 Compression Method    0008 (8) 'Deflated'\n+1E7EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1E7EE CRC                   0C78A9F4 (209234420)\n+1E7F2 Compressed Size       000002BC (700)\n+1E7F6 Uncompressed Size     00000530 (1328)\n+1E7FA Filename Length       004C (76)\n+1E7FC Extra Length          0000 (0)\n+1E7FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1E593: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E7FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1E5DF PAYLOAD\n+1E84A PAYLOAD\n \n-1E890 LOCAL HEADER #154     04034B50 (67324752)\n-1E894 Extract Zip Spec      14 (20) '2.0'\n-1E895 Extract OS            00 (0) 'MS-DOS'\n-1E896 General Purpose Flag  0800 (2048)\n+1EB06 LOCAL HEADER #154     04034B50 (67324752)\n+1EB0A Extract Zip Spec      14 (20) '2.0'\n+1EB0B Extract OS            00 (0) 'MS-DOS'\n+1EB0C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1E898 Compression Method    0008 (8) 'Deflated'\n-1E89A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1E89E CRC                   6FDF7D92 (1876917650)\n-1E8A2 Compressed Size       000002BA (698)\n-1E8A6 Uncompressed Size     00000538 (1336)\n-1E8AA Filename Length       004C (76)\n-1E8AC Extra Length          0000 (0)\n-1E8AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1EB0E Compression Method    0008 (8) 'Deflated'\n+1EB10 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1EB14 CRC                   5D42735B (1564635995)\n+1EB18 Compressed Size       000002C4 (708)\n+1EB1C Uncompressed Size     0000055A (1370)\n+1EB20 Filename Length       004C (76)\n+1EB22 Extra Length          0000 (0)\n+1EB24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1E8AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EB24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1E8FA PAYLOAD\n+1EB70 PAYLOAD\n \n-1EBB4 LOCAL HEADER #155     04034B50 (67324752)\n-1EBB8 Extract Zip Spec      14 (20) '2.0'\n-1EBB9 Extract OS            00 (0) 'MS-DOS'\n-1EBBA General Purpose Flag  0800 (2048)\n+1EE34 LOCAL HEADER #155     04034B50 (67324752)\n+1EE38 Extract Zip Spec      14 (20) '2.0'\n+1EE39 Extract OS            00 (0) 'MS-DOS'\n+1EE3A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1EBBC Compression Method    0008 (8) 'Deflated'\n-1EBBE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1EBC2 CRC                   E28B1205 (3800764933)\n-1EBC6 Compressed Size       000002A4 (676)\n-1EBCA Uncompressed Size     000004D6 (1238)\n-1EBCE Filename Length       0049 (73)\n-1EBD0 Extra Length          0000 (0)\n-1EBD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1EE3C Compression Method    0008 (8) 'Deflated'\n+1EE3E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1EE42 CRC                   FE374BB9 (4265036729)\n+1EE46 Compressed Size       000002AF (687)\n+1EE4A Uncompressed Size     000004F7 (1271)\n+1EE4E Filename Length       0049 (73)\n+1EE50 Extra Length          0000 (0)\n+1EE52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1EBD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EE52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1EC1B PAYLOAD\n+1EE9B PAYLOAD\n \n-1EEBF LOCAL HEADER #156     04034B50 (67324752)\n-1EEC3 Extract Zip Spec      14 (20) '2.0'\n-1EEC4 Extract OS            00 (0) 'MS-DOS'\n-1EEC5 General Purpose Flag  0800 (2048)\n+1F14A LOCAL HEADER #156     04034B50 (67324752)\n+1F14E Extract Zip Spec      14 (20) '2.0'\n+1F14F Extract OS            00 (0) 'MS-DOS'\n+1F150 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1EEC7 Compression Method    0008 (8) 'Deflated'\n-1EEC9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1EECD CRC                   8C9A6BCF (2358930383)\n-1EED1 Compressed Size       0000029F (671)\n-1EED5 Uncompressed Size     000004BF (1215)\n-1EED9 Filename Length       0044 (68)\n-1EEDB Extra Length          0000 (0)\n-1EEDD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1F152 Compression Method    0008 (8) 'Deflated'\n+1F154 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1F158 CRC                   EF9E0DDB (4020112859)\n+1F15C Compressed Size       000002A9 (681)\n+1F160 Uncompressed Size     000004E0 (1248)\n+1F164 Filename Length       0044 (68)\n+1F166 Extra Length          0000 (0)\n+1F168 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1EEDD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1F168: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1EF21 PAYLOAD\n+1F1AC PAYLOAD\n \n-1F1C0 LOCAL HEADER #157     04034B50 (67324752)\n-1F1C4 Extract Zip Spec      14 (20) '2.0'\n-1F1C5 Extract OS            00 (0) 'MS-DOS'\n-1F1C6 General Purpose Flag  0800 (2048)\n+1F455 LOCAL HEADER #157     04034B50 (67324752)\n+1F459 Extract Zip Spec      14 (20) '2.0'\n+1F45A Extract OS            00 (0) 'MS-DOS'\n+1F45B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F1C8 Compression Method    0008 (8) 'Deflated'\n-1F1CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F1CE CRC                   17228680 (388138624)\n-1F1D2 Compressed Size       0000048F (1167)\n-1F1D6 Uncompressed Size     00000C22 (3106)\n-1F1DA Filename Length       0047 (71)\n-1F1DC Extra Length          0000 (0)\n-1F1DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1F45D Compression Method    0008 (8) 'Deflated'\n+1F45F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1F463 CRC                   65FB8949 (1710983497)\n+1F467 Compressed Size       0000049B (1179)\n+1F46B Uncompressed Size     00000C72 (3186)\n+1F46F Filename Length       0047 (71)\n+1F471 Extra Length          0000 (0)\n+1F473 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F1DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1F473: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F225 PAYLOAD\n+1F4BA PAYLOAD\n \n-1F6B4 LOCAL HEADER #158     04034B50 (67324752)\n-1F6B8 Extract Zip Spec      14 (20) '2.0'\n-1F6B9 Extract OS            00 (0) 'MS-DOS'\n-1F6BA General Purpose Flag  0800 (2048)\n+1F955 LOCAL HEADER #158     04034B50 (67324752)\n+1F959 Extract Zip Spec      14 (20) '2.0'\n+1F95A Extract OS            00 (0) 'MS-DOS'\n+1F95B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F6BC Compression Method    0008 (8) 'Deflated'\n-1F6BE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F6C2 CRC                   90DCE257 (2430394967)\n-1F6C6 Compressed Size       0000029D (669)\n-1F6CA Uncompressed Size     000004B8 (1208)\n-1F6CE Filename Length       0043 (67)\n-1F6D0 Extra Length          0000 (0)\n-1F6D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1F95D Compression Method    0008 (8) 'Deflated'\n+1F95F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1F963 CRC                   CC224977 (3424799095)\n+1F967 Compressed Size       000002A9 (681)\n+1F96B Uncompressed Size     000004D9 (1241)\n+1F96F Filename Length       0043 (67)\n+1F971 Extra Length          0000 (0)\n+1F973 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F6D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1F973: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F715 PAYLOAD\n+1F9B6 PAYLOAD\n \n-1F9B2 LOCAL HEADER #159     04034B50 (67324752)\n-1F9B6 Extract Zip Spec      14 (20) '2.0'\n-1F9B7 Extract OS            00 (0) 'MS-DOS'\n-1F9B8 General Purpose Flag  0800 (2048)\n+1FC5F LOCAL HEADER #159     04034B50 (67324752)\n+1FC63 Extract Zip Spec      14 (20) '2.0'\n+1FC64 Extract OS            00 (0) 'MS-DOS'\n+1FC65 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F9BA Compression Method    0008 (8) 'Deflated'\n-1F9BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F9C0 CRC                   092E21B3 (154018227)\n-1F9C4 Compressed Size       000003A4 (932)\n-1F9C8 Uncompressed Size     00000873 (2163)\n-1F9CC Filename Length       0049 (73)\n-1F9CE Extra Length          0000 (0)\n-1F9D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FC67 Compression Method    0008 (8) 'Deflated'\n+1FC69 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FC6D CRC                   38CBB90F (952875279)\n+1FC71 Compressed Size       000003AE (942)\n+1FC75 Uncompressed Size     000008B0 (2224)\n+1FC79 Filename Length       0049 (73)\n+1FC7B Extra Length          0000 (0)\n+1FC7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F9D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FC7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FA19 PAYLOAD\n+1FCC6 PAYLOAD\n \n-1FDBD LOCAL HEADER #160     04034B50 (67324752)\n-1FDC1 Extract Zip Spec      14 (20) '2.0'\n-1FDC2 Extract OS            00 (0) 'MS-DOS'\n-1FDC3 General Purpose Flag  0800 (2048)\n+20074 LOCAL HEADER #160     04034B50 (67324752)\n+20078 Extract Zip Spec      14 (20) '2.0'\n+20079 Extract OS            00 (0) 'MS-DOS'\n+2007A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FDC5 Compression Method    0008 (8) 'Deflated'\n-1FDC7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FDCB CRC                   D50997CD (3574175693)\n-1FDCF Compressed Size       000002A8 (680)\n-1FDD3 Uncompressed Size     000004F1 (1265)\n-1FDD7 Filename Length       004B (75)\n-1FDD9 Extra Length          0000 (0)\n-1FDDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2007C Compression Method    0008 (8) 'Deflated'\n+2007E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20082 CRC                   F0075F17 (4027014935)\n+20086 Compressed Size       000002B2 (690)\n+2008A Uncompressed Size     00000513 (1299)\n+2008E Filename Length       004B (75)\n+20090 Extra Length          0000 (0)\n+20092 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FDDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20092: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FE26 PAYLOAD\n+200DD PAYLOAD\n \n-200CE LOCAL HEADER #161     04034B50 (67324752)\n-200D2 Extract Zip Spec      14 (20) '2.0'\n-200D3 Extract OS            00 (0) 'MS-DOS'\n-200D4 General Purpose Flag  0800 (2048)\n+2038F LOCAL HEADER #161     04034B50 (67324752)\n+20393 Extract Zip Spec      14 (20) '2.0'\n+20394 Extract OS            00 (0) 'MS-DOS'\n+20395 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-200D6 Compression Method    0008 (8) 'Deflated'\n-200D8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-200DC CRC                   1389D7CB (327800779)\n-200E0 Compressed Size       000002A6 (678)\n-200E4 Uncompressed Size     000004D7 (1239)\n-200E8 Filename Length       0044 (68)\n-200EA Extra Length          0000 (0)\n-200EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20397 Compression Method    0008 (8) 'Deflated'\n+20399 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2039D CRC                   42E91C9D (1122573469)\n+203A1 Compressed Size       000002AE (686)\n+203A5 Uncompressed Size     000004F9 (1273)\n+203A9 Filename Length       0044 (68)\n+203AB Extra Length          0000 (0)\n+203AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x200EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x203AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20130 PAYLOAD\n+203F1 PAYLOAD\n \n-203D6 LOCAL HEADER #162     04034B50 (67324752)\n-203DA Extract Zip Spec      14 (20) '2.0'\n-203DB Extract OS            00 (0) 'MS-DOS'\n-203DC General Purpose Flag  0800 (2048)\n+2069F LOCAL HEADER #162     04034B50 (67324752)\n+206A3 Extract Zip Spec      14 (20) '2.0'\n+206A4 Extract OS            00 (0) 'MS-DOS'\n+206A5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-203DE Compression Method    0008 (8) 'Deflated'\n-203E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-203E4 CRC                   0204ADF7 (33861111)\n-203E8 Compressed Size       0000029C (668)\n-203EC Uncompressed Size     000004AF (1199)\n-203F0 Filename Length       0042 (66)\n-203F2 Extra Length          0000 (0)\n-203F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+206A7 Compression Method    0008 (8) 'Deflated'\n+206A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+206AD CRC                   85A11C0C (2241928204)\n+206B1 Compressed Size       000002A6 (678)\n+206B5 Uncompressed Size     000004D0 (1232)\n+206B9 Filename Length       0042 (66)\n+206BB Extra Length          0000 (0)\n+206BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x203F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x206BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20436 PAYLOAD\n+206FF PAYLOAD\n \n-206D2 LOCAL HEADER #163     04034B50 (67324752)\n-206D6 Extract Zip Spec      14 (20) '2.0'\n-206D7 Extract OS            00 (0) 'MS-DOS'\n-206D8 General Purpose Flag  0800 (2048)\n+209A5 LOCAL HEADER #163     04034B50 (67324752)\n+209A9 Extract Zip Spec      14 (20) '2.0'\n+209AA Extract OS            00 (0) 'MS-DOS'\n+209AB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-206DA Compression Method    0008 (8) 'Deflated'\n-206DC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-206E0 CRC                   DE2764C3 (3727123651)\n-206E4 Compressed Size       0000029F (671)\n-206E8 Uncompressed Size     000004C9 (1225)\n-206EC Filename Length       0048 (72)\n-206EE Extra Length          0000 (0)\n-206F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+209AD Compression Method    0008 (8) 'Deflated'\n+209AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+209B3 CRC                   667CA259 (1719444057)\n+209B7 Compressed Size       000002AA (682)\n+209BB Uncompressed Size     000004EA (1258)\n+209BF Filename Length       0048 (72)\n+209C1 Extra Length          0000 (0)\n+209C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x206F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x209C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20738 PAYLOAD\n+20A0B PAYLOAD\n \n-209D7 LOCAL HEADER #164     04034B50 (67324752)\n-209DB Extract Zip Spec      14 (20) '2.0'\n-209DC Extract OS            00 (0) 'MS-DOS'\n-209DD General Purpose Flag  0800 (2048)\n+20CB5 LOCAL HEADER #164     04034B50 (67324752)\n+20CB9 Extract Zip Spec      14 (20) '2.0'\n+20CBA Extract OS            00 (0) 'MS-DOS'\n+20CBB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-209DF Compression Method    0008 (8) 'Deflated'\n-209E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-209E5 CRC                   A00FADB6 (2685382070)\n-209E9 Compressed Size       000002AE (686)\n-209ED Uncompressed Size     0000050B (1291)\n-209F1 Filename Length       004C (76)\n-209F3 Extra Length          0000 (0)\n-209F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20CBD Compression Method    0008 (8) 'Deflated'\n+20CBF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20CC3 CRC                   4E4FEF3B (1313861435)\n+20CC7 Compressed Size       000002BA (698)\n+20CCB Uncompressed Size     0000052C (1324)\n+20CCF Filename Length       004C (76)\n+20CD1 Extra Length          0000 (0)\n+20CD3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x209F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20CD3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20A41 PAYLOAD\n+20D1F PAYLOAD\n \n-20CEF LOCAL HEADER #165     04034B50 (67324752)\n-20CF3 Extract Zip Spec      14 (20) '2.0'\n-20CF4 Extract OS            00 (0) 'MS-DOS'\n-20CF5 General Purpose Flag  0800 (2048)\n+20FD9 LOCAL HEADER #165     04034B50 (67324752)\n+20FDD Extract Zip Spec      14 (20) '2.0'\n+20FDE Extract OS            00 (0) 'MS-DOS'\n+20FDF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20CF7 Compression Method    0008 (8) 'Deflated'\n-20CF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20CFD CRC                   9A2D2058 (2586648664)\n-20D01 Compressed Size       000004E4 (1252)\n-20D05 Uncompressed Size     00000D7A (3450)\n-20D09 Filename Length       002F (47)\n-20D0B Extra Length          0000 (0)\n-20D0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20FE1 Compression Method    0008 (8) 'Deflated'\n+20FE3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20FE7 CRC                   9A2D2058 (2586648664)\n+20FEB Compressed Size       000004E4 (1252)\n+20FEF Uncompressed Size     00000D7A (3450)\n+20FF3 Filename Length       002F (47)\n+20FF5 Extra Length          0000 (0)\n+20FF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20D0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20FF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20D3C PAYLOAD\n+21026 PAYLOAD\n \n-21220 LOCAL HEADER #166     04034B50 (67324752)\n-21224 Extract Zip Spec      14 (20) '2.0'\n-21225 Extract OS            00 (0) 'MS-DOS'\n-21226 General Purpose Flag  0800 (2048)\n+2150A LOCAL HEADER #166     04034B50 (67324752)\n+2150E Extract Zip Spec      14 (20) '2.0'\n+2150F Extract OS            00 (0) 'MS-DOS'\n+21510 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21228 Compression Method    0008 (8) 'Deflated'\n-2122A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2122E CRC                   5D8BAE4F (1569435215)\n-21232 Compressed Size       0000049E (1182)\n-21236 Uncompressed Size     00000A47 (2631)\n-2123A Filename Length       002F (47)\n-2123C Extra Length          0000 (0)\n-2123E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21512 Compression Method    0008 (8) 'Deflated'\n+21514 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21518 CRC                   8FD49BC2 (2413075394)\n+2151C Compressed Size       000004A9 (1193)\n+21520 Uncompressed Size     00000A82 (2690)\n+21524 Filename Length       002F (47)\n+21526 Extra Length          0000 (0)\n+21528 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2123E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21528: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2126D PAYLOAD\n+21557 PAYLOAD\n \n-2170B LOCAL HEADER #167     04034B50 (67324752)\n-2170F Extract Zip Spec      14 (20) '2.0'\n-21710 Extract OS            00 (0) 'MS-DOS'\n-21711 General Purpose Flag  0800 (2048)\n+21A00 LOCAL HEADER #167     04034B50 (67324752)\n+21A04 Extract Zip Spec      14 (20) '2.0'\n+21A05 Extract OS            00 (0) 'MS-DOS'\n+21A06 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21713 Compression Method    0008 (8) 'Deflated'\n-21715 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21719 CRC                   B148CBF0 (2974338032)\n-2171D Compressed Size       00000E08 (3592)\n-21721 Uncompressed Size     00003C07 (15367)\n-21725 Filename Length       0041 (65)\n-21727 Extra Length          0000 (0)\n-21729 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21A08 Compression Method    0008 (8) 'Deflated'\n+21A0A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21A0E CRC                   DFC97490 (3754521744)\n+21A12 Compressed Size       00000E1E (3614)\n+21A16 Uncompressed Size     00003D93 (15763)\n+21A1A Filename Length       0041 (65)\n+21A1C Extra Length          0000 (0)\n+21A1E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21729: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21A1E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2176A PAYLOAD\n+21A5F PAYLOAD\n \n-22572 LOCAL HEADER #168     04034B50 (67324752)\n-22576 Extract Zip Spec      14 (20) '2.0'\n-22577 Extract OS            00 (0) 'MS-DOS'\n-22578 General Purpose Flag  0800 (2048)\n+2287D LOCAL HEADER #168     04034B50 (67324752)\n+22881 Extract Zip Spec      14 (20) '2.0'\n+22882 Extract OS            00 (0) 'MS-DOS'\n+22883 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2257A Compression Method    0008 (8) 'Deflated'\n-2257C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22580 CRC                   D1BB774A (3518723914)\n-22584 Compressed Size       00000267 (615)\n-22588 Uncompressed Size     000004B9 (1209)\n-2258C Filename Length       0034 (52)\n-2258E Extra Length          0000 (0)\n-22590 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22885 Compression Method    0008 (8) 'Deflated'\n+22887 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2288B CRC                   D1BB774A (3518723914)\n+2288F Compressed Size       00000267 (615)\n+22893 Uncompressed Size     000004B9 (1209)\n+22897 Filename Length       0034 (52)\n+22899 Extra Length          0000 (0)\n+2289B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22590: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2289B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-225C4 PAYLOAD\n+228CF PAYLOAD\n \n-2282B LOCAL HEADER #169     04034B50 (67324752)\n-2282F Extract Zip Spec      14 (20) '2.0'\n-22830 Extract OS            00 (0) 'MS-DOS'\n-22831 General Purpose Flag  0800 (2048)\n+22B36 LOCAL HEADER #169     04034B50 (67324752)\n+22B3A Extract Zip Spec      14 (20) '2.0'\n+22B3B Extract OS            00 (0) 'MS-DOS'\n+22B3C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22833 Compression Method    0008 (8) 'Deflated'\n-22835 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22839 CRC                   F2DE48ED (4074653933)\n-2283D Compressed Size       00000279 (633)\n-22841 Uncompressed Size     0000048D (1165)\n-22845 Filename Length       0043 (67)\n-22847 Extra Length          0000 (0)\n-22849 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22B3E Compression Method    0008 (8) 'Deflated'\n+22B40 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22B44 CRC                   B3A8C3FA (3014181882)\n+22B48 Compressed Size       0000027E (638)\n+22B4C Uncompressed Size     000004B0 (1200)\n+22B50 Filename Length       0043 (67)\n+22B52 Extra Length          0000 (0)\n+22B54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22849: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22B54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2288C PAYLOAD\n+22B97 PAYLOAD\n \n-22B05 LOCAL HEADER #170     04034B50 (67324752)\n-22B09 Extract Zip Spec      14 (20) '2.0'\n-22B0A Extract OS            00 (0) 'MS-DOS'\n-22B0B General Purpose Flag  0800 (2048)\n+22E15 LOCAL HEADER #170     04034B50 (67324752)\n+22E19 Extract Zip Spec      14 (20) '2.0'\n+22E1A Extract OS            00 (0) 'MS-DOS'\n+22E1B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22B0D Compression Method    0008 (8) 'Deflated'\n-22B0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22B13 CRC                   0662480F (107104271)\n-22B17 Compressed Size       00000281 (641)\n-22B1B Uncompressed Size     000004C4 (1220)\n-22B1F Filename Length       003B (59)\n-22B21 Extra Length          0000 (0)\n-22B23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22E1D Compression Method    0008 (8) 'Deflated'\n+22E1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22E23 CRC                   663E77E4 (1715369956)\n+22E27 Compressed Size       0000028A (650)\n+22E2B Uncompressed Size     000004EE (1262)\n+22E2F Filename Length       003B (59)\n+22E31 Extra Length          0000 (0)\n+22E33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22B23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22E33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-22B5E PAYLOAD\n+22E6E PAYLOAD\n \n-22DDF LOCAL HEADER #171     04034B50 (67324752)\n-22DE3 Extract Zip Spec      14 (20) '2.0'\n-22DE4 Extract OS            00 (0) 'MS-DOS'\n-22DE5 General Purpose Flag  0800 (2048)\n+230F8 LOCAL HEADER #171     04034B50 (67324752)\n+230FC Extract Zip Spec      14 (20) '2.0'\n+230FD Extract OS            00 (0) 'MS-DOS'\n+230FE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22DE7 Compression Method    0008 (8) 'Deflated'\n-22DE9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22DED CRC                   4C849D6C (1283759468)\n-22DF1 Compressed Size       00000265 (613)\n-22DF5 Uncompressed Size     0000047A (1146)\n-22DF9 Filename Length       0037 (55)\n-22DFB Extra Length          0000 (0)\n-22DFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23100 Compression Method    0008 (8) 'Deflated'\n+23102 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23106 CRC                   4C849D6C (1283759468)\n+2310A Compressed Size       00000265 (613)\n+2310E Uncompressed Size     0000047A (1146)\n+23112 Filename Length       0037 (55)\n+23114 Extra Length          0000 (0)\n+23116 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22DFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23116: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-22E34 PAYLOAD\n+2314D PAYLOAD\n \n-23099 LOCAL HEADER #172     04034B50 (67324752)\n-2309D Extract Zip Spec      14 (20) '2.0'\n-2309E Extract OS            00 (0) 'MS-DOS'\n-2309F General Purpose Flag  0800 (2048)\n+233B2 LOCAL HEADER #172     04034B50 (67324752)\n+233B6 Extract Zip Spec      14 (20) '2.0'\n+233B7 Extract OS            00 (0) 'MS-DOS'\n+233B8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-230A1 Compression Method    0008 (8) 'Deflated'\n-230A3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-230A7 CRC                   A96FE6E5 (2842683109)\n-230AB Compressed Size       00002019 (8217)\n-230AF Uncompressed Size     00009CEF (40175)\n-230B3 Filename Length       0036 (54)\n-230B5 Extra Length          0000 (0)\n-230B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+233BA Compression Method    0008 (8) 'Deflated'\n+233BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+233C0 CRC                   1F091D5A (520691034)\n+233C4 Compressed Size       00002040 (8256)\n+233C8 Uncompressed Size     0000A106 (41222)\n+233CC Filename Length       0036 (54)\n+233CE Extra Length          0000 (0)\n+233D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x230B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x233D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-230ED PAYLOAD\n+23406 PAYLOAD\n \n-25106 LOCAL HEADER #173     04034B50 (67324752)\n-2510A Extract Zip Spec      14 (20) '2.0'\n-2510B Extract OS            00 (0) 'MS-DOS'\n-2510C General Purpose Flag  0800 (2048)\n+25446 LOCAL HEADER #173     04034B50 (67324752)\n+2544A Extract Zip Spec      14 (20) '2.0'\n+2544B Extract OS            00 (0) 'MS-DOS'\n+2544C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2510E Compression Method    0008 (8) 'Deflated'\n-25110 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-25114 CRC                   CA31D6AC (3392263852)\n-25118 Compressed Size       000002DD (733)\n-2511C Uncompressed Size     0000058E (1422)\n-25120 Filename Length       0036 (54)\n-25122 Extra Length          0000 (0)\n-25124 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2544E Compression Method    0008 (8) 'Deflated'\n+25450 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+25454 CRC                   BC70E4F4 (3161515252)\n+25458 Compressed Size       000002E4 (740)\n+2545C Uncompressed Size     000005B8 (1464)\n+25460 Filename Length       0036 (54)\n+25462 Extra Length          0000 (0)\n+25464 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x25124: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x25464: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2515A PAYLOAD\n+2549A PAYLOAD\n \n-25437 LOCAL HEADER #174     04034B50 (67324752)\n-2543B Extract Zip Spec      14 (20) '2.0'\n-2543C Extract OS            00 (0) 'MS-DOS'\n-2543D General Purpose Flag  0800 (2048)\n+2577E LOCAL HEADER #174     04034B50 (67324752)\n+25782 Extract Zip Spec      14 (20) '2.0'\n+25783 Extract OS            00 (0) 'MS-DOS'\n+25784 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2543F Compression Method    0008 (8) 'Deflated'\n-25441 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-25445 CRC                   48D76DDD (1222077917)\n-25449 Compressed Size       0000043E (1086)\n-2544D Uncompressed Size     00000932 (2354)\n-25451 Filename Length       002A (42)\n-25453 Extra Length          0000 (0)\n-25455 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+25786 Compression Method    0008 (8) 'Deflated'\n+25788 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2578C CRC                   48D76DDD (1222077917)\n+25790 Compressed Size       0000043E (1086)\n+25794 Uncompressed Size     00000932 (2354)\n+25798 Filename Length       002A (42)\n+2579A Extra Length          0000 (0)\n+2579C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x25455: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2579C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2547F PAYLOAD\n+257C6 PAYLOAD\n \n-258BD LOCAL HEADER #175     04034B50 (67324752)\n-258C1 Extract Zip Spec      14 (20) '2.0'\n-258C2 Extract OS            00 (0) 'MS-DOS'\n-258C3 General Purpose Flag  0800 (2048)\n+25C04 LOCAL HEADER #175     04034B50 (67324752)\n+25C08 Extract Zip Spec      14 (20) '2.0'\n+25C09 Extract OS            00 (0) 'MS-DOS'\n+25C0A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-258C5 Compression Method    0008 (8) 'Deflated'\n-258C7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-258CB CRC                   C525F495 (3307598997)\n-258CF Compressed Size       00000283 (643)\n-258D3 Uncompressed Size     000004C9 (1225)\n-258D7 Filename Length       003E (62)\n-258D9 Extra Length          0000 (0)\n-258DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+25C0C Compression Method    0008 (8) 'Deflated'\n+25C0E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+25C12 CRC                   8DAF0532 (2377057586)\n+25C16 Compressed Size       00000289 (649)\n+25C1A Uncompressed Size     000004F2 (1266)\n+25C1E Filename Length       003E (62)\n+25C20 Extra Length          0000 (0)\n+25C22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x258DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x25C22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-25919 PAYLOAD\n+25C60 PAYLOAD\n \n-25B9C LOCAL HEADER #176     04034B50 (67324752)\n-25BA0 Extract Zip Spec      14 (20) '2.0'\n-25BA1 Extract OS            00 (0) 'MS-DOS'\n-25BA2 General Purpose Flag  0800 (2048)\n+25EE9 LOCAL HEADER #176     04034B50 (67324752)\n+25EED Extract Zip Spec      14 (20) '2.0'\n+25EEE Extract OS            00 (0) 'MS-DOS'\n+25EEF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-25BA4 Compression Method    0008 (8) 'Deflated'\n-25BA6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-25BAA CRC                   25A296EC (631412460)\n-25BAE Compressed Size       00000291 (657)\n-25BB2 Uncompressed Size     00000510 (1296)\n-25BB6 Filename Length       002E (46)\n-25BB8 Extra Length          0000 (0)\n-25BBA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+25EF1 Compression Method    0008 (8) 'Deflated'\n+25EF3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+25EF7 CRC                   5CF3A6C0 (1559471808)\n+25EFB Compressed Size       0000029B (667)\n+25EFF Uncompressed Size     00000535 (1333)\n+25F03 Filename Length       002E (46)\n+25F05 Extra Length          0000 (0)\n+25F07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x25BBA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x25F07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-25BE8 PAYLOAD\n+25F35 PAYLOAD\n \n-25E79 LOCAL HEADER #177     04034B50 (67324752)\n-25E7D Extract Zip Spec      14 (20) '2.0'\n-25E7E Extract OS            00 (0) 'MS-DOS'\n-25E7F General Purpose Flag  0800 (2048)\n+261D0 LOCAL HEADER #177     04034B50 (67324752)\n+261D4 Extract Zip Spec      14 (20) '2.0'\n+261D5 Extract OS            00 (0) 'MS-DOS'\n+261D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-25E81 Compression Method    0008 (8) 'Deflated'\n-25E83 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-25E87 CRC                   EA8B59C6 (3935001030)\n-25E8B Compressed Size       0000033F (831)\n-25E8F Uncompressed Size     00000800 (2048)\n-25E93 Filename Length       0047 (71)\n-25E95 Extra Length          0000 (0)\n-25E97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+261D8 Compression Method    0008 (8) 'Deflated'\n+261DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+261DE CRC                   EA8B59C6 (3935001030)\n+261E2 Compressed Size       0000033F (831)\n+261E6 Uncompressed Size     00000800 (2048)\n+261EA Filename Length       0047 (71)\n+261EC Extra Length          0000 (0)\n+261EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x25E97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x261EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-25EDE PAYLOAD\n+26235 PAYLOAD\n \n-2621D LOCAL HEADER #178     04034B50 (67324752)\n-26221 Extract Zip Spec      14 (20) '2.0'\n-26222 Extract OS            00 (0) 'MS-DOS'\n-26223 General Purpose Flag  0800 (2048)\n+26574 LOCAL HEADER #178     04034B50 (67324752)\n+26578 Extract Zip Spec      14 (20) '2.0'\n+26579 Extract OS            00 (0) 'MS-DOS'\n+2657A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-26225 Compression Method    0008 (8) 'Deflated'\n-26227 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2622B CRC                   3280412A (847266090)\n-2622F Compressed Size       000002CE (718)\n-26233 Uncompressed Size     0000060F (1551)\n-26237 Filename Length       0042 (66)\n-26239 Extra Length          0000 (0)\n-2623B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2657C Compression Method    0008 (8) 'Deflated'\n+2657E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+26582 CRC                   3280412A (847266090)\n+26586 Compressed Size       000002CE (718)\n+2658A Uncompressed Size     0000060F (1551)\n+2658E Filename Length       0042 (66)\n+26590 Extra Length          0000 (0)\n+26592 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2623B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x26592: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2627D PAYLOAD\n+265D4 PAYLOAD\n \n-2654B LOCAL HEADER #179     04034B50 (67324752)\n-2654F Extract Zip Spec      14 (20) '2.0'\n-26550 Extract OS            00 (0) 'MS-DOS'\n-26551 General Purpose Flag  0800 (2048)\n+268A2 LOCAL HEADER #179     04034B50 (67324752)\n+268A6 Extract Zip Spec      14 (20) '2.0'\n+268A7 Extract OS            00 (0) 'MS-DOS'\n+268A8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-26553 Compression Method    0008 (8) 'Deflated'\n-26555 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-26559 CRC                   B81BB8E1 (3088824545)\n-2655D Compressed Size       0000054D (1357)\n-26561 Uncompressed Size     000011D4 (4564)\n-26565 Filename Length       0041 (65)\n-26567 Extra Length          0000 (0)\n-26569 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+268AA Compression Method    0008 (8) 'Deflated'\n+268AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+268B0 CRC                   B81BB8E1 (3088824545)\n+268B4 Compressed Size       0000054D (1357)\n+268B8 Uncompressed Size     000011D4 (4564)\n+268BC Filename Length       0041 (65)\n+268BE Extra Length          0000 (0)\n+268C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x26569: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x268C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-265AA PAYLOAD\n+26901 PAYLOAD\n \n-26AF7 LOCAL HEADER #180     04034B50 (67324752)\n-26AFB Extract Zip Spec      14 (20) '2.0'\n-26AFC Extract OS            00 (0) 'MS-DOS'\n-26AFD General Purpose Flag  0800 (2048)\n+26E4E LOCAL HEADER #180     04034B50 (67324752)\n+26E52 Extract Zip Spec      14 (20) '2.0'\n+26E53 Extract OS            00 (0) 'MS-DOS'\n+26E54 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-26AFF Compression Method    0008 (8) 'Deflated'\n-26B01 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-26B05 CRC                   C0FD96E7 (3237844711)\n-26B09 Compressed Size       00000451 (1105)\n-26B0D Uncompressed Size     00000BFA (3066)\n-26B11 Filename Length       0040 (64)\n-26B13 Extra Length          0000 (0)\n-26B15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+26E56 Compression Method    0008 (8) 'Deflated'\n+26E58 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+26E5C CRC                   1FF4288F (536094863)\n+26E60 Compressed Size       0000045C (1116)\n+26E64 Uncompressed Size     00000C58 (3160)\n+26E68 Filename Length       0040 (64)\n+26E6A Extra Length          0000 (0)\n+26E6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x26B15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x26E6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-26B55 PAYLOAD\n+26EAC PAYLOAD\n \n-26FA6 LOCAL HEADER #181     04034B50 (67324752)\n-26FAA Extract Zip Spec      14 (20) '2.0'\n-26FAB Extract OS            00 (0) 'MS-DOS'\n-26FAC General Purpose Flag  0800 (2048)\n+27308 LOCAL HEADER #181     04034B50 (67324752)\n+2730C Extract Zip Spec      14 (20) '2.0'\n+2730D Extract OS            00 (0) 'MS-DOS'\n+2730E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-26FAE Compression Method    0008 (8) 'Deflated'\n-26FB0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-26FB4 CRC                   3980931B (964727579)\n-26FB8 Compressed Size       0000036A (874)\n-26FBC Uncompressed Size     00000925 (2341)\n-26FC0 Filename Length       0030 (48)\n-26FC2 Extra Length          0000 (0)\n-26FC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+27310 Compression Method    0008 (8) 'Deflated'\n+27312 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+27316 CRC                   C191912C (3247542572)\n+2731A Compressed Size       00000375 (885)\n+2731E Uncompressed Size     0000096F (2415)\n+27322 Filename Length       0030 (48)\n+27324 Extra Length          0000 (0)\n+27326 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x26FC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x27326: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-26FF4 PAYLOAD\n+27356 PAYLOAD\n \n-2735E LOCAL HEADER #182     04034B50 (67324752)\n-27362 Extract Zip Spec      14 (20) '2.0'\n-27363 Extract OS            00 (0) 'MS-DOS'\n-27364 General Purpose Flag  0800 (2048)\n+276CB LOCAL HEADER #182     04034B50 (67324752)\n+276CF Extract Zip Spec      14 (20) '2.0'\n+276D0 Extract OS            00 (0) 'MS-DOS'\n+276D1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-27366 Compression Method    0008 (8) 'Deflated'\n-27368 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2736C CRC                   4F8202FE (1333920510)\n-27370 Compressed Size       000003A8 (936)\n-27374 Uncompressed Size     00000A7B (2683)\n-27378 Filename Length       002D (45)\n-2737A Extra Length          0000 (0)\n-2737C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+276D3 Compression Method    0008 (8) 'Deflated'\n+276D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+276D9 CRC                   B9F68231 (3119940145)\n+276DD Compressed Size       000003B3 (947)\n+276E1 Uncompressed Size     00000AC2 (2754)\n+276E5 Filename Length       002D (45)\n+276E7 Extra Length          0000 (0)\n+276E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2737C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x276E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-273A9 PAYLOAD\n+27716 PAYLOAD\n \n-27751 LOCAL HEADER #183     04034B50 (67324752)\n-27755 Extract Zip Spec      14 (20) '2.0'\n-27756 Extract OS            00 (0) 'MS-DOS'\n-27757 General Purpose Flag  0800 (2048)\n+27AC9 LOCAL HEADER #183     04034B50 (67324752)\n+27ACD Extract Zip Spec      14 (20) '2.0'\n+27ACE Extract OS            00 (0) 'MS-DOS'\n+27ACF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-27759 Compression Method    0008 (8) 'Deflated'\n-2775B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2775F CRC                   3F1DB4B7 (1058911415)\n-27763 Compressed Size       000002DE (734)\n-27767 Uncompressed Size     00000638 (1592)\n-2776B Filename Length       0035 (53)\n-2776D Extra Length          0000 (0)\n-2776F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+27AD1 Compression Method    0008 (8) 'Deflated'\n+27AD3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+27AD7 CRC                   9A0865B9 (2584241593)\n+27ADB Compressed Size       000002E7 (743)\n+27ADF Uncompressed Size     0000066B (1643)\n+27AE3 Filename Length       0035 (53)\n+27AE5 Extra Length          0000 (0)\n+27AE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2776F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x27AE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-277A4 PAYLOAD\n+27B1C PAYLOAD\n \n-27A82 LOCAL HEADER #184     04034B50 (67324752)\n-27A86 Extract Zip Spec      14 (20) '2.0'\n-27A87 Extract OS            00 (0) 'MS-DOS'\n-27A88 General Purpose Flag  0800 (2048)\n+27E03 LOCAL HEADER #184     04034B50 (67324752)\n+27E07 Extract Zip Spec      14 (20) '2.0'\n+27E08 Extract OS            00 (0) 'MS-DOS'\n+27E09 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-27A8A Compression Method    0008 (8) 'Deflated'\n-27A8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-27A90 CRC                   86537D4A (2253618506)\n-27A94 Compressed Size       00000360 (864)\n-27A98 Uncompressed Size     000007F0 (2032)\n-27A9C Filename Length       0037 (55)\n-27A9E Extra Length          0000 (0)\n-27AA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+27E0B Compression Method    0008 (8) 'Deflated'\n+27E0D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+27E11 CRC                   5F2ADB9F (1596644255)\n+27E15 Compressed Size       00000368 (872)\n+27E19 Uncompressed Size     00000832 (2098)\n+27E1D Filename Length       0037 (55)\n+27E1F Extra Length          0000 (0)\n+27E21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x27AA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x27E21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-27AD7 PAYLOAD\n+27E58 PAYLOAD\n \n-27E37 LOCAL HEADER #185     04034B50 (67324752)\n-27E3B Extract Zip Spec      14 (20) '2.0'\n-27E3C Extract OS            00 (0) 'MS-DOS'\n-27E3D General Purpose Flag  0800 (2048)\n+281C0 LOCAL HEADER #185     04034B50 (67324752)\n+281C4 Extract Zip Spec      14 (20) '2.0'\n+281C5 Extract OS            00 (0) 'MS-DOS'\n+281C6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-27E3F Compression Method    0008 (8) 'Deflated'\n-27E41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-27E45 CRC                   76835014 (1988317204)\n-27E49 Compressed Size       00000372 (882)\n-27E4D Uncompressed Size     00000885 (2181)\n-27E51 Filename Length       0037 (55)\n-27E53 Extra Length          0000 (0)\n-27E55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+281C8 Compression Method    0008 (8) 'Deflated'\n+281CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+281CE CRC                   4D1AEB96 (1293609878)\n+281D2 Compressed Size       0000037C (892)\n+281D6 Uncompressed Size     000008CC (2252)\n+281DA Filename Length       0037 (55)\n+281DC Extra Length          0000 (0)\n+281DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x27E55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x281DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-27E8C PAYLOAD\n+28215 PAYLOAD\n \n-281FE LOCAL HEADER #186     04034B50 (67324752)\n-28202 Extract Zip Spec      14 (20) '2.0'\n-28203 Extract OS            00 (0) 'MS-DOS'\n-28204 General Purpose Flag  0800 (2048)\n+28591 LOCAL HEADER #186     04034B50 (67324752)\n+28595 Extract Zip Spec      14 (20) '2.0'\n+28596 Extract OS            00 (0) 'MS-DOS'\n+28597 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28206 Compression Method    0008 (8) 'Deflated'\n-28208 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2820C CRC                   7A06D81E (2047268894)\n-28210 Compressed Size       0000031E (798)\n-28214 Uncompressed Size     00000619 (1561)\n-28218 Filename Length       002F (47)\n-2821A Extra Length          0000 (0)\n-2821C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+28599 Compression Method    0008 (8) 'Deflated'\n+2859B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2859F CRC                   D1400D79 (3510635897)\n+285A3 Compressed Size       00000327 (807)\n+285A7 Uncompressed Size     00000647 (1607)\n+285AB Filename Length       002F (47)\n+285AD Extra Length          0000 (0)\n+285AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2821C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x285AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2824B PAYLOAD\n+285DE PAYLOAD\n \n-28569 LOCAL HEADER #187     04034B50 (67324752)\n-2856D Extract Zip Spec      14 (20) '2.0'\n-2856E Extract OS            00 (0) 'MS-DOS'\n-2856F General Purpose Flag  0800 (2048)\n+28905 LOCAL HEADER #187     04034B50 (67324752)\n+28909 Extract Zip Spec      14 (20) '2.0'\n+2890A Extract OS            00 (0) 'MS-DOS'\n+2890B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28571 Compression Method    0008 (8) 'Deflated'\n-28573 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-28577 CRC                   596F5AFB (1500470011)\n-2857B Compressed Size       00000283 (643)\n-2857F Uncompressed Size     00000504 (1284)\n-28583 Filename Length       0036 (54)\n-28585 Extra Length          0000 (0)\n-28587 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2890D Compression Method    0008 (8) 'Deflated'\n+2890F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+28913 CRC                   4A87D325 (1250415397)\n+28917 Compressed Size       0000028C (652)\n+2891B Uncompressed Size     0000052B (1323)\n+2891F Filename Length       0036 (54)\n+28921 Extra Length          0000 (0)\n+28923 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x28587: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28923: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-285BD PAYLOAD\n+28959 PAYLOAD\n \n-28840 LOCAL HEADER #188     04034B50 (67324752)\n-28844 Extract Zip Spec      14 (20) '2.0'\n-28845 Extract OS            00 (0) 'MS-DOS'\n-28846 General Purpose Flag  0800 (2048)\n+28BE5 LOCAL HEADER #188     04034B50 (67324752)\n+28BE9 Extract Zip Spec      14 (20) '2.0'\n+28BEA Extract OS            00 (0) 'MS-DOS'\n+28BEB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28848 Compression Method    0008 (8) 'Deflated'\n-2884A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2884E CRC                   DAE5D322 (3672494882)\n-28852 Compressed Size       00000417 (1047)\n-28856 Uncompressed Size     00000B55 (2901)\n-2885A Filename Length       003D (61)\n-2885C Extra Length          0000 (0)\n-2885E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+28BED Compression Method    0008 (8) 'Deflated'\n+28BEF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+28BF3 CRC                   382251E3 (941773283)\n+28BF7 Compressed Size       00000423 (1059)\n+28BFB Uncompressed Size     00000B9D (2973)\n+28BFF Filename Length       003D (61)\n+28C01 Extra Length          0000 (0)\n+28C03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2885E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28C03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2889B PAYLOAD\n+28C40 PAYLOAD\n \n-28CB2 LOCAL HEADER #189     04034B50 (67324752)\n-28CB6 Extract Zip Spec      14 (20) '2.0'\n-28CB7 Extract OS            00 (0) 'MS-DOS'\n-28CB8 General Purpose Flag  0800 (2048)\n+29063 LOCAL HEADER #189     04034B50 (67324752)\n+29067 Extract Zip Spec      14 (20) '2.0'\n+29068 Extract OS            00 (0) 'MS-DOS'\n+29069 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28CBA Compression Method    0008 (8) 'Deflated'\n-28CBC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-28CC0 CRC                   0BDE6714 (199124756)\n-28CC4 Compressed Size       00000F70 (3952)\n-28CC8 Uncompressed Size     00006518 (25880)\n-28CCC Filename Length       0025 (37)\n-28CCE Extra Length          0000 (0)\n-28CD0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2906B Compression Method    0008 (8) 'Deflated'\n+2906D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+29071 CRC                   7D41B4B3 (2101458099)\n+29075 Compressed Size       00000F90 (3984)\n+29079 Uncompressed Size     000068BF (26815)\n+2907D Filename Length       0025 (37)\n+2907F Extra Length          0000 (0)\n+29081 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x28CD0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x29081: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-28CF5 PAYLOAD\n+290A6 PAYLOAD\n \n-29C65 LOCAL HEADER #190     04034B50 (67324752)\n-29C69 Extract Zip Spec      14 (20) '2.0'\n-29C6A Extract OS            00 (0) 'MS-DOS'\n-29C6B General Purpose Flag  0800 (2048)\n+2A036 LOCAL HEADER #190     04034B50 (67324752)\n+2A03A Extract Zip Spec      14 (20) '2.0'\n+2A03B Extract OS            00 (0) 'MS-DOS'\n+2A03C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-29C6D Compression Method    0008 (8) 'Deflated'\n-29C6F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-29C73 CRC                   16F10E62 (384896610)\n-29C77 Compressed Size       00000639 (1593)\n-29C7B Uncompressed Size     00001B02 (6914)\n-29C7F Filename Length       002B (43)\n-29C81 Extra Length          0000 (0)\n-29C83 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2A03E Compression Method    0008 (8) 'Deflated'\n+2A040 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2A044 CRC                   D2FF4595 (3539944853)\n+2A048 Compressed Size       00000644 (1604)\n+2A04C Uncompressed Size     00001BE9 (7145)\n+2A050 Filename Length       002B (43)\n+2A052 Extra Length          0000 (0)\n+2A054 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x29C83: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2A054: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-29CAE PAYLOAD\n+2A07F PAYLOAD\n \n-2A2E7 LOCAL HEADER #191     04034B50 (67324752)\n-2A2EB Extract Zip Spec      14 (20) '2.0'\n-2A2EC Extract OS            00 (0) 'MS-DOS'\n-2A2ED General Purpose Flag  0800 (2048)\n+2A6C3 LOCAL HEADER #191     04034B50 (67324752)\n+2A6C7 Extract Zip Spec      14 (20) '2.0'\n+2A6C8 Extract OS            00 (0) 'MS-DOS'\n+2A6C9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2A2EF Compression Method    0008 (8) 'Deflated'\n-2A2F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2A2F5 CRC                   A6F50F6E (2801078126)\n-2A2F9 Compressed Size       0000041D (1053)\n-2A2FD Uncompressed Size     00000BEB (3051)\n-2A301 Filename Length       003A (58)\n-2A303 Extra Length          0000 (0)\n-2A305 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2A6CB Compression Method    0008 (8) 'Deflated'\n+2A6CD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2A6D1 CRC                   D8BBACF0 (3636178160)\n+2A6D5 Compressed Size       00000428 (1064)\n+2A6D9 Uncompressed Size     00000C61 (3169)\n+2A6DD Filename Length       003A (58)\n+2A6DF Extra Length          0000 (0)\n+2A6E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2A305: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2A6E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2A33F PAYLOAD\n+2A71B PAYLOAD\n \n-2A75C LOCAL HEADER #192     04034B50 (67324752)\n-2A760 Extract Zip Spec      14 (20) '2.0'\n-2A761 Extract OS            00 (0) 'MS-DOS'\n-2A762 General Purpose Flag  0800 (2048)\n+2AB43 LOCAL HEADER #192     04034B50 (67324752)\n+2AB47 Extract Zip Spec      14 (20) '2.0'\n+2AB48 Extract OS            00 (0) 'MS-DOS'\n+2AB49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2A764 Compression Method    0008 (8) 'Deflated'\n-2A766 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2A76A CRC                   5110A2B9 (1360044729)\n-2A76E Compressed Size       0000041B (1051)\n-2A772 Uncompressed Size     00000B8E (2958)\n-2A776 Filename Length       003B (59)\n-2A778 Extra Length          0000 (0)\n-2A77A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2AB4B Compression Method    0008 (8) 'Deflated'\n+2AB4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2AB51 CRC                   DCFCECF5 (3707563253)\n+2AB55 Compressed Size       00000425 (1061)\n+2AB59 Uncompressed Size     00000BF3 (3059)\n+2AB5D Filename Length       003B (59)\n+2AB5F Extra Length          0000 (0)\n+2AB61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2A77A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2AB61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2A7B5 PAYLOAD\n+2AB9C PAYLOAD\n \n-2ABD0 LOCAL HEADER #193     04034B50 (67324752)\n-2ABD4 Extract Zip Spec      14 (20) '2.0'\n-2ABD5 Extract OS            00 (0) 'MS-DOS'\n-2ABD6 General Purpose Flag  0800 (2048)\n+2AFC1 LOCAL HEADER #193     04034B50 (67324752)\n+2AFC5 Extract Zip Spec      14 (20) '2.0'\n+2AFC6 Extract OS            00 (0) 'MS-DOS'\n+2AFC7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2ABD8 Compression Method    0008 (8) 'Deflated'\n-2ABDA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2ABDE CRC                   490F11E6 (1225724390)\n-2ABE2 Compressed Size       0000041C (1052)\n-2ABE6 Uncompressed Size     00000C65 (3173)\n-2ABEA Filename Length       0032 (50)\n-2ABEC Extra Length          0000 (0)\n-2ABEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2AFC9 Compression Method    0008 (8) 'Deflated'\n+2AFCB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2AFCF CRC                   490F11E6 (1225724390)\n+2AFD3 Compressed Size       0000041C (1052)\n+2AFD7 Uncompressed Size     00000C65 (3173)\n+2AFDB Filename Length       0032 (50)\n+2AFDD Extra Length          0000 (0)\n+2AFDF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2ABEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2AFDF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2AC20 PAYLOAD\n+2B011 PAYLOAD\n \n-2B03C LOCAL HEADER #194     04034B50 (67324752)\n-2B040 Extract Zip Spec      14 (20) '2.0'\n-2B041 Extract OS            00 (0) 'MS-DOS'\n-2B042 General Purpose Flag  0800 (2048)\n+2B42D LOCAL HEADER #194     04034B50 (67324752)\n+2B431 Extract Zip Spec      14 (20) '2.0'\n+2B432 Extract OS            00 (0) 'MS-DOS'\n+2B433 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2B044 Compression Method    0008 (8) 'Deflated'\n-2B046 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2B04A CRC                   2D3D8039 (759005241)\n-2B04E Compressed Size       000003D3 (979)\n-2B052 Uncompressed Size     00000AD5 (2773)\n-2B056 Filename Length       0032 (50)\n-2B058 Extra Length          0000 (0)\n-2B05A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2B435 Compression Method    0008 (8) 'Deflated'\n+2B437 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2B43B CRC                   3A9B5BED (983260141)\n+2B43F Compressed Size       000003DD (989)\n+2B443 Uncompressed Size     00000B3F (2879)\n+2B447 Filename Length       0032 (50)\n+2B449 Extra Length          0000 (0)\n+2B44B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2B05A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2B44B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2B08C PAYLOAD\n+2B47D PAYLOAD\n \n-2B45F LOCAL HEADER #195     04034B50 (67324752)\n-2B463 Extract Zip Spec      14 (20) '2.0'\n-2B464 Extract OS            00 (0) 'MS-DOS'\n-2B465 General Purpose Flag  0800 (2048)\n+2B85A LOCAL HEADER #195     04034B50 (67324752)\n+2B85E Extract Zip Spec      14 (20) '2.0'\n+2B85F Extract OS            00 (0) 'MS-DOS'\n+2B860 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2B467 Compression Method    0008 (8) 'Deflated'\n-2B469 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2B46D CRC                   BACA53B9 (3133821881)\n-2B471 Compressed Size       00000A93 (2707)\n-2B475 Uncompressed Size     000044D5 (17621)\n-2B479 Filename Length       0036 (54)\n-2B47B Extra Length          0000 (0)\n-2B47D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2B862 Compression Method    0008 (8) 'Deflated'\n+2B864 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2B868 CRC                   30256F45 (807759685)\n+2B86C Compressed Size       00000AA5 (2725)\n+2B870 Uncompressed Size     000046E5 (18149)\n+2B874 Filename Length       0036 (54)\n+2B876 Extra Length          0000 (0)\n+2B878 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2B47D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2B878: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2B4B3 PAYLOAD\n+2B8AE PAYLOAD\n \n-2BF46 LOCAL HEADER #196     04034B50 (67324752)\n-2BF4A Extract Zip Spec      14 (20) '2.0'\n-2BF4B Extract OS            00 (0) 'MS-DOS'\n-2BF4C General Purpose Flag  0800 (2048)\n+2C353 LOCAL HEADER #196     04034B50 (67324752)\n+2C357 Extract Zip Spec      14 (20) '2.0'\n+2C358 Extract OS            00 (0) 'MS-DOS'\n+2C359 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2BF4E Compression Method    0008 (8) 'Deflated'\n-2BF50 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2BF54 CRC                   FA032BB6 (4194511798)\n-2BF58 Compressed Size       00000A68 (2664)\n-2BF5C Uncompressed Size     00003385 (13189)\n-2BF60 Filename Length       002C (44)\n-2BF62 Extra Length          0000 (0)\n-2BF64 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2C35B Compression Method    0008 (8) 'Deflated'\n+2C35D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2C361 CRC                   FA032BB6 (4194511798)\n+2C365 Compressed Size       00000A68 (2664)\n+2C369 Uncompressed Size     00003385 (13189)\n+2C36D Filename Length       002C (44)\n+2C36F Extra Length          0000 (0)\n+2C371 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2BF64: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2C371: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2BF90 PAYLOAD\n+2C39D PAYLOAD\n \n-2C9F8 LOCAL HEADER #197     04034B50 (67324752)\n-2C9FC Extract Zip Spec      14 (20) '2.0'\n-2C9FD Extract OS            00 (0) 'MS-DOS'\n-2C9FE General Purpose Flag  0800 (2048)\n+2CE05 LOCAL HEADER #197     04034B50 (67324752)\n+2CE09 Extract Zip Spec      14 (20) '2.0'\n+2CE0A Extract OS            00 (0) 'MS-DOS'\n+2CE0B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2CA00 Compression Method    0008 (8) 'Deflated'\n-2CA02 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2CA06 CRC                   39C07894 (968915092)\n-2CA0A Compressed Size       00000BBA (3002)\n-2CA0E Uncompressed Size     00006AA4 (27300)\n-2CA12 Filename Length       0026 (38)\n-2CA14 Extra Length          0000 (0)\n-2CA16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2CE0D Compression Method    0008 (8) 'Deflated'\n+2CE0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2CE13 CRC                   39C07894 (968915092)\n+2CE17 Compressed Size       00000BBA (3002)\n+2CE1B Uncompressed Size     00006AA4 (27300)\n+2CE1F Filename Length       0026 (38)\n+2CE21 Extra Length          0000 (0)\n+2CE23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2CA16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2CE23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2CA3C PAYLOAD\n+2CE49 PAYLOAD\n \n-2D5F6 LOCAL HEADER #198     04034B50 (67324752)\n-2D5FA Extract Zip Spec      14 (20) '2.0'\n-2D5FB Extract OS            00 (0) 'MS-DOS'\n-2D5FC General Purpose Flag  0800 (2048)\n+2DA03 LOCAL HEADER #198     04034B50 (67324752)\n+2DA07 Extract Zip Spec      14 (20) '2.0'\n+2DA08 Extract OS            00 (0) 'MS-DOS'\n+2DA09 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2D5FE Compression Method    0008 (8) 'Deflated'\n-2D600 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2D604 CRC                   2313A478 (588489848)\n-2D608 Compressed Size       000004D5 (1237)\n-2D60C Uncompressed Size     00001330 (4912)\n-2D610 Filename Length       002B (43)\n-2D612 Extra Length          0000 (0)\n-2D614 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2DA0B Compression Method    0008 (8) 'Deflated'\n+2DA0D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2DA11 CRC                   2313A478 (588489848)\n+2DA15 Compressed Size       000004D5 (1237)\n+2DA19 Uncompressed Size     00001330 (4912)\n+2DA1D Filename Length       002B (43)\n+2DA1F Extra Length          0000 (0)\n+2DA21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2D614: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2DA21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2D63F PAYLOAD\n+2DA4C PAYLOAD\n \n-2DB14 LOCAL HEADER #199     04034B50 (67324752)\n-2DB18 Extract Zip Spec      14 (20) '2.0'\n-2DB19 Extract OS            00 (0) 'MS-DOS'\n-2DB1A General Purpose Flag  0800 (2048)\n+2DF21 LOCAL HEADER #199     04034B50 (67324752)\n+2DF25 Extract Zip Spec      14 (20) '2.0'\n+2DF26 Extract OS            00 (0) 'MS-DOS'\n+2DF27 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2DB1C Compression Method    0008 (8) 'Deflated'\n-2DB1E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2DB22 CRC                   10BC97FD (280795133)\n-2DB26 Compressed Size       000002C3 (707)\n-2DB2A Uncompressed Size     000005B5 (1461)\n-2DB2E Filename Length       002F (47)\n-2DB30 Extra Length          0000 (0)\n-2DB32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2DF29 Compression Method    0008 (8) 'Deflated'\n+2DF2B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2DF2F CRC                   10BC97FD (280795133)\n+2DF33 Compressed Size       000002C3 (707)\n+2DF37 Uncompressed Size     000005B5 (1461)\n+2DF3B Filename Length       002F (47)\n+2DF3D Extra Length          0000 (0)\n+2DF3F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2DB32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2DF3F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2DB61 PAYLOAD\n+2DF6E PAYLOAD\n \n-2DE24 LOCAL HEADER #200     04034B50 (67324752)\n-2DE28 Extract Zip Spec      14 (20) '2.0'\n-2DE29 Extract OS            00 (0) 'MS-DOS'\n-2DE2A General Purpose Flag  0800 (2048)\n+2E231 LOCAL HEADER #200     04034B50 (67324752)\n+2E235 Extract Zip Spec      14 (20) '2.0'\n+2E236 Extract OS            00 (0) 'MS-DOS'\n+2E237 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2DE2C Compression Method    0008 (8) 'Deflated'\n-2DE2E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2DE32 CRC                   982A34CC (2552902860)\n-2DE36 Compressed Size       0000027E (638)\n-2DE3A Uncompressed Size     000004AE (1198)\n-2DE3E Filename Length       002A (42)\n-2DE40 Extra Length          0000 (0)\n-2DE42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2E239 Compression Method    0008 (8) 'Deflated'\n+2E23B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2E23F CRC                   982A34CC (2552902860)\n+2E243 Compressed Size       0000027E (638)\n+2E247 Uncompressed Size     000004AE (1198)\n+2E24B Filename Length       002A (42)\n+2E24D Extra Length          0000 (0)\n+2E24F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2DE42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2E24F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2DE6C PAYLOAD\n+2E279 PAYLOAD\n \n-2E0EA LOCAL HEADER #201     04034B50 (67324752)\n-2E0EE Extract Zip Spec      14 (20) '2.0'\n-2E0EF Extract OS            00 (0) 'MS-DOS'\n-2E0F0 General Purpose Flag  0800 (2048)\n+2E4F7 LOCAL HEADER #201     04034B50 (67324752)\n+2E4FB Extract Zip Spec      14 (20) '2.0'\n+2E4FC Extract OS            00 (0) 'MS-DOS'\n+2E4FD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2E0F2 Compression Method    0008 (8) 'Deflated'\n-2E0F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2E0F8 CRC                   7653CF57 (1985204055)\n-2E0FC Compressed Size       00000592 (1426)\n-2E100 Uncompressed Size     000015FB (5627)\n-2E104 Filename Length       002C (44)\n-2E106 Extra Length          0000 (0)\n-2E108 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2E4FF Compression Method    0008 (8) 'Deflated'\n+2E501 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2E505 CRC                   7653CF57 (1985204055)\n+2E509 Compressed Size       00000592 (1426)\n+2E50D Uncompressed Size     000015FB (5627)\n+2E511 Filename Length       002C (44)\n+2E513 Extra Length          0000 (0)\n+2E515 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2E108: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2E515: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2E134 PAYLOAD\n+2E541 PAYLOAD\n \n-2E6C6 LOCAL HEADER #202     04034B50 (67324752)\n-2E6CA Extract Zip Spec      14 (20) '2.0'\n-2E6CB Extract OS            00 (0) 'MS-DOS'\n-2E6CC General Purpose Flag  0800 (2048)\n+2EAD3 LOCAL HEADER #202     04034B50 (67324752)\n+2EAD7 Extract Zip Spec      14 (20) '2.0'\n+2EAD8 Extract OS            00 (0) 'MS-DOS'\n+2EAD9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2E6CE Compression Method    0008 (8) 'Deflated'\n-2E6D0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2E6D4 CRC                   4D87180A (1300699146)\n-2E6D8 Compressed Size       0000037F (895)\n-2E6DC Uncompressed Size     000008A6 (2214)\n-2E6E0 Filename Length       002C (44)\n-2E6E2 Extra Length          0000 (0)\n-2E6E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2EADB Compression Method    0008 (8) 'Deflated'\n+2EADD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2EAE1 CRC                   4D87180A (1300699146)\n+2EAE5 Compressed Size       0000037F (895)\n+2EAE9 Uncompressed Size     000008A6 (2214)\n+2EAED Filename Length       002C (44)\n+2EAEF Extra Length          0000 (0)\n+2EAF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2E6E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2EAF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2E710 PAYLOAD\n+2EB1D PAYLOAD\n \n-2EA8F LOCAL HEADER #203     04034B50 (67324752)\n-2EA93 Extract Zip Spec      14 (20) '2.0'\n-2EA94 Extract OS            00 (0) 'MS-DOS'\n-2EA95 General Purpose Flag  0800 (2048)\n+2EE9C LOCAL HEADER #203     04034B50 (67324752)\n+2EEA0 Extract Zip Spec      14 (20) '2.0'\n+2EEA1 Extract OS            00 (0) 'MS-DOS'\n+2EEA2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2EA97 Compression Method    0008 (8) 'Deflated'\n-2EA99 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2EA9D CRC                   8F2D4992 (2402109842)\n-2EAA1 Compressed Size       00000368 (872)\n-2EAA5 Uncompressed Size     000008C7 (2247)\n-2EAA9 Filename Length       002B (43)\n-2EAAB Extra Length          0000 (0)\n-2EAAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2EEA4 Compression Method    0008 (8) 'Deflated'\n+2EEA6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2EEAA CRC                   8F2D4992 (2402109842)\n+2EEAE Compressed Size       00000368 (872)\n+2EEB2 Uncompressed Size     000008C7 (2247)\n+2EEB6 Filename Length       002B (43)\n+2EEB8 Extra Length          0000 (0)\n+2EEBA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2EAAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2EEBA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2EAD8 PAYLOAD\n+2EEE5 PAYLOAD\n \n-2EE40 LOCAL HEADER #204     04034B50 (67324752)\n-2EE44 Extract Zip Spec      14 (20) '2.0'\n-2EE45 Extract OS            00 (0) 'MS-DOS'\n-2EE46 General Purpose Flag  0800 (2048)\n+2F24D LOCAL HEADER #204     04034B50 (67324752)\n+2F251 Extract Zip Spec      14 (20) '2.0'\n+2F252 Extract OS            00 (0) 'MS-DOS'\n+2F253 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2EE48 Compression Method    0008 (8) 'Deflated'\n-2EE4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2EE4E CRC                   33828390 (864191376)\n-2EE52 Compressed Size       00000359 (857)\n-2EE56 Uncompressed Size     00000AEC (2796)\n-2EE5A Filename Length       002D (45)\n-2EE5C Extra Length          0000 (0)\n-2EE5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2F255 Compression Method    0008 (8) 'Deflated'\n+2F257 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2F25B CRC                   33828390 (864191376)\n+2F25F Compressed Size       00000359 (857)\n+2F263 Uncompressed Size     00000AEC (2796)\n+2F267 Filename Length       002D (45)\n+2F269 Extra Length          0000 (0)\n+2F26B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2EE5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2F26B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2EE8B PAYLOAD\n+2F298 PAYLOAD\n \n-2F1E4 LOCAL HEADER #205     04034B50 (67324752)\n-2F1E8 Extract Zip Spec      14 (20) '2.0'\n-2F1E9 Extract OS            00 (0) 'MS-DOS'\n-2F1EA General Purpose Flag  0800 (2048)\n+2F5F1 LOCAL HEADER #205     04034B50 (67324752)\n+2F5F5 Extract Zip Spec      14 (20) '2.0'\n+2F5F6 Extract OS            00 (0) 'MS-DOS'\n+2F5F7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2F1EC Compression Method    0008 (8) 'Deflated'\n-2F1EE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2F1F2 CRC                   ECCF2EAF (3973000879)\n-2F1F6 Compressed Size       00000708 (1800)\n-2F1FA Uncompressed Size     00001FDF (8159)\n-2F1FE Filename Length       002C (44)\n-2F200 Extra Length          0000 (0)\n-2F202 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2F5F9 Compression Method    0008 (8) 'Deflated'\n+2F5FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2F5FF CRC                   ECCF2EAF (3973000879)\n+2F603 Compressed Size       00000708 (1800)\n+2F607 Uncompressed Size     00001FDF (8159)\n+2F60B Filename Length       002C (44)\n+2F60D Extra Length          0000 (0)\n+2F60F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2F202: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2F60F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2F22E PAYLOAD\n+2F63B PAYLOAD\n \n-2F936 LOCAL HEADER #206     04034B50 (67324752)\n-2F93A Extract Zip Spec      14 (20) '2.0'\n-2F93B Extract OS            00 (0) 'MS-DOS'\n-2F93C General Purpose Flag  0800 (2048)\n+2FD43 LOCAL HEADER #206     04034B50 (67324752)\n+2FD47 Extract Zip Spec      14 (20) '2.0'\n+2FD48 Extract OS            00 (0) 'MS-DOS'\n+2FD49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2F93E Compression Method    0008 (8) 'Deflated'\n-2F940 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2F944 CRC                   4EF6CDD0 (1324797392)\n-2F948 Compressed Size       00000272 (626)\n-2F94C Uncompressed Size     00000489 (1161)\n-2F950 Filename Length       0030 (48)\n-2F952 Extra Length          0000 (0)\n-2F954 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2FD4B Compression Method    0008 (8) 'Deflated'\n+2FD4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2FD51 CRC                   4EF6CDD0 (1324797392)\n+2FD55 Compressed Size       00000272 (626)\n+2FD59 Uncompressed Size     00000489 (1161)\n+2FD5D Filename Length       0030 (48)\n+2FD5F Extra Length          0000 (0)\n+2FD61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2F954: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2FD61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2F984 PAYLOAD\n+2FD91 PAYLOAD\n \n-2FBF6 LOCAL HEADER #207     04034B50 (67324752)\n-2FBFA Extract Zip Spec      14 (20) '2.0'\n-2FBFB Extract OS            00 (0) 'MS-DOS'\n-2FBFC General Purpose Flag  0800 (2048)\n+30003 LOCAL HEADER #207     04034B50 (67324752)\n+30007 Extract Zip Spec      14 (20) '2.0'\n+30008 Extract OS            00 (0) 'MS-DOS'\n+30009 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2FBFE Compression Method    0008 (8) 'Deflated'\n-2FC00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2FC04 CRC                   D5F1D071 (3589394545)\n-2FC08 Compressed Size       00001720 (5920)\n-2FC0C Uncompressed Size     000072B9 (29369)\n-2FC10 Filename Length       0027 (39)\n-2FC12 Extra Length          0000 (0)\n-2FC14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3000B Compression Method    0008 (8) 'Deflated'\n+3000D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+30011 CRC                   8192FABF (2173893311)\n+30015 Compressed Size       00001742 (5954)\n+30019 Uncompressed Size     00007607 (30215)\n+3001D Filename Length       0027 (39)\n+3001F Extra Length          0000 (0)\n+30021 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2FC14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x30021: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2FC3B PAYLOAD\n+30048 PAYLOAD\n \n-3135B LOCAL HEADER #208     04034B50 (67324752)\n-3135F Extract Zip Spec      14 (20) '2.0'\n-31360 Extract OS            00 (0) 'MS-DOS'\n-31361 General Purpose Flag  0800 (2048)\n+3178A LOCAL HEADER #208     04034B50 (67324752)\n+3178E Extract Zip Spec      14 (20) '2.0'\n+3178F Extract OS            00 (0) 'MS-DOS'\n+31790 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-31363 Compression Method    0008 (8) 'Deflated'\n-31365 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-31369 CRC                   99C9FFC3 (2580152259)\n-3136D Compressed Size       000003F2 (1010)\n-31371 Uncompressed Size     00000902 (2306)\n-31375 Filename Length       002D (45)\n-31377 Extra Length          0000 (0)\n-31379 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+31792 Compression Method    0008 (8) 'Deflated'\n+31794 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+31798 CRC                   36088937 (906529079)\n+3179C Compressed Size       000003FC (1020)\n+317A0 Uncompressed Size     0000094E (2382)\n+317A4 Filename Length       002D (45)\n+317A6 Extra Length          0000 (0)\n+317A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x31379: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x317A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-313A6 PAYLOAD\n+317D5 PAYLOAD\n \n-31798 LOCAL HEADER #209     04034B50 (67324752)\n-3179C Extract Zip Spec      14 (20) '2.0'\n-3179D Extract OS            00 (0) 'MS-DOS'\n-3179E General Purpose Flag  0800 (2048)\n+31BD1 LOCAL HEADER #209     04034B50 (67324752)\n+31BD5 Extract Zip Spec      14 (20) '2.0'\n+31BD6 Extract OS            00 (0) 'MS-DOS'\n+31BD7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-317A0 Compression Method    0008 (8) 'Deflated'\n-317A2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-317A6 CRC                   C53EC878 (3309226104)\n-317AA Compressed Size       00000274 (628)\n-317AE Uncompressed Size     00000488 (1160)\n-317B2 Filename Length       0036 (54)\n-317B4 Extra Length          0000 (0)\n-317B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+31BD9 Compression Method    0008 (8) 'Deflated'\n+31BDB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+31BDF CRC                   C67E8FBE (3330183102)\n+31BE3 Compressed Size       0000027E (638)\n+31BE7 Uncompressed Size     000004AB (1195)\n+31BEB Filename Length       0036 (54)\n+31BED Extra Length          0000 (0)\n+31BEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x317B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x31BEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-317EC PAYLOAD\n+31C25 PAYLOAD\n \n-31A60 LOCAL HEADER #210     04034B50 (67324752)\n-31A64 Extract Zip Spec      14 (20) '2.0'\n-31A65 Extract OS            00 (0) 'MS-DOS'\n-31A66 General Purpose Flag  0800 (2048)\n+31EA3 LOCAL HEADER #210     04034B50 (67324752)\n+31EA7 Extract Zip Spec      14 (20) '2.0'\n+31EA8 Extract OS            00 (0) 'MS-DOS'\n+31EA9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-31A68 Compression Method    0008 (8) 'Deflated'\n-31A6A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-31A6E CRC                   8EF8ABEC (2398661612)\n-31A72 Compressed Size       00000392 (914)\n-31A76 Uncompressed Size     00000920 (2336)\n-31A7A Filename Length       0037 (55)\n-31A7C Extra Length          0000 (0)\n-31A7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+31EAB Compression Method    0008 (8) 'Deflated'\n+31EAD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+31EB1 CRC                   8F418EA5 (2403438245)\n+31EB5 Compressed Size       0000039C (924)\n+31EB9 Uncompressed Size     00000967 (2407)\n+31EBD Filename Length       0037 (55)\n+31EBF Extra Length          0000 (0)\n+31EC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x31A7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x31EC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-31AB5 PAYLOAD\n+31EF8 PAYLOAD\n \n-31E47 LOCAL HEADER #211     04034B50 (67324752)\n-31E4B Extract Zip Spec      14 (20) '2.0'\n-31E4C Extract OS            00 (0) 'MS-DOS'\n-31E4D General Purpose Flag  0800 (2048)\n+32294 LOCAL HEADER #211     04034B50 (67324752)\n+32298 Extract Zip Spec      14 (20) '2.0'\n+32299 Extract OS            00 (0) 'MS-DOS'\n+3229A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-31E4F Compression Method    0008 (8) 'Deflated'\n-31E51 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-31E55 CRC                   9D821087 (2642546823)\n-31E59 Compressed Size       00000249 (585)\n-31E5D Uncompressed Size     000004BE (1214)\n-31E61 Filename Length       0029 (41)\n-31E63 Extra Length          0000 (0)\n-31E65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3229C Compression Method    0008 (8) 'Deflated'\n+3229E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+322A2 CRC                   9D821087 (2642546823)\n+322A6 Compressed Size       00000249 (585)\n+322AA Uncompressed Size     000004BE (1214)\n+322AE Filename Length       0029 (41)\n+322B0 Extra Length          0000 (0)\n+322B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x31E65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x322B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-31E8E PAYLOAD\n+322DB PAYLOAD\n \n-320D7 LOCAL HEADER #212     04034B50 (67324752)\n-320DB Extract Zip Spec      14 (20) '2.0'\n-320DC Extract OS            00 (0) 'MS-DOS'\n-320DD General Purpose Flag  0800 (2048)\n+32524 LOCAL HEADER #212     04034B50 (67324752)\n+32528 Extract Zip Spec      14 (20) '2.0'\n+32529 Extract OS            00 (0) 'MS-DOS'\n+3252A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-320DF Compression Method    0008 (8) 'Deflated'\n-320E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-320E5 CRC                   7A6DF346 (2054026054)\n-320E9 Compressed Size       00000371 (881)\n-320ED Uncompressed Size     00000ED8 (3800)\n-320F1 Filename Length       002A (42)\n-320F3 Extra Length          0000 (0)\n-320F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3252C Compression Method    0008 (8) 'Deflated'\n+3252E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+32532 CRC                   0D8DFECE (227409614)\n+32536 Compressed Size       00000376 (886)\n+3253A Uncompressed Size     00000F82 (3970)\n+3253E Filename Length       002A (42)\n+32540 Extra Length          0000 (0)\n+32542 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x320F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x32542: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3211F PAYLOAD\n+3256C PAYLOAD\n \n-32490 LOCAL HEADER #213     04034B50 (67324752)\n-32494 Extract Zip Spec      14 (20) '2.0'\n-32495 Extract OS            00 (0) 'MS-DOS'\n-32496 General Purpose Flag  0800 (2048)\n+328E2 LOCAL HEADER #213     04034B50 (67324752)\n+328E6 Extract Zip Spec      14 (20) '2.0'\n+328E7 Extract OS            00 (0) 'MS-DOS'\n+328E8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-32498 Compression Method    0008 (8) 'Deflated'\n-3249A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3249E CRC                   A6EF1A57 (2800687703)\n-324A2 Compressed Size       000002E4 (740)\n-324A6 Uncompressed Size     00000745 (1861)\n-324AA Filename Length       0031 (49)\n-324AC Extra Length          0000 (0)\n-324AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+328EA Compression Method    0008 (8) 'Deflated'\n+328EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+328F0 CRC                   A6EF1A57 (2800687703)\n+328F4 Compressed Size       000002E4 (740)\n+328F8 Uncompressed Size     00000745 (1861)\n+328FC Filename Length       0031 (49)\n+328FE Extra Length          0000 (0)\n+32900 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x324AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x32900: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-324DF PAYLOAD\n+32931 PAYLOAD\n \n-327C3 LOCAL HEADER #214     04034B50 (67324752)\n-327C7 Extract Zip Spec      14 (20) '2.0'\n-327C8 Extract OS            00 (0) 'MS-DOS'\n-327C9 General Purpose Flag  0800 (2048)\n+32C15 LOCAL HEADER #214     04034B50 (67324752)\n+32C19 Extract Zip Spec      14 (20) '2.0'\n+32C1A Extract OS            00 (0) 'MS-DOS'\n+32C1B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-327CB Compression Method    0008 (8) 'Deflated'\n-327CD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-327D1 CRC                   626EDC3E (1651432510)\n-327D5 Compressed Size       000005BE (1470)\n-327D9 Uncompressed Size     00001485 (5253)\n-327DD Filename Length       0031 (49)\n-327DF Extra Length          0000 (0)\n-327E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+32C1D Compression Method    0008 (8) 'Deflated'\n+32C1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+32C23 CRC                   626EDC3E (1651432510)\n+32C27 Compressed Size       000005BE (1470)\n+32C2B Uncompressed Size     00001485 (5253)\n+32C2F Filename Length       0031 (49)\n+32C31 Extra Length          0000 (0)\n+32C33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x327E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x32C33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-32812 PAYLOAD\n+32C64 PAYLOAD\n \n-32DD0 LOCAL HEADER #215     04034B50 (67324752)\n-32DD4 Extract Zip Spec      14 (20) '2.0'\n-32DD5 Extract OS            00 (0) 'MS-DOS'\n-32DD6 General Purpose Flag  0800 (2048)\n+33222 LOCAL HEADER #215     04034B50 (67324752)\n+33226 Extract Zip Spec      14 (20) '2.0'\n+33227 Extract OS            00 (0) 'MS-DOS'\n+33228 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-32DD8 Compression Method    0008 (8) 'Deflated'\n-32DDA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-32DDE CRC                   65EBC1EB (1709949419)\n-32DE2 Compressed Size       000003A6 (934)\n-32DE6 Uncompressed Size     00000D0E (3342)\n-32DEA Filename Length       0031 (49)\n-32DEC Extra Length          0000 (0)\n-32DEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3322A Compression Method    0008 (8) 'Deflated'\n+3322C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+33230 CRC                   65EBC1EB (1709949419)\n+33234 Compressed Size       000003A6 (934)\n+33238 Uncompressed Size     00000D0E (3342)\n+3323C Filename Length       0031 (49)\n+3323E Extra Length          0000 (0)\n+33240 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x32DEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33240: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-32E1F PAYLOAD\n+33271 PAYLOAD\n \n-331C5 LOCAL HEADER #216     04034B50 (67324752)\n-331C9 Extract Zip Spec      14 (20) '2.0'\n-331CA Extract OS            00 (0) 'MS-DOS'\n-331CB General Purpose Flag  0800 (2048)\n+33617 LOCAL HEADER #216     04034B50 (67324752)\n+3361B Extract Zip Spec      14 (20) '2.0'\n+3361C Extract OS            00 (0) 'MS-DOS'\n+3361D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-331CD Compression Method    0008 (8) 'Deflated'\n-331CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-331D3 CRC                   006A5B46 (6970182)\n-331D7 Compressed Size       000002C9 (713)\n-331DB Uncompressed Size     000006F8 (1784)\n-331DF Filename Length       0038 (56)\n-331E1 Extra Length          0000 (0)\n-331E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3361F Compression Method    0008 (8) 'Deflated'\n+33621 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+33625 CRC                   006A5B46 (6970182)\n+33629 Compressed Size       000002C9 (713)\n+3362D Uncompressed Size     000006F8 (1784)\n+33631 Filename Length       0038 (56)\n+33633 Extra Length          0000 (0)\n+33635 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x331E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33635: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3321B PAYLOAD\n+3366D PAYLOAD\n \n-334E4 LOCAL HEADER #217     04034B50 (67324752)\n-334E8 Extract Zip Spec      14 (20) '2.0'\n-334E9 Extract OS            00 (0) 'MS-DOS'\n-334EA General Purpose Flag  0800 (2048)\n+33936 LOCAL HEADER #217     04034B50 (67324752)\n+3393A Extract Zip Spec      14 (20) '2.0'\n+3393B Extract OS            00 (0) 'MS-DOS'\n+3393C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-334EC Compression Method    0008 (8) 'Deflated'\n-334EE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-334F2 CRC                   8FD172CF (2412868303)\n-334F6 Compressed Size       0000034C (844)\n-334FA Uncompressed Size     00000D1B (3355)\n-334FE Filename Length       0031 (49)\n-33500 Extra Length          0000 (0)\n-33502 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3393E Compression Method    0008 (8) 'Deflated'\n+33940 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+33944 CRC                   8FD172CF (2412868303)\n+33948 Compressed Size       0000034C (844)\n+3394C Uncompressed Size     00000D1B (3355)\n+33950 Filename Length       0031 (49)\n+33952 Extra Length          0000 (0)\n+33954 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x33502: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33954: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-33533 PAYLOAD\n+33985 PAYLOAD\n \n-3387F LOCAL HEADER #218     04034B50 (67324752)\n-33883 Extract Zip Spec      14 (20) '2.0'\n-33884 Extract OS            00 (0) 'MS-DOS'\n-33885 General Purpose Flag  0800 (2048)\n+33CD1 LOCAL HEADER #218     04034B50 (67324752)\n+33CD5 Extract Zip Spec      14 (20) '2.0'\n+33CD6 Extract OS            00 (0) 'MS-DOS'\n+33CD7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-33887 Compression Method    0008 (8) 'Deflated'\n-33889 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3388D CRC                   7ADBDBE0 (2061229024)\n-33891 Compressed Size       0000055C (1372)\n-33895 Uncompressed Size     000012FC (4860)\n-33899 Filename Length       0038 (56)\n-3389B Extra Length          0000 (0)\n-3389D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+33CD9 Compression Method    0008 (8) 'Deflated'\n+33CDB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+33CDF CRC                   7ADBDBE0 (2061229024)\n+33CE3 Compressed Size       0000055C (1372)\n+33CE7 Uncompressed Size     000012FC (4860)\n+33CEB Filename Length       0038 (56)\n+33CED Extra Length          0000 (0)\n+33CEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3389D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33CEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-338D5 PAYLOAD\n+33D27 PAYLOAD\n \n-33E31 LOCAL HEADER #219     04034B50 (67324752)\n-33E35 Extract Zip Spec      14 (20) '2.0'\n-33E36 Extract OS            00 (0) 'MS-DOS'\n-33E37 General Purpose Flag  0800 (2048)\n+34283 LOCAL HEADER #219     04034B50 (67324752)\n+34287 Extract Zip Spec      14 (20) '2.0'\n+34288 Extract OS            00 (0) 'MS-DOS'\n+34289 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-33E39 Compression Method    0008 (8) 'Deflated'\n-33E3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-33E3F CRC                   0237005F (37159007)\n-33E43 Compressed Size       00000393 (915)\n-33E47 Uncompressed Size     00000E61 (3681)\n-33E4B Filename Length       0035 (53)\n-33E4D Extra Length          0000 (0)\n-33E4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3428B Compression Method    0008 (8) 'Deflated'\n+3428D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+34291 CRC                   0237005F (37159007)\n+34295 Compressed Size       00000393 (915)\n+34299 Uncompressed Size     00000E61 (3681)\n+3429D Filename Length       0035 (53)\n+3429F Extra Length          0000 (0)\n+342A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x33E4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x342A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-33E84 PAYLOAD\n+342D6 PAYLOAD\n \n-34217 LOCAL HEADER #220     04034B50 (67324752)\n-3421B Extract Zip Spec      14 (20) '2.0'\n-3421C Extract OS            00 (0) 'MS-DOS'\n-3421D General Purpose Flag  0800 (2048)\n+34669 LOCAL HEADER #220     04034B50 (67324752)\n+3466D Extract Zip Spec      14 (20) '2.0'\n+3466E Extract OS            00 (0) 'MS-DOS'\n+3466F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3421F Compression Method    0008 (8) 'Deflated'\n-34221 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-34225 CRC                   CE737695 (3463673493)\n-34229 Compressed Size       00000481 (1153)\n-3422D Uncompressed Size     000010CC (4300)\n-34231 Filename Length       003C (60)\n-34233 Extra Length          0000 (0)\n-34235 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+34671 Compression Method    0008 (8) 'Deflated'\n+34673 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+34677 CRC                   CE737695 (3463673493)\n+3467B Compressed Size       00000481 (1153)\n+3467F Uncompressed Size     000010CC (4300)\n+34683 Filename Length       003C (60)\n+34685 Extra Length          0000 (0)\n+34687 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34235: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x34687: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34271 PAYLOAD\n+346C3 PAYLOAD\n \n-346F2 LOCAL HEADER #221     04034B50 (67324752)\n-346F6 Extract Zip Spec      14 (20) '2.0'\n-346F7 Extract OS            00 (0) 'MS-DOS'\n-346F8 General Purpose Flag  0800 (2048)\n+34B44 LOCAL HEADER #221     04034B50 (67324752)\n+34B48 Extract Zip Spec      14 (20) '2.0'\n+34B49 Extract OS            00 (0) 'MS-DOS'\n+34B4A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-346FA Compression Method    0008 (8) 'Deflated'\n-346FC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-34700 CRC                   719AAFB0 (1905962928)\n-34704 Compressed Size       00000343 (835)\n-34708 Uncompressed Size     00000C98 (3224)\n-3470C Filename Length       0037 (55)\n-3470E Extra Length          0000 (0)\n-34710 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+34B4C Compression Method    0008 (8) 'Deflated'\n+34B4E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+34B52 CRC                   719AAFB0 (1905962928)\n+34B56 Compressed Size       00000343 (835)\n+34B5A Uncompressed Size     00000C98 (3224)\n+34B5E Filename Length       0037 (55)\n+34B60 Extra Length          0000 (0)\n+34B62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34710: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x34B62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34747 PAYLOAD\n+34B99 PAYLOAD\n \n-34A8A LOCAL HEADER #222     04034B50 (67324752)\n-34A8E Extract Zip Spec      14 (20) '2.0'\n-34A8F Extract OS            00 (0) 'MS-DOS'\n-34A90 General Purpose Flag  0800 (2048)\n+34EDC LOCAL HEADER #222     04034B50 (67324752)\n+34EE0 Extract Zip Spec      14 (20) '2.0'\n+34EE1 Extract OS            00 (0) 'MS-DOS'\n+34EE2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-34A92 Compression Method    0008 (8) 'Deflated'\n-34A94 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-34A98 CRC                   B7D93D08 (3084467464)\n-34A9C Compressed Size       00000375 (885)\n-34AA0 Uncompressed Size     00000CED (3309)\n-34AA4 Filename Length       003E (62)\n-34AA6 Extra Length          0000 (0)\n-34AA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+34EE4 Compression Method    0008 (8) 'Deflated'\n+34EE6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+34EEA CRC                   B7D93D08 (3084467464)\n+34EEE Compressed Size       00000375 (885)\n+34EF2 Uncompressed Size     00000CED (3309)\n+34EF6 Filename Length       003E (62)\n+34EF8 Extra Length          0000 (0)\n+34EFA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34AA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x34EFA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34AE6 PAYLOAD\n+34F38 PAYLOAD\n \n-34E5B LOCAL HEADER #223     04034B50 (67324752)\n-34E5F Extract Zip Spec      14 (20) '2.0'\n-34E60 Extract OS            00 (0) 'MS-DOS'\n-34E61 General Purpose Flag  0800 (2048)\n+352AD LOCAL HEADER #223     04034B50 (67324752)\n+352B1 Extract Zip Spec      14 (20) '2.0'\n+352B2 Extract OS            00 (0) 'MS-DOS'\n+352B3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-34E63 Compression Method    0008 (8) 'Deflated'\n-34E65 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-34E69 CRC                   FD6565BB (4251280827)\n-34E6D Compressed Size       0000044E (1102)\n-34E71 Uncompressed Size     00001876 (6262)\n-34E75 Filename Length       0035 (53)\n-34E77 Extra Length          0000 (0)\n-34E79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+352B5 Compression Method    0008 (8) 'Deflated'\n+352B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+352BB CRC                   FD6565BB (4251280827)\n+352BF Compressed Size       0000044E (1102)\n+352C3 Uncompressed Size     00001876 (6262)\n+352C7 Filename Length       0035 (53)\n+352C9 Extra Length          0000 (0)\n+352CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34E79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x352CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34EAE PAYLOAD\n+35300 PAYLOAD\n \n-352FC LOCAL HEADER #224     04034B50 (67324752)\n-35300 Extract Zip Spec      14 (20) '2.0'\n-35301 Extract OS            00 (0) 'MS-DOS'\n-35302 General Purpose Flag  0800 (2048)\n+3574E LOCAL HEADER #224     04034B50 (67324752)\n+35752 Extract Zip Spec      14 (20) '2.0'\n+35753 Extract OS            00 (0) 'MS-DOS'\n+35754 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35304 Compression Method    0008 (8) 'Deflated'\n-35306 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3530A CRC                   2D853131 (763703601)\n-3530E Compressed Size       000002C6 (710)\n-35312 Uncompressed Size     000006EF (1775)\n-35316 Filename Length       003C (60)\n-35318 Extra Length          0000 (0)\n-3531A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+35756 Compression Method    0008 (8) 'Deflated'\n+35758 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3575C CRC                   2D853131 (763703601)\n+35760 Compressed Size       000002C6 (710)\n+35764 Uncompressed Size     000006EF (1775)\n+35768 Filename Length       003C (60)\n+3576A Extra Length          0000 (0)\n+3576C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3531A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3576C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-35356 PAYLOAD\n+357A8 PAYLOAD\n \n-3561C LOCAL HEADER #225     04034B50 (67324752)\n-35620 Extract Zip Spec      14 (20) '2.0'\n-35621 Extract OS            00 (0) 'MS-DOS'\n-35622 General Purpose Flag  0800 (2048)\n+35A6E LOCAL HEADER #225     04034B50 (67324752)\n+35A72 Extract Zip Spec      14 (20) '2.0'\n+35A73 Extract OS            00 (0) 'MS-DOS'\n+35A74 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35624 Compression Method    0008 (8) 'Deflated'\n-35626 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3562A CRC                   01B8CE5D (28888669)\n-3562E Compressed Size       000003B8 (952)\n-35632 Uncompressed Size     000013B5 (5045)\n-35636 Filename Length       003A (58)\n-35638 Extra Length          0000 (0)\n-3563A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+35A76 Compression Method    0008 (8) 'Deflated'\n+35A78 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+35A7C CRC                   01B8CE5D (28888669)\n+35A80 Compressed Size       000003B8 (952)\n+35A84 Uncompressed Size     000013B5 (5045)\n+35A88 Filename Length       003A (58)\n+35A8A Extra Length          0000 (0)\n+35A8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3563A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x35A8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-35674 PAYLOAD\n+35AC6 PAYLOAD\n \n-35A2C LOCAL HEADER #226     04034B50 (67324752)\n-35A30 Extract Zip Spec      14 (20) '2.0'\n-35A31 Extract OS            00 (0) 'MS-DOS'\n-35A32 General Purpose Flag  0800 (2048)\n+35E7E LOCAL HEADER #226     04034B50 (67324752)\n+35E82 Extract Zip Spec      14 (20) '2.0'\n+35E83 Extract OS            00 (0) 'MS-DOS'\n+35E84 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35A34 Compression Method    0008 (8) 'Deflated'\n-35A36 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-35A3A CRC                   EE49CD50 (3997814096)\n-35A3E Compressed Size       000002D6 (726)\n-35A42 Uncompressed Size     0000075D (1885)\n-35A46 Filename Length       002A (42)\n-35A48 Extra Length          0000 (0)\n-35A4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+35E86 Compression Method    0008 (8) 'Deflated'\n+35E88 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+35E8C CRC                   EE49CD50 (3997814096)\n+35E90 Compressed Size       000002D6 (726)\n+35E94 Uncompressed Size     0000075D (1885)\n+35E98 Filename Length       002A (42)\n+35E9A Extra Length          0000 (0)\n+35E9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x35A4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x35E9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-35A74 PAYLOAD\n+35EC6 PAYLOAD\n \n-35D4A LOCAL HEADER #227     04034B50 (67324752)\n-35D4E Extract Zip Spec      14 (20) '2.0'\n-35D4F Extract OS            00 (0) 'MS-DOS'\n-35D50 General Purpose Flag  0800 (2048)\n+3619C LOCAL HEADER #227     04034B50 (67324752)\n+361A0 Extract Zip Spec      14 (20) '2.0'\n+361A1 Extract OS            00 (0) 'MS-DOS'\n+361A2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35D52 Compression Method    0008 (8) 'Deflated'\n-35D54 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-35D58 CRC                   4C723E93 (1282555539)\n-35D5C Compressed Size       0000023F (575)\n-35D60 Uncompressed Size     00000432 (1074)\n-35D64 Filename Length       0031 (49)\n-35D66 Extra Length          0000 (0)\n-35D68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+361A4 Compression Method    0008 (8) 'Deflated'\n+361A6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+361AA CRC                   4C723E93 (1282555539)\n+361AE Compressed Size       0000023F (575)\n+361B2 Uncompressed Size     00000432 (1074)\n+361B6 Filename Length       0031 (49)\n+361B8 Extra Length          0000 (0)\n+361BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x35D68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x361BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-35D99 PAYLOAD\n+361EB PAYLOAD\n \n-35FD8 LOCAL HEADER #228     04034B50 (67324752)\n-35FDC Extract Zip Spec      14 (20) '2.0'\n-35FDD Extract OS            00 (0) 'MS-DOS'\n-35FDE General Purpose Flag  0800 (2048)\n+3642A LOCAL HEADER #228     04034B50 (67324752)\n+3642E Extract Zip Spec      14 (20) '2.0'\n+3642F Extract OS            00 (0) 'MS-DOS'\n+36430 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35FE0 Compression Method    0008 (8) 'Deflated'\n-35FE2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-35FE6 CRC                   CD3068DB (3442501851)\n-35FEA Compressed Size       000003A9 (937)\n-35FEE Uncompressed Size     000008A7 (2215)\n-35FF2 Filename Length       003D (61)\n-35FF4 Extra Length          0000 (0)\n-35FF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36432 Compression Method    0008 (8) 'Deflated'\n+36434 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+36438 CRC                   CD3068DB (3442501851)\n+3643C Compressed Size       000003A9 (937)\n+36440 Uncompressed Size     000008A7 (2215)\n+36444 Filename Length       003D (61)\n+36446 Extra Length          0000 (0)\n+36448 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x35FF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36448: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36033 PAYLOAD\n+36485 PAYLOAD\n \n-363DC LOCAL HEADER #229     04034B50 (67324752)\n-363E0 Extract Zip Spec      14 (20) '2.0'\n-363E1 Extract OS            00 (0) 'MS-DOS'\n-363E2 General Purpose Flag  0800 (2048)\n+3682E LOCAL HEADER #229     04034B50 (67324752)\n+36832 Extract Zip Spec      14 (20) '2.0'\n+36833 Extract OS            00 (0) 'MS-DOS'\n+36834 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-363E4 Compression Method    0008 (8) 'Deflated'\n-363E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-363EA CRC                   E601D6EE (3858880238)\n-363EE Compressed Size       00000326 (806)\n-363F2 Uncompressed Size     00000701 (1793)\n-363F6 Filename Length       003F (63)\n-363F8 Extra Length          0000 (0)\n-363FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36836 Compression Method    0008 (8) 'Deflated'\n+36838 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3683C CRC                   E601D6EE (3858880238)\n+36840 Compressed Size       00000326 (806)\n+36844 Uncompressed Size     00000701 (1793)\n+36848 Filename Length       003F (63)\n+3684A Extra Length          0000 (0)\n+3684C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x363FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3684C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36439 PAYLOAD\n+3688B PAYLOAD\n \n-3675F LOCAL HEADER #230     04034B50 (67324752)\n-36763 Extract Zip Spec      14 (20) '2.0'\n-36764 Extract OS            00 (0) 'MS-DOS'\n-36765 General Purpose Flag  0800 (2048)\n+36BB1 LOCAL HEADER #230     04034B50 (67324752)\n+36BB5 Extract Zip Spec      14 (20) '2.0'\n+36BB6 Extract OS            00 (0) 'MS-DOS'\n+36BB7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-36767 Compression Method    0008 (8) 'Deflated'\n-36769 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3676D CRC                   577B6C79 (1467706489)\n-36771 Compressed Size       00000331 (817)\n-36775 Uncompressed Size     000007D4 (2004)\n-36779 Filename Length       0037 (55)\n-3677B Extra Length          0000 (0)\n-3677D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36BB9 Compression Method    0008 (8) 'Deflated'\n+36BBB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+36BBF CRC                   577B6C79 (1467706489)\n+36BC3 Compressed Size       00000331 (817)\n+36BC7 Uncompressed Size     000007D4 (2004)\n+36BCB Filename Length       0037 (55)\n+36BCD Extra Length          0000 (0)\n+36BCF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3677D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36BCF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-367B4 PAYLOAD\n+36C06 PAYLOAD\n \n-36AE5 LOCAL HEADER #231     04034B50 (67324752)\n-36AE9 Extract Zip Spec      14 (20) '2.0'\n-36AEA Extract OS            00 (0) 'MS-DOS'\n-36AEB General Purpose Flag  0800 (2048)\n+36F37 LOCAL HEADER #231     04034B50 (67324752)\n+36F3B Extract Zip Spec      14 (20) '2.0'\n+36F3C Extract OS            00 (0) 'MS-DOS'\n+36F3D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-36AED Compression Method    0008 (8) 'Deflated'\n-36AEF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-36AF3 CRC                   BF5F9C1E (3210714142)\n-36AF7 Compressed Size       00000287 (647)\n-36AFB Uncompressed Size     00000500 (1280)\n-36AFF Filename Length       002C (44)\n-36B01 Extra Length          0000 (0)\n-36B03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36F3F Compression Method    0008 (8) 'Deflated'\n+36F41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+36F45 CRC                   BF5F9C1E (3210714142)\n+36F49 Compressed Size       00000287 (647)\n+36F4D Uncompressed Size     00000500 (1280)\n+36F51 Filename Length       002C (44)\n+36F53 Extra Length          0000 (0)\n+36F55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x36B03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36F55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36B2F PAYLOAD\n+36F81 PAYLOAD\n \n-36DB6 LOCAL HEADER #232     04034B50 (67324752)\n-36DBA Extract Zip Spec      14 (20) '2.0'\n-36DBB Extract OS            00 (0) 'MS-DOS'\n-36DBC General Purpose Flag  0800 (2048)\n+37208 LOCAL HEADER #232     04034B50 (67324752)\n+3720C Extract Zip Spec      14 (20) '2.0'\n+3720D Extract OS            00 (0) 'MS-DOS'\n+3720E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-36DBE Compression Method    0008 (8) 'Deflated'\n-36DC0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-36DC4 CRC                   5E930431 (1586693169)\n-36DC8 Compressed Size       0000034F (847)\n-36DCC Uncompressed Size     000008C7 (2247)\n-36DD0 Filename Length       003A (58)\n-36DD2 Extra Length          0000 (0)\n-36DD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+37210 Compression Method    0008 (8) 'Deflated'\n+37212 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+37216 CRC                   6A2AB119 (1781182745)\n+3721A Compressed Size       00000354 (852)\n+3721E Uncompressed Size     00000908 (2312)\n+37222 Filename Length       003A (58)\n+37224 Extra Length          0000 (0)\n+37226 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x36DD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x37226: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36E0E PAYLOAD\n+37260 PAYLOAD\n \n-3715D LOCAL HEADER #233     04034B50 (67324752)\n-37161 Extract Zip Spec      14 (20) '2.0'\n-37162 Extract OS            00 (0) 'MS-DOS'\n-37163 General Purpose Flag  0800 (2048)\n+375B4 LOCAL HEADER #233     04034B50 (67324752)\n+375B8 Extract Zip Spec      14 (20) '2.0'\n+375B9 Extract OS            00 (0) 'MS-DOS'\n+375BA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-37165 Compression Method    0008 (8) 'Deflated'\n-37167 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3716B CRC                   54C421FF (1422139903)\n-3716F Compressed Size       00000358 (856)\n-37173 Uncompressed Size     00000739 (1849)\n-37177 Filename Length       0039 (57)\n-37179 Extra Length          0000 (0)\n-3717B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+375BC Compression Method    0008 (8) 'Deflated'\n+375BE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+375C2 CRC                   19AC3747 (430716743)\n+375C6 Compressed Size       00000362 (866)\n+375CA Uncompressed Size     0000076E (1902)\n+375CE Filename Length       0039 (57)\n+375D0 Extra Length          0000 (0)\n+375D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3717B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x375D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-371B4 PAYLOAD\n+3760B PAYLOAD\n \n-3750C LOCAL HEADER #234     04034B50 (67324752)\n-37510 Extract Zip Spec      14 (20) '2.0'\n-37511 Extract OS            00 (0) 'MS-DOS'\n-37512 General Purpose Flag  0800 (2048)\n+3796D LOCAL HEADER #234     04034B50 (67324752)\n+37971 Extract Zip Spec      14 (20) '2.0'\n+37972 Extract OS            00 (0) 'MS-DOS'\n+37973 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-37514 Compression Method    0008 (8) 'Deflated'\n-37516 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3751A CRC                   DFEE0135 (3756917045)\n-3751E Compressed Size       00000330 (816)\n-37522 Uncompressed Size     0000098D (2445)\n-37526 Filename Length       0037 (55)\n-37528 Extra Length          0000 (0)\n-3752A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+37975 Compression Method    0008 (8) 'Deflated'\n+37977 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3797B CRC                   DFEE0135 (3756917045)\n+3797F Compressed Size       00000330 (816)\n+37983 Uncompressed Size     0000098D (2445)\n+37987 Filename Length       0037 (55)\n+37989 Extra Length          0000 (0)\n+3798B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3752A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3798B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-37561 PAYLOAD\n+379C2 PAYLOAD\n \n-37891 LOCAL HEADER #235     04034B50 (67324752)\n-37895 Extract Zip Spec      14 (20) '2.0'\n-37896 Extract OS            00 (0) 'MS-DOS'\n-37897 General Purpose Flag  0800 (2048)\n+37CF2 LOCAL HEADER #235     04034B50 (67324752)\n+37CF6 Extract Zip Spec      14 (20) '2.0'\n+37CF7 Extract OS            00 (0) 'MS-DOS'\n+37CF8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-37899 Compression Method    0008 (8) 'Deflated'\n-3789B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3789F CRC                   F7472DA9 (4148637097)\n-378A3 Compressed Size       00000722 (1826)\n-378A7 Uncompressed Size     00001AF8 (6904)\n-378AB Filename Length       003C (60)\n-378AD Extra Length          0000 (0)\n-378AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+37CFA Compression Method    0008 (8) 'Deflated'\n+37CFC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+37D00 CRC                   E4E72DDD (3840355805)\n+37D04 Compressed Size       0000072D (1837)\n+37D08 Uncompressed Size     00001BBE (7102)\n+37D0C Filename Length       003C (60)\n+37D0E Extra Length          0000 (0)\n+37D10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x378AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x37D10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-378EB PAYLOAD\n+37D4C PAYLOAD\n \n-3800D LOCAL HEADER #236     04034B50 (67324752)\n-38011 Extract Zip Spec      14 (20) '2.0'\n-38012 Extract OS            00 (0) 'MS-DOS'\n-38013 General Purpose Flag  0800 (2048)\n+38479 LOCAL HEADER #236     04034B50 (67324752)\n+3847D Extract Zip Spec      14 (20) '2.0'\n+3847E Extract OS            00 (0) 'MS-DOS'\n+3847F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-38015 Compression Method    0008 (8) 'Deflated'\n-38017 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3801B CRC                   17B25B54 (397564756)\n-3801F Compressed Size       00000613 (1555)\n-38023 Uncompressed Size     00001558 (5464)\n-38027 Filename Length       003F (63)\n-38029 Extra Length          0000 (0)\n-3802B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+38481 Compression Method    0008 (8) 'Deflated'\n+38483 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+38487 CRC                   5E80C56B (1585497451)\n+3848B Compressed Size       0000061E (1566)\n+3848F Uncompressed Size     000015FF (5631)\n+38493 Filename Length       003F (63)\n+38495 Extra Length          0000 (0)\n+38497 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3802B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38497: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3806A PAYLOAD\n+384D6 PAYLOAD\n \n-3867D LOCAL HEADER #237     04034B50 (67324752)\n-38681 Extract Zip Spec      14 (20) '2.0'\n-38682 Extract OS            00 (0) 'MS-DOS'\n-38683 General Purpose Flag  0800 (2048)\n+38AF4 LOCAL HEADER #237     04034B50 (67324752)\n+38AF8 Extract Zip Spec      14 (20) '2.0'\n+38AF9 Extract OS            00 (0) 'MS-DOS'\n+38AFA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-38685 Compression Method    0008 (8) 'Deflated'\n-38687 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3868B CRC                   9C1B711A (2619044122)\n-3868F Compressed Size       000002EE (750)\n-38693 Uncompressed Size     0000065E (1630)\n-38697 Filename Length       0043 (67)\n-38699 Extra Length          0000 (0)\n-3869B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+38AFC Compression Method    0008 (8) 'Deflated'\n+38AFE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+38B02 CRC                   D1666DFC (3513150972)\n+38B06 Compressed Size       000002F6 (758)\n+38B0A Uncompressed Size     0000068D (1677)\n+38B0E Filename Length       0043 (67)\n+38B10 Extra Length          0000 (0)\n+38B12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3869B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38B12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-386DE PAYLOAD\n+38B55 PAYLOAD\n \n-389CC LOCAL HEADER #238     04034B50 (67324752)\n-389D0 Extract Zip Spec      14 (20) '2.0'\n-389D1 Extract OS            00 (0) 'MS-DOS'\n-389D2 General Purpose Flag  0800 (2048)\n+38E4B LOCAL HEADER #238     04034B50 (67324752)\n+38E4F Extract Zip Spec      14 (20) '2.0'\n+38E50 Extract OS            00 (0) 'MS-DOS'\n+38E51 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-389D4 Compression Method    0008 (8) 'Deflated'\n-389D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-389DA CRC                   8247BF31 (2185740081)\n-389DE Compressed Size       000002AF (687)\n-389E2 Uncompressed Size     0000054B (1355)\n-389E6 Filename Length       0032 (50)\n-389E8 Extra Length          0000 (0)\n-389EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+38E53 Compression Method    0008 (8) 'Deflated'\n+38E55 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+38E59 CRC                   25E239BD (635582909)\n+38E5D Compressed Size       000002B9 (697)\n+38E61 Uncompressed Size     00000575 (1397)\n+38E65 Filename Length       0032 (50)\n+38E67 Extra Length          0000 (0)\n+38E69 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x389EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38E69: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-38A1C PAYLOAD\n+38E9B PAYLOAD\n \n-38CCB LOCAL HEADER #239     04034B50 (67324752)\n-38CCF Extract Zip Spec      14 (20) '2.0'\n-38CD0 Extract OS            00 (0) 'MS-DOS'\n-38CD1 General Purpose Flag  0800 (2048)\n+39154 LOCAL HEADER #239     04034B50 (67324752)\n+39158 Extract Zip Spec      14 (20) '2.0'\n+39159 Extract OS            00 (0) 'MS-DOS'\n+3915A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-38CD3 Compression Method    0008 (8) 'Deflated'\n-38CD5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-38CD9 CRC                   8DDA963E (2379912766)\n-38CDD Compressed Size       000008EC (2284)\n-38CE1 Uncompressed Size     00001A95 (6805)\n-38CE5 Filename Length       003A (58)\n-38CE7 Extra Length          0000 (0)\n-38CE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3915C Compression Method    0008 (8) 'Deflated'\n+3915E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+39162 CRC                   6E8E196C (1854806380)\n+39166 Compressed Size       000008FC (2300)\n+3916A Uncompressed Size     00001B5F (7007)\n+3916E Filename Length       003A (58)\n+39170 Extra Length          0000 (0)\n+39172 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x38CE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x39172: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-38D23 PAYLOAD\n+391AC PAYLOAD\n \n-3960F LOCAL HEADER #240     04034B50 (67324752)\n-39613 Extract Zip Spec      14 (20) '2.0'\n-39614 Extract OS            00 (0) 'MS-DOS'\n-39615 General Purpose Flag  0800 (2048)\n+39AA8 LOCAL HEADER #240     04034B50 (67324752)\n+39AAC Extract Zip Spec      14 (20) '2.0'\n+39AAD Extract OS            00 (0) 'MS-DOS'\n+39AAE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-39617 Compression Method    0008 (8) 'Deflated'\n-39619 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3961D CRC                   A445CFD0 (2756038608)\n-39621 Compressed Size       00000303 (771)\n-39625 Uncompressed Size     0000090C (2316)\n-39629 Filename Length       004D (77)\n-3962B Extra Length          0000 (0)\n-3962D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+39AB0 Compression Method    0008 (8) 'Deflated'\n+39AB2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+39AB6 CRC                   4F941D99 (1335106969)\n+39ABA Compressed Size       0000030B (779)\n+39ABE Uncompressed Size     0000094D (2381)\n+39AC2 Filename Length       004D (77)\n+39AC4 Extra Length          0000 (0)\n+39AC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3962D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x39AC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3967A PAYLOAD\n+39B13 PAYLOAD\n \n-3997D LOCAL HEADER #241     04034B50 (67324752)\n-39981 Extract Zip Spec      14 (20) '2.0'\n-39982 Extract OS            00 (0) 'MS-DOS'\n-39983 General Purpose Flag  0800 (2048)\n+39E1E LOCAL HEADER #241     04034B50 (67324752)\n+39E22 Extract Zip Spec      14 (20) '2.0'\n+39E23 Extract OS            00 (0) 'MS-DOS'\n+39E24 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-39985 Compression Method    0008 (8) 'Deflated'\n-39987 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3998B CRC                   0A4E202C (172892204)\n-3998F Compressed Size       0000028F (655)\n-39993 Uncompressed Size     000004DB (1243)\n-39997 Filename Length       0046 (70)\n-39999 Extra Length          0000 (0)\n-3999B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+39E26 Compression Method    0008 (8) 'Deflated'\n+39E28 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+39E2C CRC                   9F5D6B51 (2673699665)\n+39E30 Compressed Size       00000297 (663)\n+39E34 Uncompressed Size     00000501 (1281)\n+39E38 Filename Length       0046 (70)\n+39E3A Extra Length          0000 (0)\n+39E3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3999B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x39E3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-399E1 PAYLOAD\n+39E82 PAYLOAD\n \n-39C70 LOCAL HEADER #242     04034B50 (67324752)\n-39C74 Extract Zip Spec      14 (20) '2.0'\n-39C75 Extract OS            00 (0) 'MS-DOS'\n-39C76 General Purpose Flag  0800 (2048)\n+3A119 LOCAL HEADER #242     04034B50 (67324752)\n+3A11D Extract Zip Spec      14 (20) '2.0'\n+3A11E Extract OS            00 (0) 'MS-DOS'\n+3A11F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-39C78 Compression Method    0008 (8) 'Deflated'\n-39C7A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-39C7E CRC                   6D3F9D1E (1832885534)\n-39C82 Compressed Size       000008A8 (2216)\n-39C86 Uncompressed Size     00001E30 (7728)\n-39C8A Filename Length       0049 (73)\n-39C8C Extra Length          0000 (0)\n-39C8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3A121 Compression Method    0008 (8) 'Deflated'\n+3A123 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3A127 CRC                   C15BEF93 (3244027795)\n+3A12B Compressed Size       000008B8 (2232)\n+3A12F Uncompressed Size     00001EDF (7903)\n+3A133 Filename Length       0049 (73)\n+3A135 Extra Length          0000 (0)\n+3A137 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x39C8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A137: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-39CD7 PAYLOAD\n+3A180 PAYLOAD\n \n-3A57F LOCAL HEADER #243     04034B50 (67324752)\n-3A583 Extract Zip Spec      14 (20) '2.0'\n-3A584 Extract OS            00 (0) 'MS-DOS'\n-3A585 General Purpose Flag  0800 (2048)\n+3AA38 LOCAL HEADER #243     04034B50 (67324752)\n+3AA3C Extract Zip Spec      14 (20) '2.0'\n+3AA3D Extract OS            00 (0) 'MS-DOS'\n+3AA3E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3A587 Compression Method    0008 (8) 'Deflated'\n-3A589 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3A58D CRC                   355480AB (894730411)\n-3A591 Compressed Size       00000414 (1044)\n-3A595 Uncompressed Size     00000919 (2329)\n-3A599 Filename Length       0042 (66)\n-3A59B Extra Length          0000 (0)\n-3A59D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3AA40 Compression Method    0008 (8) 'Deflated'\n+3AA42 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3AA46 CRC                   EF70124F (4017099343)\n+3AA4A Compressed Size       00000421 (1057)\n+3AA4E Uncompressed Size     00000960 (2400)\n+3AA52 Filename Length       0042 (66)\n+3AA54 Extra Length          0000 (0)\n+3AA56 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3A59D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3AA56: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3A5DF PAYLOAD\n+3AA98 PAYLOAD\n \n-3A9F3 LOCAL HEADER #244     04034B50 (67324752)\n-3A9F7 Extract Zip Spec      14 (20) '2.0'\n-3A9F8 Extract OS            00 (0) 'MS-DOS'\n-3A9F9 General Purpose Flag  0800 (2048)\n+3AEB9 LOCAL HEADER #244     04034B50 (67324752)\n+3AEBD Extract Zip Spec      14 (20) '2.0'\n+3AEBE Extract OS            00 (0) 'MS-DOS'\n+3AEBF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3A9FB Compression Method    0008 (8) 'Deflated'\n-3A9FD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3AA01 CRC                   47FCDE13 (1207754259)\n-3AA05 Compressed Size       00000343 (835)\n-3AA09 Uncompressed Size     000007FA (2042)\n-3AA0D Filename Length       0034 (52)\n-3AA0F Extra Length          0000 (0)\n-3AA11 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3AEC1 Compression Method    0008 (8) 'Deflated'\n+3AEC3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3AEC7 CRC                   B2FA49D8 (3002747352)\n+3AECB Compressed Size       0000034B (843)\n+3AECF Uncompressed Size     0000083C (2108)\n+3AED3 Filename Length       0034 (52)\n+3AED5 Extra Length          0000 (0)\n+3AED7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3AA11: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3AED7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3AA45 PAYLOAD\n+3AF0B PAYLOAD\n \n-3AD88 LOCAL HEADER #245     04034B50 (67324752)\n-3AD8C Extract Zip Spec      14 (20) '2.0'\n-3AD8D Extract OS            00 (0) 'MS-DOS'\n-3AD8E General Purpose Flag  0800 (2048)\n+3B256 LOCAL HEADER #245     04034B50 (67324752)\n+3B25A Extract Zip Spec      14 (20) '2.0'\n+3B25B Extract OS            00 (0) 'MS-DOS'\n+3B25C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3AD90 Compression Method    0008 (8) 'Deflated'\n-3AD92 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3AD96 CRC                   A9E4FF87 (2850357127)\n-3AD9A Compressed Size       0000080E (2062)\n-3AD9E Uncompressed Size     00001767 (5991)\n-3ADA2 Filename Length       0045 (69)\n-3ADA4 Extra Length          0000 (0)\n-3ADA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3B25E Compression Method    0008 (8) 'Deflated'\n+3B260 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B264 CRC                   A9E4FF87 (2850357127)\n+3B268 Compressed Size       0000080E (2062)\n+3B26C Uncompressed Size     00001767 (5991)\n+3B270 Filename Length       0045 (69)\n+3B272 Extra Length          0000 (0)\n+3B274 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3ADA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B274: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3ADEB PAYLOAD\n+3B2B9 PAYLOAD\n \n-3B5F9 LOCAL HEADER #246     04034B50 (67324752)\n-3B5FD Extract Zip Spec      14 (20) '2.0'\n-3B5FE Extract OS            00 (0) 'MS-DOS'\n-3B5FF General Purpose Flag  0800 (2048)\n+3BAC7 LOCAL HEADER #246     04034B50 (67324752)\n+3BACB Extract Zip Spec      14 (20) '2.0'\n+3BACC Extract OS            00 (0) 'MS-DOS'\n+3BACD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3B601 Compression Method    0008 (8) 'Deflated'\n-3B603 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3B607 CRC                   7C2CDC15 (2083314709)\n-3B60B Compressed Size       00000444 (1092)\n-3B60F Uncompressed Size     00000C7D (3197)\n-3B613 Filename Length       0047 (71)\n-3B615 Extra Length          0000 (0)\n-3B617 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3BACF Compression Method    0008 (8) 'Deflated'\n+3BAD1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3BAD5 CRC                   7C2CDC15 (2083314709)\n+3BAD9 Compressed Size       00000444 (1092)\n+3BADD Uncompressed Size     00000C7D (3197)\n+3BAE1 Filename Length       0047 (71)\n+3BAE3 Extra Length          0000 (0)\n+3BAE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B617: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BAE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3B65E PAYLOAD\n+3BB2C PAYLOAD\n \n-3BAA2 LOCAL HEADER #247     04034B50 (67324752)\n-3BAA6 Extract Zip Spec      14 (20) '2.0'\n-3BAA7 Extract OS            00 (0) 'MS-DOS'\n-3BAA8 General Purpose Flag  0800 (2048)\n+3BF70 LOCAL HEADER #247     04034B50 (67324752)\n+3BF74 Extract Zip Spec      14 (20) '2.0'\n+3BF75 Extract OS            00 (0) 'MS-DOS'\n+3BF76 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3BAAA Compression Method    0008 (8) 'Deflated'\n-3BAAC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BAB0 CRC                   DF3FC6E9 (3745498857)\n-3BAB4 Compressed Size       00000418 (1048)\n-3BAB8 Uncompressed Size     00000BC1 (3009)\n-3BABC Filename Length       0045 (69)\n-3BABE Extra Length          0000 (0)\n-3BAC0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3BF78 Compression Method    0008 (8) 'Deflated'\n+3BF7A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3BF7E CRC                   C7D99F04 (3352928004)\n+3BF82 Compressed Size       00000423 (1059)\n+3BF86 Uncompressed Size     00000C02 (3074)\n+3BF8A Filename Length       0045 (69)\n+3BF8C Extra Length          0000 (0)\n+3BF8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BAC0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BF8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3BB05 PAYLOAD\n+3BFD3 PAYLOAD\n \n-3BF1D LOCAL HEADER #248     04034B50 (67324752)\n-3BF21 Extract Zip Spec      14 (20) '2.0'\n-3BF22 Extract OS            00 (0) 'MS-DOS'\n-3BF23 General Purpose Flag  0800 (2048)\n+3C3F6 LOCAL HEADER #248     04034B50 (67324752)\n+3C3FA Extract Zip Spec      14 (20) '2.0'\n+3C3FB Extract OS            00 (0) 'MS-DOS'\n+3C3FC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3BF25 Compression Method    0008 (8) 'Deflated'\n-3BF27 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BF2B CRC                   B7E8049A (3085436058)\n-3BF2F Compressed Size       00000487 (1159)\n-3BF33 Uncompressed Size     00000CBE (3262)\n-3BF37 Filename Length       004D (77)\n-3BF39 Extra Length          0000 (0)\n-3BF3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3C3FE Compression Method    0008 (8) 'Deflated'\n+3C400 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C404 CRC                   B7E8049A (3085436058)\n+3C408 Compressed Size       00000487 (1159)\n+3C40C Uncompressed Size     00000CBE (3262)\n+3C410 Filename Length       004D (77)\n+3C412 Extra Length          0000 (0)\n+3C414 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BF3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C414: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3BF88 PAYLOAD\n+3C461 PAYLOAD\n \n-3C40F LOCAL HEADER #249     04034B50 (67324752)\n-3C413 Extract Zip Spec      14 (20) '2.0'\n-3C414 Extract OS            00 (0) 'MS-DOS'\n-3C415 General Purpose Flag  0800 (2048)\n+3C8E8 LOCAL HEADER #249     04034B50 (67324752)\n+3C8EC Extract Zip Spec      14 (20) '2.0'\n+3C8ED Extract OS            00 (0) 'MS-DOS'\n+3C8EE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3C417 Compression Method    0008 (8) 'Deflated'\n-3C419 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3C41D CRC                   365FEBC7 (912255943)\n-3C421 Compressed Size       000004A6 (1190)\n-3C425 Uncompressed Size     00000B87 (2951)\n-3C429 Filename Length       003F (63)\n-3C42B Extra Length          0000 (0)\n-3C42D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3C8F0 Compression Method    0008 (8) 'Deflated'\n+3C8F2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C8F6 CRC                   365FEBC7 (912255943)\n+3C8FA Compressed Size       000004A6 (1190)\n+3C8FE Uncompressed Size     00000B87 (2951)\n+3C902 Filename Length       003F (63)\n+3C904 Extra Length          0000 (0)\n+3C906 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C42D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C906: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3C46C PAYLOAD\n+3C945 PAYLOAD\n \n-3C912 LOCAL HEADER #250     04034B50 (67324752)\n-3C916 Extract Zip Spec      14 (20) '2.0'\n-3C917 Extract OS            00 (0) 'MS-DOS'\n-3C918 General Purpose Flag  0800 (2048)\n+3CDEB LOCAL HEADER #250     04034B50 (67324752)\n+3CDEF Extract Zip Spec      14 (20) '2.0'\n+3CDF0 Extract OS            00 (0) 'MS-DOS'\n+3CDF1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3C91A Compression Method    0008 (8) 'Deflated'\n-3C91C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3C920 CRC                   3EDDC0EF (1054720239)\n-3C924 Compressed Size       000003D8 (984)\n-3C928 Uncompressed Size     00000AA3 (2723)\n-3C92C Filename Length       0045 (69)\n-3C92E Extra Length          0000 (0)\n-3C930 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3CDF3 Compression Method    0008 (8) 'Deflated'\n+3CDF5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3CDF9 CRC                   3EDDC0EF (1054720239)\n+3CDFD Compressed Size       000003D8 (984)\n+3CE01 Uncompressed Size     00000AA3 (2723)\n+3CE05 Filename Length       0045 (69)\n+3CE07 Extra Length          0000 (0)\n+3CE09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C930: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3CE09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3C975 PAYLOAD\n+3CE4E PAYLOAD\n \n-3CD4D LOCAL HEADER #251     04034B50 (67324752)\n-3CD51 Extract Zip Spec      14 (20) '2.0'\n-3CD52 Extract OS            00 (0) 'MS-DOS'\n-3CD53 General Purpose Flag  0800 (2048)\n+3D226 LOCAL HEADER #251     04034B50 (67324752)\n+3D22A Extract Zip Spec      14 (20) '2.0'\n+3D22B Extract OS            00 (0) 'MS-DOS'\n+3D22C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3CD55 Compression Method    0008 (8) 'Deflated'\n-3CD57 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3CD5B CRC                   25691E02 (627645954)\n-3CD5F Compressed Size       00000405 (1029)\n-3CD63 Uncompressed Size     00000B75 (2933)\n-3CD67 Filename Length       0049 (73)\n-3CD69 Extra Length          0000 (0)\n-3CD6B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D22E Compression Method    0008 (8) 'Deflated'\n+3D230 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3D234 CRC                   9B40567E (2604684926)\n+3D238 Compressed Size       0000040D (1037)\n+3D23C Uncompressed Size     00000BB0 (2992)\n+3D240 Filename Length       0049 (73)\n+3D242 Extra Length          0000 (0)\n+3D244 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3CD6B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D244: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3CDB4 PAYLOAD\n+3D28D PAYLOAD\n \n-3D1B9 LOCAL HEADER #252     04034B50 (67324752)\n-3D1BD Extract Zip Spec      14 (20) '2.0'\n-3D1BE Extract OS            00 (0) 'MS-DOS'\n-3D1BF General Purpose Flag  0800 (2048)\n+3D69A LOCAL HEADER #252     04034B50 (67324752)\n+3D69E Extract Zip Spec      14 (20) '2.0'\n+3D69F Extract OS            00 (0) 'MS-DOS'\n+3D6A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3D1C1 Compression Method    0008 (8) 'Deflated'\n-3D1C3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D1C7 CRC                   15C91CF2 (365501682)\n-3D1CB Compressed Size       00001C34 (7220)\n-3D1CF Uncompressed Size     000079B9 (31161)\n-3D1D3 Filename Length       0033 (51)\n-3D1D5 Extra Length          0000 (0)\n-3D1D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D6A2 Compression Method    0008 (8) 'Deflated'\n+3D6A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3D6A8 CRC                   6BA20F13 (1805782803)\n+3D6AC Compressed Size       00001C52 (7250)\n+3D6B0 Uncompressed Size     00007CE7 (31975)\n+3D6B4 Filename Length       0033 (51)\n+3D6B6 Extra Length          0000 (0)\n+3D6B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D1D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D6B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3D20A PAYLOAD\n+3D6EB PAYLOAD\n \n-3EE3E LOCAL HEADER #253     04034B50 (67324752)\n-3EE42 Extract Zip Spec      14 (20) '2.0'\n-3EE43 Extract OS            00 (0) 'MS-DOS'\n-3EE44 General Purpose Flag  0800 (2048)\n+3F33D LOCAL HEADER #253     04034B50 (67324752)\n+3F341 Extract Zip Spec      14 (20) '2.0'\n+3F342 Extract OS            00 (0) 'MS-DOS'\n+3F343 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3EE46 Compression Method    0008 (8) 'Deflated'\n-3EE48 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3EE4C CRC                   896B8386 (2305524614)\n-3EE50 Compressed Size       000002C6 (710)\n-3EE54 Uncompressed Size     0000069C (1692)\n-3EE58 Filename Length       002A (42)\n-3EE5A Extra Length          0000 (0)\n-3EE5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3F345 Compression Method    0008 (8) 'Deflated'\n+3F347 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3F34B CRC                   896B8386 (2305524614)\n+3F34F Compressed Size       000002C6 (710)\n+3F353 Uncompressed Size     0000069C (1692)\n+3F357 Filename Length       002A (42)\n+3F359 Extra Length          0000 (0)\n+3F35B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3EE5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3F35B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3EE86 PAYLOAD\n+3F385 PAYLOAD\n \n-3F14C LOCAL HEADER #254     04034B50 (67324752)\n-3F150 Extract Zip Spec      14 (20) '2.0'\n-3F151 Extract OS            00 (0) 'MS-DOS'\n-3F152 General Purpose Flag  0800 (2048)\n+3F64B LOCAL HEADER #254     04034B50 (67324752)\n+3F64F Extract Zip Spec      14 (20) '2.0'\n+3F650 Extract OS            00 (0) 'MS-DOS'\n+3F651 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3F154 Compression Method    0008 (8) 'Deflated'\n-3F156 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3F15A CRC                   2D8D7FE9 (764248041)\n-3F15E Compressed Size       00000366 (870)\n-3F162 Uncompressed Size     00000769 (1897)\n-3F166 Filename Length       0028 (40)\n-3F168 Extra Length          0000 (0)\n-3F16A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3F653 Compression Method    0008 (8) 'Deflated'\n+3F655 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3F659 CRC                   2D8D7FE9 (764248041)\n+3F65D Compressed Size       00000366 (870)\n+3F661 Uncompressed Size     00000769 (1897)\n+3F665 Filename Length       0028 (40)\n+3F667 Extra Length          0000 (0)\n+3F669 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F16A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3F669: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3F192 PAYLOAD\n+3F691 PAYLOAD\n \n-3F4F8 LOCAL HEADER #255     04034B50 (67324752)\n-3F4FC Extract Zip Spec      14 (20) '2.0'\n-3F4FD Extract OS            00 (0) 'MS-DOS'\n-3F4FE General Purpose Flag  0800 (2048)\n+3F9F7 LOCAL HEADER #255     04034B50 (67324752)\n+3F9FB Extract Zip Spec      14 (20) '2.0'\n+3F9FC Extract OS            00 (0) 'MS-DOS'\n+3F9FD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3F500 Compression Method    0008 (8) 'Deflated'\n-3F502 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3F506 CRC                   E9761FB8 (3916832696)\n-3F50A Compressed Size       0000025D (605)\n-3F50E Uncompressed Size     00000497 (1175)\n-3F512 Filename Length       002C (44)\n-3F514 Extra Length          0000 (0)\n-3F516 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3F9FF Compression Method    0008 (8) 'Deflated'\n+3FA01 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3FA05 CRC                   E9761FB8 (3916832696)\n+3FA09 Compressed Size       0000025D (605)\n+3FA0D Uncompressed Size     00000497 (1175)\n+3FA11 Filename Length       002C (44)\n+3FA13 Extra Length          0000 (0)\n+3FA15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F516: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3FA15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3F542 PAYLOAD\n+3FA41 PAYLOAD\n \n-3F79F LOCAL HEADER #256     04034B50 (67324752)\n-3F7A3 Extract Zip Spec      14 (20) '2.0'\n-3F7A4 Extract OS            00 (0) 'MS-DOS'\n-3F7A5 General Purpose Flag  0800 (2048)\n+3FC9E LOCAL HEADER #256     04034B50 (67324752)\n+3FCA2 Extract Zip Spec      14 (20) '2.0'\n+3FCA3 Extract OS            00 (0) 'MS-DOS'\n+3FCA4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3F7A7 Compression Method    0008 (8) 'Deflated'\n-3F7A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3F7AD CRC                   24647E40 (610565696)\n-3F7B1 Compressed Size       00000D80 (3456)\n-3F7B5 Uncompressed Size     00005305 (21253)\n-3F7B9 Filename Length       0032 (50)\n-3F7BB Extra Length          0000 (0)\n-3F7BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3FCA6 Compression Method    0008 (8) 'Deflated'\n+3FCA8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3FCAC CRC                   7F03CBF8 (2130955256)\n+3FCB0 Compressed Size       00000D92 (3474)\n+3FCB4 Uncompressed Size     000054E7 (21735)\n+3FCB8 Filename Length       0032 (50)\n+3FCBA Extra Length          0000 (0)\n+3FCBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F7BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3FCBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3F7EF PAYLOAD\n+3FCEE PAYLOAD\n \n-4056F LOCAL HEADER #257     04034B50 (67324752)\n-40573 Extract Zip Spec      14 (20) '2.0'\n-40574 Extract OS            00 (0) 'MS-DOS'\n-40575 General Purpose Flag  0800 (2048)\n+40A80 LOCAL HEADER #257     04034B50 (67324752)\n+40A84 Extract Zip Spec      14 (20) '2.0'\n+40A85 Extract OS            00 (0) 'MS-DOS'\n+40A86 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-40577 Compression Method    0008 (8) 'Deflated'\n-40579 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4057D CRC                   9612E24D (2517819981)\n-40581 Compressed Size       000003AC (940)\n-40585 Uncompressed Size     00000936 (2358)\n-40589 Filename Length       002D (45)\n-4058B Extra Length          0000 (0)\n-4058D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+40A88 Compression Method    0008 (8) 'Deflated'\n+40A8A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+40A8E CRC                   255BC4C2 (626771138)\n+40A92 Compressed Size       000003B6 (950)\n+40A96 Uncompressed Size     00000985 (2437)\n+40A9A Filename Length       002D (45)\n+40A9C Extra Length          0000 (0)\n+40A9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4058D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x40A9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-405BA PAYLOAD\n+40ACB PAYLOAD\n \n-40966 LOCAL HEADER #258     04034B50 (67324752)\n-4096A Extract Zip Spec      14 (20) '2.0'\n-4096B Extract OS            00 (0) 'MS-DOS'\n-4096C General Purpose Flag  0800 (2048)\n+40E81 LOCAL HEADER #258     04034B50 (67324752)\n+40E85 Extract Zip Spec      14 (20) '2.0'\n+40E86 Extract OS            00 (0) 'MS-DOS'\n+40E87 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4096E Compression Method    0008 (8) 'Deflated'\n-40970 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-40974 CRC                   40170699 (1075250841)\n-40978 Compressed Size       00000296 (662)\n-4097C Uncompressed Size     0000059E (1438)\n-40980 Filename Length       0029 (41)\n-40982 Extra Length          0000 (0)\n-40984 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+40E89 Compression Method    0008 (8) 'Deflated'\n+40E8B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+40E8F CRC                   40170699 (1075250841)\n+40E93 Compressed Size       00000296 (662)\n+40E97 Uncompressed Size     0000059E (1438)\n+40E9B Filename Length       0029 (41)\n+40E9D Extra Length          0000 (0)\n+40E9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x40984: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x40E9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-409AD PAYLOAD\n+40EC8 PAYLOAD\n \n-40C43 LOCAL HEADER #259     04034B50 (67324752)\n-40C47 Extract Zip Spec      14 (20) '2.0'\n-40C48 Extract OS            00 (0) 'MS-DOS'\n-40C49 General Purpose Flag  0800 (2048)\n+4115E LOCAL HEADER #259     04034B50 (67324752)\n+41162 Extract Zip Spec      14 (20) '2.0'\n+41163 Extract OS            00 (0) 'MS-DOS'\n+41164 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-40C4B Compression Method    0008 (8) 'Deflated'\n-40C4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-40C51 CRC                   A604EAF8 (2785340152)\n-40C55 Compressed Size       000004E6 (1254)\n-40C59 Uncompressed Size     00001249 (4681)\n-40C5D Filename Length       0038 (56)\n-40C5F Extra Length          0000 (0)\n-40C61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+41166 Compression Method    0008 (8) 'Deflated'\n+41168 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4116C CRC                   A604EAF8 (2785340152)\n+41170 Compressed Size       000004E6 (1254)\n+41174 Uncompressed Size     00001249 (4681)\n+41178 Filename Length       0038 (56)\n+4117A Extra Length          0000 (0)\n+4117C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x40C61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4117C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-40C99 PAYLOAD\n+411B4 PAYLOAD\n \n-4117F LOCAL HEADER #260     04034B50 (67324752)\n-41183 Extract Zip Spec      14 (20) '2.0'\n-41184 Extract OS            00 (0) 'MS-DOS'\n-41185 General Purpose Flag  0800 (2048)\n+4169A LOCAL HEADER #260     04034B50 (67324752)\n+4169E Extract Zip Spec      14 (20) '2.0'\n+4169F Extract OS            00 (0) 'MS-DOS'\n+416A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-41187 Compression Method    0008 (8) 'Deflated'\n-41189 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4118D CRC                   D7EB77B9 (3622533049)\n-41191 Compressed Size       00000731 (1841)\n-41195 Uncompressed Size     0000137A (4986)\n-41199 Filename Length       002C (44)\n-4119B Extra Length          0000 (0)\n-4119D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+416A2 Compression Method    0008 (8) 'Deflated'\n+416A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+416A8 CRC                   D7EB77B9 (3622533049)\n+416AC Compressed Size       00000731 (1841)\n+416B0 Uncompressed Size     0000137A (4986)\n+416B4 Filename Length       002C (44)\n+416B6 Extra Length          0000 (0)\n+416B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4119D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x416B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-411C9 PAYLOAD\n+416E4 PAYLOAD\n \n-418FA LOCAL HEADER #261     04034B50 (67324752)\n-418FE Extract Zip Spec      14 (20) '2.0'\n-418FF Extract OS            00 (0) 'MS-DOS'\n-41900 General Purpose Flag  0800 (2048)\n+41E15 LOCAL HEADER #261     04034B50 (67324752)\n+41E19 Extract Zip Spec      14 (20) '2.0'\n+41E1A Extract OS            00 (0) 'MS-DOS'\n+41E1B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-41902 Compression Method    0008 (8) 'Deflated'\n-41904 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-41908 CRC                   95FCA49F (2516362399)\n-4190C Compressed Size       0000029C (668)\n-41910 Uncompressed Size     00000510 (1296)\n-41914 Filename Length       0039 (57)\n-41916 Extra Length          0000 (0)\n-41918 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+41E1D Compression Method    0008 (8) 'Deflated'\n+41E1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+41E23 CRC                   7518C2B8 (1964556984)\n+41E27 Compressed Size       000002A4 (676)\n+41E2B Uncompressed Size     00000535 (1333)\n+41E2F Filename Length       0039 (57)\n+41E31 Extra Length          0000 (0)\n+41E33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x41918: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x41E33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-41951 PAYLOAD\n+41E6C PAYLOAD\n \n-41BED LOCAL HEADER #262     04034B50 (67324752)\n-41BF1 Extract Zip Spec      14 (20) '2.0'\n-41BF2 Extract OS            00 (0) 'MS-DOS'\n-41BF3 General Purpose Flag  0800 (2048)\n+42110 LOCAL HEADER #262     04034B50 (67324752)\n+42114 Extract Zip Spec      14 (20) '2.0'\n+42115 Extract OS            00 (0) 'MS-DOS'\n+42116 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-41BF5 Compression Method    0008 (8) 'Deflated'\n-41BF7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-41BFB CRC                   EEA257C4 (4003616708)\n-41BFF Compressed Size       000006A0 (1696)\n-41C03 Uncompressed Size     000015B8 (5560)\n-41C07 Filename Length       002E (46)\n-41C09 Extra Length          0000 (0)\n-41C0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+42118 Compression Method    0008 (8) 'Deflated'\n+4211A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4211E CRC                   FC613C2C (4234230828)\n+42122 Compressed Size       000006AB (1707)\n+42126 Uncompressed Size     00001651 (5713)\n+4212A Filename Length       002E (46)\n+4212C Extra Length          0000 (0)\n+4212E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x41C0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4212E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-41C39 PAYLOAD\n+4215C PAYLOAD\n \n-422D9 LOCAL HEADER #263     04034B50 (67324752)\n-422DD Extract Zip Spec      14 (20) '2.0'\n-422DE Extract OS            00 (0) 'MS-DOS'\n-422DF General Purpose Flag  0800 (2048)\n+42807 LOCAL HEADER #263     04034B50 (67324752)\n+4280B Extract Zip Spec      14 (20) '2.0'\n+4280C Extract OS            00 (0) 'MS-DOS'\n+4280D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-422E1 Compression Method    0008 (8) 'Deflated'\n-422E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-422E7 CRC                   54F0EEAE (1425075886)\n-422EB Compressed Size       00001158 (4440)\n-422EF Uncompressed Size     00004623 (17955)\n-422F3 Filename Length       002D (45)\n-422F5 Extra Length          0000 (0)\n-422F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4280F Compression Method    0008 (8) 'Deflated'\n+42811 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+42815 CRC                   75C25786 (1975670662)\n+42819 Compressed Size       00001170 (4464)\n+4281D Uncompressed Size     00004813 (18451)\n+42821 Filename Length       002D (45)\n+42823 Extra Length          0000 (0)\n+42825 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x422F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42825: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-42324 PAYLOAD\n+42852 PAYLOAD\n \n-4347C LOCAL HEADER #264     04034B50 (67324752)\n-43480 Extract Zip Spec      14 (20) '2.0'\n-43481 Extract OS            00 (0) 'MS-DOS'\n-43482 General Purpose Flag  0800 (2048)\n+439C2 LOCAL HEADER #264     04034B50 (67324752)\n+439C6 Extract Zip Spec      14 (20) '2.0'\n+439C7 Extract OS            00 (0) 'MS-DOS'\n+439C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-43484 Compression Method    0008 (8) 'Deflated'\n-43486 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4348A CRC                   49173B6A (1226259306)\n-4348E Compressed Size       00000B30 (2864)\n-43492 Uncompressed Size     00002D62 (11618)\n-43496 Filename Length       0032 (50)\n-43498 Extra Length          0000 (0)\n-4349A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+439CA Compression Method    0008 (8) 'Deflated'\n+439CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+439D0 CRC                   49173B6A (1226259306)\n+439D4 Compressed Size       00000B30 (2864)\n+439D8 Uncompressed Size     00002D62 (11618)\n+439DC Filename Length       0032 (50)\n+439DE Extra Length          0000 (0)\n+439E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4349A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x439E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-434CC PAYLOAD\n+43A12 PAYLOAD\n \n-43FFC LOCAL HEADER #265     04034B50 (67324752)\n-44000 Extract Zip Spec      14 (20) '2.0'\n-44001 Extract OS            00 (0) 'MS-DOS'\n-44002 General Purpose Flag  0800 (2048)\n+44542 LOCAL HEADER #265     04034B50 (67324752)\n+44546 Extract Zip Spec      14 (20) '2.0'\n+44547 Extract OS            00 (0) 'MS-DOS'\n+44548 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-44004 Compression Method    0008 (8) 'Deflated'\n-44006 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4400A CRC                   094FFA20 (156236320)\n-4400E Compressed Size       000008C5 (2245)\n-44012 Uncompressed Size     0000235E (9054)\n-44016 Filename Length       0036 (54)\n-44018 Extra Length          0000 (0)\n-4401A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4454A Compression Method    0008 (8) 'Deflated'\n+4454C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+44550 CRC                   8D8AC97C (2374683004)\n+44554 Compressed Size       000008D2 (2258)\n+44558 Uncompressed Size     00002443 (9283)\n+4455C Filename Length       0036 (54)\n+4455E Extra Length          0000 (0)\n+44560 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4401A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44560: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44050 PAYLOAD\n+44596 PAYLOAD\n \n-44915 LOCAL HEADER #266     04034B50 (67324752)\n-44919 Extract Zip Spec      14 (20) '2.0'\n-4491A Extract OS            00 (0) 'MS-DOS'\n-4491B General Purpose Flag  0800 (2048)\n+44E68 LOCAL HEADER #266     04034B50 (67324752)\n+44E6C Extract Zip Spec      14 (20) '2.0'\n+44E6D Extract OS            00 (0) 'MS-DOS'\n+44E6E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4491D Compression Method    0008 (8) 'Deflated'\n-4491F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-44923 CRC                   0EFD7C48 (251493448)\n-44927 Compressed Size       00000593 (1427)\n-4492B Uncompressed Size     000011C9 (4553)\n-4492F Filename Length       0034 (52)\n-44931 Extra Length          0000 (0)\n-44933 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+44E70 Compression Method    0008 (8) 'Deflated'\n+44E72 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+44E76 CRC                   0EFD7C48 (251493448)\n+44E7A Compressed Size       00000593 (1427)\n+44E7E Uncompressed Size     000011C9 (4553)\n+44E82 Filename Length       0034 (52)\n+44E84 Extra Length          0000 (0)\n+44E86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x44933: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44E86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44967 PAYLOAD\n+44EBA PAYLOAD\n \n-44EFA LOCAL HEADER #267     04034B50 (67324752)\n-44EFE Extract Zip Spec      14 (20) '2.0'\n-44EFF Extract OS            00 (0) 'MS-DOS'\n-44F00 General Purpose Flag  0800 (2048)\n+4544D LOCAL HEADER #267     04034B50 (67324752)\n+45451 Extract Zip Spec      14 (20) '2.0'\n+45452 Extract OS            00 (0) 'MS-DOS'\n+45453 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-44F02 Compression Method    0008 (8) 'Deflated'\n-44F04 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-44F08 CRC                   8CFD4A70 (2365409904)\n-44F0C Compressed Size       00000C76 (3190)\n-44F10 Uncompressed Size     00002FB5 (12213)\n-44F14 Filename Length       002E (46)\n-44F16 Extra Length          0000 (0)\n-44F18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+45455 Compression Method    0008 (8) 'Deflated'\n+45457 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4545B CRC                   8CFD4A70 (2365409904)\n+4545F Compressed Size       00000C76 (3190)\n+45463 Uncompressed Size     00002FB5 (12213)\n+45467 Filename Length       002E (46)\n+45469 Extra Length          0000 (0)\n+4546B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x44F18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4546B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44F46 PAYLOAD\n+45499 PAYLOAD\n \n-45BBC LOCAL HEADER #268     04034B50 (67324752)\n-45BC0 Extract Zip Spec      14 (20) '2.0'\n-45BC1 Extract OS            00 (0) 'MS-DOS'\n-45BC2 General Purpose Flag  0800 (2048)\n+4610F LOCAL HEADER #268     04034B50 (67324752)\n+46113 Extract Zip Spec      14 (20) '2.0'\n+46114 Extract OS            00 (0) 'MS-DOS'\n+46115 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-45BC4 Compression Method    0008 (8) 'Deflated'\n-45BC6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-45BCA CRC                   81A24999 (2174896537)\n-45BCE Compressed Size       00000373 (883)\n-45BD2 Uncompressed Size     000008A4 (2212)\n-45BD6 Filename Length       002E (46)\n-45BD8 Extra Length          0000 (0)\n-45BDA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+46117 Compression Method    0008 (8) 'Deflated'\n+46119 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4611D CRC                   F982D49E (4186100894)\n+46121 Compressed Size       0000037B (891)\n+46125 Uncompressed Size     000008F6 (2294)\n+46129 Filename Length       002E (46)\n+4612B Extra Length          0000 (0)\n+4612D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x45BDA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4612D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-45C08 PAYLOAD\n+4615B PAYLOAD\n \n-45F7B LOCAL HEADER #269     04034B50 (67324752)\n-45F7F Extract Zip Spec      14 (20) '2.0'\n-45F80 Extract OS            00 (0) 'MS-DOS'\n-45F81 General Purpose Flag  0800 (2048)\n+464D6 LOCAL HEADER #269     04034B50 (67324752)\n+464DA Extract Zip Spec      14 (20) '2.0'\n+464DB Extract OS            00 (0) 'MS-DOS'\n+464DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-45F83 Compression Method    0008 (8) 'Deflated'\n-45F85 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-45F89 CRC                   831A7179 (2199548281)\n-45F8D Compressed Size       0000036D (877)\n-45F91 Uncompressed Size     0000080F (2063)\n-45F95 Filename Length       0030 (48)\n-45F97 Extra Length          0000 (0)\n-45F99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+464DE Compression Method    0008 (8) 'Deflated'\n+464E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+464E4 CRC                   831A7179 (2199548281)\n+464E8 Compressed Size       0000036D (877)\n+464EC Uncompressed Size     0000080F (2063)\n+464F0 Filename Length       0030 (48)\n+464F2 Extra Length          0000 (0)\n+464F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x45F99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x464F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-45FC9 PAYLOAD\n+46524 PAYLOAD\n \n-46336 LOCAL HEADER #270     04034B50 (67324752)\n-4633A Extract Zip Spec      14 (20) '2.0'\n-4633B Extract OS            00 (0) 'MS-DOS'\n-4633C General Purpose Flag  0800 (2048)\n+46891 LOCAL HEADER #270     04034B50 (67324752)\n+46895 Extract Zip Spec      14 (20) '2.0'\n+46896 Extract OS            00 (0) 'MS-DOS'\n+46897 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4633E Compression Method    0008 (8) 'Deflated'\n-46340 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-46344 CRC                   7319AF3E (1931063102)\n-46348 Compressed Size       00000643 (1603)\n-4634C Uncompressed Size     0000143D (5181)\n-46350 Filename Length       002F (47)\n-46352 Extra Length          0000 (0)\n-46354 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+46899 Compression Method    0008 (8) 'Deflated'\n+4689B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4689F CRC                   239B6511 (597386513)\n+468A3 Compressed Size       0000064E (1614)\n+468A7 Uncompressed Size     000014C9 (5321)\n+468AB Filename Length       002F (47)\n+468AD Extra Length          0000 (0)\n+468AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x46354: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x468AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-46383 PAYLOAD\n+468DE PAYLOAD\n \n-469C6 LOCAL HEADER #271     04034B50 (67324752)\n-469CA Extract Zip Spec      14 (20) '2.0'\n-469CB Extract OS            00 (0) 'MS-DOS'\n-469CC General Purpose Flag  0800 (2048)\n+46F2C LOCAL HEADER #271     04034B50 (67324752)\n+46F30 Extract Zip Spec      14 (20) '2.0'\n+46F31 Extract OS            00 (0) 'MS-DOS'\n+46F32 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-469CE Compression Method    0008 (8) 'Deflated'\n-469D0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-469D4 CRC                   D07CEF7E (3497848702)\n-469D8 Compressed Size       000004C5 (1221)\n-469DC Uncompressed Size     00001341 (4929)\n-469E0 Filename Length       002D (45)\n-469E2 Extra Length          0000 (0)\n-469E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+46F34 Compression Method    0008 (8) 'Deflated'\n+46F36 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+46F3A CRC                   CB16D394 (3407270804)\n+46F3E Compressed Size       000004D2 (1234)\n+46F42 Uncompressed Size     000013CF (5071)\n+46F46 Filename Length       002D (45)\n+46F48 Extra Length          0000 (0)\n+46F4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x469E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x46F4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-46A11 PAYLOAD\n+46F77 PAYLOAD\n \n-46ED6 LOCAL HEADER #272     04034B50 (67324752)\n-46EDA Extract Zip Spec      14 (20) '2.0'\n-46EDB Extract OS            00 (0) 'MS-DOS'\n-46EDC General Purpose Flag  0800 (2048)\n+47449 LOCAL HEADER #272     04034B50 (67324752)\n+4744D Extract Zip Spec      14 (20) '2.0'\n+4744E Extract OS            00 (0) 'MS-DOS'\n+4744F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-46EDE Compression Method    0008 (8) 'Deflated'\n-46EE0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-46EE4 CRC                   4E3FC833 (1312802867)\n-46EE8 Compressed Size       0000024E (590)\n-46EEC Uncompressed Size     00000443 (1091)\n-46EF0 Filename Length       0029 (41)\n-46EF2 Extra Length          0000 (0)\n-46EF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+47451 Compression Method    0008 (8) 'Deflated'\n+47453 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+47457 CRC                   4E3FC833 (1312802867)\n+4745B Compressed Size       0000024E (590)\n+4745F Uncompressed Size     00000443 (1091)\n+47463 Filename Length       0029 (41)\n+47465 Extra Length          0000 (0)\n+47467 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x46EF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47467: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-46F1D PAYLOAD\n+47490 PAYLOAD\n \n-4716B LOCAL HEADER #273     04034B50 (67324752)\n-4716F Extract Zip Spec      14 (20) '2.0'\n-47170 Extract OS            00 (0) 'MS-DOS'\n-47171 General Purpose Flag  0800 (2048)\n+476DE LOCAL HEADER #273     04034B50 (67324752)\n+476E2 Extract Zip Spec      14 (20) '2.0'\n+476E3 Extract OS            00 (0) 'MS-DOS'\n+476E4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-47173 Compression Method    0008 (8) 'Deflated'\n-47175 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-47179 CRC                   7A9C058A (2057045386)\n-4717D Compressed Size       00000815 (2069)\n-47181 Uncompressed Size     00002117 (8471)\n-47185 Filename Length       002A (42)\n-47187 Extra Length          0000 (0)\n-47189 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+476E6 Compression Method    0008 (8) 'Deflated'\n+476E8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+476EC CRC                   7A9C058A (2057045386)\n+476F0 Compressed Size       00000815 (2069)\n+476F4 Uncompressed Size     00002117 (8471)\n+476F8 Filename Length       002A (42)\n+476FA Extra Length          0000 (0)\n+476FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x47189: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x476FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-471B3 PAYLOAD\n+47726 PAYLOAD\n \n-479C8 LOCAL HEADER #274     04034B50 (67324752)\n-479CC Extract Zip Spec      14 (20) '2.0'\n-479CD Extract OS            00 (0) 'MS-DOS'\n-479CE General Purpose Flag  0800 (2048)\n+47F3B LOCAL HEADER #274     04034B50 (67324752)\n+47F3F Extract Zip Spec      14 (20) '2.0'\n+47F40 Extract OS            00 (0) 'MS-DOS'\n+47F41 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-479D0 Compression Method    0008 (8) 'Deflated'\n-479D2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-479D6 CRC                   A4F19F22 (2767298338)\n-479DA Compressed Size       000004FE (1278)\n-479DE Uncompressed Size     0000104C (4172)\n-479E2 Filename Length       002A (42)\n-479E4 Extra Length          0000 (0)\n-479E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+47F43 Compression Method    0008 (8) 'Deflated'\n+47F45 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+47F49 CRC                   A4F19F22 (2767298338)\n+47F4D Compressed Size       000004FE (1278)\n+47F51 Uncompressed Size     0000104C (4172)\n+47F55 Filename Length       002A (42)\n+47F57 Extra Length          0000 (0)\n+47F59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x479E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47F59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-47A10 PAYLOAD\n+47F83 PAYLOAD\n \n-47F0E LOCAL HEADER #275     04034B50 (67324752)\n-47F12 Extract Zip Spec      14 (20) '2.0'\n-47F13 Extract OS            00 (0) 'MS-DOS'\n-47F14 General Purpose Flag  0800 (2048)\n+48481 LOCAL HEADER #275     04034B50 (67324752)\n+48485 Extract Zip Spec      14 (20) '2.0'\n+48486 Extract OS            00 (0) 'MS-DOS'\n+48487 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-47F16 Compression Method    0008 (8) 'Deflated'\n-47F18 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-47F1C CRC                   E7A31A4E (3886225998)\n-47F20 Compressed Size       0000094D (2381)\n-47F24 Uncompressed Size     00002166 (8550)\n-47F28 Filename Length       002B (43)\n-47F2A Extra Length          0000 (0)\n-47F2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+48489 Compression Method    0008 (8) 'Deflated'\n+4848B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4848F CRC                   CBBE6E80 (3418254976)\n+48493 Compressed Size       0000095E (2398)\n+48497 Uncompressed Size     00002283 (8835)\n+4849B Filename Length       002B (43)\n+4849D Extra Length          0000 (0)\n+4849F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x47F2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4849F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-47F57 PAYLOAD\n+484CA PAYLOAD\n \n-488A4 LOCAL HEADER #276     04034B50 (67324752)\n-488A8 Extract Zip Spec      14 (20) '2.0'\n-488A9 Extract OS            00 (0) 'MS-DOS'\n-488AA General Purpose Flag  0800 (2048)\n+48E28 LOCAL HEADER #276     04034B50 (67324752)\n+48E2C Extract Zip Spec      14 (20) '2.0'\n+48E2D Extract OS            00 (0) 'MS-DOS'\n+48E2E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-488AC Compression Method    0008 (8) 'Deflated'\n-488AE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-488B2 CRC                   139F375C (329201500)\n-488B6 Compressed Size       000003DF (991)\n-488BA Uncompressed Size     00000BC2 (3010)\n-488BE Filename Length       002B (43)\n-488C0 Extra Length          0000 (0)\n-488C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+48E30 Compression Method    0008 (8) 'Deflated'\n+48E32 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+48E36 CRC                   139F375C (329201500)\n+48E3A Compressed Size       000003DF (991)\n+48E3E Uncompressed Size     00000BC2 (3010)\n+48E42 Filename Length       002B (43)\n+48E44 Extra Length          0000 (0)\n+48E46 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x488C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x48E46: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-488ED PAYLOAD\n+48E71 PAYLOAD\n \n-48CCC LOCAL HEADER #277     04034B50 (67324752)\n-48CD0 Extract Zip Spec      14 (20) '2.0'\n-48CD1 Extract OS            00 (0) 'MS-DOS'\n-48CD2 General Purpose Flag  0800 (2048)\n+49250 LOCAL HEADER #277     04034B50 (67324752)\n+49254 Extract Zip Spec      14 (20) '2.0'\n+49255 Extract OS            00 (0) 'MS-DOS'\n+49256 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-48CD4 Compression Method    0008 (8) 'Deflated'\n-48CD6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-48CDA CRC                   C39767CB (3281479627)\n-48CDE Compressed Size       0000040F (1039)\n-48CE2 Uncompressed Size     00000DAA (3498)\n-48CE6 Filename Length       0026 (38)\n-48CE8 Extra Length          0000 (0)\n-48CEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+49258 Compression Method    0008 (8) 'Deflated'\n+4925A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4925E CRC                   C39767CB (3281479627)\n+49262 Compressed Size       0000040F (1039)\n+49266 Uncompressed Size     00000DAA (3498)\n+4926A Filename Length       0026 (38)\n+4926C Extra Length          0000 (0)\n+4926E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48CEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4926E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-48D10 PAYLOAD\n+49294 PAYLOAD\n \n-4911F LOCAL HEADER #278     04034B50 (67324752)\n-49123 Extract Zip Spec      14 (20) '2.0'\n-49124 Extract OS            00 (0) 'MS-DOS'\n-49125 General Purpose Flag  0800 (2048)\n+496A3 LOCAL HEADER #278     04034B50 (67324752)\n+496A7 Extract Zip Spec      14 (20) '2.0'\n+496A8 Extract OS            00 (0) 'MS-DOS'\n+496A9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-49127 Compression Method    0008 (8) 'Deflated'\n-49129 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4912D CRC                   0C719C80 (208772224)\n-49131 Compressed Size       00000307 (775)\n-49135 Uncompressed Size     000010C1 (4289)\n-49139 Filename Length       002C (44)\n-4913B Extra Length          0000 (0)\n-4913D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+496AB Compression Method    0008 (8) 'Deflated'\n+496AD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+496B1 CRC                   0C719C80 (208772224)\n+496B5 Compressed Size       00000307 (775)\n+496B9 Uncompressed Size     000010C1 (4289)\n+496BD Filename Length       002C (44)\n+496BF Extra Length          0000 (0)\n+496C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4913D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x496C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-49169 PAYLOAD\n+496ED PAYLOAD\n \n-49470 LOCAL HEADER #279     04034B50 (67324752)\n-49474 Extract Zip Spec      14 (20) '2.0'\n-49475 Extract OS            00 (0) 'MS-DOS'\n-49476 General Purpose Flag  0800 (2048)\n+499F4 LOCAL HEADER #279     04034B50 (67324752)\n+499F8 Extract Zip Spec      14 (20) '2.0'\n+499F9 Extract OS            00 (0) 'MS-DOS'\n+499FA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-49478 Compression Method    0008 (8) 'Deflated'\n-4947A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4947E CRC                   4A73FA6D (1249114733)\n-49482 Compressed Size       00000441 (1089)\n-49486 Uncompressed Size     000010A2 (4258)\n-4948A Filename Length       002A (42)\n-4948C Extra Length          0000 (0)\n-4948E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+499FC Compression Method    0008 (8) 'Deflated'\n+499FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+49A02 CRC                   4A73FA6D (1249114733)\n+49A06 Compressed Size       00000441 (1089)\n+49A0A Uncompressed Size     000010A2 (4258)\n+49A0E Filename Length       002A (42)\n+49A10 Extra Length          0000 (0)\n+49A12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4948E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x49A12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-494B8 PAYLOAD\n+49A3C PAYLOAD\n \n-498F9 LOCAL HEADER #280     04034B50 (67324752)\n-498FD Extract Zip Spec      14 (20) '2.0'\n-498FE Extract OS            00 (0) 'MS-DOS'\n-498FF General Purpose Flag  0800 (2048)\n+49E7D LOCAL HEADER #280     04034B50 (67324752)\n+49E81 Extract Zip Spec      14 (20) '2.0'\n+49E82 Extract OS            00 (0) 'MS-DOS'\n+49E83 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-49901 Compression Method    0008 (8) 'Deflated'\n-49903 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-49907 CRC                   7D5526CA (2102732490)\n-4990B Compressed Size       0000032E (814)\n-4990F Uncompressed Size     00000960 (2400)\n-49913 Filename Length       002E (46)\n-49915 Extra Length          0000 (0)\n-49917 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+49E85 Compression Method    0008 (8) 'Deflated'\n+49E87 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+49E8B CRC                   FE0FBB73 (4262443891)\n+49E8F Compressed Size       0000033B (827)\n+49E93 Uncompressed Size     0000099D (2461)\n+49E97 Filename Length       002E (46)\n+49E99 Extra Length          0000 (0)\n+49E9B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x49917: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x49E9B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-49945 PAYLOAD\n+49EC9 PAYLOAD\n \n-49C73 LOCAL HEADER #281     04034B50 (67324752)\n-49C77 Extract Zip Spec      14 (20) '2.0'\n-49C78 Extract OS            00 (0) 'MS-DOS'\n-49C79 General Purpose Flag  0800 (2048)\n+4A204 LOCAL HEADER #281     04034B50 (67324752)\n+4A208 Extract Zip Spec      14 (20) '2.0'\n+4A209 Extract OS            00 (0) 'MS-DOS'\n+4A20A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-49C7B Compression Method    0008 (8) 'Deflated'\n-49C7D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-49C81 CRC                   3C2ED9BE (1009703358)\n-49C85 Compressed Size       000003E9 (1001)\n-49C89 Uncompressed Size     00000939 (2361)\n-49C8D Filename Length       0033 (51)\n-49C8F Extra Length          0000 (0)\n-49C91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4A20C Compression Method    0008 (8) 'Deflated'\n+4A20E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4A212 CRC                   F18EE811 (4052674577)\n+4A216 Compressed Size       000003F5 (1013)\n+4A21A Uncompressed Size     00000980 (2432)\n+4A21E Filename Length       0033 (51)\n+4A220 Extra Length          0000 (0)\n+4A222 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x49C91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4A222: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-49CC4 PAYLOAD\n+4A255 PAYLOAD\n \n-4A0AD LOCAL HEADER #282     04034B50 (67324752)\n-4A0B1 Extract Zip Spec      14 (20) '2.0'\n-4A0B2 Extract OS            00 (0) 'MS-DOS'\n-4A0B3 General Purpose Flag  0800 (2048)\n+4A64A LOCAL HEADER #282     04034B50 (67324752)\n+4A64E Extract Zip Spec      14 (20) '2.0'\n+4A64F Extract OS            00 (0) 'MS-DOS'\n+4A650 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4A0B5 Compression Method    0008 (8) 'Deflated'\n-4A0B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4A0BB CRC                   BA95C40E (3130377230)\n-4A0BF Compressed Size       00000C86 (3206)\n-4A0C3 Uncompressed Size     000039CB (14795)\n-4A0C7 Filename Length       002E (46)\n-4A0C9 Extra Length          0000 (0)\n-4A0CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4A652 Compression Method    0008 (8) 'Deflated'\n+4A654 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4A658 CRC                   3744AF68 (927248232)\n+4A65C Compressed Size       00000C9B (3227)\n+4A660 Uncompressed Size     00003B50 (15184)\n+4A664 Filename Length       002E (46)\n+4A666 Extra Length          0000 (0)\n+4A668 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4A0CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4A668: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4A0F9 PAYLOAD\n+4A696 PAYLOAD\n \n-4AD7F LOCAL HEADER #283     04034B50 (67324752)\n-4AD83 Extract Zip Spec      14 (20) '2.0'\n-4AD84 Extract OS            00 (0) 'MS-DOS'\n-4AD85 General Purpose Flag  0800 (2048)\n+4B331 LOCAL HEADER #283     04034B50 (67324752)\n+4B335 Extract Zip Spec      14 (20) '2.0'\n+4B336 Extract OS            00 (0) 'MS-DOS'\n+4B337 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4AD87 Compression Method    0008 (8) 'Deflated'\n-4AD89 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4AD8D CRC                   A4EA9AD2 (2766838482)\n-4AD91 Compressed Size       00000386 (902)\n-4AD95 Uncompressed Size     0000085B (2139)\n-4AD99 Filename Length       0035 (53)\n-4AD9B Extra Length          0000 (0)\n-4AD9D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4B339 Compression Method    0008 (8) 'Deflated'\n+4B33B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4B33F CRC                   A4EA9AD2 (2766838482)\n+4B343 Compressed Size       00000386 (902)\n+4B347 Uncompressed Size     0000085B (2139)\n+4B34B Filename Length       0035 (53)\n+4B34D Extra Length          0000 (0)\n+4B34F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4AD9D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4B34F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4ADD2 PAYLOAD\n+4B384 PAYLOAD\n \n-4B158 LOCAL HEADER #284     04034B50 (67324752)\n-4B15C Extract Zip Spec      14 (20) '2.0'\n-4B15D Extract OS            00 (0) 'MS-DOS'\n-4B15E General Purpose Flag  0800 (2048)\n+4B70A LOCAL HEADER #284     04034B50 (67324752)\n+4B70E Extract Zip Spec      14 (20) '2.0'\n+4B70F Extract OS            00 (0) 'MS-DOS'\n+4B710 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4B160 Compression Method    0008 (8) 'Deflated'\n-4B162 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4B166 CRC                   90514D51 (2421247313)\n-4B16A Compressed Size       0000141B (5147)\n-4B16E Uncompressed Size     00005DC7 (24007)\n-4B172 Filename Length       002B (43)\n-4B174 Extra Length          0000 (0)\n-4B176 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4B712 Compression Method    0008 (8) 'Deflated'\n+4B714 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4B718 CRC                   90514D51 (2421247313)\n+4B71C Compressed Size       0000141B (5147)\n+4B720 Uncompressed Size     00005DC7 (24007)\n+4B724 Filename Length       002B (43)\n+4B726 Extra Length          0000 (0)\n+4B728 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4B176: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4B728: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4B1A1 PAYLOAD\n+4B753 PAYLOAD\n \n-4C5BC LOCAL HEADER #285     04034B50 (67324752)\n-4C5C0 Extract Zip Spec      14 (20) '2.0'\n-4C5C1 Extract OS            00 (0) 'MS-DOS'\n-4C5C2 General Purpose Flag  0800 (2048)\n+4CB6E LOCAL HEADER #285     04034B50 (67324752)\n+4CB72 Extract Zip Spec      14 (20) '2.0'\n+4CB73 Extract OS            00 (0) 'MS-DOS'\n+4CB74 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4C5C4 Compression Method    0008 (8) 'Deflated'\n-4C5C6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4C5CA CRC                   6148ED28 (1632169256)\n-4C5CE Compressed Size       00000362 (866)\n-4C5D2 Uncompressed Size     00000813 (2067)\n-4C5D6 Filename Length       0027 (39)\n-4C5D8 Extra Length          0000 (0)\n-4C5DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4CB76 Compression Method    0008 (8) 'Deflated'\n+4CB78 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4CB7C CRC                   3422DF4F (874700623)\n+4CB80 Compressed Size       0000036E (878)\n+4CB84 Uncompressed Size     0000086A (2154)\n+4CB88 Filename Length       0027 (39)\n+4CB8A Extra Length          0000 (0)\n+4CB8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4C5DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4CB8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4C601 PAYLOAD\n+4CBB3 PAYLOAD\n \n-4C963 LOCAL HEADER #286     04034B50 (67324752)\n-4C967 Extract Zip Spec      14 (20) '2.0'\n-4C968 Extract OS            00 (0) 'MS-DOS'\n-4C969 General Purpose Flag  0800 (2048)\n+4CF21 LOCAL HEADER #286     04034B50 (67324752)\n+4CF25 Extract Zip Spec      14 (20) '2.0'\n+4CF26 Extract OS            00 (0) 'MS-DOS'\n+4CF27 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4C96B Compression Method    0008 (8) 'Deflated'\n-4C96D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4C971 CRC                   32B357AB (850614187)\n-4C975 Compressed Size       000003EF (1007)\n-4C979 Uncompressed Size     0000095A (2394)\n-4C97D Filename Length       002C (44)\n-4C97F Extra Length          0000 (0)\n-4C981 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4CF29 Compression Method    0008 (8) 'Deflated'\n+4CF2B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4CF2F CRC                   5087E57A (1351083386)\n+4CF33 Compressed Size       000003F9 (1017)\n+4CF37 Uncompressed Size     000009A4 (2468)\n+4CF3B Filename Length       002C (44)\n+4CF3D Extra Length          0000 (0)\n+4CF3F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4C981: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4CF3F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4C9AD PAYLOAD\n+4CF6B PAYLOAD\n \n-4CD9C LOCAL HEADER #287     04034B50 (67324752)\n-4CDA0 Extract Zip Spec      14 (20) '2.0'\n-4CDA1 Extract OS            00 (0) 'MS-DOS'\n-4CDA2 General Purpose Flag  0800 (2048)\n+4D364 LOCAL HEADER #287     04034B50 (67324752)\n+4D368 Extract Zip Spec      14 (20) '2.0'\n+4D369 Extract OS            00 (0) 'MS-DOS'\n+4D36A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4CDA4 Compression Method    0008 (8) 'Deflated'\n-4CDA6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4CDAA CRC                   34D97477 (886666359)\n-4CDAE Compressed Size       000019E7 (6631)\n-4CDB2 Uncompressed Size     00008320 (33568)\n-4CDB6 Filename Length       002C (44)\n-4CDB8 Extra Length          0000 (0)\n-4CDBA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4D36C Compression Method    0008 (8) 'Deflated'\n+4D36E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4D372 CRC                   34D97477 (886666359)\n+4D376 Compressed Size       000019E7 (6631)\n+4D37A Uncompressed Size     00008320 (33568)\n+4D37E Filename Length       002C (44)\n+4D380 Extra Length          0000 (0)\n+4D382 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4CDBA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4D382: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4CDE6 PAYLOAD\n+4D3AE PAYLOAD\n \n-4E7CD LOCAL HEADER #288     04034B50 (67324752)\n-4E7D1 Extract Zip Spec      14 (20) '2.0'\n-4E7D2 Extract OS            00 (0) 'MS-DOS'\n-4E7D3 General Purpose Flag  0800 (2048)\n+4ED95 LOCAL HEADER #288     04034B50 (67324752)\n+4ED99 Extract Zip Spec      14 (20) '2.0'\n+4ED9A Extract OS            00 (0) 'MS-DOS'\n+4ED9B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4E7D5 Compression Method    0008 (8) 'Deflated'\n-4E7D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4E7DB CRC                   6788144F (1736971343)\n-4E7DF Compressed Size       00002056 (8278)\n-4E7E3 Uncompressed Size     0000B91D (47389)\n-4E7E7 Filename Length       002F (47)\n-4E7E9 Extra Length          0000 (0)\n-4E7EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4ED9D Compression Method    0008 (8) 'Deflated'\n+4ED9F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4EDA3 CRC                   4414A4AD (1142203565)\n+4EDA7 Compressed Size       0000207F (8319)\n+4EDAB Uncompressed Size     0000BE90 (48784)\n+4EDAF Filename Length       002F (47)\n+4EDB1 Extra Length          0000 (0)\n+4EDB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4E7EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4EDB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4E81A PAYLOAD\n+4EDE2 PAYLOAD\n \n-50870 LOCAL HEADER #289     04034B50 (67324752)\n-50874 Extract Zip Spec      14 (20) '2.0'\n-50875 Extract OS            00 (0) 'MS-DOS'\n-50876 General Purpose Flag  0800 (2048)\n+50E61 LOCAL HEADER #289     04034B50 (67324752)\n+50E65 Extract Zip Spec      14 (20) '2.0'\n+50E66 Extract OS            00 (0) 'MS-DOS'\n+50E67 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-50878 Compression Method    0008 (8) 'Deflated'\n-5087A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5087E CRC                   9D4E3C73 (2639150195)\n-50882 Compressed Size       0000075E (1886)\n-50886 Uncompressed Size     00001707 (5895)\n-5088A Filename Length       0038 (56)\n-5088C Extra Length          0000 (0)\n-5088E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+50E69 Compression Method    0008 (8) 'Deflated'\n+50E6B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+50E6F CRC                   20B97A60 (549026400)\n+50E73 Compressed Size       0000076D (1901)\n+50E77 Uncompressed Size     0000179D (6045)\n+50E7B Filename Length       0038 (56)\n+50E7D Extra Length          0000 (0)\n+50E7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5088E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50E7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-508C6 PAYLOAD\n+50EB7 PAYLOAD\n \n-51024 LOCAL HEADER #290     04034B50 (67324752)\n-51028 Extract Zip Spec      14 (20) '2.0'\n-51029 Extract OS            00 (0) 'MS-DOS'\n-5102A General Purpose Flag  0800 (2048)\n+51624 LOCAL HEADER #290     04034B50 (67324752)\n+51628 Extract Zip Spec      14 (20) '2.0'\n+51629 Extract OS            00 (0) 'MS-DOS'\n+5162A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5102C Compression Method    0008 (8) 'Deflated'\n-5102E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-51032 CRC                   359BAAF7 (899394295)\n-51036 Compressed Size       00000598 (1432)\n-5103A Uncompressed Size     000011CA (4554)\n-5103E Filename Length       003C (60)\n-51040 Extra Length          0000 (0)\n-51042 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5162C Compression Method    0008 (8) 'Deflated'\n+5162E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+51632 CRC                   0B75FDAE (192282030)\n+51636 Compressed Size       000005A6 (1446)\n+5163A Uncompressed Size     0000124E (4686)\n+5163E Filename Length       003C (60)\n+51640 Extra Length          0000 (0)\n+51642 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51042: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x51642: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5107E PAYLOAD\n+5167E PAYLOAD\n \n-51616 LOCAL HEADER #291     04034B50 (67324752)\n-5161A Extract Zip Spec      14 (20) '2.0'\n-5161B Extract OS            00 (0) 'MS-DOS'\n-5161C General Purpose Flag  0800 (2048)\n+51C24 LOCAL HEADER #291     04034B50 (67324752)\n+51C28 Extract Zip Spec      14 (20) '2.0'\n+51C29 Extract OS            00 (0) 'MS-DOS'\n+51C2A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5161E Compression Method    0008 (8) 'Deflated'\n-51620 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-51624 CRC                   4DF6AB6E (1308011374)\n-51628 Compressed Size       000003FC (1020)\n-5162C Uncompressed Size     00000CBD (3261)\n-51630 Filename Length       0028 (40)\n-51632 Extra Length          0000 (0)\n-51634 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+51C2C Compression Method    0008 (8) 'Deflated'\n+51C2E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+51C32 CRC                   D09B55F9 (3499841017)\n+51C36 Compressed Size       00000407 (1031)\n+51C3A Uncompressed Size     00000D4B (3403)\n+51C3E Filename Length       0028 (40)\n+51C40 Extra Length          0000 (0)\n+51C42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51634: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x51C42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5165C PAYLOAD\n+51C6A PAYLOAD\n \n-51A58 LOCAL HEADER #292     04034B50 (67324752)\n-51A5C Extract Zip Spec      14 (20) '2.0'\n-51A5D Extract OS            00 (0) 'MS-DOS'\n-51A5E General Purpose Flag  0800 (2048)\n+52071 LOCAL HEADER #292     04034B50 (67324752)\n+52075 Extract Zip Spec      14 (20) '2.0'\n+52076 Extract OS            00 (0) 'MS-DOS'\n+52077 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-51A60 Compression Method    0008 (8) 'Deflated'\n-51A62 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-51A66 CRC                   E15897D6 (3780679638)\n-51A6A Compressed Size       000003D1 (977)\n-51A6E Uncompressed Size     00000A1C (2588)\n-51A72 Filename Length       0044 (68)\n-51A74 Extra Length          0000 (0)\n-51A76 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+52079 Compression Method    0008 (8) 'Deflated'\n+5207B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5207F CRC                   F3B0BA28 (4088445480)\n+52083 Compressed Size       000003D9 (985)\n+52087 Uncompressed Size     00000A5F (2655)\n+5208B Filename Length       0044 (68)\n+5208D Extra Length          0000 (0)\n+5208F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51A76: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5208F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-51ABA PAYLOAD\n+520D3 PAYLOAD\n \n-51E8B LOCAL HEADER #293     04034B50 (67324752)\n-51E8F Extract Zip Spec      14 (20) '2.0'\n-51E90 Extract OS            00 (0) 'MS-DOS'\n-51E91 General Purpose Flag  0800 (2048)\n+524AC LOCAL HEADER #293     04034B50 (67324752)\n+524B0 Extract Zip Spec      14 (20) '2.0'\n+524B1 Extract OS            00 (0) 'MS-DOS'\n+524B2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-51E93 Compression Method    0008 (8) 'Deflated'\n-51E95 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-51E99 CRC                   080CFD86 (135069062)\n-51E9D Compressed Size       00001E9B (7835)\n-51EA1 Uncompressed Size     00009370 (37744)\n-51EA5 Filename Length       002E (46)\n-51EA7 Extra Length          0000 (0)\n-51EA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+524B4 Compression Method    0008 (8) 'Deflated'\n+524B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+524BA CRC                   080CFD86 (135069062)\n+524BE Compressed Size       00001E9B (7835)\n+524C2 Uncompressed Size     00009370 (37744)\n+524C6 Filename Length       002E (46)\n+524C8 Extra Length          0000 (0)\n+524CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51EA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x524CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-51ED7 PAYLOAD\n+524F8 PAYLOAD\n \n-53D72 LOCAL HEADER #294     04034B50 (67324752)\n-53D76 Extract Zip Spec      14 (20) '2.0'\n-53D77 Extract OS            00 (0) 'MS-DOS'\n-53D78 General Purpose Flag  0800 (2048)\n+54393 LOCAL HEADER #294     04034B50 (67324752)\n+54397 Extract Zip Spec      14 (20) '2.0'\n+54398 Extract OS            00 (0) 'MS-DOS'\n+54399 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-53D7A Compression Method    0008 (8) 'Deflated'\n-53D7C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-53D80 CRC                   45127F53 (1158840147)\n-53D84 Compressed Size       00000772 (1906)\n-53D88 Uncompressed Size     000021F8 (8696)\n-53D8C Filename Length       002C (44)\n-53D8E Extra Length          0000 (0)\n-53D90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5439B Compression Method    0008 (8) 'Deflated'\n+5439D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+543A1 CRC                   70A970FE (1890152702)\n+543A5 Compressed Size       0000077E (1918)\n+543A9 Uncompressed Size     000022D8 (8920)\n+543AD Filename Length       002C (44)\n+543AF Extra Length          0000 (0)\n+543B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x53D90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x543B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-53DBC PAYLOAD\n+543DD PAYLOAD\n \n-5452E LOCAL HEADER #295     04034B50 (67324752)\n-54532 Extract Zip Spec      14 (20) '2.0'\n-54533 Extract OS            00 (0) 'MS-DOS'\n-54534 General Purpose Flag  0800 (2048)\n+54B5B LOCAL HEADER #295     04034B50 (67324752)\n+54B5F Extract Zip Spec      14 (20) '2.0'\n+54B60 Extract OS            00 (0) 'MS-DOS'\n+54B61 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-54536 Compression Method    0008 (8) 'Deflated'\n-54538 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5453C CRC                   BCEF5B37 (3169803063)\n-54540 Compressed Size       0000118B (4491)\n-54544 Uncompressed Size     0000634F (25423)\n-54548 Filename Length       002B (43)\n-5454A Extra Length          0000 (0)\n-5454C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+54B63 Compression Method    0008 (8) 'Deflated'\n+54B65 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+54B69 CRC                   BCEF5B37 (3169803063)\n+54B6D Compressed Size       0000118B (4491)\n+54B71 Uncompressed Size     0000634F (25423)\n+54B75 Filename Length       002B (43)\n+54B77 Extra Length          0000 (0)\n+54B79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5454C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x54B79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-54577 PAYLOAD\n+54BA4 PAYLOAD\n \n-55702 LOCAL HEADER #296     04034B50 (67324752)\n-55706 Extract Zip Spec      14 (20) '2.0'\n-55707 Extract OS            00 (0) 'MS-DOS'\n-55708 General Purpose Flag  0800 (2048)\n+55D2F LOCAL HEADER #296     04034B50 (67324752)\n+55D33 Extract Zip Spec      14 (20) '2.0'\n+55D34 Extract OS            00 (0) 'MS-DOS'\n+55D35 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5570A Compression Method    0008 (8) 'Deflated'\n-5570C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-55710 CRC                   E7AAF9A0 (3886741920)\n-55714 Compressed Size       00000AFB (2811)\n-55718 Uncompressed Size     000026C6 (9926)\n-5571C Filename Length       002C (44)\n-5571E Extra Length          0000 (0)\n-55720 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+55D37 Compression Method    0008 (8) 'Deflated'\n+55D39 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+55D3D CRC                   DB02321D (3674354205)\n+55D41 Compressed Size       00000B07 (2823)\n+55D45 Uncompressed Size     000027AB (10155)\n+55D49 Filename Length       002C (44)\n+55D4B Extra Length          0000 (0)\n+55D4D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x55720: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x55D4D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5574C PAYLOAD\n+55D79 PAYLOAD\n \n-56247 LOCAL HEADER #297     04034B50 (67324752)\n-5624B Extract Zip Spec      14 (20) '2.0'\n-5624C Extract OS            00 (0) 'MS-DOS'\n-5624D General Purpose Flag  0800 (2048)\n+56880 LOCAL HEADER #297     04034B50 (67324752)\n+56884 Extract Zip Spec      14 (20) '2.0'\n+56885 Extract OS            00 (0) 'MS-DOS'\n+56886 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5624F Compression Method    0008 (8) 'Deflated'\n-56251 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-56255 CRC                   4A1B9248 (1243320904)\n-56259 Compressed Size       000014E2 (5346)\n-5625D Uncompressed Size     0000642A (25642)\n-56261 Filename Length       002B (43)\n-56263 Extra Length          0000 (0)\n-56265 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+56888 Compression Method    0008 (8) 'Deflated'\n+5688A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5688E CRC                   DCD69CAC (3705052332)\n+56892 Compressed Size       000014FD (5373)\n+56896 Uncompressed Size     00006690 (26256)\n+5689A Filename Length       002B (43)\n+5689C Extra Length          0000 (0)\n+5689E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x56265: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5689E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-56290 PAYLOAD\n+568C9 PAYLOAD\n \n-57772 LOCAL HEADER #298     04034B50 (67324752)\n-57776 Extract Zip Spec      14 (20) '2.0'\n-57777 Extract OS            00 (0) 'MS-DOS'\n-57778 General Purpose Flag  0800 (2048)\n+57DC6 LOCAL HEADER #298     04034B50 (67324752)\n+57DCA Extract Zip Spec      14 (20) '2.0'\n+57DCB Extract OS            00 (0) 'MS-DOS'\n+57DCC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5777A Compression Method    0008 (8) 'Deflated'\n-5777C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-57780 CRC                   4BCB8E78 (1271631480)\n-57784 Compressed Size       00001440 (5184)\n-57788 Uncompressed Size     00005EF7 (24311)\n-5778C Filename Length       0034 (52)\n-5778E Extra Length          0000 (0)\n-57790 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+57DCE Compression Method    0008 (8) 'Deflated'\n+57DD0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+57DD4 CRC                   E3FDA003 (3825049603)\n+57DD8 Compressed Size       0000145F (5215)\n+57DDC Uncompressed Size     000061ED (25069)\n+57DE0 Filename Length       0034 (52)\n+57DE2 Extra Length          0000 (0)\n+57DE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x57790: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x57DE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-577C4 PAYLOAD\n+57E18 PAYLOAD\n \n-58C04 LOCAL HEADER #299     04034B50 (67324752)\n-58C08 Extract Zip Spec      14 (20) '2.0'\n-58C09 Extract OS            00 (0) 'MS-DOS'\n-58C0A General Purpose Flag  0800 (2048)\n+59277 LOCAL HEADER #299     04034B50 (67324752)\n+5927B Extract Zip Spec      14 (20) '2.0'\n+5927C Extract OS            00 (0) 'MS-DOS'\n+5927D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-58C0C Compression Method    0008 (8) 'Deflated'\n-58C0E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-58C12 CRC                   EBCB75D3 (3955979731)\n-58C16 Compressed Size       00000605 (1541)\n-58C1A Uncompressed Size     00001235 (4661)\n-58C1E Filename Length       0031 (49)\n-58C20 Extra Length          0000 (0)\n-58C22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5927F Compression Method    0008 (8) 'Deflated'\n+59281 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+59285 CRC                   9A747BAC (2591325100)\n+59289 Compressed Size       00000613 (1555)\n+5928D Uncompressed Size     00001305 (4869)\n+59291 Filename Length       0031 (49)\n+59293 Extra Length          0000 (0)\n+59295 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x58C22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x59295: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-58C53 PAYLOAD\n+592C6 PAYLOAD\n \n-59258 LOCAL HEADER #300     04034B50 (67324752)\n-5925C Extract Zip Spec      14 (20) '2.0'\n-5925D Extract OS            00 (0) 'MS-DOS'\n-5925E General Purpose Flag  0800 (2048)\n+598D9 LOCAL HEADER #300     04034B50 (67324752)\n+598DD Extract Zip Spec      14 (20) '2.0'\n+598DE Extract OS            00 (0) 'MS-DOS'\n+598DF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-59260 Compression Method    0008 (8) 'Deflated'\n-59262 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-59266 CRC                   0D6CD567 (225236327)\n-5926A Compressed Size       000006D0 (1744)\n-5926E Uncompressed Size     000015F5 (5621)\n-59272 Filename Length       0034 (52)\n-59274 Extra Length          0000 (0)\n-59276 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+598E1 Compression Method    0008 (8) 'Deflated'\n+598E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+598E7 CRC                   F1EB3E77 (4058726007)\n+598EB Compressed Size       000006E0 (1760)\n+598EF Uncompressed Size     000016D7 (5847)\n+598F3 Filename Length       0034 (52)\n+598F5 Extra Length          0000 (0)\n+598F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x59276: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x598F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-592AA PAYLOAD\n+5992B PAYLOAD\n \n-5997A LOCAL HEADER #301     04034B50 (67324752)\n-5997E Extract Zip Spec      14 (20) '2.0'\n-5997F Extract OS            00 (0) 'MS-DOS'\n-59980 General Purpose Flag  0800 (2048)\n+5A00B LOCAL HEADER #301     04034B50 (67324752)\n+5A00F Extract Zip Spec      14 (20) '2.0'\n+5A010 Extract OS            00 (0) 'MS-DOS'\n+5A011 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-59982 Compression Method    0008 (8) 'Deflated'\n-59984 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-59988 CRC                   6E97D75C (1855444828)\n-5998C Compressed Size       0000073D (1853)\n-59990 Uncompressed Size     00001A42 (6722)\n-59994 Filename Length       0032 (50)\n-59996 Extra Length          0000 (0)\n-59998 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5A013 Compression Method    0008 (8) 'Deflated'\n+5A015 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5A019 CRC                   7F641F8A (2137268106)\n+5A01D Compressed Size       0000074D (1869)\n+5A021 Uncompressed Size     00001B65 (7013)\n+5A025 Filename Length       0032 (50)\n+5A027 Extra Length          0000 (0)\n+5A029 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x59998: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5A029: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-599CA PAYLOAD\n+5A05B PAYLOAD\n \n-5A107 LOCAL HEADER #302     04034B50 (67324752)\n-5A10B Extract Zip Spec      14 (20) '2.0'\n-5A10C Extract OS            00 (0) 'MS-DOS'\n-5A10D General Purpose Flag  0800 (2048)\n+5A7A8 LOCAL HEADER #302     04034B50 (67324752)\n+5A7AC Extract Zip Spec      14 (20) '2.0'\n+5A7AD Extract OS            00 (0) 'MS-DOS'\n+5A7AE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5A10F Compression Method    0008 (8) 'Deflated'\n-5A111 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5A115 CRC                   327F969A (847222426)\n-5A119 Compressed Size       00000CAC (3244)\n-5A11D Uncompressed Size     0000350F (13583)\n-5A121 Filename Length       002E (46)\n-5A123 Extra Length          0000 (0)\n-5A125 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5A7B0 Compression Method    0008 (8) 'Deflated'\n+5A7B2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5A7B6 CRC                   6C21C4E0 (1814152416)\n+5A7BA Compressed Size       00000CC1 (3265)\n+5A7BE Uncompressed Size     00003707 (14087)\n+5A7C2 Filename Length       002E (46)\n+5A7C4 Extra Length          0000 (0)\n+5A7C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5A125: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5A7C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5A153 PAYLOAD\n+5A7F4 PAYLOAD\n \n-5ADFF LOCAL HEADER #303     04034B50 (67324752)\n-5AE03 Extract Zip Spec      14 (20) '2.0'\n-5AE04 Extract OS            00 (0) 'MS-DOS'\n-5AE05 General Purpose Flag  0800 (2048)\n+5B4B5 LOCAL HEADER #303     04034B50 (67324752)\n+5B4B9 Extract Zip Spec      14 (20) '2.0'\n+5B4BA Extract OS            00 (0) 'MS-DOS'\n+5B4BB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5AE07 Compression Method    0008 (8) 'Deflated'\n-5AE09 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5AE0D CRC                   C17F60B4 (3246350516)\n-5AE11 Compressed Size       00000373 (883)\n-5AE15 Uncompressed Size     0000084E (2126)\n-5AE19 Filename Length       002B (43)\n-5AE1B Extra Length          0000 (0)\n-5AE1D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5B4BD Compression Method    0008 (8) 'Deflated'\n+5B4BF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5B4C3 CRC                   F3BD8170 (4089282928)\n+5B4C7 Compressed Size       0000037A (890)\n+5B4CB Uncompressed Size     000008A1 (2209)\n+5B4CF Filename Length       002B (43)\n+5B4D1 Extra Length          0000 (0)\n+5B4D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5AE1D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5B4D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5AE48 PAYLOAD\n+5B4FE PAYLOAD\n \n-5B1BB LOCAL HEADER #304     04034B50 (67324752)\n-5B1BF Extract Zip Spec      14 (20) '2.0'\n-5B1C0 Extract OS            00 (0) 'MS-DOS'\n-5B1C1 General Purpose Flag  0800 (2048)\n+5B878 LOCAL HEADER #304     04034B50 (67324752)\n+5B87C Extract Zip Spec      14 (20) '2.0'\n+5B87D Extract OS            00 (0) 'MS-DOS'\n+5B87E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5B1C3 Compression Method    0008 (8) 'Deflated'\n-5B1C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5B1C9 CRC                   60259860 (1613076576)\n-5B1CD Compressed Size       0000098F (2447)\n-5B1D1 Uncompressed Size     0000229B (8859)\n-5B1D5 Filename Length       002F (47)\n-5B1D7 Extra Length          0000 (0)\n-5B1D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5B880 Compression Method    0008 (8) 'Deflated'\n+5B882 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5B886 CRC                   56A68FB6 (1453756342)\n+5B88A Compressed Size       000009A4 (2468)\n+5B88E Uncompressed Size     000023BC (9148)\n+5B892 Filename Length       002F (47)\n+5B894 Extra Length          0000 (0)\n+5B896 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5B1D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5B896: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5B208 PAYLOAD\n+5B8C5 PAYLOAD\n \n-5BB97 LOCAL HEADER #305     04034B50 (67324752)\n-5BB9B Extract Zip Spec      14 (20) '2.0'\n-5BB9C Extract OS            00 (0) 'MS-DOS'\n-5BB9D General Purpose Flag  0800 (2048)\n+5C269 LOCAL HEADER #305     04034B50 (67324752)\n+5C26D Extract Zip Spec      14 (20) '2.0'\n+5C26E Extract OS            00 (0) 'MS-DOS'\n+5C26F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5BB9F Compression Method    0008 (8) 'Deflated'\n-5BBA1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5BBA5 CRC                   CBED4405 (3421324293)\n-5BBA9 Compressed Size       0000047C (1148)\n-5BBAD Uncompressed Size     00000B21 (2849)\n-5BBB1 Filename Length       0026 (38)\n-5BBB3 Extra Length          0000 (0)\n-5BBB5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5C271 Compression Method    0008 (8) 'Deflated'\n+5C273 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5C277 CRC                   111FF296 (287306390)\n+5C27B Compressed Size       00000484 (1156)\n+5C27F Uncompressed Size     00000B99 (2969)\n+5C283 Filename Length       0026 (38)\n+5C285 Extra Length          0000 (0)\n+5C287 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5BBB5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C287: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5BBDB PAYLOAD\n+5C2AD PAYLOAD\n \n-5C057 LOCAL HEADER #306     04034B50 (67324752)\n-5C05B Extract Zip Spec      14 (20) '2.0'\n-5C05C Extract OS            00 (0) 'MS-DOS'\n-5C05D General Purpose Flag  0800 (2048)\n+5C731 LOCAL HEADER #306     04034B50 (67324752)\n+5C735 Extract Zip Spec      14 (20) '2.0'\n+5C736 Extract OS            00 (0) 'MS-DOS'\n+5C737 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5C05F Compression Method    0008 (8) 'Deflated'\n-5C061 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5C065 CRC                   4EECAFD1 (1324134353)\n-5C069 Compressed Size       000004DF (1247)\n-5C06D Uncompressed Size     00000DF0 (3568)\n-5C071 Filename Length       002B (43)\n-5C073 Extra Length          0000 (0)\n-5C075 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5C739 Compression Method    0008 (8) 'Deflated'\n+5C73B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5C73F CRC                   44CDA5D9 (1154328025)\n+5C743 Compressed Size       000004EC (1260)\n+5C747 Uncompressed Size     00000E77 (3703)\n+5C74B Filename Length       002B (43)\n+5C74D Extra Length          0000 (0)\n+5C74F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5C075: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C74F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5C0A0 PAYLOAD\n+5C77A PAYLOAD\n \n-5C57F LOCAL HEADER #307     04034B50 (67324752)\n-5C583 Extract Zip Spec      14 (20) '2.0'\n-5C584 Extract OS            00 (0) 'MS-DOS'\n-5C585 General Purpose Flag  0800 (2048)\n+5CC66 LOCAL HEADER #307     04034B50 (67324752)\n+5CC6A Extract Zip Spec      14 (20) '2.0'\n+5CC6B Extract OS            00 (0) 'MS-DOS'\n+5CC6C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5C587 Compression Method    0008 (8) 'Deflated'\n-5C589 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5C58D CRC                   44E5E8ED (1155918061)\n-5C591 Compressed Size       00000733 (1843)\n-5C595 Uncompressed Size     00001786 (6022)\n-5C599 Filename Length       0031 (49)\n-5C59B Extra Length          0000 (0)\n-5C59D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5CC6E Compression Method    0008 (8) 'Deflated'\n+5CC70 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5CC74 CRC                   D584FEC4 (3582262980)\n+5CC78 Compressed Size       00000743 (1859)\n+5CC7C Uncompressed Size     00001869 (6249)\n+5CC80 Filename Length       0031 (49)\n+5CC82 Extra Length          0000 (0)\n+5CC84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5C59D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5CC84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5C5CE PAYLOAD\n+5CCB5 PAYLOAD\n \n-5CD01 LOCAL HEADER #308     04034B50 (67324752)\n-5CD05 Extract Zip Spec      14 (20) '2.0'\n-5CD06 Extract OS            00 (0) 'MS-DOS'\n-5CD07 General Purpose Flag  0800 (2048)\n+5D3F8 LOCAL HEADER #308     04034B50 (67324752)\n+5D3FC Extract Zip Spec      14 (20) '2.0'\n+5D3FD Extract OS            00 (0) 'MS-DOS'\n+5D3FE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5CD09 Compression Method    0008 (8) 'Deflated'\n-5CD0B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5CD0F CRC                   AEF897E4 (2935527396)\n-5CD13 Compressed Size       00000853 (2131)\n-5CD17 Uncompressed Size     00002174 (8564)\n-5CD1B Filename Length       0029 (41)\n-5CD1D Extra Length          0000 (0)\n-5CD1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5D400 Compression Method    0008 (8) 'Deflated'\n+5D402 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5D406 CRC                   6E2E32B0 (1848521392)\n+5D40A Compressed Size       00000868 (2152)\n+5D40E Uncompressed Size     000022C0 (8896)\n+5D412 Filename Length       0029 (41)\n+5D414 Extra Length          0000 (0)\n+5D416 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5CD1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D416: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5CD48 PAYLOAD\n+5D43F PAYLOAD\n \n-5D59B LOCAL HEADER #309     04034B50 (67324752)\n-5D59F Extract Zip Spec      14 (20) '2.0'\n-5D5A0 Extract OS            00 (0) 'MS-DOS'\n-5D5A1 General Purpose Flag  0800 (2048)\n+5DCA7 LOCAL HEADER #309     04034B50 (67324752)\n+5DCAB Extract Zip Spec      14 (20) '2.0'\n+5DCAC Extract OS            00 (0) 'MS-DOS'\n+5DCAD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5D5A3 Compression Method    0008 (8) 'Deflated'\n-5D5A5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5D5A9 CRC                   1F3B896F (523995503)\n-5D5AD Compressed Size       000002E4 (740)\n-5D5B1 Uncompressed Size     0000065A (1626)\n-5D5B5 Filename Length       002A (42)\n-5D5B7 Extra Length          0000 (0)\n-5D5B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5DCAF Compression Method    0008 (8) 'Deflated'\n+5DCB1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5DCB5 CRC                   C17F4D7C (3246345596)\n+5DCB9 Compressed Size       000002EC (748)\n+5DCBD Uncompressed Size     0000068F (1679)\n+5DCC1 Filename Length       002A (42)\n+5DCC3 Extra Length          0000 (0)\n+5DCC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5D5B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5DCC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5D5E3 PAYLOAD\n+5DCEF PAYLOAD\n \n-5D8C7 LOCAL HEADER #310     04034B50 (67324752)\n-5D8CB Extract Zip Spec      14 (20) '2.0'\n-5D8CC Extract OS            00 (0) 'MS-DOS'\n-5D8CD General Purpose Flag  0800 (2048)\n+5DFDB LOCAL HEADER #310     04034B50 (67324752)\n+5DFDF Extract Zip Spec      14 (20) '2.0'\n+5DFE0 Extract OS            00 (0) 'MS-DOS'\n+5DFE1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5D8CF Compression Method    0008 (8) 'Deflated'\n-5D8D1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5D8D5 CRC                   FE661D4B (4268105035)\n-5D8D9 Compressed Size       00000483 (1155)\n-5D8DD Uncompressed Size     00000DF5 (3573)\n-5D8E1 Filename Length       0029 (41)\n-5D8E3 Extra Length          0000 (0)\n-5D8E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5DFE3 Compression Method    0008 (8) 'Deflated'\n+5DFE5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5DFE9 CRC                   0D00D936 (218159414)\n+5DFED Compressed Size       00000492 (1170)\n+5DFF1 Uncompressed Size     00000E8E (3726)\n+5DFF5 Filename Length       0029 (41)\n+5DFF7 Extra Length          0000 (0)\n+5DFF9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5D8E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5DFF9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5D90E PAYLOAD\n+5E022 PAYLOAD\n \n-5DD91 LOCAL HEADER #311     04034B50 (67324752)\n-5DD95 Extract Zip Spec      14 (20) '2.0'\n-5DD96 Extract OS            00 (0) 'MS-DOS'\n-5DD97 General Purpose Flag  0800 (2048)\n+5E4B4 LOCAL HEADER #311     04034B50 (67324752)\n+5E4B8 Extract Zip Spec      14 (20) '2.0'\n+5E4B9 Extract OS            00 (0) 'MS-DOS'\n+5E4BA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5DD99 Compression Method    0008 (8) 'Deflated'\n-5DD9B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5DD9F CRC                   32F83356 (855126870)\n-5DDA3 Compressed Size       000004A7 (1191)\n-5DDA7 Uncompressed Size     00000E80 (3712)\n-5DDAB Filename Length       002A (42)\n-5DDAD Extra Length          0000 (0)\n-5DDAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5E4BC Compression Method    0008 (8) 'Deflated'\n+5E4BE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5E4C2 CRC                   F4388FF8 (4097347576)\n+5E4C6 Compressed Size       000004B5 (1205)\n+5E4CA Uncompressed Size     00000F20 (3872)\n+5E4CE Filename Length       002A (42)\n+5E4D0 Extra Length          0000 (0)\n+5E4D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5DDAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5E4D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5DDD9 PAYLOAD\n+5E4FC PAYLOAD\n \n-5E280 LOCAL HEADER #312     04034B50 (67324752)\n-5E284 Extract Zip Spec      14 (20) '2.0'\n-5E285 Extract OS            00 (0) 'MS-DOS'\n-5E286 General Purpose Flag  0800 (2048)\n+5E9B1 LOCAL HEADER #312     04034B50 (67324752)\n+5E9B5 Extract Zip Spec      14 (20) '2.0'\n+5E9B6 Extract OS            00 (0) 'MS-DOS'\n+5E9B7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5E288 Compression Method    0008 (8) 'Deflated'\n-5E28A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5E28E CRC                   5B6E7792 (1533966226)\n-5E292 Compressed Size       00000B79 (2937)\n-5E296 Uncompressed Size     000033BD (13245)\n-5E29A Filename Length       002B (43)\n-5E29C Extra Length          0000 (0)\n-5E29E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5E9B9 Compression Method    0008 (8) 'Deflated'\n+5E9BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5E9BF CRC                   39FACF71 (972738417)\n+5E9C3 Compressed Size       00000B93 (2963)\n+5E9C7 Uncompressed Size     00003613 (13843)\n+5E9CB Filename Length       002B (43)\n+5E9CD Extra Length          0000 (0)\n+5E9CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5E29E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5E9CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5E2C9 PAYLOAD\n+5E9FA PAYLOAD\n \n-5EE42 LOCAL HEADER #313     04034B50 (67324752)\n-5EE46 Extract Zip Spec      14 (20) '2.0'\n-5EE47 Extract OS            00 (0) 'MS-DOS'\n-5EE48 General Purpose Flag  0800 (2048)\n+5F58D LOCAL HEADER #313     04034B50 (67324752)\n+5F591 Extract Zip Spec      14 (20) '2.0'\n+5F592 Extract OS            00 (0) 'MS-DOS'\n+5F593 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5EE4A Compression Method    0008 (8) 'Deflated'\n-5EE4C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5EE50 CRC                   321C1C15 (840702997)\n-5EE54 Compressed Size       00000987 (2439)\n-5EE58 Uncompressed Size     00002894 (10388)\n-5EE5C Filename Length       002B (43)\n-5EE5E Extra Length          0000 (0)\n-5EE60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5F595 Compression Method    0008 (8) 'Deflated'\n+5F597 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5F59B CRC                   2FD52EF2 (802500338)\n+5F59F Compressed Size       0000099B (2459)\n+5F5A3 Uncompressed Size     00002A6C (10860)\n+5F5A7 Filename Length       002B (43)\n+5F5A9 Extra Length          0000 (0)\n+5F5AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5EE60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5F5AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5EE8B PAYLOAD\n+5F5D6 PAYLOAD\n \n-5F812 LOCAL HEADER #314     04034B50 (67324752)\n-5F816 Extract Zip Spec      14 (20) '2.0'\n-5F817 Extract OS            00 (0) 'MS-DOS'\n-5F818 General Purpose Flag  0800 (2048)\n+5FF71 LOCAL HEADER #314     04034B50 (67324752)\n+5FF75 Extract Zip Spec      14 (20) '2.0'\n+5FF76 Extract OS            00 (0) 'MS-DOS'\n+5FF77 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5F81A Compression Method    0008 (8) 'Deflated'\n-5F81C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5F820 CRC                   52C8839A (1388872602)\n-5F824 Compressed Size       00000942 (2370)\n-5F828 Uncompressed Size     000020A7 (8359)\n-5F82C Filename Length       0030 (48)\n-5F82E Extra Length          0000 (0)\n-5F830 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5FF79 Compression Method    0008 (8) 'Deflated'\n+5FF7B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5FF7F CRC                   42C7E3CE (1120396238)\n+5FF83 Compressed Size       00000952 (2386)\n+5FF87 Uncompressed Size     000021AF (8623)\n+5FF8B Filename Length       0030 (48)\n+5FF8D Extra Length          0000 (0)\n+5FF8F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5F830: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5FF8F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5F860 PAYLOAD\n+5FFBF PAYLOAD\n \n-601A2 LOCAL HEADER #315     04034B50 (67324752)\n-601A6 Extract Zip Spec      14 (20) '2.0'\n-601A7 Extract OS            00 (0) 'MS-DOS'\n-601A8 General Purpose Flag  0800 (2048)\n+60911 LOCAL HEADER #315     04034B50 (67324752)\n+60915 Extract Zip Spec      14 (20) '2.0'\n+60916 Extract OS            00 (0) 'MS-DOS'\n+60917 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-601AA Compression Method    0008 (8) 'Deflated'\n-601AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-601B0 CRC                   838E36DD (2207135453)\n-601B4 Compressed Size       00000C5F (3167)\n-601B8 Uncompressed Size     00003312 (13074)\n-601BC Filename Length       002B (43)\n-601BE Extra Length          0000 (0)\n-601C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+60919 Compression Method    0008 (8) 'Deflated'\n+6091B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6091F CRC                   9B8BDB69 (2609634153)\n+60923 Compressed Size       00000C77 (3191)\n+60927 Uncompressed Size     00003527 (13607)\n+6092B Filename Length       002B (43)\n+6092D Extra Length          0000 (0)\n+6092F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x601C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6092F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-601EB PAYLOAD\n+6095A PAYLOAD\n \n-60E4A LOCAL HEADER #316     04034B50 (67324752)\n-60E4E Extract Zip Spec      14 (20) '2.0'\n-60E4F Extract OS            00 (0) 'MS-DOS'\n-60E50 General Purpose Flag  0800 (2048)\n+615D1 LOCAL HEADER #316     04034B50 (67324752)\n+615D5 Extract Zip Spec      14 (20) '2.0'\n+615D6 Extract OS            00 (0) 'MS-DOS'\n+615D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-60E52 Compression Method    0008 (8) 'Deflated'\n-60E54 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-60E58 CRC                   CB5B9E0C (3411779084)\n-60E5C Compressed Size       00000C72 (3186)\n-60E60 Uncompressed Size     00003489 (13449)\n-60E64 Filename Length       002E (46)\n-60E66 Extra Length          0000 (0)\n-60E68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+615D9 Compression Method    0008 (8) 'Deflated'\n+615DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+615DF CRC                   2A6335AE (711144878)\n+615E3 Compressed Size       00000C83 (3203)\n+615E7 Uncompressed Size     00003628 (13864)\n+615EB Filename Length       002E (46)\n+615ED Extra Length          0000 (0)\n+615EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x60E68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x615EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-60E96 PAYLOAD\n+6161D PAYLOAD\n \n-61B08 LOCAL HEADER #317     04034B50 (67324752)\n-61B0C Extract Zip Spec      14 (20) '2.0'\n-61B0D Extract OS            00 (0) 'MS-DOS'\n-61B0E General Purpose Flag  0800 (2048)\n+622A0 LOCAL HEADER #317     04034B50 (67324752)\n+622A4 Extract Zip Spec      14 (20) '2.0'\n+622A5 Extract OS            00 (0) 'MS-DOS'\n+622A6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-61B10 Compression Method    0008 (8) 'Deflated'\n-61B12 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-61B16 CRC                   5FCFA231 (1607442993)\n-61B1A Compressed Size       0000053D (1341)\n-61B1E Uncompressed Size     00001BE6 (7142)\n-61B22 Filename Length       0026 (38)\n-61B24 Extra Length          0000 (0)\n-61B26 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+622A8 Compression Method    0008 (8) 'Deflated'\n+622AA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+622AE CRC                   4DECBF7A (1307361146)\n+622B2 Compressed Size       0000054A (1354)\n+622B6 Uncompressed Size     00001CA2 (7330)\n+622BA Filename Length       0026 (38)\n+622BC Extra Length          0000 (0)\n+622BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x61B26: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x622BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-61B4C PAYLOAD\n+622E4 PAYLOAD\n \n-62089 LOCAL HEADER #318     04034B50 (67324752)\n-6208D Extract Zip Spec      14 (20) '2.0'\n-6208E Extract OS            00 (0) 'MS-DOS'\n-6208F General Purpose Flag  0800 (2048)\n+6282E LOCAL HEADER #318     04034B50 (67324752)\n+62832 Extract Zip Spec      14 (20) '2.0'\n+62833 Extract OS            00 (0) 'MS-DOS'\n+62834 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-62091 Compression Method    0008 (8) 'Deflated'\n-62093 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-62097 CRC                   53B2D875 (1404229749)\n-6209B Compressed Size       000002D2 (722)\n-6209F Uncompressed Size     000005A4 (1444)\n-620A3 Filename Length       0030 (48)\n-620A5 Extra Length          0000 (0)\n-620A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+62836 Compression Method    0008 (8) 'Deflated'\n+62838 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6283C CRC                   DF16DFCA (3742818250)\n+62840 Compressed Size       000002DA (730)\n+62844 Uncompressed Size     000005D0 (1488)\n+62848 Filename Length       0030 (48)\n+6284A Extra Length          0000 (0)\n+6284C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x620A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6284C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-620D7 PAYLOAD\n+6287C PAYLOAD\n \n-623A9 LOCAL HEADER #319     04034B50 (67324752)\n-623AD Extract Zip Spec      14 (20) '2.0'\n-623AE Extract OS            00 (0) 'MS-DOS'\n-623AF General Purpose Flag  0800 (2048)\n+62B56 LOCAL HEADER #319     04034B50 (67324752)\n+62B5A Extract Zip Spec      14 (20) '2.0'\n+62B5B Extract OS            00 (0) 'MS-DOS'\n+62B5C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-623B1 Compression Method    0008 (8) 'Deflated'\n-623B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-623B7 CRC                   07CF28F9 (131016953)\n-623BB Compressed Size       000008BE (2238)\n-623BF Uncompressed Size     00001D72 (7538)\n-623C3 Filename Length       0036 (54)\n-623C5 Extra Length          0000 (0)\n-623C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+62B5E Compression Method    0008 (8) 'Deflated'\n+62B60 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+62B64 CRC                   14F52AE5 (351611621)\n+62B68 Compressed Size       000008CE (2254)\n+62B6C Uncompressed Size     00001E9C (7836)\n+62B70 Filename Length       0036 (54)\n+62B72 Extra Length          0000 (0)\n+62B74 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x623C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x62B74: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-623FD PAYLOAD\n+62BAA PAYLOAD\n \n-62CBB LOCAL HEADER #320     04034B50 (67324752)\n-62CBF Extract Zip Spec      14 (20) '2.0'\n-62CC0 Extract OS            00 (0) 'MS-DOS'\n-62CC1 General Purpose Flag  0800 (2048)\n+63478 LOCAL HEADER #320     04034B50 (67324752)\n+6347C Extract Zip Spec      14 (20) '2.0'\n+6347D Extract OS            00 (0) 'MS-DOS'\n+6347E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-62CC3 Compression Method    0008 (8) 'Deflated'\n-62CC5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-62CC9 CRC                   FF8666DF (4286998239)\n-62CCD Compressed Size       00000734 (1844)\n-62CD1 Uncompressed Size     00001A8A (6794)\n-62CD5 Filename Length       0034 (52)\n-62CD7 Extra Length          0000 (0)\n-62CD9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+63480 Compression Method    0008 (8) 'Deflated'\n+63482 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+63486 CRC                   455A049E (1163527326)\n+6348A Compressed Size       00000744 (1860)\n+6348E Uncompressed Size     00001BA0 (7072)\n+63492 Filename Length       0034 (52)\n+63494 Extra Length          0000 (0)\n+63496 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x62CD9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x63496: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-62D0D PAYLOAD\n+634CA PAYLOAD\n \n-63441 LOCAL HEADER #321     04034B50 (67324752)\n-63445 Extract Zip Spec      14 (20) '2.0'\n-63446 Extract OS            00 (0) 'MS-DOS'\n-63447 General Purpose Flag  0800 (2048)\n+63C0E LOCAL HEADER #321     04034B50 (67324752)\n+63C12 Extract Zip Spec      14 (20) '2.0'\n+63C13 Extract OS            00 (0) 'MS-DOS'\n+63C14 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-63449 Compression Method    0008 (8) 'Deflated'\n-6344B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6344F CRC                   C4C508F0 (3301247216)\n-63453 Compressed Size       00000333 (819)\n-63457 Uncompressed Size     00000751 (1873)\n-6345B Filename Length       002E (46)\n-6345D Extra Length          0000 (0)\n-6345F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+63C16 Compression Method    0008 (8) 'Deflated'\n+63C18 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+63C1C CRC                   C852179E (3360823198)\n+63C20 Compressed Size       0000033F (831)\n+63C24 Uncompressed Size     00000798 (1944)\n+63C28 Filename Length       002E (46)\n+63C2A Extra Length          0000 (0)\n+63C2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6345F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x63C2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6348D PAYLOAD\n+63C5A PAYLOAD\n \n-637C0 LOCAL HEADER #322     04034B50 (67324752)\n-637C4 Extract Zip Spec      14 (20) '2.0'\n-637C5 Extract OS            00 (0) 'MS-DOS'\n-637C6 General Purpose Flag  0800 (2048)\n+63F99 LOCAL HEADER #322     04034B50 (67324752)\n+63F9D Extract Zip Spec      14 (20) '2.0'\n+63F9E Extract OS            00 (0) 'MS-DOS'\n+63F9F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-637C8 Compression Method    0008 (8) 'Deflated'\n-637CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-637CE CRC                   55945694 (1435784852)\n-637D2 Compressed Size       00000839 (2105)\n-637D6 Uncompressed Size     00001B9B (7067)\n-637DA Filename Length       0031 (49)\n-637DC Extra Length          0000 (0)\n-637DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+63FA1 Compression Method    0008 (8) 'Deflated'\n+63FA3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+63FA7 CRC                   BD46272F (3175491375)\n+63FAB Compressed Size       00000845 (2117)\n+63FAF Uncompressed Size     00001CB5 (7349)\n+63FB3 Filename Length       0031 (49)\n+63FB5 Extra Length          0000 (0)\n+63FB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x637DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x63FB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6380F PAYLOAD\n+63FE8 PAYLOAD\n \n-64048 LOCAL HEADER #323     04034B50 (67324752)\n-6404C Extract Zip Spec      14 (20) '2.0'\n-6404D Extract OS            00 (0) 'MS-DOS'\n-6404E General Purpose Flag  0800 (2048)\n+6482D LOCAL HEADER #323     04034B50 (67324752)\n+64831 Extract Zip Spec      14 (20) '2.0'\n+64832 Extract OS            00 (0) 'MS-DOS'\n+64833 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-64050 Compression Method    0008 (8) 'Deflated'\n-64052 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-64056 CRC                   CEB8A43B (3468207163)\n-6405A Compressed Size       00000744 (1860)\n-6405E Uncompressed Size     00001ABC (6844)\n-64062 Filename Length       002F (47)\n-64064 Extra Length          0000 (0)\n-64066 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+64835 Compression Method    0008 (8) 'Deflated'\n+64837 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6483B CRC                   F51CAE43 (4112297539)\n+6483F Compressed Size       00000755 (1877)\n+64843 Uncompressed Size     00001BD5 (7125)\n+64847 Filename Length       002F (47)\n+64849 Extra Length          0000 (0)\n+6484B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x64066: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6484B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-64095 PAYLOAD\n+6487A PAYLOAD\n \n-647D9 LOCAL HEADER #324     04034B50 (67324752)\n-647DD Extract Zip Spec      14 (20) '2.0'\n-647DE Extract OS            00 (0) 'MS-DOS'\n-647DF General Purpose Flag  0800 (2048)\n+64FCF LOCAL HEADER #324     04034B50 (67324752)\n+64FD3 Extract Zip Spec      14 (20) '2.0'\n+64FD4 Extract OS            00 (0) 'MS-DOS'\n+64FD5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-647E1 Compression Method    0008 (8) 'Deflated'\n-647E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-647E7 CRC                   339D235A (865936218)\n-647EB Compressed Size       00000378 (888)\n-647EF Uncompressed Size     00000791 (1937)\n-647F3 Filename Length       003F (63)\n-647F5 Extra Length          0000 (0)\n-647F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+64FD7 Compression Method    0008 (8) 'Deflated'\n+64FD9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+64FDD CRC                   DB5A6031 (3680133169)\n+64FE1 Compressed Size       00000382 (898)\n+64FE5 Uncompressed Size     000007C1 (1985)\n+64FE9 Filename Length       003F (63)\n+64FEB Extra Length          0000 (0)\n+64FED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x647F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x64FED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-64836 PAYLOAD\n+6502C PAYLOAD\n \n-64BAE LOCAL HEADER #325     04034B50 (67324752)\n-64BB2 Extract Zip Spec      14 (20) '2.0'\n-64BB3 Extract OS            00 (0) 'MS-DOS'\n-64BB4 General Purpose Flag  0800 (2048)\n+653AE LOCAL HEADER #325     04034B50 (67324752)\n+653B2 Extract Zip Spec      14 (20) '2.0'\n+653B3 Extract OS            00 (0) 'MS-DOS'\n+653B4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-64BB6 Compression Method    0008 (8) 'Deflated'\n-64BB8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-64BBC CRC                   F30DAB50 (4077759312)\n-64BC0 Compressed Size       00000F25 (3877)\n-64BC4 Uncompressed Size     000047F4 (18420)\n-64BC8 Filename Length       0032 (50)\n-64BCA Extra Length          0000 (0)\n-64BCC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+653B6 Compression Method    0008 (8) 'Deflated'\n+653B8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+653BC CRC                   695EFF74 (1767833460)\n+653C0 Compressed Size       00000F43 (3907)\n+653C4 Uncompressed Size     00004A07 (18951)\n+653C8 Filename Length       0032 (50)\n+653CA Extra Length          0000 (0)\n+653CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x64BCC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x653CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-64BFE PAYLOAD\n+653FE PAYLOAD\n \n-65B23 LOCAL HEADER #326     04034B50 (67324752)\n-65B27 Extract Zip Spec      14 (20) '2.0'\n-65B28 Extract OS            00 (0) 'MS-DOS'\n-65B29 General Purpose Flag  0800 (2048)\n+66341 LOCAL HEADER #326     04034B50 (67324752)\n+66345 Extract Zip Spec      14 (20) '2.0'\n+66346 Extract OS            00 (0) 'MS-DOS'\n+66347 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-65B2B Compression Method    0008 (8) 'Deflated'\n-65B2D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-65B31 CRC                   9409E400 (2483676160)\n-65B35 Compressed Size       000003A7 (935)\n-65B39 Uncompressed Size     000007F6 (2038)\n-65B3D Filename Length       002E (46)\n-65B3F Extra Length          0000 (0)\n-65B41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+66349 Compression Method    0008 (8) 'Deflated'\n+6634B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6634F CRC                   FB06EFC4 (4211535812)\n+66353 Compressed Size       000003AF (943)\n+66357 Uncompressed Size     00000833 (2099)\n+6635B Filename Length       002E (46)\n+6635D Extra Length          0000 (0)\n+6635F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x65B41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6635F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-65B6F PAYLOAD\n+6638D PAYLOAD\n \n-65F16 LOCAL HEADER #327     04034B50 (67324752)\n-65F1A Extract Zip Spec      14 (20) '2.0'\n-65F1B Extract OS            00 (0) 'MS-DOS'\n-65F1C General Purpose Flag  0800 (2048)\n+6673C LOCAL HEADER #327     04034B50 (67324752)\n+66740 Extract Zip Spec      14 (20) '2.0'\n+66741 Extract OS            00 (0) 'MS-DOS'\n+66742 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-65F1E Compression Method    0008 (8) 'Deflated'\n-65F20 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-65F24 CRC                   0896EC5C (144108636)\n-65F28 Compressed Size       0000070E (1806)\n-65F2C Uncompressed Size     000016D6 (5846)\n-65F30 Filename Length       0033 (51)\n-65F32 Extra Length          0000 (0)\n-65F34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+66744 Compression Method    0008 (8) 'Deflated'\n+66746 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6674A CRC                   18AD9BF8 (414030840)\n+6674E Compressed Size       0000071D (1821)\n+66752 Uncompressed Size     0000177E (6014)\n+66756 Filename Length       0033 (51)\n+66758 Extra Length          0000 (0)\n+6675A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x65F34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6675A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-65F67 PAYLOAD\n+6678D PAYLOAD\n \n-66675 LOCAL HEADER #328     04034B50 (67324752)\n-66679 Extract Zip Spec      14 (20) '2.0'\n-6667A Extract OS            00 (0) 'MS-DOS'\n-6667B General Purpose Flag  0800 (2048)\n+66EAA LOCAL HEADER #328     04034B50 (67324752)\n+66EAE Extract Zip Spec      14 (20) '2.0'\n+66EAF Extract OS            00 (0) 'MS-DOS'\n+66EB0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6667D Compression Method    0008 (8) 'Deflated'\n-6667F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-66683 CRC                   7DBCFDD1 (2109537745)\n-66687 Compressed Size       000002B9 (697)\n-6668B Uncompressed Size     0000055B (1371)\n-6668F Filename Length       0034 (52)\n-66691 Extra Length          0000 (0)\n-66693 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+66EB2 Compression Method    0008 (8) 'Deflated'\n+66EB4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+66EB8 CRC                   1BB78BFC (465013756)\n+66EBC Compressed Size       000002C1 (705)\n+66EC0 Uncompressed Size     0000057E (1406)\n+66EC4 Filename Length       0034 (52)\n+66EC6 Extra Length          0000 (0)\n+66EC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x66693: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x66EC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-666C7 PAYLOAD\n+66EFC PAYLOAD\n \n-66980 LOCAL HEADER #329     04034B50 (67324752)\n-66984 Extract Zip Spec      14 (20) '2.0'\n-66985 Extract OS            00 (0) 'MS-DOS'\n-66986 General Purpose Flag  0800 (2048)\n+671BD LOCAL HEADER #329     04034B50 (67324752)\n+671C1 Extract Zip Spec      14 (20) '2.0'\n+671C2 Extract OS            00 (0) 'MS-DOS'\n+671C3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-66988 Compression Method    0008 (8) 'Deflated'\n-6698A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6698E CRC                   3AC92564 (986260836)\n-66992 Compressed Size       0000026A (618)\n-66996 Uncompressed Size     00000464 (1124)\n-6699A Filename Length       0031 (49)\n-6699C Extra Length          0000 (0)\n-6699E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+671C5 Compression Method    0008 (8) 'Deflated'\n+671C7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+671CB CRC                   163DDCF2 (373153010)\n+671CF Compressed Size       00000272 (626)\n+671D3 Uncompressed Size     00000482 (1154)\n+671D7 Filename Length       0031 (49)\n+671D9 Extra Length          0000 (0)\n+671DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6699E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x671DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-669CF PAYLOAD\n+6720C PAYLOAD\n \n-66C39 LOCAL HEADER #330     04034B50 (67324752)\n-66C3D Extract Zip Spec      14 (20) '2.0'\n-66C3E Extract OS            00 (0) 'MS-DOS'\n-66C3F General Purpose Flag  0800 (2048)\n+6747E LOCAL HEADER #330     04034B50 (67324752)\n+67482 Extract Zip Spec      14 (20) '2.0'\n+67483 Extract OS            00 (0) 'MS-DOS'\n+67484 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-66C41 Compression Method    0008 (8) 'Deflated'\n-66C43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-66C47 CRC                   0EB290DE (246583518)\n-66C4B Compressed Size       00000339 (825)\n-66C4F Uncompressed Size     0000061E (1566)\n-66C53 Filename Length       0021 (33)\n-66C55 Extra Length          0000 (0)\n-66C57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+67486 Compression Method    0008 (8) 'Deflated'\n+67488 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6748C CRC                   6F7884D3 (1870169299)\n+67490 Compressed Size       00000341 (833)\n+67494 Uncompressed Size     0000064F (1615)\n+67498 Filename Length       0021 (33)\n+6749A Extra Length          0000 (0)\n+6749C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x66C57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6749C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-66C78 PAYLOAD\n+674BD PAYLOAD\n \n-66FB1 LOCAL HEADER #331     04034B50 (67324752)\n-66FB5 Extract Zip Spec      14 (20) '2.0'\n-66FB6 Extract OS            00 (0) 'MS-DOS'\n-66FB7 General Purpose Flag  0800 (2048)\n+677FE LOCAL HEADER #331     04034B50 (67324752)\n+67802 Extract Zip Spec      14 (20) '2.0'\n+67803 Extract OS            00 (0) 'MS-DOS'\n+67804 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-66FB9 Compression Method    0008 (8) 'Deflated'\n-66FBB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-66FBF CRC                   2A1C7A3B (706509371)\n-66FC3 Compressed Size       000003DE (990)\n-66FC7 Uncompressed Size     000008DC (2268)\n-66FCB Filename Length       002B (43)\n-66FCD Extra Length          0000 (0)\n-66FCF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+67806 Compression Method    0008 (8) 'Deflated'\n+67808 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6780C CRC                   7837B4D1 (2016916689)\n+67810 Compressed Size       000003EA (1002)\n+67814 Uncompressed Size     0000091E (2334)\n+67818 Filename Length       002B (43)\n+6781A Extra Length          0000 (0)\n+6781C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x66FCF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6781C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-66FFA PAYLOAD\n+67847 PAYLOAD\n \n-673D8 LOCAL HEADER #332     04034B50 (67324752)\n-673DC Extract Zip Spec      14 (20) '2.0'\n-673DD Extract OS            00 (0) 'MS-DOS'\n-673DE General Purpose Flag  0800 (2048)\n+67C31 LOCAL HEADER #332     04034B50 (67324752)\n+67C35 Extract Zip Spec      14 (20) '2.0'\n+67C36 Extract OS            00 (0) 'MS-DOS'\n+67C37 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-673E0 Compression Method    0008 (8) 'Deflated'\n-673E2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-673E6 CRC                   3A57EAC8 (978840264)\n-673EA Compressed Size       000005CE (1486)\n-673EE Uncompressed Size     0000126A (4714)\n-673F2 Filename Length       0029 (41)\n-673F4 Extra Length          0000 (0)\n-673F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+67C39 Compression Method    0008 (8) 'Deflated'\n+67C3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+67C3F CRC                   1FC70E2E (533138990)\n+67C43 Compressed Size       000005DC (1500)\n+67C47 Uncompressed Size     000012E0 (4832)\n+67C4B Filename Length       0029 (41)\n+67C4D Extra Length          0000 (0)\n+67C4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x673F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x67C4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6741F PAYLOAD\n+67C78 PAYLOAD\n \n-679ED LOCAL HEADER #333     04034B50 (67324752)\n-679F1 Extract Zip Spec      14 (20) '2.0'\n-679F2 Extract OS            00 (0) 'MS-DOS'\n-679F3 General Purpose Flag  0800 (2048)\n+68254 LOCAL HEADER #333     04034B50 (67324752)\n+68258 Extract Zip Spec      14 (20) '2.0'\n+68259 Extract OS            00 (0) 'MS-DOS'\n+6825A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-679F5 Compression Method    0008 (8) 'Deflated'\n-679F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-679FB CRC                   B1AAD78E (2980763534)\n-679FF Compressed Size       00000262 (610)\n-67A03 Uncompressed Size     00000463 (1123)\n-67A07 Filename Length       0028 (40)\n-67A09 Extra Length          0000 (0)\n-67A0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6825C Compression Method    0008 (8) 'Deflated'\n+6825E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+68262 CRC                   34F679E6 (888568294)\n+68266 Compressed Size       0000026B (619)\n+6826A Uncompressed Size     00000485 (1157)\n+6826E Filename Length       0028 (40)\n+68270 Extra Length          0000 (0)\n+68272 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x67A0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x68272: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-67A33 PAYLOAD\n+6829A PAYLOAD\n \n-67C95 LOCAL HEADER #334     04034B50 (67324752)\n-67C99 Extract Zip Spec      14 (20) '2.0'\n-67C9A Extract OS            00 (0) 'MS-DOS'\n-67C9B General Purpose Flag  0800 (2048)\n+68505 LOCAL HEADER #334     04034B50 (67324752)\n+68509 Extract Zip Spec      14 (20) '2.0'\n+6850A Extract OS            00 (0) 'MS-DOS'\n+6850B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-67C9D Compression Method    0008 (8) 'Deflated'\n-67C9F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-67CA3 CRC                   903888C3 (2419624131)\n-67CA7 Compressed Size       00000621 (1569)\n-67CAB Uncompressed Size     0000120D (4621)\n-67CAF Filename Length       0030 (48)\n-67CB1 Extra Length          0000 (0)\n-67CB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6850D Compression Method    0008 (8) 'Deflated'\n+6850F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+68513 CRC                   A2725211 (2725401105)\n+68517 Compressed Size       0000062D (1581)\n+6851B Uncompressed Size     0000128F (4751)\n+6851F Filename Length       0030 (48)\n+68521 Extra Length          0000 (0)\n+68523 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x67CB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x68523: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-67CE3 PAYLOAD\n+68553 PAYLOAD\n \n-68304 LOCAL HEADER #335     04034B50 (67324752)\n-68308 Extract Zip Spec      14 (20) '2.0'\n-68309 Extract OS            00 (0) 'MS-DOS'\n-6830A General Purpose Flag  0800 (2048)\n+68B80 LOCAL HEADER #335     04034B50 (67324752)\n+68B84 Extract Zip Spec      14 (20) '2.0'\n+68B85 Extract OS            00 (0) 'MS-DOS'\n+68B86 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6830C Compression Method    0008 (8) 'Deflated'\n-6830E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-68312 CRC                   98A61B9D (2561022877)\n-68316 Compressed Size       00000555 (1365)\n-6831A Uncompressed Size     000014BA (5306)\n-6831E Filename Length       0026 (38)\n-68320 Extra Length          0000 (0)\n-68322 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+68B88 Compression Method    0008 (8) 'Deflated'\n+68B8A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+68B8E CRC                   646CD426 (1684853798)\n+68B92 Compressed Size       0000055F (1375)\n+68B96 Uncompressed Size     0000153D (5437)\n+68B9A Filename Length       0026 (38)\n+68B9C Extra Length          0000 (0)\n+68B9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x68322: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x68B9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-68348 PAYLOAD\n+68BC4 PAYLOAD\n \n-6889D LOCAL HEADER #336     04034B50 (67324752)\n-688A1 Extract Zip Spec      14 (20) '2.0'\n-688A2 Extract OS            00 (0) 'MS-DOS'\n-688A3 General Purpose Flag  0800 (2048)\n+69123 LOCAL HEADER #336     04034B50 (67324752)\n+69127 Extract Zip Spec      14 (20) '2.0'\n+69128 Extract OS            00 (0) 'MS-DOS'\n+69129 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-688A5 Compression Method    0008 (8) 'Deflated'\n-688A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-688AB CRC                   1AE780F7 (451379447)\n-688AF Compressed Size       00000287 (647)\n-688B3 Uncompressed Size     000004BD (1213)\n-688B7 Filename Length       0033 (51)\n-688B9 Extra Length          0000 (0)\n-688BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6912B Compression Method    0008 (8) 'Deflated'\n+6912D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+69131 CRC                   D4D0313F (3570413887)\n+69135 Compressed Size       0000028E (654)\n+69139 Uncompressed Size     000004DD (1245)\n+6913D Filename Length       0033 (51)\n+6913F Extra Length          0000 (0)\n+69141 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x688BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x69141: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-688EE PAYLOAD\n+69174 PAYLOAD\n \n-68B75 LOCAL HEADER #337     04034B50 (67324752)\n-68B79 Extract Zip Spec      14 (20) '2.0'\n-68B7A Extract OS            00 (0) 'MS-DOS'\n-68B7B General Purpose Flag  0800 (2048)\n+69402 LOCAL HEADER #337     04034B50 (67324752)\n+69406 Extract Zip Spec      14 (20) '2.0'\n+69407 Extract OS            00 (0) 'MS-DOS'\n+69408 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-68B7D Compression Method    0008 (8) 'Deflated'\n-68B7F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-68B83 CRC                   86E81518 (2263356696)\n-68B87 Compressed Size       0000022E (558)\n-68B8B Uncompressed Size     000003E4 (996)\n-68B8F Filename Length       0037 (55)\n-68B91 Extra Length          0000 (0)\n-68B93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6940A Compression Method    0008 (8) 'Deflated'\n+6940C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+69410 CRC                   63368ED1 (1664519889)\n+69414 Compressed Size       00000234 (564)\n+69418 Uncompressed Size     000003FE (1022)\n+6941C Filename Length       0037 (55)\n+6941E Extra Length          0000 (0)\n+69420 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x68B93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x69420: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-68BCA PAYLOAD\n+69457 PAYLOAD\n \n-68DF8 LOCAL HEADER #338     04034B50 (67324752)\n-68DFC Extract Zip Spec      14 (20) '2.0'\n-68DFD Extract OS            00 (0) 'MS-DOS'\n-68DFE General Purpose Flag  0800 (2048)\n+6968B LOCAL HEADER #338     04034B50 (67324752)\n+6968F Extract Zip Spec      14 (20) '2.0'\n+69690 Extract OS            00 (0) 'MS-DOS'\n+69691 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-68E00 Compression Method    0008 (8) 'Deflated'\n-68E02 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-68E06 CRC                   201D5BFC (538795004)\n-68E0A Compressed Size       00000621 (1569)\n-68E0E Uncompressed Size     000012A8 (4776)\n-68E12 Filename Length       0030 (48)\n-68E14 Extra Length          0000 (0)\n-68E16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+69693 Compression Method    0008 (8) 'Deflated'\n+69695 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+69699 CRC                   876E0335 (2272133941)\n+6969D Compressed Size       00000630 (1584)\n+696A1 Uncompressed Size     00001328 (4904)\n+696A5 Filename Length       0030 (48)\n+696A7 Extra Length          0000 (0)\n+696A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x68E16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x696A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-68E46 PAYLOAD\n+696D9 PAYLOAD\n \n-69467 LOCAL HEADER #339     04034B50 (67324752)\n-6946B Extract Zip Spec      14 (20) '2.0'\n-6946C Extract OS            00 (0) 'MS-DOS'\n-6946D General Purpose Flag  0800 (2048)\n+69D09 LOCAL HEADER #339     04034B50 (67324752)\n+69D0D Extract Zip Spec      14 (20) '2.0'\n+69D0E Extract OS            00 (0) 'MS-DOS'\n+69D0F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6946F Compression Method    0008 (8) 'Deflated'\n-69471 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-69475 CRC                   E946A330 (3913720624)\n-69479 Compressed Size       0000031F (799)\n-6947D Uncompressed Size     00000A39 (2617)\n-69481 Filename Length       002F (47)\n-69483 Extra Length          0000 (0)\n-69485 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+69D11 Compression Method    0008 (8) 'Deflated'\n+69D13 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+69D17 CRC                   1E67CB82 (510118786)\n+69D1B Compressed Size       00000327 (807)\n+69D1F Uncompressed Size     00000A90 (2704)\n+69D23 Filename Length       002F (47)\n+69D25 Extra Length          0000 (0)\n+69D27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x69485: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x69D27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-694B4 PAYLOAD\n+69D56 PAYLOAD\n \n-697D3 LOCAL HEADER #340     04034B50 (67324752)\n-697D7 Extract Zip Spec      14 (20) '2.0'\n-697D8 Extract OS            00 (0) 'MS-DOS'\n-697D9 General Purpose Flag  0800 (2048)\n+6A07D LOCAL HEADER #340     04034B50 (67324752)\n+6A081 Extract Zip Spec      14 (20) '2.0'\n+6A082 Extract OS            00 (0) 'MS-DOS'\n+6A083 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-697DB Compression Method    0008 (8) 'Deflated'\n-697DD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-697E1 CRC                   FBAECD89 (4222537097)\n-697E5 Compressed Size       00000228 (552)\n-697E9 Uncompressed Size     000003C4 (964)\n-697ED Filename Length       0036 (54)\n-697EF Extra Length          0000 (0)\n-697F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6A085 Compression Method    0008 (8) 'Deflated'\n+6A087 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6A08B CRC                   61CAA47B (1640670331)\n+6A08F Compressed Size       00000232 (562)\n+6A093 Uncompressed Size     000003DE (990)\n+6A097 Filename Length       0036 (54)\n+6A099 Extra Length          0000 (0)\n+6A09B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x697F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6A09B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-69827 PAYLOAD\n+6A0D1 PAYLOAD\n \n-69A4F LOCAL HEADER #341     04034B50 (67324752)\n-69A53 Extract Zip Spec      14 (20) '2.0'\n-69A54 Extract OS            00 (0) 'MS-DOS'\n-69A55 General Purpose Flag  0800 (2048)\n+6A303 LOCAL HEADER #341     04034B50 (67324752)\n+6A307 Extract Zip Spec      14 (20) '2.0'\n+6A308 Extract OS            00 (0) 'MS-DOS'\n+6A309 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-69A57 Compression Method    0008 (8) 'Deflated'\n-69A59 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-69A5D CRC                   E22DB581 (3794646401)\n-69A61 Compressed Size       00000472 (1138)\n-69A65 Uncompressed Size     00000BEE (3054)\n-69A69 Filename Length       0033 (51)\n-69A6B Extra Length          0000 (0)\n-69A6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6A30B Compression Method    0008 (8) 'Deflated'\n+6A30D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6A311 CRC                   607FF27E (1618997886)\n+6A315 Compressed Size       0000047D (1149)\n+6A319 Uncompressed Size     00000C53 (3155)\n+6A31D Filename Length       0033 (51)\n+6A31F Extra Length          0000 (0)\n+6A321 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x69A6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6A321: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-69AA0 PAYLOAD\n+6A354 PAYLOAD\n \n-69F12 LOCAL HEADER #342     04034B50 (67324752)\n-69F16 Extract Zip Spec      14 (20) '2.0'\n-69F17 Extract OS            00 (0) 'MS-DOS'\n-69F18 General Purpose Flag  0800 (2048)\n+6A7D1 LOCAL HEADER #342     04034B50 (67324752)\n+6A7D5 Extract Zip Spec      14 (20) '2.0'\n+6A7D6 Extract OS            00 (0) 'MS-DOS'\n+6A7D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-69F1A Compression Method    0008 (8) 'Deflated'\n-69F1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-69F20 CRC                   02426CD5 (37907669)\n-69F24 Compressed Size       0000079A (1946)\n-69F28 Uncompressed Size     00001B9D (7069)\n-69F2C Filename Length       002D (45)\n-69F2E Extra Length          0000 (0)\n-69F30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6A7D9 Compression Method    0008 (8) 'Deflated'\n+6A7DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6A7DF CRC                   7B7924E9 (2071536873)\n+6A7E3 Compressed Size       000007AC (1964)\n+6A7E7 Uncompressed Size     00001C78 (7288)\n+6A7EB Filename Length       002D (45)\n+6A7ED Extra Length          0000 (0)\n+6A7EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x69F30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6A7EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-69F5D PAYLOAD\n+6A81C PAYLOAD\n \n-6A6F7 LOCAL HEADER #343     04034B50 (67324752)\n-6A6FB Extract Zip Spec      14 (20) '2.0'\n-6A6FC Extract OS            00 (0) 'MS-DOS'\n-6A6FD General Purpose Flag  0800 (2048)\n+6AFC8 LOCAL HEADER #343     04034B50 (67324752)\n+6AFCC Extract Zip Spec      14 (20) '2.0'\n+6AFCD Extract OS            00 (0) 'MS-DOS'\n+6AFCE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6A6FF Compression Method    0008 (8) 'Deflated'\n-6A701 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6A705 CRC                   641CBA7B (1679604347)\n-6A709 Compressed Size       00000430 (1072)\n-6A70D Uncompressed Size     00000BB0 (2992)\n-6A711 Filename Length       0030 (48)\n-6A713 Extra Length          0000 (0)\n-6A715 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6AFD0 Compression Method    0008 (8) 'Deflated'\n+6AFD2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6AFD6 CRC                   707F9167 (1887408487)\n+6AFDA Compressed Size       00000439 (1081)\n+6AFDE Uncompressed Size     00000C0D (3085)\n+6AFE2 Filename Length       0030 (48)\n+6AFE4 Extra Length          0000 (0)\n+6AFE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6A715: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6AFE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6A745 PAYLOAD\n+6B016 PAYLOAD\n \n-6AB75 LOCAL HEADER #344     04034B50 (67324752)\n-6AB79 Extract Zip Spec      14 (20) '2.0'\n-6AB7A Extract OS            00 (0) 'MS-DOS'\n-6AB7B General Purpose Flag  0800 (2048)\n+6B44F LOCAL HEADER #344     04034B50 (67324752)\n+6B453 Extract Zip Spec      14 (20) '2.0'\n+6B454 Extract OS            00 (0) 'MS-DOS'\n+6B455 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6AB7D Compression Method    0008 (8) 'Deflated'\n-6AB7F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6AB83 CRC                   C652D326 (3327316774)\n-6AB87 Compressed Size       000003C2 (962)\n-6AB8B Uncompressed Size     00000A71 (2673)\n-6AB8F Filename Length       0033 (51)\n-6AB91 Extra Length          0000 (0)\n-6AB93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6B457 Compression Method    0008 (8) 'Deflated'\n+6B459 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6B45D CRC                   FDA638C9 (4255529161)\n+6B461 Compressed Size       000003CC (972)\n+6B465 Uncompressed Size     00000AC1 (2753)\n+6B469 Filename Length       0033 (51)\n+6B46B Extra Length          0000 (0)\n+6B46D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6AB93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6B46D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6ABC6 PAYLOAD\n+6B4A0 PAYLOAD\n \n-6AF88 LOCAL HEADER #345     04034B50 (67324752)\n-6AF8C Extract Zip Spec      14 (20) '2.0'\n-6AF8D Extract OS            00 (0) 'MS-DOS'\n-6AF8E General Purpose Flag  0800 (2048)\n+6B86C LOCAL HEADER #345     04034B50 (67324752)\n+6B870 Extract Zip Spec      14 (20) '2.0'\n+6B871 Extract OS            00 (0) 'MS-DOS'\n+6B872 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6AF90 Compression Method    0008 (8) 'Deflated'\n-6AF92 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6AF96 CRC                   DE4FB79A (3729766298)\n-6AF9A Compressed Size       000006C2 (1730)\n-6AF9E Uncompressed Size     00001A0D (6669)\n-6AFA2 Filename Length       002D (45)\n-6AFA4 Extra Length          0000 (0)\n-6AFA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6B874 Compression Method    0008 (8) 'Deflated'\n+6B876 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6B87A CRC                   5FA42AEE (1604594414)\n+6B87E Compressed Size       000006D0 (1744)\n+6B882 Uncompressed Size     00001ADA (6874)\n+6B886 Filename Length       002D (45)\n+6B888 Extra Length          0000 (0)\n+6B88A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6AFA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6B88A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6AFD3 PAYLOAD\n+6B8B7 PAYLOAD\n \n-6B695 LOCAL HEADER #346     04034B50 (67324752)\n-6B699 Extract Zip Spec      14 (20) '2.0'\n-6B69A Extract OS            00 (0) 'MS-DOS'\n-6B69B General Purpose Flag  0800 (2048)\n+6BF87 LOCAL HEADER #346     04034B50 (67324752)\n+6BF8B Extract Zip Spec      14 (20) '2.0'\n+6BF8C Extract OS            00 (0) 'MS-DOS'\n+6BF8D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6B69D Compression Method    0008 (8) 'Deflated'\n-6B69F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6B6A3 CRC                   C6C2FD7D (3334667645)\n-6B6A7 Compressed Size       0000056D (1389)\n-6B6AB Uncompressed Size     0000110A (4362)\n-6B6AF Filename Length       0031 (49)\n-6B6B1 Extra Length          0000 (0)\n-6B6B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6BF8F Compression Method    0008 (8) 'Deflated'\n+6BF91 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6BF95 CRC                   619FED81 (1637870977)\n+6BF99 Compressed Size       0000057C (1404)\n+6BF9D Uncompressed Size     00001181 (4481)\n+6BFA1 Filename Length       0031 (49)\n+6BFA3 Extra Length          0000 (0)\n+6BFA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6B6B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6BFA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6B6E4 PAYLOAD\n+6BFD6 PAYLOAD\n \n-6BC51 LOCAL HEADER #347     04034B50 (67324752)\n-6BC55 Extract Zip Spec      14 (20) '2.0'\n-6BC56 Extract OS            00 (0) 'MS-DOS'\n-6BC57 General Purpose Flag  0800 (2048)\n+6C552 LOCAL HEADER #347     04034B50 (67324752)\n+6C556 Extract Zip Spec      14 (20) '2.0'\n+6C557 Extract OS            00 (0) 'MS-DOS'\n+6C558 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6BC59 Compression Method    0008 (8) 'Deflated'\n-6BC5B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6BC5F CRC                   92839F02 (2458099458)\n-6BC63 Compressed Size       00000434 (1076)\n-6BC67 Uncompressed Size     00000C1C (3100)\n-6BC6B Filename Length       002F (47)\n-6BC6D Extra Length          0000 (0)\n-6BC6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6C55A Compression Method    0008 (8) 'Deflated'\n+6C55C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6C560 CRC                   E8166721 (3893782305)\n+6C564 Compressed Size       0000043F (1087)\n+6C568 Uncompressed Size     00000C82 (3202)\n+6C56C Filename Length       002F (47)\n+6C56E Extra Length          0000 (0)\n+6C570 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6BC6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6C570: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6BC9E PAYLOAD\n+6C59F PAYLOAD\n \n-6C0D2 LOCAL HEADER #348     04034B50 (67324752)\n-6C0D6 Extract Zip Spec      14 (20) '2.0'\n-6C0D7 Extract OS            00 (0) 'MS-DOS'\n-6C0D8 General Purpose Flag  0800 (2048)\n+6C9DE LOCAL HEADER #348     04034B50 (67324752)\n+6C9E2 Extract Zip Spec      14 (20) '2.0'\n+6C9E3 Extract OS            00 (0) 'MS-DOS'\n+6C9E4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6C0DA Compression Method    0008 (8) 'Deflated'\n-6C0DC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6C0E0 CRC                   ED067114 (3976622356)\n-6C0E4 Compressed Size       00000790 (1936)\n-6C0E8 Uncompressed Size     00001C7D (7293)\n-6C0EC Filename Length       0031 (49)\n-6C0EE Extra Length          0000 (0)\n-6C0F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6C9E6 Compression Method    0008 (8) 'Deflated'\n+6C9E8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6C9EC CRC                   363316B0 (909317808)\n+6C9F0 Compressed Size       000007A1 (1953)\n+6C9F4 Uncompressed Size     00001D36 (7478)\n+6C9F8 Filename Length       0031 (49)\n+6C9FA Extra Length          0000 (0)\n+6C9FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6C0F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6C9FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6C121 PAYLOAD\n+6CA2D PAYLOAD\n \n-6C8B1 LOCAL HEADER #349     04034B50 (67324752)\n-6C8B5 Extract Zip Spec      14 (20) '2.0'\n-6C8B6 Extract OS            00 (0) 'MS-DOS'\n-6C8B7 General Purpose Flag  0800 (2048)\n+6D1CE LOCAL HEADER #349     04034B50 (67324752)\n+6D1D2 Extract Zip Spec      14 (20) '2.0'\n+6D1D3 Extract OS            00 (0) 'MS-DOS'\n+6D1D4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6C8B9 Compression Method    0008 (8) 'Deflated'\n-6C8BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6C8BF CRC                   D7F884E9 (3623388393)\n-6C8C3 Compressed Size       00000204 (516)\n-6C8C7 Uncompressed Size     00000381 (897)\n-6C8CB Filename Length       002D (45)\n-6C8CD Extra Length          0000 (0)\n-6C8CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6D1D6 Compression Method    0008 (8) 'Deflated'\n+6D1D8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D1DC CRC                   8C6F354A (2356098378)\n+6D1E0 Compressed Size       0000020C (524)\n+6D1E4 Uncompressed Size     00000398 (920)\n+6D1E8 Filename Length       002D (45)\n+6D1EA Extra Length          0000 (0)\n+6D1EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6C8CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6D1EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6C8FC PAYLOAD\n+6D219 PAYLOAD\n \n-6CB00 LOCAL HEADER #350     04034B50 (67324752)\n-6CB04 Extract Zip Spec      14 (20) '2.0'\n-6CB05 Extract OS            00 (0) 'MS-DOS'\n-6CB06 General Purpose Flag  0800 (2048)\n+6D425 LOCAL HEADER #350     04034B50 (67324752)\n+6D429 Extract Zip Spec      14 (20) '2.0'\n+6D42A Extract OS            00 (0) 'MS-DOS'\n+6D42B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6CB08 Compression Method    0008 (8) 'Deflated'\n-6CB0A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6CB0E CRC                   28AB9AE3 (682334947)\n-6CB12 Compressed Size       0000023B (571)\n-6CB16 Uncompressed Size     00000411 (1041)\n-6CB1A Filename Length       002D (45)\n-6CB1C Extra Length          0000 (0)\n-6CB1E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6D42D Compression Method    0008 (8) 'Deflated'\n+6D42F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D433 CRC                   4B31CC84 (1261554820)\n+6D437 Compressed Size       00000242 (578)\n+6D43B Uncompressed Size     00000431 (1073)\n+6D43F Filename Length       002D (45)\n+6D441 Extra Length          0000 (0)\n+6D443 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6CB1E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6D443: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6CB4B PAYLOAD\n+6D470 PAYLOAD\n \n-6CD86 LOCAL HEADER #351     04034B50 (67324752)\n-6CD8A Extract Zip Spec      14 (20) '2.0'\n-6CD8B Extract OS            00 (0) 'MS-DOS'\n-6CD8C General Purpose Flag  0800 (2048)\n+6D6B2 LOCAL HEADER #351     04034B50 (67324752)\n+6D6B6 Extract Zip Spec      14 (20) '2.0'\n+6D6B7 Extract OS            00 (0) 'MS-DOS'\n+6D6B8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6CD8E Compression Method    0008 (8) 'Deflated'\n-6CD90 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6CD94 CRC                   9CAA7033 (2628415539)\n-6CD98 Compressed Size       0000023E (574)\n-6CD9C Uncompressed Size     00000426 (1062)\n-6CDA0 Filename Length       0035 (53)\n-6CDA2 Extra Length          0000 (0)\n-6CDA4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6D6BA Compression Method    0008 (8) 'Deflated'\n+6D6BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D6C0 CRC                   66AD4132 (1722630450)\n+6D6C4 Compressed Size       00000246 (582)\n+6D6C8 Uncompressed Size     00000442 (1090)\n+6D6CC Filename Length       0035 (53)\n+6D6CE Extra Length          0000 (0)\n+6D6D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6CDA4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6D6D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6CDD9 PAYLOAD\n+6D705 PAYLOAD\n \n-6D017 LOCAL HEADER #352     04034B50 (67324752)\n-6D01B Extract Zip Spec      14 (20) '2.0'\n-6D01C Extract OS            00 (0) 'MS-DOS'\n-6D01D General Purpose Flag  0800 (2048)\n+6D94B LOCAL HEADER #352     04034B50 (67324752)\n+6D94F Extract Zip Spec      14 (20) '2.0'\n+6D950 Extract OS            00 (0) 'MS-DOS'\n+6D951 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6D01F Compression Method    0008 (8) 'Deflated'\n-6D021 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D025 CRC                   C2B7ABEC (3266817004)\n-6D029 Compressed Size       0000030F (783)\n-6D02D Uncompressed Size     000007C9 (1993)\n-6D031 Filename Length       0032 (50)\n-6D033 Extra Length          0000 (0)\n-6D035 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6D953 Compression Method    0008 (8) 'Deflated'\n+6D955 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D959 CRC                   49B9FF79 (1236926329)\n+6D95D Compressed Size       00000319 (793)\n+6D961 Uncompressed Size     00000809 (2057)\n+6D965 Filename Length       0032 (50)\n+6D967 Extra Length          0000 (0)\n+6D969 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6D035: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6D969: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6D067 PAYLOAD\n+6D99B PAYLOAD\n \n-6D376 LOCAL HEADER #353     04034B50 (67324752)\n-6D37A Extract Zip Spec      14 (20) '2.0'\n-6D37B Extract OS            00 (0) 'MS-DOS'\n-6D37C General Purpose Flag  0800 (2048)\n+6DCB4 LOCAL HEADER #353     04034B50 (67324752)\n+6DCB8 Extract Zip Spec      14 (20) '2.0'\n+6DCB9 Extract OS            00 (0) 'MS-DOS'\n+6DCBA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6D37E Compression Method    0008 (8) 'Deflated'\n-6D380 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D384 CRC                   2C4FF5E6 (743437798)\n-6D388 Compressed Size       00000351 (849)\n-6D38C Uncompressed Size     0000075E (1886)\n-6D390 Filename Length       0030 (48)\n-6D392 Extra Length          0000 (0)\n-6D394 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6DCBC Compression Method    0008 (8) 'Deflated'\n+6DCBE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6DCC2 CRC                   D07DEF14 (3497914132)\n+6DCC6 Compressed Size       0000035A (858)\n+6DCCA Uncompressed Size     0000078D (1933)\n+6DCCE Filename Length       0030 (48)\n+6DCD0 Extra Length          0000 (0)\n+6DCD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6D394: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6DCD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6D3C4 PAYLOAD\n+6DD02 PAYLOAD\n \n-6D715 LOCAL HEADER #354     04034B50 (67324752)\n-6D719 Extract Zip Spec      14 (20) '2.0'\n-6D71A Extract OS            00 (0) 'MS-DOS'\n-6D71B General Purpose Flag  0800 (2048)\n+6E05C LOCAL HEADER #354     04034B50 (67324752)\n+6E060 Extract Zip Spec      14 (20) '2.0'\n+6E061 Extract OS            00 (0) 'MS-DOS'\n+6E062 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6D71D Compression Method    0008 (8) 'Deflated'\n-6D71F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D723 CRC                   420D2C18 (1108159512)\n-6D727 Compressed Size       00000240 (576)\n-6D72B Uncompressed Size     0000042C (1068)\n-6D72F Filename Length       0038 (56)\n-6D731 Extra Length          0000 (0)\n-6D733 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6E064 Compression Method    0008 (8) 'Deflated'\n+6E066 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6E06A CRC                   4AFAB67E (1257944702)\n+6E06E Compressed Size       00000247 (583)\n+6E072 Uncompressed Size     00000448 (1096)\n+6E076 Filename Length       0038 (56)\n+6E078 Extra Length          0000 (0)\n+6E07A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6D733: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E07A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6D76B PAYLOAD\n+6E0B2 PAYLOAD\n \n-6D9AB LOCAL HEADER #355     04034B50 (67324752)\n-6D9AF Extract Zip Spec      14 (20) '2.0'\n-6D9B0 Extract OS            00 (0) 'MS-DOS'\n-6D9B1 General Purpose Flag  0800 (2048)\n+6E2F9 LOCAL HEADER #355     04034B50 (67324752)\n+6E2FD Extract Zip Spec      14 (20) '2.0'\n+6E2FE Extract OS            00 (0) 'MS-DOS'\n+6E2FF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6D9B3 Compression Method    0008 (8) 'Deflated'\n-6D9B5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D9B9 CRC                   40BAC24E (1085981262)\n-6D9BD Compressed Size       000003D7 (983)\n-6D9C1 Uncompressed Size     00000B49 (2889)\n-6D9C5 Filename Length       0036 (54)\n-6D9C7 Extra Length          0000 (0)\n-6D9C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6E301 Compression Method    0008 (8) 'Deflated'\n+6E303 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6E307 CRC                   C563319A (3311612314)\n+6E30B Compressed Size       000003DF (991)\n+6E30F Uncompressed Size     00000B90 (2960)\n+6E313 Filename Length       0036 (54)\n+6E315 Extra Length          0000 (0)\n+6E317 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6D9C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E317: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6D9FF PAYLOAD\n+6E34D PAYLOAD\n \n-6DDD6 LOCAL HEADER #356     04034B50 (67324752)\n-6DDDA Extract Zip Spec      14 (20) '2.0'\n-6DDDB Extract OS            00 (0) 'MS-DOS'\n-6DDDC General Purpose Flag  0800 (2048)\n+6E72C LOCAL HEADER #356     04034B50 (67324752)\n+6E730 Extract Zip Spec      14 (20) '2.0'\n+6E731 Extract OS            00 (0) 'MS-DOS'\n+6E732 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6DDDE Compression Method    0008 (8) 'Deflated'\n-6DDE0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6DDE4 CRC                   CC5CA724 (3428624164)\n-6DDE8 Compressed Size       0000048C (1164)\n-6DDEC Uncompressed Size     0000105D (4189)\n-6DDF0 Filename Length       002F (47)\n-6DDF2 Extra Length          0000 (0)\n-6DDF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6E734 Compression Method    0008 (8) 'Deflated'\n+6E736 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6E73A CRC                   1187A07F (294101119)\n+6E73E Compressed Size       00000499 (1177)\n+6E742 Uncompressed Size     000010B8 (4280)\n+6E746 Filename Length       002F (47)\n+6E748 Extra Length          0000 (0)\n+6E74A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6DDF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E74A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6DE23 PAYLOAD\n+6E779 PAYLOAD\n \n-6E2AF LOCAL HEADER #357     04034B50 (67324752)\n-6E2B3 Extract Zip Spec      14 (20) '2.0'\n-6E2B4 Extract OS            00 (0) 'MS-DOS'\n-6E2B5 General Purpose Flag  0800 (2048)\n+6EC12 LOCAL HEADER #357     04034B50 (67324752)\n+6EC16 Extract Zip Spec      14 (20) '2.0'\n+6EC17 Extract OS            00 (0) 'MS-DOS'\n+6EC18 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E2B7 Compression Method    0008 (8) 'Deflated'\n-6E2B9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E2BD CRC                   BC0369E6 (3154340326)\n-6E2C1 Compressed Size       00000052 (82)\n-6E2C5 Uncompressed Size     000000C2 (194)\n-6E2C9 Filename Length       0041 (65)\n-6E2CB Extra Length          0000 (0)\n-6E2CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6EC1A Compression Method    0008 (8) 'Deflated'\n+6EC1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6EC20 CRC                   BC0369E6 (3154340326)\n+6EC24 Compressed Size       00000052 (82)\n+6EC28 Uncompressed Size     000000C2 (194)\n+6EC2C Filename Length       0041 (65)\n+6EC2E Extra Length          0000 (0)\n+6EC30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E2CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EC30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E30E PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6EC71 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E360 LOCAL HEADER #358     04034B50 (67324752)\n-6E364 Extract Zip Spec      14 (20) '2.0'\n-6E365 Extract OS            00 (0) 'MS-DOS'\n-6E366 General Purpose Flag  0800 (2048)\n+6ECC3 LOCAL HEADER #358     04034B50 (67324752)\n+6ECC7 Extract Zip Spec      14 (20) '2.0'\n+6ECC8 Extract OS            00 (0) 'MS-DOS'\n+6ECC9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E368 Compression Method    0008 (8) 'Deflated'\n-6E36A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E36E CRC                   193ACDA3 (423284131)\n-6E372 Compressed Size       0000005D (93)\n-6E376 Uncompressed Size     000000AE (174)\n-6E37A Filename Length       005F (95)\n-6E37C Extra Length          0000 (0)\n-6E37E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6ECCB Compression Method    0008 (8) 'Deflated'\n+6ECCD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6ECD1 CRC                   C7151CD7 (3340049623)\n+6ECD5 Compressed Size       0000005F (95)\n+6ECD9 Uncompressed Size     000000AF (175)\n+6ECDD Filename Length       005F (95)\n+6ECDF Extra Length          0000 (0)\n+6ECE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E37E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6ECE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E3DD PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6ED40 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E43A LOCAL HEADER #359     04034B50 (67324752)\n-6E43E Extract Zip Spec      14 (20) '2.0'\n-6E43F Extract OS            00 (0) 'MS-DOS'\n-6E440 General Purpose Flag  0800 (2048)\n+6ED9F LOCAL HEADER #359     04034B50 (67324752)\n+6EDA3 Extract Zip Spec      14 (20) '2.0'\n+6EDA4 Extract OS            00 (0) 'MS-DOS'\n+6EDA5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E442 Compression Method    0008 (8) 'Deflated'\n-6E444 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E448 CRC                   DA7850A4 (3665318052)\n-6E44C Compressed Size       00000064 (100)\n-6E450 Uncompressed Size     000000A3 (163)\n-6E454 Filename Length       0044 (68)\n-6E456 Extra Length          0000 (0)\n-6E458 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6EDA7 Compression Method    0008 (8) 'Deflated'\n+6EDA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6EDAD CRC                   FD9DED40 (4254985536)\n+6EDB1 Compressed Size       00000067 (103)\n+6EDB5 Uncompressed Size     000000A5 (165)\n+6EDB9 Filename Length       0044 (68)\n+6EDBB Extra Length          0000 (0)\n+6EDBD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E458: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EDBD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E49C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6EE01 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E500 LOCAL HEADER #360     04034B50 (67324752)\n-6E504 Extract Zip Spec      14 (20) '2.0'\n-6E505 Extract OS            00 (0) 'MS-DOS'\n-6E506 General Purpose Flag  0800 (2048)\n+6EE68 LOCAL HEADER #360     04034B50 (67324752)\n+6EE6C Extract Zip Spec      14 (20) '2.0'\n+6EE6D Extract OS            00 (0) 'MS-DOS'\n+6EE6E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E508 Compression Method    0008 (8) 'Deflated'\n-6E50A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E50E CRC                   99161436 (2568361014)\n-6E512 Compressed Size       000000AD (173)\n-6E516 Uncompressed Size     00000312 (786)\n-6E51A Filename Length       0041 (65)\n-6E51C Extra Length          0000 (0)\n-6E51E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6EE70 Compression Method    0008 (8) 'Deflated'\n+6EE72 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6EE76 CRC                   6F27839F (1864860575)\n+6EE7A Compressed Size       000000AF (175)\n+6EE7E Uncompressed Size     0000031C (796)\n+6EE82 Filename Length       0041 (65)\n+6EE84 Extra Length          0000 (0)\n+6EE86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E51E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EE86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E55F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6EEC7 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E60C LOCAL HEADER #361     04034B50 (67324752)\n-6E610 Extract Zip Spec      14 (20) '2.0'\n-6E611 Extract OS            00 (0) 'MS-DOS'\n-6E612 General Purpose Flag  0800 (2048)\n+6EF76 LOCAL HEADER #361     04034B50 (67324752)\n+6EF7A Extract Zip Spec      14 (20) '2.0'\n+6EF7B Extract OS            00 (0) 'MS-DOS'\n+6EF7C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E614 Compression Method    0008 (8) 'Deflated'\n-6E616 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E61A CRC                   81B9C79B (2176436123)\n-6E61E Compressed Size       000000C5 (197)\n-6E622 Uncompressed Size     000003FE (1022)\n-6E626 Filename Length       0054 (84)\n-6E628 Extra Length          0000 (0)\n-6E62A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6EF7E Compression Method    0008 (8) 'Deflated'\n+6EF80 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6EF84 CRC                   0A4E0AA7 (172886695)\n+6EF88 Compressed Size       000000C8 (200)\n+6EF8C Uncompressed Size     0000040A (1034)\n+6EF90 Filename Length       0054 (84)\n+6EF92 Extra Length          0000 (0)\n+6EF94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E62A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EF94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E67E PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6EFE8 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E743 LOCAL HEADER #362     04034B50 (67324752)\n-6E747 Extract Zip Spec      14 (20) '2.0'\n-6E748 Extract OS            00 (0) 'MS-DOS'\n-6E749 General Purpose Flag  0800 (2048)\n+6F0B0 LOCAL HEADER #362     04034B50 (67324752)\n+6F0B4 Extract Zip Spec      14 (20) '2.0'\n+6F0B5 Extract OS            00 (0) 'MS-DOS'\n+6F0B6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E74B Compression Method    0008 (8) 'Deflated'\n-6E74D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E751 CRC                   0FF999F7 (268016119)\n-6E755 Compressed Size       00000049 (73)\n-6E759 Uncompressed Size     0000008E (142)\n-6E75D Filename Length       004A (74)\n-6E75F Extra Length          0000 (0)\n-6E761 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F0B8 Compression Method    0008 (8) 'Deflated'\n+6F0BA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F0BE CRC                   0FF999F7 (268016119)\n+6F0C2 Compressed Size       00000049 (73)\n+6F0C6 Uncompressed Size     0000008E (142)\n+6F0CA Filename Length       004A (74)\n+6F0CC Extra Length          0000 (0)\n+6F0CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E761: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F0CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E7AB PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F118 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E7F4 LOCAL HEADER #363     04034B50 (67324752)\n-6E7F8 Extract Zip Spec      14 (20) '2.0'\n-6E7F9 Extract OS            00 (0) 'MS-DOS'\n-6E7FA General Purpose Flag  0800 (2048)\n+6F161 LOCAL HEADER #363     04034B50 (67324752)\n+6F165 Extract Zip Spec      14 (20) '2.0'\n+6F166 Extract OS            00 (0) 'MS-DOS'\n+6F167 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E7FC Compression Method    0008 (8) 'Deflated'\n-6E7FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E802 CRC                   9C0450EC (2617528556)\n-6E806 Compressed Size       0000003C (60)\n-6E80A Uncompressed Size     00000044 (68)\n-6E80E Filename Length       0042 (66)\n-6E810 Extra Length          0000 (0)\n-6E812 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F169 Compression Method    0008 (8) 'Deflated'\n+6F16B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F16F CRC                   9C0450EC (2617528556)\n+6F173 Compressed Size       0000003C (60)\n+6F177 Uncompressed Size     00000044 (68)\n+6F17B Filename Length       0042 (66)\n+6F17D Extra Length          0000 (0)\n+6F17F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E812: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F17F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E854 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F1C1 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E890 LOCAL HEADER #364     04034B50 (67324752)\n-6E894 Extract Zip Spec      14 (20) '2.0'\n-6E895 Extract OS            00 (0) 'MS-DOS'\n-6E896 General Purpose Flag  0800 (2048)\n+6F1FD LOCAL HEADER #364     04034B50 (67324752)\n+6F201 Extract Zip Spec      14 (20) '2.0'\n+6F202 Extract OS            00 (0) 'MS-DOS'\n+6F203 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E898 Compression Method    0008 (8) 'Deflated'\n-6E89A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E89E CRC                   56E1501D (1457606685)\n-6E8A2 Compressed Size       00000069 (105)\n-6E8A6 Uncompressed Size     00000132 (306)\n-6E8AA Filename Length       0044 (68)\n-6E8AC Extra Length          0000 (0)\n-6E8AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F205 Compression Method    0008 (8) 'Deflated'\n+6F207 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F20B CRC                   56E1501D (1457606685)\n+6F20F Compressed Size       00000069 (105)\n+6F213 Uncompressed Size     00000132 (306)\n+6F217 Filename Length       0044 (68)\n+6F219 Extra Length          0000 (0)\n+6F21B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E8AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F21B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E8F2 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F25F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6E95B LOCAL HEADER #365     04034B50 (67324752)\n-6E95F Extract Zip Spec      14 (20) '2.0'\n-6E960 Extract OS            00 (0) 'MS-DOS'\n-6E961 General Purpose Flag  0800 (2048)\n+6F2C8 LOCAL HEADER #365     04034B50 (67324752)\n+6F2CC Extract Zip Spec      14 (20) '2.0'\n+6F2CD Extract OS            00 (0) 'MS-DOS'\n+6F2CE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6E963 Compression Method    0008 (8) 'Deflated'\n-6E965 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E969 CRC                   F0F60C18 (4042656792)\n-6E96D Compressed Size       0000004A (74)\n-6E971 Uncompressed Size     00000080 (128)\n-6E975 Filename Length       0044 (68)\n-6E977 Extra Length          0000 (0)\n-6E979 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F2D0 Compression Method    0008 (8) 'Deflated'\n+6F2D2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F2D6 CRC                   F0F60C18 (4042656792)\n+6F2DA Compressed Size       0000004A (74)\n+6F2DE Uncompressed Size     00000080 (128)\n+6F2E2 Filename Length       0044 (68)\n+6F2E4 Extra Length          0000 (0)\n+6F2E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E979: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F2E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6E9BD PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F32A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6EA07 LOCAL HEADER #366     04034B50 (67324752)\n-6EA0B Extract Zip Spec      14 (20) '2.0'\n-6EA0C Extract OS            00 (0) 'MS-DOS'\n-6EA0D General Purpose Flag  0800 (2048)\n+6F374 LOCAL HEADER #366     04034B50 (67324752)\n+6F378 Extract Zip Spec      14 (20) '2.0'\n+6F379 Extract OS            00 (0) 'MS-DOS'\n+6F37A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6EA0F Compression Method    0008 (8) 'Deflated'\n-6EA11 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6EA15 CRC                   5CED5836 (1559058486)\n-6EA19 Compressed Size       00000039 (57)\n-6EA1D Uncompressed Size     0000003C (60)\n-6EA21 Filename Length       003F (63)\n-6EA23 Extra Length          0000 (0)\n-6EA25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F37C Compression Method    0008 (8) 'Deflated'\n+6F37E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F382 CRC                   5CED5836 (1559058486)\n+6F386 Compressed Size       00000039 (57)\n+6F38A Uncompressed Size     0000003C (60)\n+6F38E Filename Length       003F (63)\n+6F390 Extra Length          0000 (0)\n+6F392 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6EA25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F392: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6EA64 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F3D1 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6EA9D LOCAL HEADER #367     04034B50 (67324752)\n-6EAA1 Extract Zip Spec      14 (20) '2.0'\n-6EAA2 Extract OS            00 (0) 'MS-DOS'\n-6EAA3 General Purpose Flag  0800 (2048)\n+6F40A LOCAL HEADER #367     04034B50 (67324752)\n+6F40E Extract Zip Spec      14 (20) '2.0'\n+6F40F Extract OS            00 (0) 'MS-DOS'\n+6F410 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6EAA5 Compression Method    0008 (8) 'Deflated'\n-6EAA7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6EAAB CRC                   9C4BEDD5 (2622221781)\n-6EAAF Compressed Size       0000006A (106)\n-6EAB3 Uncompressed Size     00000129 (297)\n-6EAB7 Filename Length       0045 (69)\n-6EAB9 Extra Length          0000 (0)\n-6EABB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F412 Compression Method    0008 (8) 'Deflated'\n+6F414 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F418 CRC                   9C4BEDD5 (2622221781)\n+6F41C Compressed Size       0000006A (106)\n+6F420 Uncompressed Size     00000129 (297)\n+6F424 Filename Length       0045 (69)\n+6F426 Extra Length          0000 (0)\n+6F428 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6EABB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F428: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6EB00 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F46D PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6EB6A LOCAL HEADER #368     04034B50 (67324752)\n-6EB6E Extract Zip Spec      14 (20) '2.0'\n-6EB6F Extract OS            00 (0) 'MS-DOS'\n-6EB70 General Purpose Flag  0800 (2048)\n+6F4D7 LOCAL HEADER #368     04034B50 (67324752)\n+6F4DB Extract Zip Spec      14 (20) '2.0'\n+6F4DC Extract OS            00 (0) 'MS-DOS'\n+6F4DD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6EB72 Compression Method    0008 (8) 'Deflated'\n-6EB74 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6EB78 CRC                   BF790872 (3212380274)\n-6EB7C Compressed Size       00000047 (71)\n-6EB80 Uncompressed Size     0000004C (76)\n-6EB84 Filename Length       0055 (85)\n-6EB86 Extra Length          0000 (0)\n-6EB88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F4DF Compression Method    0008 (8) 'Deflated'\n+6F4E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F4E5 CRC                   BF790872 (3212380274)\n+6F4E9 Compressed Size       00000047 (71)\n+6F4ED Uncompressed Size     0000004C (76)\n+6F4F1 Filename Length       0055 (85)\n+6F4F3 Extra Length          0000 (0)\n+6F4F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6EB88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F4F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6EBDD PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F54A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6EC24 LOCAL HEADER #369     04034B50 (67324752)\n-6EC28 Extract Zip Spec      14 (20) '2.0'\n-6EC29 Extract OS            00 (0) 'MS-DOS'\n-6EC2A General Purpose Flag  0800 (2048)\n+6F591 LOCAL HEADER #369     04034B50 (67324752)\n+6F595 Extract Zip Spec      14 (20) '2.0'\n+6F596 Extract OS            00 (0) 'MS-DOS'\n+6F597 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6EC2C Compression Method    0008 (8) 'Deflated'\n-6EC2E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6EC32 CRC                   58896C3D (1485401149)\n-6EC36 Compressed Size       0000003F (63)\n-6EC3A Uncompressed Size     0000006C (108)\n-6EC3E Filename Length       003E (62)\n-6EC40 Extra Length          0000 (0)\n-6EC42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F599 Compression Method    0008 (8) 'Deflated'\n+6F59B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F59F CRC                   CEEAECDB (3471502555)\n+6F5A3 Compressed Size       00000040 (64)\n+6F5A7 Uncompressed Size     0000006E (110)\n+6F5AB Filename Length       003E (62)\n+6F5AD Extra Length          0000 (0)\n+6F5AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6EC42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F5AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6EC80 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F5ED PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6ECBF LOCAL HEADER #370     04034B50 (67324752)\n-6ECC3 Extract Zip Spec      14 (20) '2.0'\n-6ECC4 Extract OS            00 (0) 'MS-DOS'\n-6ECC5 General Purpose Flag  0800 (2048)\n+6F62D LOCAL HEADER #370     04034B50 (67324752)\n+6F631 Extract Zip Spec      14 (20) '2.0'\n+6F632 Extract OS            00 (0) 'MS-DOS'\n+6F633 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6ECC7 Compression Method    0008 (8) 'Deflated'\n-6ECC9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6ECCD CRC                   BA3A525C (3124384348)\n-6ECD1 Compressed Size       00000041 (65)\n-6ECD5 Uncompressed Size     00000071 (113)\n-6ECD9 Filename Length       0049 (73)\n-6ECDB Extra Length          0000 (0)\n-6ECDD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F635 Compression Method    0008 (8) 'Deflated'\n+6F637 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F63B CRC                   F822DEA4 (4163034788)\n+6F63F Compressed Size       00000042 (66)\n+6F643 Uncompressed Size     00000072 (114)\n+6F647 Filename Length       0049 (73)\n+6F649 Extra Length          0000 (0)\n+6F64B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6ECDD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F64B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6ED26 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F694 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6ED67 LOCAL HEADER #371     04034B50 (67324752)\n-6ED6B Extract Zip Spec      14 (20) '2.0'\n-6ED6C Extract OS            00 (0) 'MS-DOS'\n-6ED6D General Purpose Flag  0800 (2048)\n+6F6D6 LOCAL HEADER #371     04034B50 (67324752)\n+6F6DA Extract Zip Spec      14 (20) '2.0'\n+6F6DB Extract OS            00 (0) 'MS-DOS'\n+6F6DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6ED6F Compression Method    0008 (8) 'Deflated'\n-6ED71 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6ED75 CRC                   7CA8E715 (2091443989)\n-6ED79 Compressed Size       0000004D (77)\n-6ED7D Uncompressed Size     000000AF (175)\n-6ED81 Filename Length       0043 (67)\n-6ED83 Extra Length          0000 (0)\n-6ED85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F6DE Compression Method    0008 (8) 'Deflated'\n+6F6E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F6E4 CRC                   40B03A55 (1085291093)\n+6F6E8 Compressed Size       0000004E (78)\n+6F6EC Uncompressed Size     000000B1 (177)\n+6F6F0 Filename Length       0043 (67)\n+6F6F2 Extra Length          0000 (0)\n+6F6F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6ED85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F6F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6EDC8 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6F737 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6EE15 LOCAL HEADER #372     04034B50 (67324752)\n-6EE19 Extract Zip Spec      14 (20) '2.0'\n-6EE1A Extract OS            00 (0) 'MS-DOS'\n-6EE1B General Purpose Flag  0800 (2048)\n+6F785 LOCAL HEADER #372     04034B50 (67324752)\n+6F789 Extract Zip Spec      14 (20) '2.0'\n+6F78A Extract OS            00 (0) 'MS-DOS'\n+6F78B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6EE1D Compression Method    0008 (8) 'Deflated'\n-6EE1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6EE23 CRC                   94CE4031 (2496544817)\n-6EE27 Compressed Size       000006D2 (1746)\n-6EE2B Uncompressed Size     000011A8 (4520)\n-6EE2F Filename Length       001E (30)\n-6EE31 Extra Length          0000 (0)\n-6EE33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F78D Compression Method    0008 (8) 'Deflated'\n+6F78F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F793 CRC                   1096B4BF (278312127)\n+6F797 Compressed Size       000006E2 (1762)\n+6F79B Uncompressed Size     0000124E (4686)\n+6F79F Filename Length       001E (30)\n+6F7A1 Extra Length          0000 (0)\n+6F7A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6EE33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F7A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6EE51 PAYLOAD\n+6F7C1 PAYLOAD\n \n-6F523 LOCAL HEADER #373     04034B50 (67324752)\n-6F527 Extract Zip Spec      14 (20) '2.0'\n-6F528 Extract OS            00 (0) 'MS-DOS'\n-6F529 General Purpose Flag  0800 (2048)\n+6FEA3 LOCAL HEADER #373     04034B50 (67324752)\n+6FEA7 Extract Zip Spec      14 (20) '2.0'\n+6FEA8 Extract OS            00 (0) 'MS-DOS'\n+6FEA9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6F52B Compression Method    0008 (8) 'Deflated'\n-6F52D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6F531 CRC                   4D73DC93 (1299438739)\n-6F535 Compressed Size       000003DA (986)\n-6F539 Uncompressed Size     00000BA2 (2978)\n-6F53D Filename Length       0034 (52)\n-6F53F Extra Length          0000 (0)\n-6F541 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6FEAB Compression Method    0008 (8) 'Deflated'\n+6FEAD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6FEB1 CRC                   CDE8C563 (3454584163)\n+6FEB5 Compressed Size       000003D2 (978)\n+6FEB9 Uncompressed Size     00000B50 (2896)\n+6FEBD Filename Length       0034 (52)\n+6FEBF Extra Length          0000 (0)\n+6FEC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6F541: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6FEC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6F575 PAYLOAD\n+6FEF5 PAYLOAD\n \n-6F94F LOCAL HEADER #374     04034B50 (67324752)\n-6F953 Extract Zip Spec      14 (20) '2.0'\n-6F954 Extract OS            00 (0) 'MS-DOS'\n-6F955 General Purpose Flag  0800 (2048)\n+702C7 LOCAL HEADER #374     04034B50 (67324752)\n+702CB Extract Zip Spec      14 (20) '2.0'\n+702CC Extract OS            00 (0) 'MS-DOS'\n+702CD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6F957 Compression Method    0008 (8) 'Deflated'\n-6F959 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6F95D CRC                   295DB5AA (694007210)\n-6F961 Compressed Size       00000041 (65)\n-6F965 Uncompressed Size     00000043 (67)\n-6F969 Filename Length       003B (59)\n-6F96B Extra Length          0000 (0)\n-6F96D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+702CF Compression Method    0008 (8) 'Deflated'\n+702D1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+702D5 CRC                   295DB5AA (694007210)\n+702D9 Compressed Size       00000041 (65)\n+702DD Uncompressed Size     00000043 (67)\n+702E1 Filename Length       003B (59)\n+702E3 Extra Length          0000 (0)\n+702E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6F96D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x702E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6F9A8 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+70320 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6F9E9 CENTRAL HEADER #1     02014B50 (33639248)\n-6F9ED Created Zip Spec      14 (20) '2.0'\n-6F9EE Created OS            03 (3) 'Unix'\n-6F9EF Extract Zip Spec      14 (20) '2.0'\n-6F9F0 Extract OS            00 (0) 'MS-DOS'\n-6F9F1 General Purpose Flag  0800 (2048)\n+70361 CENTRAL HEADER #1     02014B50 (33639248)\n+70365 Created Zip Spec      14 (20) '2.0'\n+70366 Created OS            03 (3) 'Unix'\n+70367 Extract Zip Spec      14 (20) '2.0'\n+70368 Extract OS            00 (0) 'MS-DOS'\n+70369 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6F9F3 Compression Method    0008 (8) 'Deflated'\n-6F9F5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6F9F9 CRC                   A689EB18 (2794056472)\n-6F9FD Compressed Size       00000042 (66)\n-6FA01 Uncompressed Size     00000040 (64)\n-6FA05 Filename Length       0014 (20)\n-6FA07 Extra Length          0000 (0)\n-6FA09 Comment Length        0000 (0)\n-6FA0B Disk Start            0000 (0)\n-6FA0D Int File Attributes   0000 (0)\n+7036B Compression Method    0008 (8) 'Deflated'\n+7036D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70371 CRC                   A689EB18 (2794056472)\n+70375 Compressed Size       00000042 (66)\n+70379 Uncompressed Size     00000040 (64)\n+7037D Filename Length       0014 (20)\n+7037F Extra Length          0000 (0)\n+70381 Comment Length        0000 (0)\n+70383 Disk Start            0000 (0)\n+70385 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FA0F Ext File Attributes   81A40000 (2175008768)\n+70387 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-6FA13 Local Header Offset   00000000 (0)\n-6FA17 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+7038B Local Header Offset   00000000 (0)\n+7038F Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FA17: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7038F: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6FA2B CENTRAL HEADER #2     02014B50 (33639248)\n-6FA2F Created Zip Spec      14 (20) '2.0'\n-6FA30 Created OS            03 (3) 'Unix'\n-6FA31 Extract Zip Spec      0A (10) '1.0'\n-6FA32 Extract OS            00 (0) 'MS-DOS'\n-6FA33 General Purpose Flag  0800 (2048)\n+703A3 CENTRAL HEADER #2     02014B50 (33639248)\n+703A7 Created Zip Spec      14 (20) '2.0'\n+703A8 Created OS            03 (3) 'Unix'\n+703A9 Extract Zip Spec      0A (10) '1.0'\n+703AA Extract OS            00 (0) 'MS-DOS'\n+703AB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-6FA35 Compression Method    0000 (0) 'Stored'\n-6FA37 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FA3B CRC                   00000000 (0)\n-6FA3F Compressed Size       00000000 (0)\n-6FA43 Uncompressed Size     00000000 (0)\n-6FA47 Filename Length       0009 (9)\n-6FA49 Extra Length          0000 (0)\n-6FA4B Comment Length        0000 (0)\n-6FA4D Disk Start            0000 (0)\n-6FA4F Int File Attributes   0000 (0)\n+703AD Compression Method    0000 (0) 'Stored'\n+703AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+703B3 CRC                   00000000 (0)\n+703B7 Compressed Size       00000000 (0)\n+703BB Uncompressed Size     00000000 (0)\n+703BF Filename Length       0009 (9)\n+703C1 Extra Length          0000 (0)\n+703C3 Comment Length        0000 (0)\n+703C5 Disk Start            0000 (0)\n+703C7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FA51 Ext File Attributes   41ED0010 (1106051088)\n+703C9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FA55 Local Header Offset   00000074 (116)\n-6FA59 Filename              'XXXXXXXXX'\n+703CD Local Header Offset   00000074 (116)\n+703D1 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x6FA59: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x703D1: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FA59: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x703D1: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FA31: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x703A9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-6FA62 CENTRAL HEADER #3     02014B50 (33639248)\n-6FA66 Created Zip Spec      14 (20) '2.0'\n-6FA67 Created OS            03 (3) 'Unix'\n-6FA68 Extract Zip Spec      0A (10) '1.0'\n-6FA69 Extract OS            00 (0) 'MS-DOS'\n-6FA6A General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FA6C Compression Method    0000 (0) 'Stored'\n-6FA6E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FA72 CRC                   00000000 (0)\n-6FA76 Compressed Size       00000000 (0)\n-6FA7A Uncompressed Size     00000000 (0)\n-6FA7E Filename Length       0004 (4)\n-6FA80 Extra Length          0000 (0)\n-6FA82 Comment Length        0000 (0)\n-6FA84 Disk Start            0000 (0)\n-6FA86 Int File Attributes   0000 (0)\n+703DA CENTRAL HEADER #3     02014B50 (33639248)\n+703DE Created Zip Spec      14 (20) '2.0'\n+703DF Created OS            03 (3) 'Unix'\n+703E0 Extract Zip Spec      0A (10) '1.0'\n+703E1 Extract OS            00 (0) 'MS-DOS'\n+703E2 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+703E4 Compression Method    0000 (0) 'Stored'\n+703E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+703EA CRC                   00000000 (0)\n+703EE Compressed Size       00000000 (0)\n+703F2 Uncompressed Size     00000000 (0)\n+703F6 Filename Length       0004 (4)\n+703F8 Extra Length          0000 (0)\n+703FA Comment Length        0000 (0)\n+703FC Disk Start            0000 (0)\n+703FE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FA88 Ext File Attributes   41ED0010 (1106051088)\n+70400 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FA8C Local Header Offset   0000009B (155)\n-6FA90 Filename              'XXXX'\n+70404 Local Header Offset   0000009B (155)\n+70408 Filename              'XXXX'\n #\n-# WARNING: Offset 0x6FA90: Filename 'XXXX'\n+# WARNING: Offset 0x70408: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FA90: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x70408: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FA68: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x703E0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-6FA94 CENTRAL HEADER #4     02014B50 (33639248)\n-6FA98 Created Zip Spec      14 (20) '2.0'\n-6FA99 Created OS            03 (3) 'Unix'\n-6FA9A Extract Zip Spec      0A (10) '1.0'\n-6FA9B Extract OS            00 (0) 'MS-DOS'\n-6FA9C General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FA9E Compression Method    0000 (0) 'Stored'\n-6FAA0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FAA4 CRC                   00000000 (0)\n-6FAA8 Compressed Size       00000000 (0)\n-6FAAC Uncompressed Size     00000000 (0)\n-6FAB0 Filename Length       000C (12)\n-6FAB2 Extra Length          0000 (0)\n-6FAB4 Comment Length        0000 (0)\n-6FAB6 Disk Start            0000 (0)\n-6FAB8 Int File Attributes   0000 (0)\n+7040C CENTRAL HEADER #4     02014B50 (33639248)\n+70410 Created Zip Spec      14 (20) '2.0'\n+70411 Created OS            03 (3) 'Unix'\n+70412 Extract Zip Spec      0A (10) '1.0'\n+70413 Extract OS            00 (0) 'MS-DOS'\n+70414 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70416 Compression Method    0000 (0) 'Stored'\n+70418 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7041C CRC                   00000000 (0)\n+70420 Compressed Size       00000000 (0)\n+70424 Uncompressed Size     00000000 (0)\n+70428 Filename Length       000C (12)\n+7042A Extra Length          0000 (0)\n+7042C Comment Length        0000 (0)\n+7042E Disk Start            0000 (0)\n+70430 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FABA Ext File Attributes   41ED0010 (1106051088)\n+70432 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FABE Local Header Offset   000000BD (189)\n-6FAC2 Filename              'XXXXXXXXXXXX'\n+70436 Local Header Offset   000000BD (189)\n+7043A Filename              'XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FAC2: Filename 'XXXXXXXXXXXX'\n+# WARNING: Offset 0x7043A: Filename 'XXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FAC2: Directory 'XXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7043A: Directory 'XXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FA9A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXX'\n+# WARNING: Offset 0x70412: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXX'\n #\n \n-6FACE CENTRAL HEADER #5     02014B50 (33639248)\n-6FAD2 Created Zip Spec      14 (20) '2.0'\n-6FAD3 Created OS            03 (3) 'Unix'\n-6FAD4 Extract Zip Spec      0A (10) '1.0'\n-6FAD5 Extract OS            00 (0) 'MS-DOS'\n-6FAD6 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FAD8 Compression Method    0000 (0) 'Stored'\n-6FADA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FADE CRC                   00000000 (0)\n-6FAE2 Compressed Size       00000000 (0)\n-6FAE6 Uncompressed Size     00000000 (0)\n-6FAEA Filename Length       0012 (18)\n-6FAEC Extra Length          0000 (0)\n-6FAEE Comment Length        0000 (0)\n-6FAF0 Disk Start            0000 (0)\n-6FAF2 Int File Attributes   0000 (0)\n+70446 CENTRAL HEADER #5     02014B50 (33639248)\n+7044A Created Zip Spec      14 (20) '2.0'\n+7044B Created OS            03 (3) 'Unix'\n+7044C Extract Zip Spec      0A (10) '1.0'\n+7044D Extract OS            00 (0) 'MS-DOS'\n+7044E General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70450 Compression Method    0000 (0) 'Stored'\n+70452 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70456 CRC                   00000000 (0)\n+7045A Compressed Size       00000000 (0)\n+7045E Uncompressed Size     00000000 (0)\n+70462 Filename Length       0012 (18)\n+70464 Extra Length          0000 (0)\n+70466 Comment Length        0000 (0)\n+70468 Disk Start            0000 (0)\n+7046A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FAF4 Ext File Attributes   41ED0010 (1106051088)\n+7046C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FAF8 Local Header Offset   000000E7 (231)\n-6FAFC Filename              'XXXXXXXXXXXXXXXXXX'\n+70470 Local Header Offset   000000E7 (231)\n+70474 Filename              'XXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FAFC: Filename 'XXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70474: Filename 'XXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FAFC: Directory 'XXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70474: Directory 'XXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FAD4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7044C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXX'\n #\n \n-6FB0E CENTRAL HEADER #6     02014B50 (33639248)\n-6FB12 Created Zip Spec      14 (20) '2.0'\n-6FB13 Created OS            03 (3) 'Unix'\n-6FB14 Extract Zip Spec      0A (10) '1.0'\n-6FB15 Extract OS            00 (0) 'MS-DOS'\n-6FB16 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FB18 Compression Method    0000 (0) 'Stored'\n-6FB1A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FB1E CRC                   00000000 (0)\n-6FB22 Compressed Size       00000000 (0)\n-6FB26 Uncompressed Size     00000000 (0)\n-6FB2A Filename Length       0019 (25)\n-6FB2C Extra Length          0000 (0)\n-6FB2E Comment Length        0000 (0)\n-6FB30 Disk Start            0000 (0)\n-6FB32 Int File Attributes   0000 (0)\n+70486 CENTRAL HEADER #6     02014B50 (33639248)\n+7048A Created Zip Spec      14 (20) '2.0'\n+7048B Created OS            03 (3) 'Unix'\n+7048C Extract Zip Spec      0A (10) '1.0'\n+7048D Extract OS            00 (0) 'MS-DOS'\n+7048E General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70490 Compression Method    0000 (0) 'Stored'\n+70492 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70496 CRC                   00000000 (0)\n+7049A Compressed Size       00000000 (0)\n+7049E Uncompressed Size     00000000 (0)\n+704A2 Filename Length       0019 (25)\n+704A4 Extra Length          0000 (0)\n+704A6 Comment Length        0000 (0)\n+704A8 Disk Start            0000 (0)\n+704AA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FB34 Ext File Attributes   41ED0010 (1106051088)\n+704AC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FB38 Local Header Offset   00000117 (279)\n-6FB3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXX'\n+704B0 Local Header Offset   00000117 (279)\n+704B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FB3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x704B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FB3C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x704B4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FB14: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7048C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FB55 CENTRAL HEADER #7     02014B50 (33639248)\n-6FB59 Created Zip Spec      14 (20) '2.0'\n-6FB5A Created OS            03 (3) 'Unix'\n-6FB5B Extract Zip Spec      0A (10) '1.0'\n-6FB5C Extract OS            00 (0) 'MS-DOS'\n-6FB5D General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FB5F Compression Method    0000 (0) 'Stored'\n-6FB61 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FB65 CRC                   00000000 (0)\n-6FB69 Compressed Size       00000000 (0)\n-6FB6D Uncompressed Size     00000000 (0)\n-6FB71 Filename Length       0023 (35)\n-6FB73 Extra Length          0000 (0)\n-6FB75 Comment Length        0000 (0)\n-6FB77 Disk Start            0000 (0)\n-6FB79 Int File Attributes   0000 (0)\n+704CD CENTRAL HEADER #7     02014B50 (33639248)\n+704D1 Created Zip Spec      14 (20) '2.0'\n+704D2 Created OS            03 (3) 'Unix'\n+704D3 Extract Zip Spec      0A (10) '1.0'\n+704D4 Extract OS            00 (0) 'MS-DOS'\n+704D5 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+704D7 Compression Method    0000 (0) 'Stored'\n+704D9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+704DD CRC                   00000000 (0)\n+704E1 Compressed Size       00000000 (0)\n+704E5 Uncompressed Size     00000000 (0)\n+704E9 Filename Length       0023 (35)\n+704EB Extra Length          0000 (0)\n+704ED Comment Length        0000 (0)\n+704EF Disk Start            0000 (0)\n+704F1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FB7B Ext File Attributes   41ED0010 (1106051088)\n+704F3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FB7F Local Header Offset   0000014E (334)\n-6FB83 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+704F7 Local Header Offset   0000014E (334)\n+704FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FB83: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x704FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FB83: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x704FB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FB5B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x704D3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FBA6 CENTRAL HEADER #8     02014B50 (33639248)\n-6FBAA Created Zip Spec      14 (20) '2.0'\n-6FBAB Created OS            03 (3) 'Unix'\n-6FBAC Extract Zip Spec      0A (10) '1.0'\n-6FBAD Extract OS            00 (0) 'MS-DOS'\n-6FBAE General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FBB0 Compression Method    0000 (0) 'Stored'\n-6FBB2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FBB6 CRC                   00000000 (0)\n-6FBBA Compressed Size       00000000 (0)\n-6FBBE Uncompressed Size     00000000 (0)\n-6FBC2 Filename Length       0019 (25)\n-6FBC4 Extra Length          0000 (0)\n-6FBC6 Comment Length        0000 (0)\n-6FBC8 Disk Start            0000 (0)\n-6FBCA Int File Attributes   0000 (0)\n+7051E CENTRAL HEADER #8     02014B50 (33639248)\n+70522 Created Zip Spec      14 (20) '2.0'\n+70523 Created OS            03 (3) 'Unix'\n+70524 Extract Zip Spec      0A (10) '1.0'\n+70525 Extract OS            00 (0) 'MS-DOS'\n+70526 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70528 Compression Method    0000 (0) 'Stored'\n+7052A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7052E CRC                   00000000 (0)\n+70532 Compressed Size       00000000 (0)\n+70536 Uncompressed Size     00000000 (0)\n+7053A Filename Length       0019 (25)\n+7053C Extra Length          0000 (0)\n+7053E Comment Length        0000 (0)\n+70540 Disk Start            0000 (0)\n+70542 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FBCC Ext File Attributes   41ED0010 (1106051088)\n+70544 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FBD0 Local Header Offset   0000018F (399)\n-6FBD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXX'\n+70548 Local Header Offset   0000018F (399)\n+7054C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FBD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7054C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FBD4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7054C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FBAC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70524: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FBED CENTRAL HEADER #9     02014B50 (33639248)\n-6FBF1 Created Zip Spec      14 (20) '2.0'\n-6FBF2 Created OS            03 (3) 'Unix'\n-6FBF3 Extract Zip Spec      0A (10) '1.0'\n-6FBF4 Extract OS            00 (0) 'MS-DOS'\n-6FBF5 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FBF7 Compression Method    0000 (0) 'Stored'\n-6FBF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FBFD CRC                   00000000 (0)\n-6FC01 Compressed Size       00000000 (0)\n-6FC05 Uncompressed Size     00000000 (0)\n-6FC09 Filename Length       0024 (36)\n-6FC0B Extra Length          0000 (0)\n-6FC0D Comment Length        0000 (0)\n-6FC0F Disk Start            0000 (0)\n-6FC11 Int File Attributes   0000 (0)\n+70565 CENTRAL HEADER #9     02014B50 (33639248)\n+70569 Created Zip Spec      14 (20) '2.0'\n+7056A Created OS            03 (3) 'Unix'\n+7056B Extract Zip Spec      0A (10) '1.0'\n+7056C Extract OS            00 (0) 'MS-DOS'\n+7056D General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7056F Compression Method    0000 (0) 'Stored'\n+70571 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70575 CRC                   00000000 (0)\n+70579 Compressed Size       00000000 (0)\n+7057D Uncompressed Size     00000000 (0)\n+70581 Filename Length       0024 (36)\n+70583 Extra Length          0000 (0)\n+70585 Comment Length        0000 (0)\n+70587 Disk Start            0000 (0)\n+70589 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FC13 Ext File Attributes   41ED0010 (1106051088)\n+7058B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FC17 Local Header Offset   000001C6 (454)\n-6FC1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7058F Local Header Offset   000001C6 (454)\n+70593 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FC1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70593: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FC1B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70593: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FBF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7056B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FC3F CENTRAL HEADER #10    02014B50 (33639248)\n-6FC43 Created Zip Spec      14 (20) '2.0'\n-6FC44 Created OS            03 (3) 'Unix'\n-6FC45 Extract Zip Spec      0A (10) '1.0'\n-6FC46 Extract OS            00 (0) 'MS-DOS'\n-6FC47 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FC49 Compression Method    0000 (0) 'Stored'\n-6FC4B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FC4F CRC                   00000000 (0)\n-6FC53 Compressed Size       00000000 (0)\n-6FC57 Uncompressed Size     00000000 (0)\n-6FC5B Filename Length       0004 (4)\n-6FC5D Extra Length          0000 (0)\n-6FC5F Comment Length        0000 (0)\n-6FC61 Disk Start            0000 (0)\n-6FC63 Int File Attributes   0000 (0)\n+705B7 CENTRAL HEADER #10    02014B50 (33639248)\n+705BB Created Zip Spec      14 (20) '2.0'\n+705BC Created OS            03 (3) 'Unix'\n+705BD Extract Zip Spec      0A (10) '1.0'\n+705BE Extract OS            00 (0) 'MS-DOS'\n+705BF General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+705C1 Compression Method    0000 (0) 'Stored'\n+705C3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+705C7 CRC                   00000000 (0)\n+705CB Compressed Size       00000000 (0)\n+705CF Uncompressed Size     00000000 (0)\n+705D3 Filename Length       0004 (4)\n+705D5 Extra Length          0000 (0)\n+705D7 Comment Length        0000 (0)\n+705D9 Disk Start            0000 (0)\n+705DB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FC65 Ext File Attributes   41ED0010 (1106051088)\n+705DD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FC69 Local Header Offset   00000208 (520)\n-6FC6D Filename              'XXXX'\n+705E1 Local Header Offset   00000208 (520)\n+705E5 Filename              'XXXX'\n #\n-# WARNING: Offset 0x6FC6D: Filename 'XXXX'\n+# WARNING: Offset 0x705E5: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FC6D: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x705E5: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FC45: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x705BD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-6FC71 CENTRAL HEADER #11    02014B50 (33639248)\n-6FC75 Created Zip Spec      14 (20) '2.0'\n-6FC76 Created OS            03 (3) 'Unix'\n-6FC77 Extract Zip Spec      0A (10) '1.0'\n-6FC78 Extract OS            00 (0) 'MS-DOS'\n-6FC79 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FC7B Compression Method    0000 (0) 'Stored'\n-6FC7D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FC81 CRC                   00000000 (0)\n-6FC85 Compressed Size       00000000 (0)\n-6FC89 Uncompressed Size     00000000 (0)\n-6FC8D Filename Length       000B (11)\n-6FC8F Extra Length          0000 (0)\n-6FC91 Comment Length        0000 (0)\n-6FC93 Disk Start            0000 (0)\n-6FC95 Int File Attributes   0000 (0)\n+705E9 CENTRAL HEADER #11    02014B50 (33639248)\n+705ED Created Zip Spec      14 (20) '2.0'\n+705EE Created OS            03 (3) 'Unix'\n+705EF Extract Zip Spec      0A (10) '1.0'\n+705F0 Extract OS            00 (0) 'MS-DOS'\n+705F1 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+705F3 Compression Method    0000 (0) 'Stored'\n+705F5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+705F9 CRC                   00000000 (0)\n+705FD Compressed Size       00000000 (0)\n+70601 Uncompressed Size     00000000 (0)\n+70605 Filename Length       000B (11)\n+70607 Extra Length          0000 (0)\n+70609 Comment Length        0000 (0)\n+7060B Disk Start            0000 (0)\n+7060D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FC97 Ext File Attributes   41ED0010 (1106051088)\n+7060F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FC9B Local Header Offset   0000022A (554)\n-6FC9F Filename              'XXXXXXXXXXX'\n+70613 Local Header Offset   0000022A (554)\n+70617 Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FC9F: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x70617: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FC9F: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70617: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FC77: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x705EF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-6FCAA CENTRAL HEADER #12    02014B50 (33639248)\n-6FCAE Created Zip Spec      14 (20) '2.0'\n-6FCAF Created OS            03 (3) 'Unix'\n-6FCB0 Extract Zip Spec      0A (10) '1.0'\n-6FCB1 Extract OS            00 (0) 'MS-DOS'\n-6FCB2 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FCB4 Compression Method    0000 (0) 'Stored'\n-6FCB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FCBA CRC                   00000000 (0)\n-6FCBE Compressed Size       00000000 (0)\n-6FCC2 Uncompressed Size     00000000 (0)\n-6FCC6 Filename Length       0011 (17)\n-6FCC8 Extra Length          0000 (0)\n-6FCCA Comment Length        0000 (0)\n-6FCCC Disk Start            0000 (0)\n-6FCCE Int File Attributes   0000 (0)\n+70622 CENTRAL HEADER #12    02014B50 (33639248)\n+70626 Created Zip Spec      14 (20) '2.0'\n+70627 Created OS            03 (3) 'Unix'\n+70628 Extract Zip Spec      0A (10) '1.0'\n+70629 Extract OS            00 (0) 'MS-DOS'\n+7062A General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7062C Compression Method    0000 (0) 'Stored'\n+7062E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70632 CRC                   00000000 (0)\n+70636 Compressed Size       00000000 (0)\n+7063A Uncompressed Size     00000000 (0)\n+7063E Filename Length       0011 (17)\n+70640 Extra Length          0000 (0)\n+70642 Comment Length        0000 (0)\n+70644 Disk Start            0000 (0)\n+70646 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FCD0 Ext File Attributes   41ED0010 (1106051088)\n+70648 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FCD4 Local Header Offset   00000253 (595)\n-6FCD8 Filename              'XXXXXXXXXXXXXXXXX'\n+7064C Local Header Offset   00000253 (595)\n+70650 Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FCD8: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70650: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FCD8: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70650: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FCB0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70628: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-6FCE9 CENTRAL HEADER #13    02014B50 (33639248)\n-6FCED Created Zip Spec      14 (20) '2.0'\n-6FCEE Created OS            03 (3) 'Unix'\n-6FCEF Extract Zip Spec      0A (10) '1.0'\n-6FCF0 Extract OS            00 (0) 'MS-DOS'\n-6FCF1 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FCF3 Compression Method    0000 (0) 'Stored'\n-6FCF5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FCF9 CRC                   00000000 (0)\n-6FCFD Compressed Size       00000000 (0)\n-6FD01 Uncompressed Size     00000000 (0)\n-6FD05 Filename Length       0018 (24)\n-6FD07 Extra Length          0000 (0)\n-6FD09 Comment Length        0000 (0)\n-6FD0B Disk Start            0000 (0)\n-6FD0D Int File Attributes   0000 (0)\n+70661 CENTRAL HEADER #13    02014B50 (33639248)\n+70665 Created Zip Spec      14 (20) '2.0'\n+70666 Created OS            03 (3) 'Unix'\n+70667 Extract Zip Spec      0A (10) '1.0'\n+70668 Extract OS            00 (0) 'MS-DOS'\n+70669 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7066B Compression Method    0000 (0) 'Stored'\n+7066D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70671 CRC                   00000000 (0)\n+70675 Compressed Size       00000000 (0)\n+70679 Uncompressed Size     00000000 (0)\n+7067D Filename Length       0018 (24)\n+7067F Extra Length          0000 (0)\n+70681 Comment Length        0000 (0)\n+70683 Disk Start            0000 (0)\n+70685 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FD0F Ext File Attributes   41ED0010 (1106051088)\n+70687 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FD13 Local Header Offset   00000282 (642)\n-6FD17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+7068B Local Header Offset   00000282 (642)\n+7068F Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FD17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7068F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FD17: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7068F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FCEF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70667: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FD2F CENTRAL HEADER #14    02014B50 (33639248)\n-6FD33 Created Zip Spec      14 (20) '2.0'\n-6FD34 Created OS            03 (3) 'Unix'\n-6FD35 Extract Zip Spec      0A (10) '1.0'\n-6FD36 Extract OS            00 (0) 'MS-DOS'\n-6FD37 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FD39 Compression Method    0000 (0) 'Stored'\n-6FD3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FD3F CRC                   00000000 (0)\n-6FD43 Compressed Size       00000000 (0)\n-6FD47 Uncompressed Size     00000000 (0)\n-6FD4B Filename Length       0021 (33)\n-6FD4D Extra Length          0000 (0)\n-6FD4F Comment Length        0000 (0)\n-6FD51 Disk Start            0000 (0)\n-6FD53 Int File Attributes   0000 (0)\n+706A7 CENTRAL HEADER #14    02014B50 (33639248)\n+706AB Created Zip Spec      14 (20) '2.0'\n+706AC Created OS            03 (3) 'Unix'\n+706AD Extract Zip Spec      0A (10) '1.0'\n+706AE Extract OS            00 (0) 'MS-DOS'\n+706AF General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+706B1 Compression Method    0000 (0) 'Stored'\n+706B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+706B7 CRC                   00000000 (0)\n+706BB Compressed Size       00000000 (0)\n+706BF Uncompressed Size     00000000 (0)\n+706C3 Filename Length       0021 (33)\n+706C5 Extra Length          0000 (0)\n+706C7 Comment Length        0000 (0)\n+706C9 Disk Start            0000 (0)\n+706CB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FD55 Ext File Attributes   41ED0010 (1106051088)\n+706CD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FD59 Local Header Offset   000002B8 (696)\n-6FD5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+706D1 Local Header Offset   000002B8 (696)\n+706D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FD5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x706D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FD5D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x706D5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FD35: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x706AD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FD7E CENTRAL HEADER #15    02014B50 (33639248)\n-6FD82 Created Zip Spec      14 (20) '2.0'\n-6FD83 Created OS            03 (3) 'Unix'\n-6FD84 Extract Zip Spec      0A (10) '1.0'\n-6FD85 Extract OS            00 (0) 'MS-DOS'\n-6FD86 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FD88 Compression Method    0000 (0) 'Stored'\n-6FD8A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FD8E CRC                   00000000 (0)\n-6FD92 Compressed Size       00000000 (0)\n-6FD96 Uncompressed Size     00000000 (0)\n-6FD9A Filename Length       0021 (33)\n-6FD9C Extra Length          0000 (0)\n-6FD9E Comment Length        0000 (0)\n-6FDA0 Disk Start            0000 (0)\n-6FDA2 Int File Attributes   0000 (0)\n+706F6 CENTRAL HEADER #15    02014B50 (33639248)\n+706FA Created Zip Spec      14 (20) '2.0'\n+706FB Created OS            03 (3) 'Unix'\n+706FC Extract Zip Spec      0A (10) '1.0'\n+706FD Extract OS            00 (0) 'MS-DOS'\n+706FE General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70700 Compression Method    0000 (0) 'Stored'\n+70702 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70706 CRC                   00000000 (0)\n+7070A Compressed Size       00000000 (0)\n+7070E Uncompressed Size     00000000 (0)\n+70712 Filename Length       0021 (33)\n+70714 Extra Length          0000 (0)\n+70716 Comment Length        0000 (0)\n+70718 Disk Start            0000 (0)\n+7071A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FDA4 Ext File Attributes   41ED0010 (1106051088)\n+7071C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FDA8 Local Header Offset   000002F7 (759)\n-6FDAC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70720 Local Header Offset   000002F7 (759)\n+70724 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FDAC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70724: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FDAC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70724: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FD84: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x706FC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FDCD CENTRAL HEADER #16    02014B50 (33639248)\n-6FDD1 Created Zip Spec      14 (20) '2.0'\n-6FDD2 Created OS            03 (3) 'Unix'\n-6FDD3 Extract Zip Spec      0A (10) '1.0'\n-6FDD4 Extract OS            00 (0) 'MS-DOS'\n-6FDD5 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FDD7 Compression Method    0000 (0) 'Stored'\n-6FDD9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FDDD CRC                   00000000 (0)\n-6FDE1 Compressed Size       00000000 (0)\n-6FDE5 Uncompressed Size     00000000 (0)\n-6FDE9 Filename Length       0021 (33)\n-6FDEB Extra Length          0000 (0)\n-6FDED Comment Length        0000 (0)\n-6FDEF Disk Start            0000 (0)\n-6FDF1 Int File Attributes   0000 (0)\n+70745 CENTRAL HEADER #16    02014B50 (33639248)\n+70749 Created Zip Spec      14 (20) '2.0'\n+7074A Created OS            03 (3) 'Unix'\n+7074B Extract Zip Spec      0A (10) '1.0'\n+7074C Extract OS            00 (0) 'MS-DOS'\n+7074D General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7074F Compression Method    0000 (0) 'Stored'\n+70751 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70755 CRC                   00000000 (0)\n+70759 Compressed Size       00000000 (0)\n+7075D Uncompressed Size     00000000 (0)\n+70761 Filename Length       0021 (33)\n+70763 Extra Length          0000 (0)\n+70765 Comment Length        0000 (0)\n+70767 Disk Start            0000 (0)\n+70769 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FDF3 Ext File Attributes   41ED0010 (1106051088)\n+7076B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FDF7 Local Header Offset   00000336 (822)\n-6FDFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7076F Local Header Offset   00000336 (822)\n+70773 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FDFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70773: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FDFB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70773: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FDD3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7074B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FE1C CENTRAL HEADER #17    02014B50 (33639248)\n-6FE20 Created Zip Spec      14 (20) '2.0'\n-6FE21 Created OS            03 (3) 'Unix'\n-6FE22 Extract Zip Spec      0A (10) '1.0'\n-6FE23 Extract OS            00 (0) 'MS-DOS'\n-6FE24 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FE26 Compression Method    0000 (0) 'Stored'\n-6FE28 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FE2C CRC                   00000000 (0)\n-6FE30 Compressed Size       00000000 (0)\n-6FE34 Uncompressed Size     00000000 (0)\n-6FE38 Filename Length       0029 (41)\n-6FE3A Extra Length          0000 (0)\n-6FE3C Comment Length        0000 (0)\n-6FE3E Disk Start            0000 (0)\n-6FE40 Int File Attributes   0000 (0)\n+70794 CENTRAL HEADER #17    02014B50 (33639248)\n+70798 Created Zip Spec      14 (20) '2.0'\n+70799 Created OS            03 (3) 'Unix'\n+7079A Extract Zip Spec      0A (10) '1.0'\n+7079B Extract OS            00 (0) 'MS-DOS'\n+7079C General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7079E Compression Method    0000 (0) 'Stored'\n+707A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+707A4 CRC                   00000000 (0)\n+707A8 Compressed Size       00000000 (0)\n+707AC Uncompressed Size     00000000 (0)\n+707B0 Filename Length       0029 (41)\n+707B2 Extra Length          0000 (0)\n+707B4 Comment Length        0000 (0)\n+707B6 Disk Start            0000 (0)\n+707B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FE42 Ext File Attributes   41ED0010 (1106051088)\n+707BA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FE46 Local Header Offset   00000375 (885)\n-6FE4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+707BE Local Header Offset   00000375 (885)\n+707C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FE4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x707C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FE4A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x707C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FE22: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7079A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FE73 CENTRAL HEADER #18    02014B50 (33639248)\n-6FE77 Created Zip Spec      14 (20) '2.0'\n-6FE78 Created OS            03 (3) 'Unix'\n-6FE79 Extract Zip Spec      0A (10) '1.0'\n-6FE7A Extract OS            00 (0) 'MS-DOS'\n-6FE7B General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FE7D Compression Method    0000 (0) 'Stored'\n-6FE7F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FE83 CRC                   00000000 (0)\n-6FE87 Compressed Size       00000000 (0)\n-6FE8B Uncompressed Size     00000000 (0)\n-6FE8F Filename Length       001F (31)\n-6FE91 Extra Length          0000 (0)\n-6FE93 Comment Length        0000 (0)\n-6FE95 Disk Start            0000 (0)\n-6FE97 Int File Attributes   0000 (0)\n+707EB CENTRAL HEADER #18    02014B50 (33639248)\n+707EF Created Zip Spec      14 (20) '2.0'\n+707F0 Created OS            03 (3) 'Unix'\n+707F1 Extract Zip Spec      0A (10) '1.0'\n+707F2 Extract OS            00 (0) 'MS-DOS'\n+707F3 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+707F5 Compression Method    0000 (0) 'Stored'\n+707F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+707FB CRC                   00000000 (0)\n+707FF Compressed Size       00000000 (0)\n+70803 Uncompressed Size     00000000 (0)\n+70807 Filename Length       001F (31)\n+70809 Extra Length          0000 (0)\n+7080B Comment Length        0000 (0)\n+7080D Disk Start            0000 (0)\n+7080F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FE99 Ext File Attributes   41ED0010 (1106051088)\n+70811 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FE9D Local Header Offset   000003BC (956)\n-6FEA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70815 Local Header Offset   000003BC (956)\n+70819 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FEA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70819: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FEA1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70819: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FE79: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x707F1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FEC0 CENTRAL HEADER #19    02014B50 (33639248)\n-6FEC4 Created Zip Spec      14 (20) '2.0'\n-6FEC5 Created OS            03 (3) 'Unix'\n-6FEC6 Extract Zip Spec      0A (10) '1.0'\n-6FEC7 Extract OS            00 (0) 'MS-DOS'\n-6FEC8 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FECA Compression Method    0000 (0) 'Stored'\n-6FECC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FED0 CRC                   00000000 (0)\n-6FED4 Compressed Size       00000000 (0)\n-6FED8 Uncompressed Size     00000000 (0)\n-6FEDC Filename Length       002C (44)\n-6FEDE Extra Length          0000 (0)\n-6FEE0 Comment Length        0000 (0)\n-6FEE2 Disk Start            0000 (0)\n-6FEE4 Int File Attributes   0000 (0)\n+70838 CENTRAL HEADER #19    02014B50 (33639248)\n+7083C Created Zip Spec      14 (20) '2.0'\n+7083D Created OS            03 (3) 'Unix'\n+7083E Extract Zip Spec      0A (10) '1.0'\n+7083F Extract OS            00 (0) 'MS-DOS'\n+70840 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70842 Compression Method    0000 (0) 'Stored'\n+70844 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70848 CRC                   00000000 (0)\n+7084C Compressed Size       00000000 (0)\n+70850 Uncompressed Size     00000000 (0)\n+70854 Filename Length       002C (44)\n+70856 Extra Length          0000 (0)\n+70858 Comment Length        0000 (0)\n+7085A Disk Start            0000 (0)\n+7085C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FEE6 Ext File Attributes   41ED0010 (1106051088)\n+7085E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FEEA Local Header Offset   000003F9 (1017)\n-6FEEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70862 Local Header Offset   000003F9 (1017)\n+70866 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FEEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70866: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FEEE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70866: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FEC6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7083E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FF1A CENTRAL HEADER #20    02014B50 (33639248)\n-6FF1E Created Zip Spec      14 (20) '2.0'\n-6FF1F Created OS            03 (3) 'Unix'\n-6FF20 Extract Zip Spec      0A (10) '1.0'\n-6FF21 Extract OS            00 (0) 'MS-DOS'\n-6FF22 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FF24 Compression Method    0000 (0) 'Stored'\n-6FF26 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FF2A CRC                   00000000 (0)\n-6FF2E Compressed Size       00000000 (0)\n-6FF32 Uncompressed Size     00000000 (0)\n-6FF36 Filename Length       0031 (49)\n-6FF38 Extra Length          0000 (0)\n-6FF3A Comment Length        0000 (0)\n-6FF3C Disk Start            0000 (0)\n-6FF3E Int File Attributes   0000 (0)\n+70892 CENTRAL HEADER #20    02014B50 (33639248)\n+70896 Created Zip Spec      14 (20) '2.0'\n+70897 Created OS            03 (3) 'Unix'\n+70898 Extract Zip Spec      0A (10) '1.0'\n+70899 Extract OS            00 (0) 'MS-DOS'\n+7089A General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7089C Compression Method    0000 (0) 'Stored'\n+7089E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+708A2 CRC                   00000000 (0)\n+708A6 Compressed Size       00000000 (0)\n+708AA Uncompressed Size     00000000 (0)\n+708AE Filename Length       0031 (49)\n+708B0 Extra Length          0000 (0)\n+708B2 Comment Length        0000 (0)\n+708B4 Disk Start            0000 (0)\n+708B6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FF40 Ext File Attributes   41ED0010 (1106051088)\n+708B8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FF44 Local Header Offset   00000443 (1091)\n-6FF48 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+708BC Local Header Offset   00000443 (1091)\n+708C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FF48: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x708C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FF48: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x708C0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FF20: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70898: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FF79 CENTRAL HEADER #21    02014B50 (33639248)\n-6FF7D Created Zip Spec      14 (20) '2.0'\n-6FF7E Created OS            03 (3) 'Unix'\n-6FF7F Extract Zip Spec      0A (10) '1.0'\n-6FF80 Extract OS            00 (0) 'MS-DOS'\n-6FF81 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FF83 Compression Method    0000 (0) 'Stored'\n-6FF85 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FF89 CRC                   00000000 (0)\n-6FF8D Compressed Size       00000000 (0)\n-6FF91 Uncompressed Size     00000000 (0)\n-6FF95 Filename Length       0030 (48)\n-6FF97 Extra Length          0000 (0)\n-6FF99 Comment Length        0000 (0)\n-6FF9B Disk Start            0000 (0)\n-6FF9D Int File Attributes   0000 (0)\n+708F1 CENTRAL HEADER #21    02014B50 (33639248)\n+708F5 Created Zip Spec      14 (20) '2.0'\n+708F6 Created OS            03 (3) 'Unix'\n+708F7 Extract Zip Spec      0A (10) '1.0'\n+708F8 Extract OS            00 (0) 'MS-DOS'\n+708F9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+708FB Compression Method    0000 (0) 'Stored'\n+708FD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70901 CRC                   00000000 (0)\n+70905 Compressed Size       00000000 (0)\n+70909 Uncompressed Size     00000000 (0)\n+7090D Filename Length       0030 (48)\n+7090F Extra Length          0000 (0)\n+70911 Comment Length        0000 (0)\n+70913 Disk Start            0000 (0)\n+70915 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FF9F Ext File Attributes   41ED0010 (1106051088)\n+70917 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-6FFA3 Local Header Offset   00000492 (1170)\n-6FFA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7091B Local Header Offset   00000492 (1170)\n+7091F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FFA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7091F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FFA7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7091F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FF7F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x708F7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FFD7 CENTRAL HEADER #22    02014B50 (33639248)\n-6FFDB Created Zip Spec      14 (20) '2.0'\n-6FFDC Created OS            03 (3) 'Unix'\n-6FFDD Extract Zip Spec      0A (10) '1.0'\n-6FFDE Extract OS            00 (0) 'MS-DOS'\n-6FFDF General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-6FFE1 Compression Method    0000 (0) 'Stored'\n-6FFE3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FFE7 CRC                   00000000 (0)\n-6FFEB Compressed Size       00000000 (0)\n-6FFEF Uncompressed Size     00000000 (0)\n-6FFF3 Filename Length       0034 (52)\n-6FFF5 Extra Length          0000 (0)\n-6FFF7 Comment Length        0000 (0)\n-6FFF9 Disk Start            0000 (0)\n-6FFFB Int File Attributes   0000 (0)\n+7094F CENTRAL HEADER #22    02014B50 (33639248)\n+70953 Created Zip Spec      14 (20) '2.0'\n+70954 Created OS            03 (3) 'Unix'\n+70955 Extract Zip Spec      0A (10) '1.0'\n+70956 Extract OS            00 (0) 'MS-DOS'\n+70957 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70959 Compression Method    0000 (0) 'Stored'\n+7095B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7095F CRC                   00000000 (0)\n+70963 Compressed Size       00000000 (0)\n+70967 Uncompressed Size     00000000 (0)\n+7096B Filename Length       0034 (52)\n+7096D Extra Length          0000 (0)\n+7096F Comment Length        0000 (0)\n+70971 Disk Start            0000 (0)\n+70973 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-6FFFD Ext File Attributes   41ED0010 (1106051088)\n+70975 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70001 Local Header Offset   000004E0 (1248)\n-70005 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70979 Local Header Offset   000004E0 (1248)\n+7097D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70005: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7097D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70005: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7097D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FFDD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70955: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70039 CENTRAL HEADER #23    02014B50 (33639248)\n-7003D Created Zip Spec      14 (20) '2.0'\n-7003E Created OS            03 (3) 'Unix'\n-7003F Extract Zip Spec      0A (10) '1.0'\n-70040 Extract OS            00 (0) 'MS-DOS'\n-70041 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70043 Compression Method    0000 (0) 'Stored'\n-70045 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70049 CRC                   00000000 (0)\n-7004D Compressed Size       00000000 (0)\n-70051 Uncompressed Size     00000000 (0)\n-70055 Filename Length       0022 (34)\n-70057 Extra Length          0000 (0)\n-70059 Comment Length        0000 (0)\n-7005B Disk Start            0000 (0)\n-7005D Int File Attributes   0000 (0)\n+709B1 CENTRAL HEADER #23    02014B50 (33639248)\n+709B5 Created Zip Spec      14 (20) '2.0'\n+709B6 Created OS            03 (3) 'Unix'\n+709B7 Extract Zip Spec      0A (10) '1.0'\n+709B8 Extract OS            00 (0) 'MS-DOS'\n+709B9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+709BB Compression Method    0000 (0) 'Stored'\n+709BD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+709C1 CRC                   00000000 (0)\n+709C5 Compressed Size       00000000 (0)\n+709C9 Uncompressed Size     00000000 (0)\n+709CD Filename Length       0022 (34)\n+709CF Extra Length          0000 (0)\n+709D1 Comment Length        0000 (0)\n+709D3 Disk Start            0000 (0)\n+709D5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7005F Ext File Attributes   41ED0010 (1106051088)\n+709D7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70063 Local Header Offset   00000532 (1330)\n-70067 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+709DB Local Header Offset   00000532 (1330)\n+709DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70067: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x709DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70067: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x709DF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7003F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x709B7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70089 CENTRAL HEADER #24    02014B50 (33639248)\n-7008D Created Zip Spec      14 (20) '2.0'\n-7008E Created OS            03 (3) 'Unix'\n-7008F Extract Zip Spec      0A (10) '1.0'\n-70090 Extract OS            00 (0) 'MS-DOS'\n-70091 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70093 Compression Method    0000 (0) 'Stored'\n-70095 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70099 CRC                   00000000 (0)\n-7009D Compressed Size       00000000 (0)\n-700A1 Uncompressed Size     00000000 (0)\n-700A5 Filename Length       0020 (32)\n-700A7 Extra Length          0000 (0)\n-700A9 Comment Length        0000 (0)\n-700AB Disk Start            0000 (0)\n-700AD Int File Attributes   0000 (0)\n+70A01 CENTRAL HEADER #24    02014B50 (33639248)\n+70A05 Created Zip Spec      14 (20) '2.0'\n+70A06 Created OS            03 (3) 'Unix'\n+70A07 Extract Zip Spec      0A (10) '1.0'\n+70A08 Extract OS            00 (0) 'MS-DOS'\n+70A09 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70A0B Compression Method    0000 (0) 'Stored'\n+70A0D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70A11 CRC                   00000000 (0)\n+70A15 Compressed Size       00000000 (0)\n+70A19 Uncompressed Size     00000000 (0)\n+70A1D Filename Length       0020 (32)\n+70A1F Extra Length          0000 (0)\n+70A21 Comment Length        0000 (0)\n+70A23 Disk Start            0000 (0)\n+70A25 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-700AF Ext File Attributes   41ED0010 (1106051088)\n+70A27 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-700B3 Local Header Offset   00000572 (1394)\n-700B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70A2B Local Header Offset   00000572 (1394)\n+70A2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x700B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70A2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x700B7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70A2F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7008F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70A07: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-700D7 CENTRAL HEADER #25    02014B50 (33639248)\n-700DB Created Zip Spec      14 (20) '2.0'\n-700DC Created OS            03 (3) 'Unix'\n-700DD Extract Zip Spec      0A (10) '1.0'\n-700DE Extract OS            00 (0) 'MS-DOS'\n-700DF General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-700E1 Compression Method    0000 (0) 'Stored'\n-700E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-700E7 CRC                   00000000 (0)\n-700EB Compressed Size       00000000 (0)\n-700EF Uncompressed Size     00000000 (0)\n-700F3 Filename Length       0020 (32)\n-700F5 Extra Length          0000 (0)\n-700F7 Comment Length        0000 (0)\n-700F9 Disk Start            0000 (0)\n-700FB Int File Attributes   0000 (0)\n+70A4F CENTRAL HEADER #25    02014B50 (33639248)\n+70A53 Created Zip Spec      14 (20) '2.0'\n+70A54 Created OS            03 (3) 'Unix'\n+70A55 Extract Zip Spec      0A (10) '1.0'\n+70A56 Extract OS            00 (0) 'MS-DOS'\n+70A57 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70A59 Compression Method    0000 (0) 'Stored'\n+70A5B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70A5F CRC                   00000000 (0)\n+70A63 Compressed Size       00000000 (0)\n+70A67 Uncompressed Size     00000000 (0)\n+70A6B Filename Length       0020 (32)\n+70A6D Extra Length          0000 (0)\n+70A6F Comment Length        0000 (0)\n+70A71 Disk Start            0000 (0)\n+70A73 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-700FD Ext File Attributes   41ED0010 (1106051088)\n+70A75 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70101 Local Header Offset   000005B0 (1456)\n-70105 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70A79 Local Header Offset   000005B0 (1456)\n+70A7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70105: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70A7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70105: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70A7D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x700DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70A55: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70125 CENTRAL HEADER #26    02014B50 (33639248)\n-70129 Created Zip Spec      14 (20) '2.0'\n-7012A Created OS            03 (3) 'Unix'\n-7012B Extract Zip Spec      0A (10) '1.0'\n-7012C Extract OS            00 (0) 'MS-DOS'\n-7012D General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-7012F Compression Method    0000 (0) 'Stored'\n-70131 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70135 CRC                   00000000 (0)\n-70139 Compressed Size       00000000 (0)\n-7013D Uncompressed Size     00000000 (0)\n-70141 Filename Length       0029 (41)\n-70143 Extra Length          0000 (0)\n-70145 Comment Length        0000 (0)\n-70147 Disk Start            0000 (0)\n-70149 Int File Attributes   0000 (0)\n+70A9D CENTRAL HEADER #26    02014B50 (33639248)\n+70AA1 Created Zip Spec      14 (20) '2.0'\n+70AA2 Created OS            03 (3) 'Unix'\n+70AA3 Extract Zip Spec      0A (10) '1.0'\n+70AA4 Extract OS            00 (0) 'MS-DOS'\n+70AA5 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70AA7 Compression Method    0000 (0) 'Stored'\n+70AA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70AAD CRC                   00000000 (0)\n+70AB1 Compressed Size       00000000 (0)\n+70AB5 Uncompressed Size     00000000 (0)\n+70AB9 Filename Length       0029 (41)\n+70ABB Extra Length          0000 (0)\n+70ABD Comment Length        0000 (0)\n+70ABF Disk Start            0000 (0)\n+70AC1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7014B Ext File Attributes   41ED0010 (1106051088)\n+70AC3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-7014F Local Header Offset   000005EE (1518)\n-70153 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70AC7 Local Header Offset   000005EE (1518)\n+70ACB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70153: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70ACB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70153: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70ACB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7012B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70AA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7017C CENTRAL HEADER #27    02014B50 (33639248)\n-70180 Created Zip Spec      14 (20) '2.0'\n-70181 Created OS            03 (3) 'Unix'\n-70182 Extract Zip Spec      0A (10) '1.0'\n-70183 Extract OS            00 (0) 'MS-DOS'\n-70184 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70186 Compression Method    0000 (0) 'Stored'\n-70188 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7018C CRC                   00000000 (0)\n-70190 Compressed Size       00000000 (0)\n-70194 Uncompressed Size     00000000 (0)\n-70198 Filename Length       0022 (34)\n-7019A Extra Length          0000 (0)\n-7019C Comment Length        0000 (0)\n-7019E Disk Start            0000 (0)\n-701A0 Int File Attributes   0000 (0)\n+70AF4 CENTRAL HEADER #27    02014B50 (33639248)\n+70AF8 Created Zip Spec      14 (20) '2.0'\n+70AF9 Created OS            03 (3) 'Unix'\n+70AFA Extract Zip Spec      0A (10) '1.0'\n+70AFB Extract OS            00 (0) 'MS-DOS'\n+70AFC General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70AFE Compression Method    0000 (0) 'Stored'\n+70B00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70B04 CRC                   00000000 (0)\n+70B08 Compressed Size       00000000 (0)\n+70B0C Uncompressed Size     00000000 (0)\n+70B10 Filename Length       0022 (34)\n+70B12 Extra Length          0000 (0)\n+70B14 Comment Length        0000 (0)\n+70B16 Disk Start            0000 (0)\n+70B18 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-701A2 Ext File Attributes   41ED0010 (1106051088)\n+70B1A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-701A6 Local Header Offset   00000635 (1589)\n-701AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70B1E Local Header Offset   00000635 (1589)\n+70B22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x701AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70B22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x701AA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70B22: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70182: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70AFA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-701CC CENTRAL HEADER #28    02014B50 (33639248)\n-701D0 Created Zip Spec      14 (20) '2.0'\n-701D1 Created OS            03 (3) 'Unix'\n-701D2 Extract Zip Spec      0A (10) '1.0'\n-701D3 Extract OS            00 (0) 'MS-DOS'\n-701D4 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-701D6 Compression Method    0000 (0) 'Stored'\n-701D8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-701DC CRC                   00000000 (0)\n-701E0 Compressed Size       00000000 (0)\n-701E4 Uncompressed Size     00000000 (0)\n-701E8 Filename Length       002A (42)\n-701EA Extra Length          0000 (0)\n-701EC Comment Length        0000 (0)\n-701EE Disk Start            0000 (0)\n-701F0 Int File Attributes   0000 (0)\n+70B44 CENTRAL HEADER #28    02014B50 (33639248)\n+70B48 Created Zip Spec      14 (20) '2.0'\n+70B49 Created OS            03 (3) 'Unix'\n+70B4A Extract Zip Spec      0A (10) '1.0'\n+70B4B Extract OS            00 (0) 'MS-DOS'\n+70B4C General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70B4E Compression Method    0000 (0) 'Stored'\n+70B50 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70B54 CRC                   00000000 (0)\n+70B58 Compressed Size       00000000 (0)\n+70B5C Uncompressed Size     00000000 (0)\n+70B60 Filename Length       002A (42)\n+70B62 Extra Length          0000 (0)\n+70B64 Comment Length        0000 (0)\n+70B66 Disk Start            0000 (0)\n+70B68 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-701F2 Ext File Attributes   41ED0010 (1106051088)\n+70B6A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-701F6 Local Header Offset   00000675 (1653)\n-701FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70B6E Local Header Offset   00000675 (1653)\n+70B72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x701FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70B72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x701FA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70B72: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x701D2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70B4A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70224 CENTRAL HEADER #29    02014B50 (33639248)\n-70228 Created Zip Spec      14 (20) '2.0'\n-70229 Created OS            03 (3) 'Unix'\n-7022A Extract Zip Spec      0A (10) '1.0'\n-7022B Extract OS            00 (0) 'MS-DOS'\n-7022C General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-7022E Compression Method    0000 (0) 'Stored'\n-70230 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70234 CRC                   00000000 (0)\n-70238 Compressed Size       00000000 (0)\n-7023C Uncompressed Size     00000000 (0)\n-70240 Filename Length       002A (42)\n-70242 Extra Length          0000 (0)\n-70244 Comment Length        0000 (0)\n-70246 Disk Start            0000 (0)\n-70248 Int File Attributes   0000 (0)\n+70B9C CENTRAL HEADER #29    02014B50 (33639248)\n+70BA0 Created Zip Spec      14 (20) '2.0'\n+70BA1 Created OS            03 (3) 'Unix'\n+70BA2 Extract Zip Spec      0A (10) '1.0'\n+70BA3 Extract OS            00 (0) 'MS-DOS'\n+70BA4 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70BA6 Compression Method    0000 (0) 'Stored'\n+70BA8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70BAC CRC                   00000000 (0)\n+70BB0 Compressed Size       00000000 (0)\n+70BB4 Uncompressed Size     00000000 (0)\n+70BB8 Filename Length       002A (42)\n+70BBA Extra Length          0000 (0)\n+70BBC Comment Length        0000 (0)\n+70BBE Disk Start            0000 (0)\n+70BC0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7024A Ext File Attributes   41ED0010 (1106051088)\n+70BC2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-7024E Local Header Offset   000006BD (1725)\n-70252 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70BC6 Local Header Offset   000006BD (1725)\n+70BCA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70252: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70BCA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70252: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70BCA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7022A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70BA2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7027C CENTRAL HEADER #30    02014B50 (33639248)\n-70280 Created Zip Spec      14 (20) '2.0'\n-70281 Created OS            03 (3) 'Unix'\n-70282 Extract Zip Spec      0A (10) '1.0'\n-70283 Extract OS            00 (0) 'MS-DOS'\n-70284 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70286 Compression Method    0000 (0) 'Stored'\n-70288 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7028C CRC                   00000000 (0)\n-70290 Compressed Size       00000000 (0)\n-70294 Uncompressed Size     00000000 (0)\n-70298 Filename Length       0021 (33)\n-7029A Extra Length          0000 (0)\n-7029C Comment Length        0000 (0)\n-7029E Disk Start            0000 (0)\n-702A0 Int File Attributes   0000 (0)\n+70BF4 CENTRAL HEADER #30    02014B50 (33639248)\n+70BF8 Created Zip Spec      14 (20) '2.0'\n+70BF9 Created OS            03 (3) 'Unix'\n+70BFA Extract Zip Spec      0A (10) '1.0'\n+70BFB Extract OS            00 (0) 'MS-DOS'\n+70BFC General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70BFE Compression Method    0000 (0) 'Stored'\n+70C00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70C04 CRC                   00000000 (0)\n+70C08 Compressed Size       00000000 (0)\n+70C0C Uncompressed Size     00000000 (0)\n+70C10 Filename Length       0021 (33)\n+70C12 Extra Length          0000 (0)\n+70C14 Comment Length        0000 (0)\n+70C16 Disk Start            0000 (0)\n+70C18 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-702A2 Ext File Attributes   41ED0010 (1106051088)\n+70C1A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-702A6 Local Header Offset   00000705 (1797)\n-702AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70C1E Local Header Offset   00000705 (1797)\n+70C22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x702AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70C22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x702AA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70C22: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70282: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70BFA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-702CB CENTRAL HEADER #31    02014B50 (33639248)\n-702CF Created Zip Spec      14 (20) '2.0'\n-702D0 Created OS            03 (3) 'Unix'\n-702D1 Extract Zip Spec      0A (10) '1.0'\n-702D2 Extract OS            00 (0) 'MS-DOS'\n-702D3 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-702D5 Compression Method    0000 (0) 'Stored'\n-702D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-702DB CRC                   00000000 (0)\n-702DF Compressed Size       00000000 (0)\n-702E3 Uncompressed Size     00000000 (0)\n-702E7 Filename Length       001E (30)\n-702E9 Extra Length          0000 (0)\n-702EB Comment Length        0000 (0)\n-702ED Disk Start            0000 (0)\n-702EF Int File Attributes   0000 (0)\n+70C43 CENTRAL HEADER #31    02014B50 (33639248)\n+70C47 Created Zip Spec      14 (20) '2.0'\n+70C48 Created OS            03 (3) 'Unix'\n+70C49 Extract Zip Spec      0A (10) '1.0'\n+70C4A Extract OS            00 (0) 'MS-DOS'\n+70C4B General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70C4D Compression Method    0000 (0) 'Stored'\n+70C4F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70C53 CRC                   00000000 (0)\n+70C57 Compressed Size       00000000 (0)\n+70C5B Uncompressed Size     00000000 (0)\n+70C5F Filename Length       001E (30)\n+70C61 Extra Length          0000 (0)\n+70C63 Comment Length        0000 (0)\n+70C65 Disk Start            0000 (0)\n+70C67 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-702F1 Ext File Attributes   41ED0010 (1106051088)\n+70C69 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-702F5 Local Header Offset   00000744 (1860)\n-702F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70C6D Local Header Offset   00000744 (1860)\n+70C71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x702F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70C71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x702F9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70C71: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x702D1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70C49: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70317 CENTRAL HEADER #32    02014B50 (33639248)\n-7031B Created Zip Spec      14 (20) '2.0'\n-7031C Created OS            03 (3) 'Unix'\n-7031D Extract Zip Spec      0A (10) '1.0'\n-7031E Extract OS            00 (0) 'MS-DOS'\n-7031F General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70321 Compression Method    0000 (0) 'Stored'\n-70323 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70327 CRC                   00000000 (0)\n-7032B Compressed Size       00000000 (0)\n-7032F Uncompressed Size     00000000 (0)\n-70333 Filename Length       0026 (38)\n-70335 Extra Length          0000 (0)\n-70337 Comment Length        0000 (0)\n-70339 Disk Start            0000 (0)\n-7033B Int File Attributes   0000 (0)\n+70C8F CENTRAL HEADER #32    02014B50 (33639248)\n+70C93 Created Zip Spec      14 (20) '2.0'\n+70C94 Created OS            03 (3) 'Unix'\n+70C95 Extract Zip Spec      0A (10) '1.0'\n+70C96 Extract OS            00 (0) 'MS-DOS'\n+70C97 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70C99 Compression Method    0000 (0) 'Stored'\n+70C9B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70C9F CRC                   00000000 (0)\n+70CA3 Compressed Size       00000000 (0)\n+70CA7 Uncompressed Size     00000000 (0)\n+70CAB Filename Length       0026 (38)\n+70CAD Extra Length          0000 (0)\n+70CAF Comment Length        0000 (0)\n+70CB1 Disk Start            0000 (0)\n+70CB3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7033D Ext File Attributes   41ED0010 (1106051088)\n+70CB5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70341 Local Header Offset   00000780 (1920)\n-70345 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70CB9 Local Header Offset   00000780 (1920)\n+70CBD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70345: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70CBD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70345: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70CBD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7031D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70C95: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7036B CENTRAL HEADER #33    02014B50 (33639248)\n-7036F Created Zip Spec      14 (20) '2.0'\n-70370 Created OS            03 (3) 'Unix'\n-70371 Extract Zip Spec      0A (10) '1.0'\n-70372 Extract OS            00 (0) 'MS-DOS'\n-70373 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70375 Compression Method    0000 (0) 'Stored'\n-70377 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7037B CRC                   00000000 (0)\n-7037F Compressed Size       00000000 (0)\n-70383 Uncompressed Size     00000000 (0)\n-70387 Filename Length       001B (27)\n-70389 Extra Length          0000 (0)\n-7038B Comment Length        0000 (0)\n-7038D Disk Start            0000 (0)\n-7038F Int File Attributes   0000 (0)\n+70CE3 CENTRAL HEADER #33    02014B50 (33639248)\n+70CE7 Created Zip Spec      14 (20) '2.0'\n+70CE8 Created OS            03 (3) 'Unix'\n+70CE9 Extract Zip Spec      0A (10) '1.0'\n+70CEA Extract OS            00 (0) 'MS-DOS'\n+70CEB General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70CED Compression Method    0000 (0) 'Stored'\n+70CEF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70CF3 CRC                   00000000 (0)\n+70CF7 Compressed Size       00000000 (0)\n+70CFB Uncompressed Size     00000000 (0)\n+70CFF Filename Length       001B (27)\n+70D01 Extra Length          0000 (0)\n+70D03 Comment Length        0000 (0)\n+70D05 Disk Start            0000 (0)\n+70D07 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70391 Ext File Attributes   41ED0010 (1106051088)\n+70D09 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70395 Local Header Offset   000007C4 (1988)\n-70399 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70D0D Local Header Offset   000007C4 (1988)\n+70D11 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70399: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70D11: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70399: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70D11: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70371: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70CE9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-703B4 CENTRAL HEADER #34    02014B50 (33639248)\n-703B8 Created Zip Spec      14 (20) '2.0'\n-703B9 Created OS            03 (3) 'Unix'\n-703BA Extract Zip Spec      0A (10) '1.0'\n-703BB Extract OS            00 (0) 'MS-DOS'\n-703BC General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-703BE Compression Method    0000 (0) 'Stored'\n-703C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-703C4 CRC                   00000000 (0)\n-703C8 Compressed Size       00000000 (0)\n-703CC Uncompressed Size     00000000 (0)\n-703D0 Filename Length       001D (29)\n-703D2 Extra Length          0000 (0)\n-703D4 Comment Length        0000 (0)\n-703D6 Disk Start            0000 (0)\n-703D8 Int File Attributes   0000 (0)\n+70D2C CENTRAL HEADER #34    02014B50 (33639248)\n+70D30 Created Zip Spec      14 (20) '2.0'\n+70D31 Created OS            03 (3) 'Unix'\n+70D32 Extract Zip Spec      0A (10) '1.0'\n+70D33 Extract OS            00 (0) 'MS-DOS'\n+70D34 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70D36 Compression Method    0000 (0) 'Stored'\n+70D38 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70D3C CRC                   00000000 (0)\n+70D40 Compressed Size       00000000 (0)\n+70D44 Uncompressed Size     00000000 (0)\n+70D48 Filename Length       001D (29)\n+70D4A Extra Length          0000 (0)\n+70D4C Comment Length        0000 (0)\n+70D4E Disk Start            0000 (0)\n+70D50 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-703DA Ext File Attributes   41ED0010 (1106051088)\n+70D52 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-703DE Local Header Offset   000007FD (2045)\n-703E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70D56 Local Header Offset   000007FD (2045)\n+70D5A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x703E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70D5A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x703E2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70D5A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x703BA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70D32: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-703FF CENTRAL HEADER #35    02014B50 (33639248)\n-70403 Created Zip Spec      14 (20) '2.0'\n-70404 Created OS            03 (3) 'Unix'\n-70405 Extract Zip Spec      0A (10) '1.0'\n-70406 Extract OS            00 (0) 'MS-DOS'\n-70407 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70409 Compression Method    0000 (0) 'Stored'\n-7040B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7040F CRC                   00000000 (0)\n-70413 Compressed Size       00000000 (0)\n-70417 Uncompressed Size     00000000 (0)\n-7041B Filename Length       001D (29)\n-7041D Extra Length          0000 (0)\n-7041F Comment Length        0000 (0)\n-70421 Disk Start            0000 (0)\n-70423 Int File Attributes   0000 (0)\n+70D77 CENTRAL HEADER #35    02014B50 (33639248)\n+70D7B Created Zip Spec      14 (20) '2.0'\n+70D7C Created OS            03 (3) 'Unix'\n+70D7D Extract Zip Spec      0A (10) '1.0'\n+70D7E Extract OS            00 (0) 'MS-DOS'\n+70D7F General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70D81 Compression Method    0000 (0) 'Stored'\n+70D83 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70D87 CRC                   00000000 (0)\n+70D8B Compressed Size       00000000 (0)\n+70D8F Uncompressed Size     00000000 (0)\n+70D93 Filename Length       001D (29)\n+70D95 Extra Length          0000 (0)\n+70D97 Comment Length        0000 (0)\n+70D99 Disk Start            0000 (0)\n+70D9B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70425 Ext File Attributes   41ED0010 (1106051088)\n+70D9D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70429 Local Header Offset   00000838 (2104)\n-7042D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70DA1 Local Header Offset   00000838 (2104)\n+70DA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7042D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70DA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x7042D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70DA5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70405: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70D7D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7044A CENTRAL HEADER #36    02014B50 (33639248)\n-7044E Created Zip Spec      14 (20) '2.0'\n-7044F Created OS            03 (3) 'Unix'\n-70450 Extract Zip Spec      0A (10) '1.0'\n-70451 Extract OS            00 (0) 'MS-DOS'\n-70452 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70454 Compression Method    0000 (0) 'Stored'\n-70456 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7045A CRC                   00000000 (0)\n-7045E Compressed Size       00000000 (0)\n-70462 Uncompressed Size     00000000 (0)\n-70466 Filename Length       001F (31)\n-70468 Extra Length          0000 (0)\n-7046A Comment Length        0000 (0)\n-7046C Disk Start            0000 (0)\n-7046E Int File Attributes   0000 (0)\n+70DC2 CENTRAL HEADER #36    02014B50 (33639248)\n+70DC6 Created Zip Spec      14 (20) '2.0'\n+70DC7 Created OS            03 (3) 'Unix'\n+70DC8 Extract Zip Spec      0A (10) '1.0'\n+70DC9 Extract OS            00 (0) 'MS-DOS'\n+70DCA General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70DCC Compression Method    0000 (0) 'Stored'\n+70DCE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70DD2 CRC                   00000000 (0)\n+70DD6 Compressed Size       00000000 (0)\n+70DDA Uncompressed Size     00000000 (0)\n+70DDE Filename Length       001F (31)\n+70DE0 Extra Length          0000 (0)\n+70DE2 Comment Length        0000 (0)\n+70DE4 Disk Start            0000 (0)\n+70DE6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70470 Ext File Attributes   41ED0010 (1106051088)\n+70DE8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70474 Local Header Offset   00000873 (2163)\n-70478 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70DEC Local Header Offset   00000873 (2163)\n+70DF0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70478: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70DF0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70478: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70DF0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70450: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70DC8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70497 CENTRAL HEADER #37    02014B50 (33639248)\n-7049B Created Zip Spec      14 (20) '2.0'\n-7049C Created OS            03 (3) 'Unix'\n-7049D Extract Zip Spec      0A (10) '1.0'\n-7049E Extract OS            00 (0) 'MS-DOS'\n-7049F General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-704A1 Compression Method    0000 (0) 'Stored'\n-704A3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-704A7 CRC                   00000000 (0)\n-704AB Compressed Size       00000000 (0)\n-704AF Uncompressed Size     00000000 (0)\n-704B3 Filename Length       0023 (35)\n-704B5 Extra Length          0000 (0)\n-704B7 Comment Length        0000 (0)\n-704B9 Disk Start            0000 (0)\n-704BB Int File Attributes   0000 (0)\n+70E0F CENTRAL HEADER #37    02014B50 (33639248)\n+70E13 Created Zip Spec      14 (20) '2.0'\n+70E14 Created OS            03 (3) 'Unix'\n+70E15 Extract Zip Spec      0A (10) '1.0'\n+70E16 Extract OS            00 (0) 'MS-DOS'\n+70E17 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70E19 Compression Method    0000 (0) 'Stored'\n+70E1B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70E1F CRC                   00000000 (0)\n+70E23 Compressed Size       00000000 (0)\n+70E27 Uncompressed Size     00000000 (0)\n+70E2B Filename Length       0023 (35)\n+70E2D Extra Length          0000 (0)\n+70E2F Comment Length        0000 (0)\n+70E31 Disk Start            0000 (0)\n+70E33 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-704BD Ext File Attributes   41ED0010 (1106051088)\n+70E35 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-704C1 Local Header Offset   000008B0 (2224)\n-704C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70E39 Local Header Offset   000008B0 (2224)\n+70E3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x704C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70E3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x704C5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70E3D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7049D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70E15: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-704E8 CENTRAL HEADER #38    02014B50 (33639248)\n-704EC Created Zip Spec      14 (20) '2.0'\n-704ED Created OS            03 (3) 'Unix'\n-704EE Extract Zip Spec      0A (10) '1.0'\n-704EF Extract OS            00 (0) 'MS-DOS'\n-704F0 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-704F2 Compression Method    0000 (0) 'Stored'\n-704F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-704F8 CRC                   00000000 (0)\n-704FC Compressed Size       00000000 (0)\n-70500 Uncompressed Size     00000000 (0)\n-70504 Filename Length       0023 (35)\n-70506 Extra Length          0000 (0)\n-70508 Comment Length        0000 (0)\n-7050A Disk Start            0000 (0)\n-7050C Int File Attributes   0000 (0)\n+70E60 CENTRAL HEADER #38    02014B50 (33639248)\n+70E64 Created Zip Spec      14 (20) '2.0'\n+70E65 Created OS            03 (3) 'Unix'\n+70E66 Extract Zip Spec      0A (10) '1.0'\n+70E67 Extract OS            00 (0) 'MS-DOS'\n+70E68 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70E6A Compression Method    0000 (0) 'Stored'\n+70E6C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70E70 CRC                   00000000 (0)\n+70E74 Compressed Size       00000000 (0)\n+70E78 Uncompressed Size     00000000 (0)\n+70E7C Filename Length       0023 (35)\n+70E7E Extra Length          0000 (0)\n+70E80 Comment Length        0000 (0)\n+70E82 Disk Start            0000 (0)\n+70E84 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7050E Ext File Attributes   41ED0010 (1106051088)\n+70E86 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70512 Local Header Offset   000008F1 (2289)\n-70516 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70E8A Local Header Offset   000008F1 (2289)\n+70E8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70516: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70E8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70516: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70E8E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x704EE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70E66: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70539 CENTRAL HEADER #39    02014B50 (33639248)\n-7053D Created Zip Spec      14 (20) '2.0'\n-7053E Created OS            03 (3) 'Unix'\n-7053F Extract Zip Spec      0A (10) '1.0'\n-70540 Extract OS            00 (0) 'MS-DOS'\n-70541 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70543 Compression Method    0000 (0) 'Stored'\n-70545 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70549 CRC                   00000000 (0)\n-7054D Compressed Size       00000000 (0)\n-70551 Uncompressed Size     00000000 (0)\n-70555 Filename Length       0025 (37)\n-70557 Extra Length          0000 (0)\n-70559 Comment Length        0000 (0)\n-7055B Disk Start            0000 (0)\n-7055D Int File Attributes   0000 (0)\n+70EB1 CENTRAL HEADER #39    02014B50 (33639248)\n+70EB5 Created Zip Spec      14 (20) '2.0'\n+70EB6 Created OS            03 (3) 'Unix'\n+70EB7 Extract Zip Spec      0A (10) '1.0'\n+70EB8 Extract OS            00 (0) 'MS-DOS'\n+70EB9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70EBB Compression Method    0000 (0) 'Stored'\n+70EBD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70EC1 CRC                   00000000 (0)\n+70EC5 Compressed Size       00000000 (0)\n+70EC9 Uncompressed Size     00000000 (0)\n+70ECD Filename Length       0025 (37)\n+70ECF Extra Length          0000 (0)\n+70ED1 Comment Length        0000 (0)\n+70ED3 Disk Start            0000 (0)\n+70ED5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7055F Ext File Attributes   41ED0010 (1106051088)\n+70ED7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70563 Local Header Offset   00000932 (2354)\n-70567 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70EDB Local Header Offset   00000932 (2354)\n+70EDF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70567: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70EDF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70567: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70EDF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7053F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70EB7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7058C CENTRAL HEADER #40    02014B50 (33639248)\n-70590 Created Zip Spec      14 (20) '2.0'\n-70591 Created OS            03 (3) 'Unix'\n-70592 Extract Zip Spec      0A (10) '1.0'\n-70593 Extract OS            00 (0) 'MS-DOS'\n-70594 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70596 Compression Method    0000 (0) 'Stored'\n-70598 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7059C CRC                   00000000 (0)\n-705A0 Compressed Size       00000000 (0)\n-705A4 Uncompressed Size     00000000 (0)\n-705A8 Filename Length       0026 (38)\n-705AA Extra Length          0000 (0)\n-705AC Comment Length        0000 (0)\n-705AE Disk Start            0000 (0)\n-705B0 Int File Attributes   0000 (0)\n+70F04 CENTRAL HEADER #40    02014B50 (33639248)\n+70F08 Created Zip Spec      14 (20) '2.0'\n+70F09 Created OS            03 (3) 'Unix'\n+70F0A Extract Zip Spec      0A (10) '1.0'\n+70F0B Extract OS            00 (0) 'MS-DOS'\n+70F0C General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70F0E Compression Method    0000 (0) 'Stored'\n+70F10 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70F14 CRC                   00000000 (0)\n+70F18 Compressed Size       00000000 (0)\n+70F1C Uncompressed Size     00000000 (0)\n+70F20 Filename Length       0026 (38)\n+70F22 Extra Length          0000 (0)\n+70F24 Comment Length        0000 (0)\n+70F26 Disk Start            0000 (0)\n+70F28 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-705B2 Ext File Attributes   41ED0010 (1106051088)\n+70F2A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-705B6 Local Header Offset   00000975 (2421)\n-705BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70F2E Local Header Offset   00000975 (2421)\n+70F32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x705BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70F32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x705BA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70F32: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70592: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70F0A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-705E0 CENTRAL HEADER #41    02014B50 (33639248)\n-705E4 Created Zip Spec      14 (20) '2.0'\n-705E5 Created OS            03 (3) 'Unix'\n-705E6 Extract Zip Spec      0A (10) '1.0'\n-705E7 Extract OS            00 (0) 'MS-DOS'\n-705E8 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-705EA Compression Method    0000 (0) 'Stored'\n-705EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-705F0 CRC                   00000000 (0)\n-705F4 Compressed Size       00000000 (0)\n-705F8 Uncompressed Size     00000000 (0)\n-705FC Filename Length       0025 (37)\n-705FE Extra Length          0000 (0)\n-70600 Comment Length        0000 (0)\n-70602 Disk Start            0000 (0)\n-70604 Int File Attributes   0000 (0)\n+70F58 CENTRAL HEADER #41    02014B50 (33639248)\n+70F5C Created Zip Spec      14 (20) '2.0'\n+70F5D Created OS            03 (3) 'Unix'\n+70F5E Extract Zip Spec      0A (10) '1.0'\n+70F5F Extract OS            00 (0) 'MS-DOS'\n+70F60 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70F62 Compression Method    0000 (0) 'Stored'\n+70F64 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70F68 CRC                   00000000 (0)\n+70F6C Compressed Size       00000000 (0)\n+70F70 Uncompressed Size     00000000 (0)\n+70F74 Filename Length       0025 (37)\n+70F76 Extra Length          0000 (0)\n+70F78 Comment Length        0000 (0)\n+70F7A Disk Start            0000 (0)\n+70F7C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70606 Ext File Attributes   41ED0010 (1106051088)\n+70F7E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-7060A Local Header Offset   000009B9 (2489)\n-7060E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70F82 Local Header Offset   000009B9 (2489)\n+70F86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7060E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70F86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x7060E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70F86: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x705E6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70F5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70633 CENTRAL HEADER #42    02014B50 (33639248)\n-70637 Created Zip Spec      14 (20) '2.0'\n-70638 Created OS            03 (3) 'Unix'\n-70639 Extract Zip Spec      0A (10) '1.0'\n-7063A Extract OS            00 (0) 'MS-DOS'\n-7063B General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-7063D Compression Method    0000 (0) 'Stored'\n-7063F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70643 CRC                   00000000 (0)\n-70647 Compressed Size       00000000 (0)\n-7064B Uncompressed Size     00000000 (0)\n-7064F Filename Length       0027 (39)\n-70651 Extra Length          0000 (0)\n-70653 Comment Length        0000 (0)\n-70655 Disk Start            0000 (0)\n-70657 Int File Attributes   0000 (0)\n+70FAB CENTRAL HEADER #42    02014B50 (33639248)\n+70FAF Created Zip Spec      14 (20) '2.0'\n+70FB0 Created OS            03 (3) 'Unix'\n+70FB1 Extract Zip Spec      0A (10) '1.0'\n+70FB2 Extract OS            00 (0) 'MS-DOS'\n+70FB3 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+70FB5 Compression Method    0000 (0) 'Stored'\n+70FB7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70FBB CRC                   00000000 (0)\n+70FBF Compressed Size       00000000 (0)\n+70FC3 Uncompressed Size     00000000 (0)\n+70FC7 Filename Length       0027 (39)\n+70FC9 Extra Length          0000 (0)\n+70FCB Comment Length        0000 (0)\n+70FCD Disk Start            0000 (0)\n+70FCF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70659 Ext File Attributes   41ED0010 (1106051088)\n+70FD1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-7065D Local Header Offset   000009FC (2556)\n-70661 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70FD5 Local Header Offset   000009FC (2556)\n+70FD9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70661: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70FD9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70661: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70FD9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70639: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70FB1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70688 CENTRAL HEADER #43    02014B50 (33639248)\n-7068C Created Zip Spec      14 (20) '2.0'\n-7068D Created OS            03 (3) 'Unix'\n-7068E Extract Zip Spec      0A (10) '1.0'\n-7068F Extract OS            00 (0) 'MS-DOS'\n-70690 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70692 Compression Method    0000 (0) 'Stored'\n-70694 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70698 CRC                   00000000 (0)\n-7069C Compressed Size       00000000 (0)\n-706A0 Uncompressed Size     00000000 (0)\n-706A4 Filename Length       001F (31)\n-706A6 Extra Length          0000 (0)\n-706A8 Comment Length        0000 (0)\n-706AA Disk Start            0000 (0)\n-706AC Int File Attributes   0000 (0)\n+71000 CENTRAL HEADER #43    02014B50 (33639248)\n+71004 Created Zip Spec      14 (20) '2.0'\n+71005 Created OS            03 (3) 'Unix'\n+71006 Extract Zip Spec      0A (10) '1.0'\n+71007 Extract OS            00 (0) 'MS-DOS'\n+71008 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7100A Compression Method    0000 (0) 'Stored'\n+7100C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71010 CRC                   00000000 (0)\n+71014 Compressed Size       00000000 (0)\n+71018 Uncompressed Size     00000000 (0)\n+7101C Filename Length       001F (31)\n+7101E Extra Length          0000 (0)\n+71020 Comment Length        0000 (0)\n+71022 Disk Start            0000 (0)\n+71024 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-706AE Ext File Attributes   41ED0010 (1106051088)\n+71026 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-706B2 Local Header Offset   00000A41 (2625)\n-706B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7102A Local Header Offset   00000A41 (2625)\n+7102E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x706B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7102E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x706B6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7102E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7068E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71006: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-706D5 CENTRAL HEADER #44    02014B50 (33639248)\n-706D9 Created Zip Spec      14 (20) '2.0'\n-706DA Created OS            03 (3) 'Unix'\n-706DB Extract Zip Spec      0A (10) '1.0'\n-706DC Extract OS            00 (0) 'MS-DOS'\n-706DD General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-706DF Compression Method    0000 (0) 'Stored'\n-706E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-706E5 CRC                   00000000 (0)\n-706E9 Compressed Size       00000000 (0)\n-706ED Uncompressed Size     00000000 (0)\n-706F1 Filename Length       0027 (39)\n-706F3 Extra Length          0000 (0)\n-706F5 Comment Length        0000 (0)\n-706F7 Disk Start            0000 (0)\n-706F9 Int File Attributes   0000 (0)\n+7104D CENTRAL HEADER #44    02014B50 (33639248)\n+71051 Created Zip Spec      14 (20) '2.0'\n+71052 Created OS            03 (3) 'Unix'\n+71053 Extract Zip Spec      0A (10) '1.0'\n+71054 Extract OS            00 (0) 'MS-DOS'\n+71055 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71057 Compression Method    0000 (0) 'Stored'\n+71059 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7105D CRC                   00000000 (0)\n+71061 Compressed Size       00000000 (0)\n+71065 Uncompressed Size     00000000 (0)\n+71069 Filename Length       0027 (39)\n+7106B Extra Length          0000 (0)\n+7106D Comment Length        0000 (0)\n+7106F Disk Start            0000 (0)\n+71071 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-706FB Ext File Attributes   41ED0010 (1106051088)\n+71073 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-706FF Local Header Offset   00000A7E (2686)\n-70703 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71077 Local Header Offset   00000A7E (2686)\n+7107B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70703: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7107B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70703: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7107B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x706DB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71053: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7072A CENTRAL HEADER #45    02014B50 (33639248)\n-7072E Created Zip Spec      14 (20) '2.0'\n-7072F Created OS            03 (3) 'Unix'\n-70730 Extract Zip Spec      0A (10) '1.0'\n-70731 Extract OS            00 (0) 'MS-DOS'\n-70732 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70734 Compression Method    0000 (0) 'Stored'\n-70736 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7073A CRC                   00000000 (0)\n-7073E Compressed Size       00000000 (0)\n-70742 Uncompressed Size     00000000 (0)\n-70746 Filename Length       001E (30)\n-70748 Extra Length          0000 (0)\n-7074A Comment Length        0000 (0)\n-7074C Disk Start            0000 (0)\n-7074E Int File Attributes   0000 (0)\n+710A2 CENTRAL HEADER #45    02014B50 (33639248)\n+710A6 Created Zip Spec      14 (20) '2.0'\n+710A7 Created OS            03 (3) 'Unix'\n+710A8 Extract Zip Spec      0A (10) '1.0'\n+710A9 Extract OS            00 (0) 'MS-DOS'\n+710AA General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+710AC Compression Method    0000 (0) 'Stored'\n+710AE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+710B2 CRC                   00000000 (0)\n+710B6 Compressed Size       00000000 (0)\n+710BA Uncompressed Size     00000000 (0)\n+710BE Filename Length       001E (30)\n+710C0 Extra Length          0000 (0)\n+710C2 Comment Length        0000 (0)\n+710C4 Disk Start            0000 (0)\n+710C6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70750 Ext File Attributes   41ED0010 (1106051088)\n+710C8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70754 Local Header Offset   00000AC3 (2755)\n-70758 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+710CC Local Header Offset   00000AC3 (2755)\n+710D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70758: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x710D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70758: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x710D0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70730: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x710A8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70776 CENTRAL HEADER #46    02014B50 (33639248)\n-7077A Created Zip Spec      14 (20) '2.0'\n-7077B Created OS            03 (3) 'Unix'\n-7077C Extract Zip Spec      0A (10) '1.0'\n-7077D Extract OS            00 (0) 'MS-DOS'\n-7077E General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70780 Compression Method    0000 (0) 'Stored'\n-70782 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70786 CRC                   00000000 (0)\n-7078A Compressed Size       00000000 (0)\n-7078E Uncompressed Size     00000000 (0)\n-70792 Filename Length       0026 (38)\n-70794 Extra Length          0000 (0)\n-70796 Comment Length        0000 (0)\n-70798 Disk Start            0000 (0)\n-7079A Int File Attributes   0000 (0)\n+710EE CENTRAL HEADER #46    02014B50 (33639248)\n+710F2 Created Zip Spec      14 (20) '2.0'\n+710F3 Created OS            03 (3) 'Unix'\n+710F4 Extract Zip Spec      0A (10) '1.0'\n+710F5 Extract OS            00 (0) 'MS-DOS'\n+710F6 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+710F8 Compression Method    0000 (0) 'Stored'\n+710FA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+710FE CRC                   00000000 (0)\n+71102 Compressed Size       00000000 (0)\n+71106 Uncompressed Size     00000000 (0)\n+7110A Filename Length       0026 (38)\n+7110C Extra Length          0000 (0)\n+7110E Comment Length        0000 (0)\n+71110 Disk Start            0000 (0)\n+71112 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7079C Ext File Attributes   41ED0010 (1106051088)\n+71114 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-707A0 Local Header Offset   00000AFF (2815)\n-707A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71118 Local Header Offset   00000AFF (2815)\n+7111C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x707A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7111C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x707A4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7111C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7077C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x710F4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-707CA CENTRAL HEADER #47    02014B50 (33639248)\n-707CE Created Zip Spec      14 (20) '2.0'\n-707CF Created OS            03 (3) 'Unix'\n-707D0 Extract Zip Spec      0A (10) '1.0'\n-707D1 Extract OS            00 (0) 'MS-DOS'\n-707D2 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-707D4 Compression Method    0000 (0) 'Stored'\n-707D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-707DA CRC                   00000000 (0)\n-707DE Compressed Size       00000000 (0)\n-707E2 Uncompressed Size     00000000 (0)\n-707E6 Filename Length       0024 (36)\n-707E8 Extra Length          0000 (0)\n-707EA Comment Length        0000 (0)\n-707EC Disk Start            0000 (0)\n-707EE Int File Attributes   0000 (0)\n+71142 CENTRAL HEADER #47    02014B50 (33639248)\n+71146 Created Zip Spec      14 (20) '2.0'\n+71147 Created OS            03 (3) 'Unix'\n+71148 Extract Zip Spec      0A (10) '1.0'\n+71149 Extract OS            00 (0) 'MS-DOS'\n+7114A General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7114C Compression Method    0000 (0) 'Stored'\n+7114E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71152 CRC                   00000000 (0)\n+71156 Compressed Size       00000000 (0)\n+7115A Uncompressed Size     00000000 (0)\n+7115E Filename Length       0024 (36)\n+71160 Extra Length          0000 (0)\n+71162 Comment Length        0000 (0)\n+71164 Disk Start            0000 (0)\n+71166 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-707F0 Ext File Attributes   41ED0010 (1106051088)\n+71168 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-707F4 Local Header Offset   00000B43 (2883)\n-707F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7116C Local Header Offset   00000B43 (2883)\n+71170 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x707F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71170: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x707F8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71170: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x707D0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71148: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7081C CENTRAL HEADER #48    02014B50 (33639248)\n-70820 Created Zip Spec      14 (20) '2.0'\n-70821 Created OS            03 (3) 'Unix'\n-70822 Extract Zip Spec      0A (10) '1.0'\n-70823 Extract OS            00 (0) 'MS-DOS'\n-70824 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70826 Compression Method    0000 (0) 'Stored'\n-70828 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7082C CRC                   00000000 (0)\n-70830 Compressed Size       00000000 (0)\n-70834 Uncompressed Size     00000000 (0)\n-70838 Filename Length       0023 (35)\n-7083A Extra Length          0000 (0)\n-7083C Comment Length        0000 (0)\n-7083E Disk Start            0000 (0)\n-70840 Int File Attributes   0000 (0)\n+71194 CENTRAL HEADER #48    02014B50 (33639248)\n+71198 Created Zip Spec      14 (20) '2.0'\n+71199 Created OS            03 (3) 'Unix'\n+7119A Extract Zip Spec      0A (10) '1.0'\n+7119B Extract OS            00 (0) 'MS-DOS'\n+7119C General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7119E Compression Method    0000 (0) 'Stored'\n+711A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+711A4 CRC                   00000000 (0)\n+711A8 Compressed Size       00000000 (0)\n+711AC Uncompressed Size     00000000 (0)\n+711B0 Filename Length       0023 (35)\n+711B2 Extra Length          0000 (0)\n+711B4 Comment Length        0000 (0)\n+711B6 Disk Start            0000 (0)\n+711B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70842 Ext File Attributes   41ED0010 (1106051088)\n+711BA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70846 Local Header Offset   00000B85 (2949)\n-7084A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+711BE Local Header Offset   00000B85 (2949)\n+711C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7084A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x711C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x7084A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x711C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70822: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7119A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7086D CENTRAL HEADER #49    02014B50 (33639248)\n-70871 Created Zip Spec      14 (20) '2.0'\n-70872 Created OS            03 (3) 'Unix'\n-70873 Extract Zip Spec      0A (10) '1.0'\n-70874 Extract OS            00 (0) 'MS-DOS'\n-70875 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70877 Compression Method    0000 (0) 'Stored'\n-70879 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7087D CRC                   00000000 (0)\n-70881 Compressed Size       00000000 (0)\n-70885 Uncompressed Size     00000000 (0)\n-70889 Filename Length       002E (46)\n-7088B Extra Length          0000 (0)\n-7088D Comment Length        0000 (0)\n-7088F Disk Start            0000 (0)\n-70891 Int File Attributes   0000 (0)\n+711E5 CENTRAL HEADER #49    02014B50 (33639248)\n+711E9 Created Zip Spec      14 (20) '2.0'\n+711EA Created OS            03 (3) 'Unix'\n+711EB Extract Zip Spec      0A (10) '1.0'\n+711EC Extract OS            00 (0) 'MS-DOS'\n+711ED General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+711EF Compression Method    0000 (0) 'Stored'\n+711F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+711F5 CRC                   00000000 (0)\n+711F9 Compressed Size       00000000 (0)\n+711FD Uncompressed Size     00000000 (0)\n+71201 Filename Length       002E (46)\n+71203 Extra Length          0000 (0)\n+71205 Comment Length        0000 (0)\n+71207 Disk Start            0000 (0)\n+71209 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70893 Ext File Attributes   41ED0010 (1106051088)\n+7120B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70897 Local Header Offset   00000BC6 (3014)\n-7089B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7120F Local Header Offset   00000BC6 (3014)\n+71213 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7089B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71213: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x7089B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71213: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70873: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x711EB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-708C9 CENTRAL HEADER #50    02014B50 (33639248)\n-708CD Created Zip Spec      14 (20) '2.0'\n-708CE Created OS            03 (3) 'Unix'\n-708CF Extract Zip Spec      0A (10) '1.0'\n-708D0 Extract OS            00 (0) 'MS-DOS'\n-708D1 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-708D3 Compression Method    0000 (0) 'Stored'\n-708D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-708D9 CRC                   00000000 (0)\n-708DD Compressed Size       00000000 (0)\n-708E1 Uncompressed Size     00000000 (0)\n-708E5 Filename Length       0029 (41)\n-708E7 Extra Length          0000 (0)\n-708E9 Comment Length        0000 (0)\n-708EB Disk Start            0000 (0)\n-708ED Int File Attributes   0000 (0)\n+71241 CENTRAL HEADER #50    02014B50 (33639248)\n+71245 Created Zip Spec      14 (20) '2.0'\n+71246 Created OS            03 (3) 'Unix'\n+71247 Extract Zip Spec      0A (10) '1.0'\n+71248 Extract OS            00 (0) 'MS-DOS'\n+71249 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7124B Compression Method    0000 (0) 'Stored'\n+7124D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71251 CRC                   00000000 (0)\n+71255 Compressed Size       00000000 (0)\n+71259 Uncompressed Size     00000000 (0)\n+7125D Filename Length       0029 (41)\n+7125F Extra Length          0000 (0)\n+71261 Comment Length        0000 (0)\n+71263 Disk Start            0000 (0)\n+71265 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-708EF Ext File Attributes   41ED0010 (1106051088)\n+71267 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-708F3 Local Header Offset   00000C12 (3090)\n-708F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7126B Local Header Offset   00000C12 (3090)\n+7126F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x708F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7126F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x708F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7126F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x708CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71247: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70920 CENTRAL HEADER #51    02014B50 (33639248)\n-70924 Created Zip Spec      14 (20) '2.0'\n-70925 Created OS            03 (3) 'Unix'\n-70926 Extract Zip Spec      0A (10) '1.0'\n-70927 Extract OS            00 (0) 'MS-DOS'\n-70928 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-7092A Compression Method    0000 (0) 'Stored'\n-7092C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70930 CRC                   00000000 (0)\n-70934 Compressed Size       00000000 (0)\n-70938 Uncompressed Size     00000000 (0)\n-7093C Filename Length       002B (43)\n-7093E Extra Length          0000 (0)\n-70940 Comment Length        0000 (0)\n-70942 Disk Start            0000 (0)\n-70944 Int File Attributes   0000 (0)\n+71298 CENTRAL HEADER #51    02014B50 (33639248)\n+7129C Created Zip Spec      14 (20) '2.0'\n+7129D Created OS            03 (3) 'Unix'\n+7129E Extract Zip Spec      0A (10) '1.0'\n+7129F Extract OS            00 (0) 'MS-DOS'\n+712A0 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+712A2 Compression Method    0000 (0) 'Stored'\n+712A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+712A8 CRC                   00000000 (0)\n+712AC Compressed Size       00000000 (0)\n+712B0 Uncompressed Size     00000000 (0)\n+712B4 Filename Length       002B (43)\n+712B6 Extra Length          0000 (0)\n+712B8 Comment Length        0000 (0)\n+712BA Disk Start            0000 (0)\n+712BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70946 Ext File Attributes   41ED0010 (1106051088)\n+712BE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-7094A Local Header Offset   00000C59 (3161)\n-7094E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+712C2 Local Header Offset   00000C59 (3161)\n+712C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7094E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x712C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x7094E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x712C6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70926: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7129E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70979 CENTRAL HEADER #52    02014B50 (33639248)\n-7097D Created Zip Spec      14 (20) '2.0'\n-7097E Created OS            03 (3) 'Unix'\n-7097F Extract Zip Spec      0A (10) '1.0'\n-70980 Extract OS            00 (0) 'MS-DOS'\n-70981 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70983 Compression Method    0000 (0) 'Stored'\n-70985 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70989 CRC                   00000000 (0)\n-7098D Compressed Size       00000000 (0)\n-70991 Uncompressed Size     00000000 (0)\n-70995 Filename Length       002B (43)\n-70997 Extra Length          0000 (0)\n-70999 Comment Length        0000 (0)\n-7099B Disk Start            0000 (0)\n-7099D Int File Attributes   0000 (0)\n+712F1 CENTRAL HEADER #52    02014B50 (33639248)\n+712F5 Created Zip Spec      14 (20) '2.0'\n+712F6 Created OS            03 (3) 'Unix'\n+712F7 Extract Zip Spec      0A (10) '1.0'\n+712F8 Extract OS            00 (0) 'MS-DOS'\n+712F9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+712FB Compression Method    0000 (0) 'Stored'\n+712FD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71301 CRC                   00000000 (0)\n+71305 Compressed Size       00000000 (0)\n+71309 Uncompressed Size     00000000 (0)\n+7130D Filename Length       002B (43)\n+7130F Extra Length          0000 (0)\n+71311 Comment Length        0000 (0)\n+71313 Disk Start            0000 (0)\n+71315 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7099F Ext File Attributes   41ED0010 (1106051088)\n+71317 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-709A3 Local Header Offset   00000CA2 (3234)\n-709A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7131B Local Header Offset   00000CA2 (3234)\n+7131F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x709A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7131F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x709A7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7131F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7097F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x712F7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-709D2 CENTRAL HEADER #53    02014B50 (33639248)\n-709D6 Created Zip Spec      14 (20) '2.0'\n-709D7 Created OS            03 (3) 'Unix'\n-709D8 Extract Zip Spec      0A (10) '1.0'\n-709D9 Extract OS            00 (0) 'MS-DOS'\n-709DA General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-709DC Compression Method    0000 (0) 'Stored'\n-709DE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-709E2 CRC                   00000000 (0)\n-709E6 Compressed Size       00000000 (0)\n-709EA Uncompressed Size     00000000 (0)\n-709EE Filename Length       0032 (50)\n-709F0 Extra Length          0000 (0)\n-709F2 Comment Length        0000 (0)\n-709F4 Disk Start            0000 (0)\n-709F6 Int File Attributes   0000 (0)\n+7134A CENTRAL HEADER #53    02014B50 (33639248)\n+7134E Created Zip Spec      14 (20) '2.0'\n+7134F Created OS            03 (3) 'Unix'\n+71350 Extract Zip Spec      0A (10) '1.0'\n+71351 Extract OS            00 (0) 'MS-DOS'\n+71352 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71354 Compression Method    0000 (0) 'Stored'\n+71356 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7135A CRC                   00000000 (0)\n+7135E Compressed Size       00000000 (0)\n+71362 Uncompressed Size     00000000 (0)\n+71366 Filename Length       0032 (50)\n+71368 Extra Length          0000 (0)\n+7136A Comment Length        0000 (0)\n+7136C Disk Start            0000 (0)\n+7136E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-709F8 Ext File Attributes   41ED0010 (1106051088)\n+71370 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-709FC Local Header Offset   00000CEB (3307)\n-70A00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71374 Local Header Offset   00000CEB (3307)\n+71378 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70A00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71378: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70A00: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71378: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x709D8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71350: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70A32 CENTRAL HEADER #54    02014B50 (33639248)\n-70A36 Created Zip Spec      14 (20) '2.0'\n-70A37 Created OS            03 (3) 'Unix'\n-70A38 Extract Zip Spec      0A (10) '1.0'\n-70A39 Extract OS            00 (0) 'MS-DOS'\n-70A3A General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70A3C Compression Method    0000 (0) 'Stored'\n-70A3E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70A42 CRC                   00000000 (0)\n-70A46 Compressed Size       00000000 (0)\n-70A4A Uncompressed Size     00000000 (0)\n-70A4E Filename Length       0031 (49)\n-70A50 Extra Length          0000 (0)\n-70A52 Comment Length        0000 (0)\n-70A54 Disk Start            0000 (0)\n-70A56 Int File Attributes   0000 (0)\n+713AA CENTRAL HEADER #54    02014B50 (33639248)\n+713AE Created Zip Spec      14 (20) '2.0'\n+713AF Created OS            03 (3) 'Unix'\n+713B0 Extract Zip Spec      0A (10) '1.0'\n+713B1 Extract OS            00 (0) 'MS-DOS'\n+713B2 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+713B4 Compression Method    0000 (0) 'Stored'\n+713B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+713BA CRC                   00000000 (0)\n+713BE Compressed Size       00000000 (0)\n+713C2 Uncompressed Size     00000000 (0)\n+713C6 Filename Length       0031 (49)\n+713C8 Extra Length          0000 (0)\n+713CA Comment Length        0000 (0)\n+713CC Disk Start            0000 (0)\n+713CE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70A58 Ext File Attributes   41ED0010 (1106051088)\n+713D0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70A5C Local Header Offset   00000D3B (3387)\n-70A60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+713D4 Local Header Offset   00000D3B (3387)\n+713D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70A60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x713D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70A60: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x713D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70A38: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x713B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70A91 CENTRAL HEADER #55    02014B50 (33639248)\n-70A95 Created Zip Spec      14 (20) '2.0'\n-70A96 Created OS            03 (3) 'Unix'\n-70A97 Extract Zip Spec      0A (10) '1.0'\n-70A98 Extract OS            00 (0) 'MS-DOS'\n-70A99 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70A9B Compression Method    0000 (0) 'Stored'\n-70A9D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70AA1 CRC                   00000000 (0)\n-70AA5 Compressed Size       00000000 (0)\n-70AA9 Uncompressed Size     00000000 (0)\n-70AAD Filename Length       0031 (49)\n-70AAF Extra Length          0000 (0)\n-70AB1 Comment Length        0000 (0)\n-70AB3 Disk Start            0000 (0)\n-70AB5 Int File Attributes   0000 (0)\n+71409 CENTRAL HEADER #55    02014B50 (33639248)\n+7140D Created Zip Spec      14 (20) '2.0'\n+7140E Created OS            03 (3) 'Unix'\n+7140F Extract Zip Spec      0A (10) '1.0'\n+71410 Extract OS            00 (0) 'MS-DOS'\n+71411 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71413 Compression Method    0000 (0) 'Stored'\n+71415 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71419 CRC                   00000000 (0)\n+7141D Compressed Size       00000000 (0)\n+71421 Uncompressed Size     00000000 (0)\n+71425 Filename Length       0031 (49)\n+71427 Extra Length          0000 (0)\n+71429 Comment Length        0000 (0)\n+7142B Disk Start            0000 (0)\n+7142D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70AB7 Ext File Attributes   41ED0010 (1106051088)\n+7142F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70ABB Local Header Offset   00000D8A (3466)\n-70ABF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71433 Local Header Offset   00000D8A (3466)\n+71437 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70ABF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71437: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70ABF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71437: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70A97: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7140F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70AF0 CENTRAL HEADER #56    02014B50 (33639248)\n-70AF4 Created Zip Spec      14 (20) '2.0'\n-70AF5 Created OS            03 (3) 'Unix'\n-70AF6 Extract Zip Spec      0A (10) '1.0'\n-70AF7 Extract OS            00 (0) 'MS-DOS'\n-70AF8 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70AFA Compression Method    0000 (0) 'Stored'\n-70AFC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70B00 CRC                   00000000 (0)\n-70B04 Compressed Size       00000000 (0)\n-70B08 Uncompressed Size     00000000 (0)\n-70B0C Filename Length       0033 (51)\n-70B0E Extra Length          0000 (0)\n-70B10 Comment Length        0000 (0)\n-70B12 Disk Start            0000 (0)\n-70B14 Int File Attributes   0000 (0)\n+71468 CENTRAL HEADER #56    02014B50 (33639248)\n+7146C Created Zip Spec      14 (20) '2.0'\n+7146D Created OS            03 (3) 'Unix'\n+7146E Extract Zip Spec      0A (10) '1.0'\n+7146F Extract OS            00 (0) 'MS-DOS'\n+71470 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71472 Compression Method    0000 (0) 'Stored'\n+71474 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71478 CRC                   00000000 (0)\n+7147C Compressed Size       00000000 (0)\n+71480 Uncompressed Size     00000000 (0)\n+71484 Filename Length       0033 (51)\n+71486 Extra Length          0000 (0)\n+71488 Comment Length        0000 (0)\n+7148A Disk Start            0000 (0)\n+7148C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70B16 Ext File Attributes   41ED0010 (1106051088)\n+7148E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70B1A Local Header Offset   00000DD9 (3545)\n-70B1E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71492 Local Header Offset   00000DD9 (3545)\n+71496 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70B1E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71496: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70B1E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71496: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70AF6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7146E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70B51 CENTRAL HEADER #57    02014B50 (33639248)\n-70B55 Created Zip Spec      14 (20) '2.0'\n-70B56 Created OS            03 (3) 'Unix'\n-70B57 Extract Zip Spec      0A (10) '1.0'\n-70B58 Extract OS            00 (0) 'MS-DOS'\n-70B59 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70B5B Compression Method    0000 (0) 'Stored'\n-70B5D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70B61 CRC                   00000000 (0)\n-70B65 Compressed Size       00000000 (0)\n-70B69 Uncompressed Size     00000000 (0)\n-70B6D Filename Length       001E (30)\n-70B6F Extra Length          0000 (0)\n-70B71 Comment Length        0000 (0)\n-70B73 Disk Start            0000 (0)\n-70B75 Int File Attributes   0000 (0)\n+714C9 CENTRAL HEADER #57    02014B50 (33639248)\n+714CD Created Zip Spec      14 (20) '2.0'\n+714CE Created OS            03 (3) 'Unix'\n+714CF Extract Zip Spec      0A (10) '1.0'\n+714D0 Extract OS            00 (0) 'MS-DOS'\n+714D1 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+714D3 Compression Method    0000 (0) 'Stored'\n+714D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+714D9 CRC                   00000000 (0)\n+714DD Compressed Size       00000000 (0)\n+714E1 Uncompressed Size     00000000 (0)\n+714E5 Filename Length       001E (30)\n+714E7 Extra Length          0000 (0)\n+714E9 Comment Length        0000 (0)\n+714EB Disk Start            0000 (0)\n+714ED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70B77 Ext File Attributes   41ED0010 (1106051088)\n+714EF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70B7B Local Header Offset   00000E2A (3626)\n-70B7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+714F3 Local Header Offset   00000E2A (3626)\n+714F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70B7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x714F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70B7F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x714F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70B57: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x714CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70B9D CENTRAL HEADER #58    02014B50 (33639248)\n-70BA1 Created Zip Spec      14 (20) '2.0'\n-70BA2 Created OS            03 (3) 'Unix'\n-70BA3 Extract Zip Spec      0A (10) '1.0'\n-70BA4 Extract OS            00 (0) 'MS-DOS'\n-70BA5 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70BA7 Compression Method    0000 (0) 'Stored'\n-70BA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70BAD CRC                   00000000 (0)\n-70BB1 Compressed Size       00000000 (0)\n-70BB5 Uncompressed Size     00000000 (0)\n-70BB9 Filename Length       001E (30)\n-70BBB Extra Length          0000 (0)\n-70BBD Comment Length        0000 (0)\n-70BBF Disk Start            0000 (0)\n-70BC1 Int File Attributes   0000 (0)\n+71515 CENTRAL HEADER #58    02014B50 (33639248)\n+71519 Created Zip Spec      14 (20) '2.0'\n+7151A Created OS            03 (3) 'Unix'\n+7151B Extract Zip Spec      0A (10) '1.0'\n+7151C Extract OS            00 (0) 'MS-DOS'\n+7151D General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7151F Compression Method    0000 (0) 'Stored'\n+71521 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71525 CRC                   00000000 (0)\n+71529 Compressed Size       00000000 (0)\n+7152D Uncompressed Size     00000000 (0)\n+71531 Filename Length       001E (30)\n+71533 Extra Length          0000 (0)\n+71535 Comment Length        0000 (0)\n+71537 Disk Start            0000 (0)\n+71539 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70BC3 Ext File Attributes   41ED0010 (1106051088)\n+7153B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70BC7 Local Header Offset   00000E66 (3686)\n-70BCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7153F Local Header Offset   00000E66 (3686)\n+71543 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70BCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71543: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70BCB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71543: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70BA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7151B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70BE9 CENTRAL HEADER #59    02014B50 (33639248)\n-70BED Created Zip Spec      14 (20) '2.0'\n-70BEE Created OS            03 (3) 'Unix'\n-70BEF Extract Zip Spec      0A (10) '1.0'\n-70BF0 Extract OS            00 (0) 'MS-DOS'\n-70BF1 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70BF3 Compression Method    0000 (0) 'Stored'\n-70BF5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70BF9 CRC                   00000000 (0)\n-70BFD Compressed Size       00000000 (0)\n-70C01 Uncompressed Size     00000000 (0)\n-70C05 Filename Length       0018 (24)\n-70C07 Extra Length          0000 (0)\n-70C09 Comment Length        0000 (0)\n-70C0B Disk Start            0000 (0)\n-70C0D Int File Attributes   0000 (0)\n+71561 CENTRAL HEADER #59    02014B50 (33639248)\n+71565 Created Zip Spec      14 (20) '2.0'\n+71566 Created OS            03 (3) 'Unix'\n+71567 Extract Zip Spec      0A (10) '1.0'\n+71568 Extract OS            00 (0) 'MS-DOS'\n+71569 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7156B Compression Method    0000 (0) 'Stored'\n+7156D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71571 CRC                   00000000 (0)\n+71575 Compressed Size       00000000 (0)\n+71579 Uncompressed Size     00000000 (0)\n+7157D Filename Length       0018 (24)\n+7157F Extra Length          0000 (0)\n+71581 Comment Length        0000 (0)\n+71583 Disk Start            0000 (0)\n+71585 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70C0F Ext File Attributes   41ED0010 (1106051088)\n+71587 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70C13 Local Header Offset   00000EA2 (3746)\n-70C17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+7158B Local Header Offset   00000EA2 (3746)\n+7158F Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70C17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7158F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70C17: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7158F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70BEF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71567: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70C2F CENTRAL HEADER #60    02014B50 (33639248)\n-70C33 Created Zip Spec      14 (20) '2.0'\n-70C34 Created OS            03 (3) 'Unix'\n-70C35 Extract Zip Spec      0A (10) '1.0'\n-70C36 Extract OS            00 (0) 'MS-DOS'\n-70C37 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70C39 Compression Method    0000 (0) 'Stored'\n-70C3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70C3F CRC                   00000000 (0)\n-70C43 Compressed Size       00000000 (0)\n-70C47 Uncompressed Size     00000000 (0)\n-70C4B Filename Length       0023 (35)\n-70C4D Extra Length          0000 (0)\n-70C4F Comment Length        0000 (0)\n-70C51 Disk Start            0000 (0)\n-70C53 Int File Attributes   0000 (0)\n+715A7 CENTRAL HEADER #60    02014B50 (33639248)\n+715AB Created Zip Spec      14 (20) '2.0'\n+715AC Created OS            03 (3) 'Unix'\n+715AD Extract Zip Spec      0A (10) '1.0'\n+715AE Extract OS            00 (0) 'MS-DOS'\n+715AF General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+715B1 Compression Method    0000 (0) 'Stored'\n+715B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+715B7 CRC                   00000000 (0)\n+715BB Compressed Size       00000000 (0)\n+715BF Uncompressed Size     00000000 (0)\n+715C3 Filename Length       0023 (35)\n+715C5 Extra Length          0000 (0)\n+715C7 Comment Length        0000 (0)\n+715C9 Disk Start            0000 (0)\n+715CB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70C55 Ext File Attributes   41ED0010 (1106051088)\n+715CD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70C59 Local Header Offset   00000ED8 (3800)\n-70C5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+715D1 Local Header Offset   00000ED8 (3800)\n+715D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70C5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x715D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70C5D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x715D5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70C35: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x715AD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70C80 CENTRAL HEADER #61    02014B50 (33639248)\n-70C84 Created Zip Spec      14 (20) '2.0'\n-70C85 Created OS            03 (3) 'Unix'\n-70C86 Extract Zip Spec      0A (10) '1.0'\n-70C87 Extract OS            00 (0) 'MS-DOS'\n-70C88 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70C8A Compression Method    0000 (0) 'Stored'\n-70C8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70C90 CRC                   00000000 (0)\n-70C94 Compressed Size       00000000 (0)\n-70C98 Uncompressed Size     00000000 (0)\n-70C9C Filename Length       0020 (32)\n-70C9E Extra Length          0000 (0)\n-70CA0 Comment Length        0000 (0)\n-70CA2 Disk Start            0000 (0)\n-70CA4 Int File Attributes   0000 (0)\n+715F8 CENTRAL HEADER #61    02014B50 (33639248)\n+715FC Created Zip Spec      14 (20) '2.0'\n+715FD Created OS            03 (3) 'Unix'\n+715FE Extract Zip Spec      0A (10) '1.0'\n+715FF Extract OS            00 (0) 'MS-DOS'\n+71600 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71602 Compression Method    0000 (0) 'Stored'\n+71604 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71608 CRC                   00000000 (0)\n+7160C Compressed Size       00000000 (0)\n+71610 Uncompressed Size     00000000 (0)\n+71614 Filename Length       0020 (32)\n+71616 Extra Length          0000 (0)\n+71618 Comment Length        0000 (0)\n+7161A Disk Start            0000 (0)\n+7161C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70CA6 Ext File Attributes   41ED0010 (1106051088)\n+7161E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70CAA Local Header Offset   00000F19 (3865)\n-70CAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71622 Local Header Offset   00000F19 (3865)\n+71626 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70CAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71626: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70CAE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71626: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70C86: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x715FE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70CCE CENTRAL HEADER #62    02014B50 (33639248)\n-70CD2 Created Zip Spec      14 (20) '2.0'\n-70CD3 Created OS            03 (3) 'Unix'\n-70CD4 Extract Zip Spec      0A (10) '1.0'\n-70CD5 Extract OS            00 (0) 'MS-DOS'\n-70CD6 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70CD8 Compression Method    0000 (0) 'Stored'\n-70CDA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70CDE CRC                   00000000 (0)\n-70CE2 Compressed Size       00000000 (0)\n-70CE6 Uncompressed Size     00000000 (0)\n-70CEA Filename Length       0020 (32)\n-70CEC Extra Length          0000 (0)\n-70CEE Comment Length        0000 (0)\n-70CF0 Disk Start            0000 (0)\n-70CF2 Int File Attributes   0000 (0)\n+71646 CENTRAL HEADER #62    02014B50 (33639248)\n+7164A Created Zip Spec      14 (20) '2.0'\n+7164B Created OS            03 (3) 'Unix'\n+7164C Extract Zip Spec      0A (10) '1.0'\n+7164D Extract OS            00 (0) 'MS-DOS'\n+7164E General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71650 Compression Method    0000 (0) 'Stored'\n+71652 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71656 CRC                   00000000 (0)\n+7165A Compressed Size       00000000 (0)\n+7165E Uncompressed Size     00000000 (0)\n+71662 Filename Length       0020 (32)\n+71664 Extra Length          0000 (0)\n+71666 Comment Length        0000 (0)\n+71668 Disk Start            0000 (0)\n+7166A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70CF4 Ext File Attributes   41ED0010 (1106051088)\n+7166C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70CF8 Local Header Offset   00000F57 (3927)\n-70CFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71670 Local Header Offset   00000F57 (3927)\n+71674 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70CFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71674: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70CFC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71674: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70CD4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7164C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70D1C CENTRAL HEADER #63    02014B50 (33639248)\n-70D20 Created Zip Spec      14 (20) '2.0'\n-70D21 Created OS            03 (3) 'Unix'\n-70D22 Extract Zip Spec      0A (10) '1.0'\n-70D23 Extract OS            00 (0) 'MS-DOS'\n-70D24 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70D26 Compression Method    0000 (0) 'Stored'\n-70D28 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70D2C CRC                   00000000 (0)\n-70D30 Compressed Size       00000000 (0)\n-70D34 Uncompressed Size     00000000 (0)\n-70D38 Filename Length       0017 (23)\n-70D3A Extra Length          0000 (0)\n-70D3C Comment Length        0000 (0)\n-70D3E Disk Start            0000 (0)\n-70D40 Int File Attributes   0000 (0)\n+71694 CENTRAL HEADER #63    02014B50 (33639248)\n+71698 Created Zip Spec      14 (20) '2.0'\n+71699 Created OS            03 (3) 'Unix'\n+7169A Extract Zip Spec      0A (10) '1.0'\n+7169B Extract OS            00 (0) 'MS-DOS'\n+7169C General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7169E Compression Method    0000 (0) 'Stored'\n+716A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+716A4 CRC                   00000000 (0)\n+716A8 Compressed Size       00000000 (0)\n+716AC Uncompressed Size     00000000 (0)\n+716B0 Filename Length       0017 (23)\n+716B2 Extra Length          0000 (0)\n+716B4 Comment Length        0000 (0)\n+716B6 Disk Start            0000 (0)\n+716B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70D42 Ext File Attributes   41ED0010 (1106051088)\n+716BA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70D46 Local Header Offset   00000F95 (3989)\n-70D4A Filename              'XXXXXXXXXXXXXXXXXXXXXXX'\n+716BE Local Header Offset   00000F95 (3989)\n+716C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70D4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x716C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70D4A: Directory 'XXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x716C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70D22: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7169A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70D61 CENTRAL HEADER #64    02014B50 (33639248)\n-70D65 Created Zip Spec      14 (20) '2.0'\n-70D66 Created OS            03 (3) 'Unix'\n-70D67 Extract Zip Spec      0A (10) '1.0'\n-70D68 Extract OS            00 (0) 'MS-DOS'\n-70D69 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70D6B Compression Method    0000 (0) 'Stored'\n-70D6D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70D71 CRC                   00000000 (0)\n-70D75 Compressed Size       00000000 (0)\n-70D79 Uncompressed Size     00000000 (0)\n-70D7D Filename Length       0015 (21)\n-70D7F Extra Length          0000 (0)\n-70D81 Comment Length        0000 (0)\n-70D83 Disk Start            0000 (0)\n-70D85 Int File Attributes   0000 (0)\n+716D9 CENTRAL HEADER #64    02014B50 (33639248)\n+716DD Created Zip Spec      14 (20) '2.0'\n+716DE Created OS            03 (3) 'Unix'\n+716DF Extract Zip Spec      0A (10) '1.0'\n+716E0 Extract OS            00 (0) 'MS-DOS'\n+716E1 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+716E3 Compression Method    0000 (0) 'Stored'\n+716E5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+716E9 CRC                   00000000 (0)\n+716ED Compressed Size       00000000 (0)\n+716F1 Uncompressed Size     00000000 (0)\n+716F5 Filename Length       0015 (21)\n+716F7 Extra Length          0000 (0)\n+716F9 Comment Length        0000 (0)\n+716FB Disk Start            0000 (0)\n+716FD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70D87 Ext File Attributes   41ED0010 (1106051088)\n+716FF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70D8B Local Header Offset   00000FCA (4042)\n-70D8F Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+71703 Local Header Offset   00000FCA (4042)\n+71707 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70D8F: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71707: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70D8F: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71707: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70D67: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x716DF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70DA4 CENTRAL HEADER #65    02014B50 (33639248)\n-70DA8 Created Zip Spec      14 (20) '2.0'\n-70DA9 Created OS            03 (3) 'Unix'\n-70DAA Extract Zip Spec      0A (10) '1.0'\n-70DAB Extract OS            00 (0) 'MS-DOS'\n-70DAC General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70DAE Compression Method    0000 (0) 'Stored'\n-70DB0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70DB4 CRC                   00000000 (0)\n-70DB8 Compressed Size       00000000 (0)\n-70DBC Uncompressed Size     00000000 (0)\n-70DC0 Filename Length       001B (27)\n-70DC2 Extra Length          0000 (0)\n-70DC4 Comment Length        0000 (0)\n-70DC6 Disk Start            0000 (0)\n-70DC8 Int File Attributes   0000 (0)\n+7171C CENTRAL HEADER #65    02014B50 (33639248)\n+71720 Created Zip Spec      14 (20) '2.0'\n+71721 Created OS            03 (3) 'Unix'\n+71722 Extract Zip Spec      0A (10) '1.0'\n+71723 Extract OS            00 (0) 'MS-DOS'\n+71724 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71726 Compression Method    0000 (0) 'Stored'\n+71728 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7172C CRC                   00000000 (0)\n+71730 Compressed Size       00000000 (0)\n+71734 Uncompressed Size     00000000 (0)\n+71738 Filename Length       001B (27)\n+7173A Extra Length          0000 (0)\n+7173C Comment Length        0000 (0)\n+7173E Disk Start            0000 (0)\n+71740 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70DCA Ext File Attributes   41ED0010 (1106051088)\n+71742 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70DCE Local Header Offset   00000FFD (4093)\n-70DD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71746 Local Header Offset   00000FFD (4093)\n+7174A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70DD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7174A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70DD2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7174A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70DAA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71722: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70DED CENTRAL HEADER #66    02014B50 (33639248)\n-70DF1 Created Zip Spec      14 (20) '2.0'\n-70DF2 Created OS            03 (3) 'Unix'\n-70DF3 Extract Zip Spec      0A (10) '1.0'\n-70DF4 Extract OS            00 (0) 'MS-DOS'\n-70DF5 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70DF7 Compression Method    0000 (0) 'Stored'\n-70DF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70DFD CRC                   00000000 (0)\n-70E01 Compressed Size       00000000 (0)\n-70E05 Uncompressed Size     00000000 (0)\n-70E09 Filename Length       001D (29)\n-70E0B Extra Length          0000 (0)\n-70E0D Comment Length        0000 (0)\n-70E0F Disk Start            0000 (0)\n-70E11 Int File Attributes   0000 (0)\n+71765 CENTRAL HEADER #66    02014B50 (33639248)\n+71769 Created Zip Spec      14 (20) '2.0'\n+7176A Created OS            03 (3) 'Unix'\n+7176B Extract Zip Spec      0A (10) '1.0'\n+7176C Extract OS            00 (0) 'MS-DOS'\n+7176D General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7176F Compression Method    0000 (0) 'Stored'\n+71771 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71775 CRC                   00000000 (0)\n+71779 Compressed Size       00000000 (0)\n+7177D Uncompressed Size     00000000 (0)\n+71781 Filename Length       001D (29)\n+71783 Extra Length          0000 (0)\n+71785 Comment Length        0000 (0)\n+71787 Disk Start            0000 (0)\n+71789 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70E13 Ext File Attributes   41ED0010 (1106051088)\n+7178B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70E17 Local Header Offset   00001036 (4150)\n-70E1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7178F Local Header Offset   00001036 (4150)\n+71793 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70E1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71793: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70E1B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71793: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70DF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7176B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70E38 CENTRAL HEADER #67    02014B50 (33639248)\n-70E3C Created Zip Spec      14 (20) '2.0'\n-70E3D Created OS            03 (3) 'Unix'\n-70E3E Extract Zip Spec      0A (10) '1.0'\n-70E3F Extract OS            00 (0) 'MS-DOS'\n-70E40 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70E42 Compression Method    0000 (0) 'Stored'\n-70E44 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70E48 CRC                   00000000 (0)\n-70E4C Compressed Size       00000000 (0)\n-70E50 Uncompressed Size     00000000 (0)\n-70E54 Filename Length       001D (29)\n-70E56 Extra Length          0000 (0)\n-70E58 Comment Length        0000 (0)\n-70E5A Disk Start            0000 (0)\n-70E5C Int File Attributes   0000 (0)\n+717B0 CENTRAL HEADER #67    02014B50 (33639248)\n+717B4 Created Zip Spec      14 (20) '2.0'\n+717B5 Created OS            03 (3) 'Unix'\n+717B6 Extract Zip Spec      0A (10) '1.0'\n+717B7 Extract OS            00 (0) 'MS-DOS'\n+717B8 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+717BA Compression Method    0000 (0) 'Stored'\n+717BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+717C0 CRC                   00000000 (0)\n+717C4 Compressed Size       00000000 (0)\n+717C8 Uncompressed Size     00000000 (0)\n+717CC Filename Length       001D (29)\n+717CE Extra Length          0000 (0)\n+717D0 Comment Length        0000 (0)\n+717D2 Disk Start            0000 (0)\n+717D4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70E5E Ext File Attributes   41ED0010 (1106051088)\n+717D6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70E62 Local Header Offset   00001071 (4209)\n-70E66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+717DA Local Header Offset   00001071 (4209)\n+717DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70E66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x717DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70E66: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x717DE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70E3E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x717B6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70E83 CENTRAL HEADER #68    02014B50 (33639248)\n-70E87 Created Zip Spec      14 (20) '2.0'\n-70E88 Created OS            03 (3) 'Unix'\n-70E89 Extract Zip Spec      0A (10) '1.0'\n-70E8A Extract OS            00 (0) 'MS-DOS'\n-70E8B General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70E8D Compression Method    0000 (0) 'Stored'\n-70E8F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70E93 CRC                   00000000 (0)\n-70E97 Compressed Size       00000000 (0)\n-70E9B Uncompressed Size     00000000 (0)\n-70E9F Filename Length       000F (15)\n-70EA1 Extra Length          0000 (0)\n-70EA3 Comment Length        0000 (0)\n-70EA5 Disk Start            0000 (0)\n-70EA7 Int File Attributes   0000 (0)\n+717FB CENTRAL HEADER #68    02014B50 (33639248)\n+717FF Created Zip Spec      14 (20) '2.0'\n+71800 Created OS            03 (3) 'Unix'\n+71801 Extract Zip Spec      0A (10) '1.0'\n+71802 Extract OS            00 (0) 'MS-DOS'\n+71803 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71805 Compression Method    0000 (0) 'Stored'\n+71807 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7180B CRC                   00000000 (0)\n+7180F Compressed Size       00000000 (0)\n+71813 Uncompressed Size     00000000 (0)\n+71817 Filename Length       000F (15)\n+71819 Extra Length          0000 (0)\n+7181B Comment Length        0000 (0)\n+7181D Disk Start            0000 (0)\n+7181F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70EA9 Ext File Attributes   41ED0010 (1106051088)\n+71821 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70EAD Local Header Offset   000010AC (4268)\n-70EB1 Filename              'XXXXXXXXXXXXXXX'\n+71825 Local Header Offset   000010AC (4268)\n+71829 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70EB1: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71829: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70EB1: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71829: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70E89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71801: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-70EC0 CENTRAL HEADER #69    02014B50 (33639248)\n-70EC4 Created Zip Spec      14 (20) '2.0'\n-70EC5 Created OS            03 (3) 'Unix'\n-70EC6 Extract Zip Spec      0A (10) '1.0'\n-70EC7 Extract OS            00 (0) 'MS-DOS'\n-70EC8 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70ECA Compression Method    0000 (0) 'Stored'\n-70ECC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70ED0 CRC                   00000000 (0)\n-70ED4 Compressed Size       00000000 (0)\n-70ED8 Uncompressed Size     00000000 (0)\n-70EDC Filename Length       0018 (24)\n-70EDE Extra Length          0000 (0)\n-70EE0 Comment Length        0000 (0)\n-70EE2 Disk Start            0000 (0)\n-70EE4 Int File Attributes   0000 (0)\n+71838 CENTRAL HEADER #69    02014B50 (33639248)\n+7183C Created Zip Spec      14 (20) '2.0'\n+7183D Created OS            03 (3) 'Unix'\n+7183E Extract Zip Spec      0A (10) '1.0'\n+7183F Extract OS            00 (0) 'MS-DOS'\n+71840 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71842 Compression Method    0000 (0) 'Stored'\n+71844 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71848 CRC                   00000000 (0)\n+7184C Compressed Size       00000000 (0)\n+71850 Uncompressed Size     00000000 (0)\n+71854 Filename Length       0018 (24)\n+71856 Extra Length          0000 (0)\n+71858 Comment Length        0000 (0)\n+7185A Disk Start            0000 (0)\n+7185C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70EE6 Ext File Attributes   41ED0010 (1106051088)\n+7185E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70EEA Local Header Offset   000010D9 (4313)\n-70EEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+71862 Local Header Offset   000010D9 (4313)\n+71866 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70EEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71866: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70EEE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71866: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70EC6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7183E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70F06 CENTRAL HEADER #70    02014B50 (33639248)\n-70F0A Created Zip Spec      14 (20) '2.0'\n-70F0B Created OS            03 (3) 'Unix'\n-70F0C Extract Zip Spec      0A (10) '1.0'\n-70F0D Extract OS            00 (0) 'MS-DOS'\n-70F0E General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70F10 Compression Method    0000 (0) 'Stored'\n-70F12 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70F16 CRC                   00000000 (0)\n-70F1A Compressed Size       00000000 (0)\n-70F1E Uncompressed Size     00000000 (0)\n-70F22 Filename Length       0012 (18)\n-70F24 Extra Length          0000 (0)\n-70F26 Comment Length        0000 (0)\n-70F28 Disk Start            0000 (0)\n-70F2A Int File Attributes   0000 (0)\n+7187E CENTRAL HEADER #70    02014B50 (33639248)\n+71882 Created Zip Spec      14 (20) '2.0'\n+71883 Created OS            03 (3) 'Unix'\n+71884 Extract Zip Spec      0A (10) '1.0'\n+71885 Extract OS            00 (0) 'MS-DOS'\n+71886 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+71888 Compression Method    0000 (0) 'Stored'\n+7188A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7188E CRC                   00000000 (0)\n+71892 Compressed Size       00000000 (0)\n+71896 Uncompressed Size     00000000 (0)\n+7189A Filename Length       0012 (18)\n+7189C Extra Length          0000 (0)\n+7189E Comment Length        0000 (0)\n+718A0 Disk Start            0000 (0)\n+718A2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70F2C Ext File Attributes   41ED0010 (1106051088)\n+718A4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70F30 Local Header Offset   0000110F (4367)\n-70F34 Filename              'XXXXXXXXXXXXXXXXXX'\n+718A8 Local Header Offset   0000110F (4367)\n+718AC Filename              'XXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70F34: Filename 'XXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x718AC: Filename 'XXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70F34: Directory 'XXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x718AC: Directory 'XXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70F0C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71884: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXX'\n #\n \n-70F46 CENTRAL HEADER #71    02014B50 (33639248)\n-70F4A Created Zip Spec      14 (20) '2.0'\n-70F4B Created OS            03 (3) 'Unix'\n-70F4C Extract Zip Spec      0A (10) '1.0'\n-70F4D Extract OS            00 (0) 'MS-DOS'\n-70F4E General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70F50 Compression Method    0000 (0) 'Stored'\n-70F52 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70F56 CRC                   00000000 (0)\n-70F5A Compressed Size       00000000 (0)\n-70F5E Uncompressed Size     00000000 (0)\n-70F62 Filename Length       0009 (9)\n-70F64 Extra Length          0000 (0)\n-70F66 Comment Length        0000 (0)\n-70F68 Disk Start            0000 (0)\n-70F6A Int File Attributes   0000 (0)\n+718BE CENTRAL HEADER #71    02014B50 (33639248)\n+718C2 Created Zip Spec      14 (20) '2.0'\n+718C3 Created OS            03 (3) 'Unix'\n+718C4 Extract Zip Spec      0A (10) '1.0'\n+718C5 Extract OS            00 (0) 'MS-DOS'\n+718C6 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+718C8 Compression Method    0000 (0) 'Stored'\n+718CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+718CE CRC                   00000000 (0)\n+718D2 Compressed Size       00000000 (0)\n+718D6 Uncompressed Size     00000000 (0)\n+718DA Filename Length       0009 (9)\n+718DC Extra Length          0000 (0)\n+718DE Comment Length        0000 (0)\n+718E0 Disk Start            0000 (0)\n+718E2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70F6C Ext File Attributes   41ED0010 (1106051088)\n+718E4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70F70 Local Header Offset   0000113F (4415)\n-70F74 Filename              'XXXXXXXXX'\n+718E8 Local Header Offset   0000113F (4415)\n+718EC Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x70F74: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x718EC: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70F74: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x718EC: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70F4C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x718C4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-70F7D CENTRAL HEADER #72    02014B50 (33639248)\n-70F81 Created Zip Spec      14 (20) '2.0'\n-70F82 Created OS            03 (3) 'Unix'\n-70F83 Extract Zip Spec      0A (10) '1.0'\n-70F84 Extract OS            00 (0) 'MS-DOS'\n-70F85 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70F87 Compression Method    0000 (0) 'Stored'\n-70F89 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70F8D CRC                   00000000 (0)\n-70F91 Compressed Size       00000000 (0)\n-70F95 Uncompressed Size     00000000 (0)\n-70F99 Filename Length       000F (15)\n-70F9B Extra Length          0000 (0)\n-70F9D Comment Length        0000 (0)\n-70F9F Disk Start            0000 (0)\n-70FA1 Int File Attributes   0000 (0)\n+718F5 CENTRAL HEADER #72    02014B50 (33639248)\n+718F9 Created Zip Spec      14 (20) '2.0'\n+718FA Created OS            03 (3) 'Unix'\n+718FB Extract Zip Spec      0A (10) '1.0'\n+718FC Extract OS            00 (0) 'MS-DOS'\n+718FD General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+718FF Compression Method    0000 (0) 'Stored'\n+71901 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71905 CRC                   00000000 (0)\n+71909 Compressed Size       00000000 (0)\n+7190D Uncompressed Size     00000000 (0)\n+71911 Filename Length       000F (15)\n+71913 Extra Length          0000 (0)\n+71915 Comment Length        0000 (0)\n+71917 Disk Start            0000 (0)\n+71919 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70FA3 Ext File Attributes   41ED0010 (1106051088)\n+7191B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70FA7 Local Header Offset   00001166 (4454)\n-70FAB Filename              'XXXXXXXXXXXXXXX'\n+7191F Local Header Offset   00001166 (4454)\n+71923 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70FAB: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71923: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70FAB: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71923: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70F83: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x718FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-70FBA CENTRAL HEADER #73    02014B50 (33639248)\n-70FBE Created Zip Spec      14 (20) '2.0'\n-70FBF Created OS            03 (3) 'Unix'\n-70FC0 Extract Zip Spec      0A (10) '1.0'\n-70FC1 Extract OS            00 (0) 'MS-DOS'\n-70FC2 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-70FC4 Compression Method    0000 (0) 'Stored'\n-70FC6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70FCA CRC                   00000000 (0)\n-70FCE Compressed Size       00000000 (0)\n-70FD2 Uncompressed Size     00000000 (0)\n-70FD6 Filename Length       0020 (32)\n-70FD8 Extra Length          0000 (0)\n-70FDA Comment Length        0000 (0)\n-70FDC Disk Start            0000 (0)\n-70FDE Int File Attributes   0000 (0)\n+71932 CENTRAL HEADER #73    02014B50 (33639248)\n+71936 Created Zip Spec      14 (20) '2.0'\n+71937 Created OS            03 (3) 'Unix'\n+71938 Extract Zip Spec      0A (10) '1.0'\n+71939 Extract OS            00 (0) 'MS-DOS'\n+7193A General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7193C Compression Method    0000 (0) 'Stored'\n+7193E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71942 CRC                   00000000 (0)\n+71946 Compressed Size       00000000 (0)\n+7194A Uncompressed Size     00000000 (0)\n+7194E Filename Length       0020 (32)\n+71950 Extra Length          0000 (0)\n+71952 Comment Length        0000 (0)\n+71954 Disk Start            0000 (0)\n+71956 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-70FE0 Ext File Attributes   41ED0010 (1106051088)\n+71958 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-70FE4 Local Header Offset   00001193 (4499)\n-70FE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7195C Local Header Offset   00001193 (4499)\n+71960 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70FE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71960: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x70FE8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x71960: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x70FC0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71938: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-71008 CENTRAL HEADER #74    02014B50 (33639248)\n-7100C Created Zip Spec      14 (20) '2.0'\n-7100D Created OS            03 (3) 'Unix'\n-7100E Extract Zip Spec      0A (10) '1.0'\n-7100F Extract OS            00 (0) 'MS-DOS'\n-71010 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-71012 Compression Method    0000 (0) 'Stored'\n-71014 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71018 CRC                   00000000 (0)\n-7101C Compressed Size       00000000 (0)\n-71020 Uncompressed Size     00000000 (0)\n-71024 Filename Length       002D (45)\n-71026 Extra Length          0000 (0)\n-71028 Comment Length        0000 (0)\n-7102A Disk Start            0000 (0)\n-7102C Int File Attributes   0000 (0)\n+71980 CENTRAL HEADER #74    02014B50 (33639248)\n+71984 Created Zip Spec      14 (20) '2.0'\n+71985 Created OS            03 (3) 'Unix'\n+71986 Extract Zip Spec      0A (10) '1.0'\n+71987 Extract OS            00 (0) 'MS-DOS'\n+71988 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+7198A Compression Method    0000 (0) 'Stored'\n+7198C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71990 CRC                   00000000 (0)\n+71994 Compressed Size       00000000 (0)\n+71998 Uncompressed Size     00000000 (0)\n+7199C Filename Length       002D (45)\n+7199E Extra Length          0000 (0)\n+719A0 Comment Length        0000 (0)\n+719A2 Disk Start            0000 (0)\n+719A4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7102E Ext File Attributes   41ED0010 (1106051088)\n+719A6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-71032 Local Header Offset   000011D1 (4561)\n-71036 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+719AA Local Header Offset   000011D1 (4561)\n+719AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71036: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x719AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x71036: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x719AE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7100E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71986: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-71063 CENTRAL HEADER #75    02014B50 (33639248)\n-71067 Created Zip Spec      14 (20) '2.0'\n-71068 Created OS            03 (3) 'Unix'\n-71069 Extract Zip Spec      14 (20) '2.0'\n-7106A Extract OS            00 (0) 'MS-DOS'\n-7106B General Purpose Flag  0800 (2048)\n+719DB CENTRAL HEADER #75    02014B50 (33639248)\n+719DF Created Zip Spec      14 (20) '2.0'\n+719E0 Created OS            03 (3) 'Unix'\n+719E1 Extract Zip Spec      14 (20) '2.0'\n+719E2 Extract OS            00 (0) 'MS-DOS'\n+719E3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7106D Compression Method    0008 (8) 'Deflated'\n-7106F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71073 CRC                   84843D83 (2223259011)\n-71077 Compressed Size       0000026F (623)\n-7107B Uncompressed Size     00000753 (1875)\n-7107F Filename Length       0015 (21)\n-71081 Extra Length          0000 (0)\n-71083 Comment Length        0000 (0)\n-71085 Disk Start            0000 (0)\n-71087 Int File Attributes   0000 (0)\n+719E5 Compression Method    0008 (8) 'Deflated'\n+719E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+719EB CRC                   84843D83 (2223259011)\n+719EF Compressed Size       0000026F (623)\n+719F3 Uncompressed Size     00000753 (1875)\n+719F7 Filename Length       0015 (21)\n+719F9 Extra Length          0000 (0)\n+719FB Comment Length        0000 (0)\n+719FD Disk Start            0000 (0)\n+719FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71089 Ext File Attributes   81A40000 (2175008768)\n+71A01 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7108D Local Header Offset   0000121C (4636)\n-71091 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+71A05 Local Header Offset   0000121C (4636)\n+71A09 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71091: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71A09: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-710A6 CENTRAL HEADER #76    02014B50 (33639248)\n-710AA Created Zip Spec      14 (20) '2.0'\n-710AB Created OS            03 (3) 'Unix'\n-710AC Extract Zip Spec      14 (20) '2.0'\n-710AD Extract OS            00 (0) 'MS-DOS'\n-710AE General Purpose Flag  0800 (2048)\n+71A1E CENTRAL HEADER #76    02014B50 (33639248)\n+71A22 Created Zip Spec      14 (20) '2.0'\n+71A23 Created OS            03 (3) 'Unix'\n+71A24 Extract Zip Spec      14 (20) '2.0'\n+71A25 Extract OS            00 (0) 'MS-DOS'\n+71A26 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-710B0 Compression Method    0008 (8) 'Deflated'\n-710B2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-710B6 CRC                   86E2B4B4 (2263004340)\n-710BA Compressed Size       00000F6D (3949)\n-710BE Uncompressed Size     00002C5E (11358)\n-710C2 Filename Length       0010 (16)\n-710C4 Extra Length          0000 (0)\n-710C6 Comment Length        0000 (0)\n-710C8 Disk Start            0000 (0)\n-710CA Int File Attributes   0000 (0)\n+71A28 Compression Method    0008 (8) 'Deflated'\n+71A2A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71A2E CRC                   86E2B4B4 (2263004340)\n+71A32 Compressed Size       00000F6D (3949)\n+71A36 Uncompressed Size     00002C5E (11358)\n+71A3A Filename Length       0010 (16)\n+71A3C Extra Length          0000 (0)\n+71A3E Comment Length        0000 (0)\n+71A40 Disk Start            0000 (0)\n+71A42 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-710CC Ext File Attributes   81A40000 (2175008768)\n+71A44 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-710D0 Local Header Offset   000014BE (5310)\n-710D4 Filename              'XXXXXXXXXXXXXXXX'\n+71A48 Local Header Offset   000014BE (5310)\n+71A4C Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x710D4: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71A4C: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-710E4 CENTRAL HEADER #77    02014B50 (33639248)\n-710E8 Created Zip Spec      14 (20) '2.0'\n-710E9 Created OS            03 (3) 'Unix'\n-710EA Extract Zip Spec      14 (20) '2.0'\n-710EB Extract OS            00 (0) 'MS-DOS'\n-710EC General Purpose Flag  0800 (2048)\n+71A5C CENTRAL HEADER #77    02014B50 (33639248)\n+71A60 Created Zip Spec      14 (20) '2.0'\n+71A61 Created OS            03 (3) 'Unix'\n+71A62 Extract Zip Spec      14 (20) '2.0'\n+71A63 Extract OS            00 (0) 'MS-DOS'\n+71A64 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-710EE Compression Method    0008 (8) 'Deflated'\n-710F0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-710F4 CRC                   59F12043 (1508974659)\n-710F8 Compressed Size       0000007B (123)\n-710FC Uncompressed Size     000000A9 (169)\n-71100 Filename Length       000F (15)\n-71102 Extra Length          0000 (0)\n-71104 Comment Length        0000 (0)\n-71106 Disk Start            0000 (0)\n-71108 Int File Attributes   0000 (0)\n+71A66 Compression Method    0008 (8) 'Deflated'\n+71A68 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71A6C CRC                   59F12043 (1508974659)\n+71A70 Compressed Size       0000007B (123)\n+71A74 Uncompressed Size     000000A9 (169)\n+71A78 Filename Length       000F (15)\n+71A7A Extra Length          0000 (0)\n+71A7C Comment Length        0000 (0)\n+71A7E Disk Start            0000 (0)\n+71A80 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7110A Ext File Attributes   81A40000 (2175008768)\n+71A82 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7110E Local Header Offset   00002459 (9305)\n-71112 Filename              'XXXXXXXXXXXXXXX'\n+71A86 Local Header Offset   00002459 (9305)\n+71A8A Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71112: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71A8A: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71121 CENTRAL HEADER #78    02014B50 (33639248)\n-71125 Created Zip Spec      14 (20) '2.0'\n-71126 Created OS            03 (3) 'Unix'\n-71127 Extract Zip Spec      14 (20) '2.0'\n-71128 Extract OS            00 (0) 'MS-DOS'\n-71129 General Purpose Flag  0800 (2048)\n+71A99 CENTRAL HEADER #78    02014B50 (33639248)\n+71A9D Created Zip Spec      14 (20) '2.0'\n+71A9E Created OS            03 (3) 'Unix'\n+71A9F Extract Zip Spec      14 (20) '2.0'\n+71AA0 Extract OS            00 (0) 'MS-DOS'\n+71AA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7112B Compression Method    0008 (8) 'Deflated'\n-7112D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71131 CRC                   87D33073 (2278764659)\n-71135 Compressed Size       000002BB (699)\n-71139 Uncompressed Size     000005CF (1487)\n-7113D Filename Length       0030 (48)\n-7113F Extra Length          0000 (0)\n-71141 Comment Length        0000 (0)\n-71143 Disk Start            0000 (0)\n-71145 Int File Attributes   0000 (0)\n+71AA3 Compression Method    0008 (8) 'Deflated'\n+71AA5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71AA9 CRC                   87D33073 (2278764659)\n+71AAD Compressed Size       000002BB (699)\n+71AB1 Uncompressed Size     000005CF (1487)\n+71AB5 Filename Length       0030 (48)\n+71AB7 Extra Length          0000 (0)\n+71AB9 Comment Length        0000 (0)\n+71ABB Disk Start            0000 (0)\n+71ABD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71147 Ext File Attributes   81A40000 (2175008768)\n+71ABF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7114B Local Header Offset   00002501 (9473)\n-7114F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71AC3 Local Header Offset   00002501 (9473)\n+71AC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7114F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71AC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7117F CENTRAL HEADER #79    02014B50 (33639248)\n-71183 Created Zip Spec      14 (20) '2.0'\n-71184 Created OS            03 (3) 'Unix'\n-71185 Extract Zip Spec      14 (20) '2.0'\n-71186 Extract OS            00 (0) 'MS-DOS'\n-71187 General Purpose Flag  0800 (2048)\n+71AF7 CENTRAL HEADER #79    02014B50 (33639248)\n+71AFB Created Zip Spec      14 (20) '2.0'\n+71AFC Created OS            03 (3) 'Unix'\n+71AFD Extract Zip Spec      14 (20) '2.0'\n+71AFE Extract OS            00 (0) 'MS-DOS'\n+71AFF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71189 Compression Method    0008 (8) 'Deflated'\n-7118B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7118F CRC                   9122A7A7 (2434967463)\n-71193 Compressed Size       000003B9 (953)\n-71197 Uncompressed Size     00000A3F (2623)\n-7119B Filename Length       0032 (50)\n-7119D Extra Length          0000 (0)\n-7119F Comment Length        0000 (0)\n-711A1 Disk Start            0000 (0)\n-711A3 Int File Attributes   0000 (0)\n+71B01 Compression Method    0008 (8) 'Deflated'\n+71B03 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71B07 CRC                   79620788 (2036467592)\n+71B0B Compressed Size       000003C0 (960)\n+71B0F Uncompressed Size     00000AB0 (2736)\n+71B13 Filename Length       0032 (50)\n+71B15 Extra Length          0000 (0)\n+71B17 Comment Length        0000 (0)\n+71B19 Disk Start            0000 (0)\n+71B1B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-711A5 Ext File Attributes   81A40000 (2175008768)\n+71B1D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-711A9 Local Header Offset   0000280A (10250)\n-711AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71B21 Local Header Offset   0000280A (10250)\n+71B25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x711AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71B25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-711DF CENTRAL HEADER #80    02014B50 (33639248)\n-711E3 Created Zip Spec      14 (20) '2.0'\n-711E4 Created OS            03 (3) 'Unix'\n-711E5 Extract Zip Spec      14 (20) '2.0'\n-711E6 Extract OS            00 (0) 'MS-DOS'\n-711E7 General Purpose Flag  0800 (2048)\n+71B57 CENTRAL HEADER #80    02014B50 (33639248)\n+71B5B Created Zip Spec      14 (20) '2.0'\n+71B5C Created OS            03 (3) 'Unix'\n+71B5D Extract Zip Spec      14 (20) '2.0'\n+71B5E Extract OS            00 (0) 'MS-DOS'\n+71B5F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-711E9 Compression Method    0008 (8) 'Deflated'\n-711EB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-711EF CRC                   3228CAA5 (841534117)\n-711F3 Compressed Size       000003C2 (962)\n-711F7 Uncompressed Size     00000A97 (2711)\n-711FB Filename Length       0030 (48)\n-711FD Extra Length          0000 (0)\n-711FF Comment Length        0000 (0)\n-71201 Disk Start            0000 (0)\n-71203 Int File Attributes   0000 (0)\n+71B61 Compression Method    0008 (8) 'Deflated'\n+71B63 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71B67 CRC                   C8043322 (3355718434)\n+71B6B Compressed Size       000003CA (970)\n+71B6F Uncompressed Size     00000B0F (2831)\n+71B73 Filename Length       0030 (48)\n+71B75 Extra Length          0000 (0)\n+71B77 Comment Length        0000 (0)\n+71B79 Disk Start            0000 (0)\n+71B7B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71205 Ext File Attributes   81A40000 (2175008768)\n+71B7D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71209 Local Header Offset   00002C13 (11283)\n-7120D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71B81 Local Header Offset   00002C1A (11290)\n+71B85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7120D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71B85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7123D CENTRAL HEADER #81    02014B50 (33639248)\n-71241 Created Zip Spec      14 (20) '2.0'\n-71242 Created OS            03 (3) 'Unix'\n-71243 Extract Zip Spec      14 (20) '2.0'\n-71244 Extract OS            00 (0) 'MS-DOS'\n-71245 General Purpose Flag  0800 (2048)\n+71BB5 CENTRAL HEADER #81    02014B50 (33639248)\n+71BB9 Created Zip Spec      14 (20) '2.0'\n+71BBA Created OS            03 (3) 'Unix'\n+71BBB Extract Zip Spec      14 (20) '2.0'\n+71BBC Extract OS            00 (0) 'MS-DOS'\n+71BBD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71247 Compression Method    0008 (8) 'Deflated'\n-71249 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7124D CRC                   4059C95D (1079626077)\n-71251 Compressed Size       00000507 (1287)\n-71255 Uncompressed Size     000010F7 (4343)\n-71259 Filename Length       0030 (48)\n-7125B Extra Length          0000 (0)\n-7125D Comment Length        0000 (0)\n-7125F Disk Start            0000 (0)\n-71261 Int File Attributes   0000 (0)\n+71BBF Compression Method    0008 (8) 'Deflated'\n+71BC1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71BC5 CRC                   7A6AA41E (2053809182)\n+71BC9 Compressed Size       00000512 (1298)\n+71BCD Uncompressed Size     00001180 (4480)\n+71BD1 Filename Length       0030 (48)\n+71BD3 Extra Length          0000 (0)\n+71BD5 Comment Length        0000 (0)\n+71BD7 Disk Start            0000 (0)\n+71BD9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71263 Ext File Attributes   81A40000 (2175008768)\n+71BDB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71267 Local Header Offset   00003023 (12323)\n-7126B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71BDF Local Header Offset   00003032 (12338)\n+71BE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7126B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71BE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7129B CENTRAL HEADER #82    02014B50 (33639248)\n-7129F Created Zip Spec      14 (20) '2.0'\n-712A0 Created OS            03 (3) 'Unix'\n-712A1 Extract Zip Spec      14 (20) '2.0'\n-712A2 Extract OS            00 (0) 'MS-DOS'\n-712A3 General Purpose Flag  0800 (2048)\n+71C13 CENTRAL HEADER #82    02014B50 (33639248)\n+71C17 Created Zip Spec      14 (20) '2.0'\n+71C18 Created OS            03 (3) 'Unix'\n+71C19 Extract Zip Spec      14 (20) '2.0'\n+71C1A Extract OS            00 (0) 'MS-DOS'\n+71C1B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-712A5 Compression Method    0008 (8) 'Deflated'\n-712A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-712AB CRC                   BF971C06 (3214351366)\n-712AF Compressed Size       000002AE (686)\n-712B3 Uncompressed Size     00000552 (1362)\n-712B7 Filename Length       0029 (41)\n-712B9 Extra Length          0000 (0)\n-712BB Comment Length        0000 (0)\n-712BD Disk Start            0000 (0)\n-712BF Int File Attributes   0000 (0)\n+71C1D Compression Method    0008 (8) 'Deflated'\n+71C1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71C23 CRC                   00F537FE (16070654)\n+71C27 Compressed Size       000002B7 (695)\n+71C2B Uncompressed Size     00000577 (1399)\n+71C2F Filename Length       0029 (41)\n+71C31 Extra Length          0000 (0)\n+71C33 Comment Length        0000 (0)\n+71C35 Disk Start            0000 (0)\n+71C37 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-712C1 Ext File Attributes   81A40000 (2175008768)\n+71C39 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-712C5 Local Header Offset   00003578 (13688)\n-712C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71C3D Local Header Offset   00003592 (13714)\n+71C41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x712C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71C41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-712F2 CENTRAL HEADER #83    02014B50 (33639248)\n-712F6 Created Zip Spec      14 (20) '2.0'\n-712F7 Created OS            03 (3) 'Unix'\n-712F8 Extract Zip Spec      14 (20) '2.0'\n-712F9 Extract OS            00 (0) 'MS-DOS'\n-712FA General Purpose Flag  0800 (2048)\n+71C6A CENTRAL HEADER #83    02014B50 (33639248)\n+71C6E Created Zip Spec      14 (20) '2.0'\n+71C6F Created OS            03 (3) 'Unix'\n+71C70 Extract Zip Spec      14 (20) '2.0'\n+71C71 Extract OS            00 (0) 'MS-DOS'\n+71C72 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-712FC Compression Method    0008 (8) 'Deflated'\n-712FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71302 CRC                   1CCCA507 (483173639)\n-71306 Compressed Size       0000046C (1132)\n-7130A Uncompressed Size     000009AB (2475)\n-7130E Filename Length       0026 (38)\n-71310 Extra Length          0000 (0)\n-71312 Comment Length        0000 (0)\n-71314 Disk Start            0000 (0)\n-71316 Int File Attributes   0000 (0)\n+71C74 Compression Method    0008 (8) 'Deflated'\n+71C76 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71C7A CRC                   1CCCA507 (483173639)\n+71C7E Compressed Size       0000046C (1132)\n+71C82 Uncompressed Size     000009AB (2475)\n+71C86 Filename Length       0026 (38)\n+71C88 Extra Length          0000 (0)\n+71C8A Comment Length        0000 (0)\n+71C8C Disk Start            0000 (0)\n+71C8E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71318 Ext File Attributes   81A40000 (2175008768)\n+71C90 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7131C Local Header Offset   0000386D (14445)\n-71320 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71C94 Local Header Offset   00003890 (14480)\n+71C98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71320: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71C98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71346 CENTRAL HEADER #84    02014B50 (33639248)\n-7134A Created Zip Spec      14 (20) '2.0'\n-7134B Created OS            03 (3) 'Unix'\n-7134C Extract Zip Spec      14 (20) '2.0'\n-7134D Extract OS            00 (0) 'MS-DOS'\n-7134E General Purpose Flag  0800 (2048)\n+71CBE CENTRAL HEADER #84    02014B50 (33639248)\n+71CC2 Created Zip Spec      14 (20) '2.0'\n+71CC3 Created OS            03 (3) 'Unix'\n+71CC4 Extract Zip Spec      14 (20) '2.0'\n+71CC5 Extract OS            00 (0) 'MS-DOS'\n+71CC6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71350 Compression Method    0008 (8) 'Deflated'\n-71352 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71356 CRC                   0622E0A0 (102949024)\n-7135A Compressed Size       00000264 (612)\n-7135E Uncompressed Size     0000049F (1183)\n-71362 Filename Length       0021 (33)\n-71364 Extra Length          0000 (0)\n-71366 Comment Length        0000 (0)\n-71368 Disk Start            0000 (0)\n-7136A Int File Attributes   0000 (0)\n+71CC8 Compression Method    0008 (8) 'Deflated'\n+71CCA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71CCE CRC                   0622E0A0 (102949024)\n+71CD2 Compressed Size       00000264 (612)\n+71CD6 Uncompressed Size     0000049F (1183)\n+71CDA Filename Length       0021 (33)\n+71CDC Extra Length          0000 (0)\n+71CDE Comment Length        0000 (0)\n+71CE0 Disk Start            0000 (0)\n+71CE2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7136C Ext File Attributes   81A40000 (2175008768)\n+71CE4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71370 Local Header Offset   00003D1D (15645)\n-71374 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71CE8 Local Header Offset   00003D40 (15680)\n+71CEC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71374: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71CEC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71395 CENTRAL HEADER #85    02014B50 (33639248)\n-71399 Created Zip Spec      14 (20) '2.0'\n-7139A Created OS            03 (3) 'Unix'\n-7139B Extract Zip Spec      14 (20) '2.0'\n-7139C Extract OS            00 (0) 'MS-DOS'\n-7139D General Purpose Flag  0800 (2048)\n+71D0D CENTRAL HEADER #85    02014B50 (33639248)\n+71D11 Created Zip Spec      14 (20) '2.0'\n+71D12 Created OS            03 (3) 'Unix'\n+71D13 Extract Zip Spec      14 (20) '2.0'\n+71D14 Extract OS            00 (0) 'MS-DOS'\n+71D15 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7139F Compression Method    0008 (8) 'Deflated'\n-713A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-713A5 CRC                   3DF15F74 (1039228788)\n-713A9 Compressed Size       00000650 (1616)\n-713AD Uncompressed Size     0000229A (8858)\n-713B1 Filename Length       0027 (39)\n-713B3 Extra Length          0000 (0)\n-713B5 Comment Length        0000 (0)\n-713B7 Disk Start            0000 (0)\n-713B9 Int File Attributes   0000 (0)\n+71D17 Compression Method    0008 (8) 'Deflated'\n+71D19 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71D1D CRC                   3DF15F74 (1039228788)\n+71D21 Compressed Size       00000650 (1616)\n+71D25 Uncompressed Size     0000229A (8858)\n+71D29 Filename Length       0027 (39)\n+71D2B Extra Length          0000 (0)\n+71D2D Comment Length        0000 (0)\n+71D2F Disk Start            0000 (0)\n+71D31 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-713BB Ext File Attributes   81A40000 (2175008768)\n+71D33 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-713BF Local Header Offset   00003FC0 (16320)\n-713C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71D37 Local Header Offset   00003FE3 (16355)\n+71D3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x713C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71D3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-713EA CENTRAL HEADER #86    02014B50 (33639248)\n-713EE Created Zip Spec      14 (20) '2.0'\n-713EF Created OS            03 (3) 'Unix'\n-713F0 Extract Zip Spec      14 (20) '2.0'\n-713F1 Extract OS            00 (0) 'MS-DOS'\n-713F2 General Purpose Flag  0800 (2048)\n+71D62 CENTRAL HEADER #86    02014B50 (33639248)\n+71D66 Created Zip Spec      14 (20) '2.0'\n+71D67 Created OS            03 (3) 'Unix'\n+71D68 Extract Zip Spec      14 (20) '2.0'\n+71D69 Extract OS            00 (0) 'MS-DOS'\n+71D6A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-713F4 Compression Method    0008 (8) 'Deflated'\n-713F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-713FA CRC                   52712A03 (1383148035)\n-713FE Compressed Size       00000226 (550)\n-71402 Uncompressed Size     000003E8 (1000)\n-71406 Filename Length       0026 (38)\n-71408 Extra Length          0000 (0)\n-7140A Comment Length        0000 (0)\n-7140C Disk Start            0000 (0)\n-7140E Int File Attributes   0000 (0)\n+71D6C Compression Method    0008 (8) 'Deflated'\n+71D6E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71D72 CRC                   52712A03 (1383148035)\n+71D76 Compressed Size       00000226 (550)\n+71D7A Uncompressed Size     000003E8 (1000)\n+71D7E Filename Length       0026 (38)\n+71D80 Extra Length          0000 (0)\n+71D82 Comment Length        0000 (0)\n+71D84 Disk Start            0000 (0)\n+71D86 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71410 Ext File Attributes   81A40000 (2175008768)\n+71D88 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71414 Local Header Offset   00004655 (18005)\n-71418 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71D8C Local Header Offset   00004678 (18040)\n+71D90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71418: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71D90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7143E CENTRAL HEADER #87    02014B50 (33639248)\n-71442 Created Zip Spec      14 (20) '2.0'\n-71443 Created OS            03 (3) 'Unix'\n-71444 Extract Zip Spec      14 (20) '2.0'\n-71445 Extract OS            00 (0) 'MS-DOS'\n-71446 General Purpose Flag  0800 (2048)\n+71DB6 CENTRAL HEADER #87    02014B50 (33639248)\n+71DBA Created Zip Spec      14 (20) '2.0'\n+71DBB Created OS            03 (3) 'Unix'\n+71DBC Extract Zip Spec      14 (20) '2.0'\n+71DBD Extract OS            00 (0) 'MS-DOS'\n+71DBE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71448 Compression Method    0008 (8) 'Deflated'\n-7144A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7144E CRC                   4B96BF4D (1268170573)\n-71452 Compressed Size       00002661 (9825)\n-71456 Uncompressed Size     00011389 (70537)\n-7145A Filename Length       0020 (32)\n-7145C Extra Length          0000 (0)\n-7145E Comment Length        0000 (0)\n-71460 Disk Start            0000 (0)\n-71462 Int File Attributes   0000 (0)\n+71DC0 Compression Method    0008 (8) 'Deflated'\n+71DC2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71DC6 CRC                   4B96BF4D (1268170573)\n+71DCA Compressed Size       00002661 (9825)\n+71DCE Uncompressed Size     00011389 (70537)\n+71DD2 Filename Length       0020 (32)\n+71DD4 Extra Length          0000 (0)\n+71DD6 Comment Length        0000 (0)\n+71DD8 Disk Start            0000 (0)\n+71DDA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71464 Ext File Attributes   81A40000 (2175008768)\n+71DDC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71468 Local Header Offset   000048BF (18623)\n-7146C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71DE0 Local Header Offset   000048E2 (18658)\n+71DE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7146C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71DE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7148C CENTRAL HEADER #88    02014B50 (33639248)\n-71490 Created Zip Spec      14 (20) '2.0'\n-71491 Created OS            03 (3) 'Unix'\n-71492 Extract Zip Spec      14 (20) '2.0'\n-71493 Extract OS            00 (0) 'MS-DOS'\n-71494 General Purpose Flag  0800 (2048)\n+71E04 CENTRAL HEADER #88    02014B50 (33639248)\n+71E08 Created Zip Spec      14 (20) '2.0'\n+71E09 Created OS            03 (3) 'Unix'\n+71E0A Extract Zip Spec      14 (20) '2.0'\n+71E0B Extract OS            00 (0) 'MS-DOS'\n+71E0C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71496 Compression Method    0008 (8) 'Deflated'\n-71498 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7149C CRC                   E6F6EE92 (3874942610)\n-714A0 Compressed Size       00000984 (2436)\n-714A4 Uncompressed Size     00003564 (13668)\n-714A8 Filename Length       0027 (39)\n-714AA Extra Length          0000 (0)\n-714AC Comment Length        0000 (0)\n-714AE Disk Start            0000 (0)\n-714B0 Int File Attributes   0000 (0)\n+71E0E Compression Method    0008 (8) 'Deflated'\n+71E10 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71E14 CRC                   E6F6EE92 (3874942610)\n+71E18 Compressed Size       00000984 (2436)\n+71E1C Uncompressed Size     00003564 (13668)\n+71E20 Filename Length       0027 (39)\n+71E22 Extra Length          0000 (0)\n+71E24 Comment Length        0000 (0)\n+71E26 Disk Start            0000 (0)\n+71E28 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-714B2 Ext File Attributes   81A40000 (2175008768)\n+71E2A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-714B6 Local Header Offset   00006F5E (28510)\n-714BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71E2E Local Header Offset   00006F81 (28545)\n+71E32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x714BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71E32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-714E1 CENTRAL HEADER #89    02014B50 (33639248)\n-714E5 Created Zip Spec      14 (20) '2.0'\n-714E6 Created OS            03 (3) 'Unix'\n-714E7 Extract Zip Spec      14 (20) '2.0'\n-714E8 Extract OS            00 (0) 'MS-DOS'\n-714E9 General Purpose Flag  0800 (2048)\n+71E59 CENTRAL HEADER #89    02014B50 (33639248)\n+71E5D Created Zip Spec      14 (20) '2.0'\n+71E5E Created OS            03 (3) 'Unix'\n+71E5F Extract Zip Spec      14 (20) '2.0'\n+71E60 Extract OS            00 (0) 'MS-DOS'\n+71E61 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-714EB Compression Method    0008 (8) 'Deflated'\n-714ED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-714F1 CRC                   8B1361FF (2333303295)\n-714F5 Compressed Size       00000BD3 (3027)\n-714F9 Uncompressed Size     000034A1 (13473)\n-714FD Filename Length       0029 (41)\n-714FF Extra Length          0000 (0)\n-71501 Comment Length        0000 (0)\n-71503 Disk Start            0000 (0)\n-71505 Int File Attributes   0000 (0)\n+71E63 Compression Method    0008 (8) 'Deflated'\n+71E65 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71E69 CRC                   D525E52E (3576030510)\n+71E6D Compressed Size       00000BEA (3050)\n+71E71 Uncompressed Size     00003610 (13840)\n+71E75 Filename Length       0029 (41)\n+71E77 Extra Length          0000 (0)\n+71E79 Comment Length        0000 (0)\n+71E7B Disk Start            0000 (0)\n+71E7D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71507 Ext File Attributes   81A40000 (2175008768)\n+71E7F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7150B Local Header Offset   00007927 (31015)\n-7150F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71E83 Local Header Offset   0000794A (31050)\n+71E87 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7150F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71E87: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71538 CENTRAL HEADER #90    02014B50 (33639248)\n-7153C Created Zip Spec      14 (20) '2.0'\n-7153D Created OS            03 (3) 'Unix'\n-7153E Extract Zip Spec      14 (20) '2.0'\n-7153F Extract OS            00 (0) 'MS-DOS'\n-71540 General Purpose Flag  0800 (2048)\n+71EB0 CENTRAL HEADER #90    02014B50 (33639248)\n+71EB4 Created Zip Spec      14 (20) '2.0'\n+71EB5 Created OS            03 (3) 'Unix'\n+71EB6 Extract Zip Spec      14 (20) '2.0'\n+71EB7 Extract OS            00 (0) 'MS-DOS'\n+71EB8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71542 Compression Method    0008 (8) 'Deflated'\n-71544 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71548 CRC                   F43D3BE1 (4097653729)\n-7154C Compressed Size       00000B7F (2943)\n-71550 Uncompressed Size     00002625 (9765)\n-71554 Filename Length       0024 (36)\n-71556 Extra Length          0000 (0)\n-71558 Comment Length        0000 (0)\n-7155A Disk Start            0000 (0)\n-7155C Int File Attributes   0000 (0)\n+71EBA Compression Method    0008 (8) 'Deflated'\n+71EBC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71EC0 CRC                   82E9AE97 (2196352663)\n+71EC4 Compressed Size       00000B94 (2964)\n+71EC8 Uncompressed Size     0000273B (10043)\n+71ECC Filename Length       0024 (36)\n+71ECE Extra Length          0000 (0)\n+71ED0 Comment Length        0000 (0)\n+71ED2 Disk Start            0000 (0)\n+71ED4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7155E Ext File Attributes   81A40000 (2175008768)\n+71ED6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71562 Local Header Offset   00008541 (34113)\n-71566 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71EDA Local Header Offset   0000857B (34171)\n+71EDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71566: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71EDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7158A CENTRAL HEADER #91    02014B50 (33639248)\n-7158E Created Zip Spec      14 (20) '2.0'\n-7158F Created OS            03 (3) 'Unix'\n-71590 Extract Zip Spec      14 (20) '2.0'\n-71591 Extract OS            00 (0) 'MS-DOS'\n-71592 General Purpose Flag  0800 (2048)\n+71F02 CENTRAL HEADER #91    02014B50 (33639248)\n+71F06 Created Zip Spec      14 (20) '2.0'\n+71F07 Created OS            03 (3) 'Unix'\n+71F08 Extract Zip Spec      14 (20) '2.0'\n+71F09 Extract OS            00 (0) 'MS-DOS'\n+71F0A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71594 Compression Method    0008 (8) 'Deflated'\n-71596 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7159A CRC                   62810B39 (1652624185)\n-7159E Compressed Size       0000027B (635)\n-715A2 Uncompressed Size     00000554 (1364)\n-715A6 Filename Length       0036 (54)\n-715A8 Extra Length          0000 (0)\n-715AA Comment Length        0000 (0)\n-715AC Disk Start            0000 (0)\n-715AE Int File Attributes   0000 (0)\n+71F0C Compression Method    0008 (8) 'Deflated'\n+71F0E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71F12 CRC                   62810B39 (1652624185)\n+71F16 Compressed Size       0000027B (635)\n+71F1A Uncompressed Size     00000554 (1364)\n+71F1E Filename Length       0036 (54)\n+71F20 Extra Length          0000 (0)\n+71F22 Comment Length        0000 (0)\n+71F24 Disk Start            0000 (0)\n+71F26 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-715B0 Ext File Attributes   81A40000 (2175008768)\n+71F28 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-715B4 Local Header Offset   00009102 (37122)\n-715B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71F2C Local Header Offset   00009151 (37201)\n+71F30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x715B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71F30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-715EE CENTRAL HEADER #92    02014B50 (33639248)\n-715F2 Created Zip Spec      14 (20) '2.0'\n-715F3 Created OS            03 (3) 'Unix'\n-715F4 Extract Zip Spec      14 (20) '2.0'\n-715F5 Extract OS            00 (0) 'MS-DOS'\n-715F6 General Purpose Flag  0800 (2048)\n+71F66 CENTRAL HEADER #92    02014B50 (33639248)\n+71F6A Created Zip Spec      14 (20) '2.0'\n+71F6B Created OS            03 (3) 'Unix'\n+71F6C Extract Zip Spec      14 (20) '2.0'\n+71F6D Extract OS            00 (0) 'MS-DOS'\n+71F6E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-715F8 Compression Method    0008 (8) 'Deflated'\n-715FA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-715FE CRC                   F49AF035 (4103794741)\n-71602 Compressed Size       0000065D (1629)\n-71606 Uncompressed Size     000018A5 (6309)\n-7160A Filename Length       0038 (56)\n-7160C Extra Length          0000 (0)\n-7160E Comment Length        0000 (0)\n-71610 Disk Start            0000 (0)\n-71612 Int File Attributes   0000 (0)\n+71F70 Compression Method    0008 (8) 'Deflated'\n+71F72 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71F76 CRC                   7918064D (2031617613)\n+71F7A Compressed Size       00000668 (1640)\n+71F7E Uncompressed Size     00001974 (6516)\n+71F82 Filename Length       0038 (56)\n+71F84 Extra Length          0000 (0)\n+71F86 Comment Length        0000 (0)\n+71F88 Disk Start            0000 (0)\n+71F8A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71614 Ext File Attributes   81A40000 (2175008768)\n+71F8C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71618 Local Header Offset   000093D1 (37841)\n-7161C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71F90 Local Header Offset   00009420 (37920)\n+71F94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7161C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71F94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71654 CENTRAL HEADER #93    02014B50 (33639248)\n-71658 Created Zip Spec      14 (20) '2.0'\n-71659 Created OS            03 (3) 'Unix'\n-7165A Extract Zip Spec      14 (20) '2.0'\n-7165B Extract OS            00 (0) 'MS-DOS'\n-7165C General Purpose Flag  0800 (2048)\n+71FCC CENTRAL HEADER #93    02014B50 (33639248)\n+71FD0 Created Zip Spec      14 (20) '2.0'\n+71FD1 Created OS            03 (3) 'Unix'\n+71FD2 Extract Zip Spec      14 (20) '2.0'\n+71FD3 Extract OS            00 (0) 'MS-DOS'\n+71FD4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7165E Compression Method    0008 (8) 'Deflated'\n-71660 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71664 CRC                   11EE6DF6 (300838390)\n-71668 Compressed Size       00000EF2 (3826)\n-7166C Uncompressed Size     00004ECE (20174)\n-71670 Filename Length       003B (59)\n-71672 Extra Length          0000 (0)\n-71674 Comment Length        0000 (0)\n-71676 Disk Start            0000 (0)\n-71678 Int File Attributes   0000 (0)\n+71FD6 Compression Method    0008 (8) 'Deflated'\n+71FD8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71FDC CRC                   9C935B9B (2626902939)\n+71FE0 Compressed Size       00000F0B (3851)\n+71FE4 Uncompressed Size     000050B4 (20660)\n+71FE8 Filename Length       003B (59)\n+71FEA Extra Length          0000 (0)\n+71FEC Comment Length        0000 (0)\n+71FEE Disk Start            0000 (0)\n+71FF0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7167A Ext File Attributes   81A40000 (2175008768)\n+71FF2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7167E Local Header Offset   00009A84 (39556)\n-71682 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+71FF6 Local Header Offset   00009ADE (39646)\n+71FFA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71682: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71FFA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-716BD CENTRAL HEADER #94    02014B50 (33639248)\n-716C1 Created Zip Spec      14 (20) '2.0'\n-716C2 Created OS            03 (3) 'Unix'\n-716C3 Extract Zip Spec      14 (20) '2.0'\n-716C4 Extract OS            00 (0) 'MS-DOS'\n-716C5 General Purpose Flag  0800 (2048)\n+72035 CENTRAL HEADER #94    02014B50 (33639248)\n+72039 Created Zip Spec      14 (20) '2.0'\n+7203A Created OS            03 (3) 'Unix'\n+7203B Extract Zip Spec      14 (20) '2.0'\n+7203C Extract OS            00 (0) 'MS-DOS'\n+7203D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-716C7 Compression Method    0008 (8) 'Deflated'\n-716C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-716CD CRC                   87F19404 (2280756228)\n-716D1 Compressed Size       00000AF9 (2809)\n-716D5 Uncompressed Size     000032DF (13023)\n-716D9 Filename Length       0034 (52)\n-716DB Extra Length          0000 (0)\n-716DD Comment Length        0000 (0)\n-716DF Disk Start            0000 (0)\n-716E1 Int File Attributes   0000 (0)\n+7203F Compression Method    0008 (8) 'Deflated'\n+72041 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72045 CRC                   2B1352F9 (722686713)\n+72049 Compressed Size       00000B08 (2824)\n+7204D Uncompressed Size     00003462 (13410)\n+72051 Filename Length       0034 (52)\n+72053 Extra Length          0000 (0)\n+72055 Comment Length        0000 (0)\n+72057 Disk Start            0000 (0)\n+72059 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-716E3 Ext File Attributes   81A40000 (2175008768)\n+7205B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-716E7 Local Header Offset   0000A9CF (43471)\n-716EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7205F Local Header Offset   0000AA42 (43586)\n+72063 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x716EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72063: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7171F CENTRAL HEADER #95    02014B50 (33639248)\n-71723 Created Zip Spec      14 (20) '2.0'\n-71724 Created OS            03 (3) 'Unix'\n-71725 Extract Zip Spec      14 (20) '2.0'\n-71726 Extract OS            00 (0) 'MS-DOS'\n-71727 General Purpose Flag  0800 (2048)\n+72097 CENTRAL HEADER #95    02014B50 (33639248)\n+7209B Created Zip Spec      14 (20) '2.0'\n+7209C Created OS            03 (3) 'Unix'\n+7209D Extract Zip Spec      14 (20) '2.0'\n+7209E Extract OS            00 (0) 'MS-DOS'\n+7209F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71729 Compression Method    0008 (8) 'Deflated'\n-7172B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7172F CRC                   AA2CE6AF (2855069359)\n-71733 Compressed Size       000004D5 (1237)\n-71737 Uncompressed Size     00000DB2 (3506)\n-7173B Filename Length       003F (63)\n-7173D Extra Length          0000 (0)\n-7173F Comment Length        0000 (0)\n-71741 Disk Start            0000 (0)\n-71743 Int File Attributes   0000 (0)\n+720A1 Compression Method    0008 (8) 'Deflated'\n+720A3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+720A7 CRC                   50C2BDD7 (1354939863)\n+720AB Compressed Size       000004E2 (1250)\n+720AF Uncompressed Size     00000E1B (3611)\n+720B3 Filename Length       003F (63)\n+720B5 Extra Length          0000 (0)\n+720B7 Comment Length        0000 (0)\n+720B9 Disk Start            0000 (0)\n+720BB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71745 Ext File Attributes   81A40000 (2175008768)\n+720BD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71749 Local Header Offset   0000B51A (46362)\n-7174D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+720C1 Local Header Offset   0000B59C (46492)\n+720C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7174D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x720C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7178C CENTRAL HEADER #96    02014B50 (33639248)\n-71790 Created Zip Spec      14 (20) '2.0'\n-71791 Created OS            03 (3) 'Unix'\n-71792 Extract Zip Spec      14 (20) '2.0'\n-71793 Extract OS            00 (0) 'MS-DOS'\n-71794 General Purpose Flag  0800 (2048)\n+72104 CENTRAL HEADER #96    02014B50 (33639248)\n+72108 Created Zip Spec      14 (20) '2.0'\n+72109 Created OS            03 (3) 'Unix'\n+7210A Extract Zip Spec      14 (20) '2.0'\n+7210B Extract OS            00 (0) 'MS-DOS'\n+7210C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71796 Compression Method    0008 (8) 'Deflated'\n-71798 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7179C CRC                   4F0E9D5D (1326357853)\n-717A0 Compressed Size       00000852 (2130)\n-717A4 Uncompressed Size     00002017 (8215)\n-717A8 Filename Length       002B (43)\n-717AA Extra Length          0000 (0)\n-717AC Comment Length        0000 (0)\n-717AE Disk Start            0000 (0)\n-717B0 Int File Attributes   0000 (0)\n+7210E Compression Method    0008 (8) 'Deflated'\n+72110 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72114 CRC                   4F0E9D5D (1326357853)\n+72118 Compressed Size       00000852 (2130)\n+7211C Uncompressed Size     00002017 (8215)\n+72120 Filename Length       002B (43)\n+72122 Extra Length          0000 (0)\n+72124 Comment Length        0000 (0)\n+72126 Disk Start            0000 (0)\n+72128 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-717B2 Ext File Attributes   81A40000 (2175008768)\n+7212A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-717B6 Local Header Offset   0000BA4C (47692)\n-717BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7212E Local Header Offset   0000BADB (47835)\n+72132 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x717BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72132: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-717E5 CENTRAL HEADER #97    02014B50 (33639248)\n-717E9 Created Zip Spec      14 (20) '2.0'\n-717EA Created OS            03 (3) 'Unix'\n-717EB Extract Zip Spec      14 (20) '2.0'\n-717EC Extract OS            00 (0) 'MS-DOS'\n-717ED General Purpose Flag  0800 (2048)\n+7215D CENTRAL HEADER #97    02014B50 (33639248)\n+72161 Created Zip Spec      14 (20) '2.0'\n+72162 Created OS            03 (3) 'Unix'\n+72163 Extract Zip Spec      14 (20) '2.0'\n+72164 Extract OS            00 (0) 'MS-DOS'\n+72165 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-717EF Compression Method    0008 (8) 'Deflated'\n-717F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-717F5 CRC                   35B34ECC (900943564)\n-717F9 Compressed Size       00000276 (630)\n-717FD Uncompressed Size     0000049E (1182)\n-71801 Filename Length       003B (59)\n-71803 Extra Length          0000 (0)\n-71805 Comment Length        0000 (0)\n-71807 Disk Start            0000 (0)\n-71809 Int File Attributes   0000 (0)\n+72167 Compression Method    0008 (8) 'Deflated'\n+72169 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7216D CRC                   35B34ECC (900943564)\n+72171 Compressed Size       00000276 (630)\n+72175 Uncompressed Size     0000049E (1182)\n+72179 Filename Length       003B (59)\n+7217B Extra Length          0000 (0)\n+7217D Comment Length        0000 (0)\n+7217F Disk Start            0000 (0)\n+72181 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7180B Ext File Attributes   81A40000 (2175008768)\n+72183 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7180F Local Header Offset   0000C2E7 (49895)\n-71813 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72187 Local Header Offset   0000C376 (50038)\n+7218B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71813: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7218B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7184E CENTRAL HEADER #98    02014B50 (33639248)\n-71852 Created Zip Spec      14 (20) '2.0'\n-71853 Created OS            03 (3) 'Unix'\n-71854 Extract Zip Spec      14 (20) '2.0'\n-71855 Extract OS            00 (0) 'MS-DOS'\n-71856 General Purpose Flag  0800 (2048)\n+721C6 CENTRAL HEADER #98    02014B50 (33639248)\n+721CA Created Zip Spec      14 (20) '2.0'\n+721CB Created OS            03 (3) 'Unix'\n+721CC Extract Zip Spec      14 (20) '2.0'\n+721CD Extract OS            00 (0) 'MS-DOS'\n+721CE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71858 Compression Method    0008 (8) 'Deflated'\n-7185A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7185E CRC                   AE36D6DB (2922829531)\n-71862 Compressed Size       00000275 (629)\n-71866 Uncompressed Size     000004A6 (1190)\n-7186A Filename Length       003D (61)\n-7186C Extra Length          0000 (0)\n-7186E Comment Length        0000 (0)\n-71870 Disk Start            0000 (0)\n-71872 Int File Attributes   0000 (0)\n+721D0 Compression Method    0008 (8) 'Deflated'\n+721D2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+721D6 CRC                   AE36D6DB (2922829531)\n+721DA Compressed Size       00000275 (629)\n+721DE Uncompressed Size     000004A6 (1190)\n+721E2 Filename Length       003D (61)\n+721E4 Extra Length          0000 (0)\n+721E6 Comment Length        0000 (0)\n+721E8 Disk Start            0000 (0)\n+721EA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71874 Ext File Attributes   81A40000 (2175008768)\n+721EC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71878 Local Header Offset   0000C5B6 (50614)\n-7187C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+721F0 Local Header Offset   0000C645 (50757)\n+721F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7187C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x721F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-718B9 CENTRAL HEADER #99    02014B50 (33639248)\n-718BD Created Zip Spec      14 (20) '2.0'\n-718BE Created OS            03 (3) 'Unix'\n-718BF Extract Zip Spec      14 (20) '2.0'\n-718C0 Extract OS            00 (0) 'MS-DOS'\n-718C1 General Purpose Flag  0800 (2048)\n+72231 CENTRAL HEADER #99    02014B50 (33639248)\n+72235 Created Zip Spec      14 (20) '2.0'\n+72236 Created OS            03 (3) 'Unix'\n+72237 Extract Zip Spec      14 (20) '2.0'\n+72238 Extract OS            00 (0) 'MS-DOS'\n+72239 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-718C3 Compression Method    0008 (8) 'Deflated'\n-718C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-718C9 CRC                   693DBCBA (1765653690)\n-718CD Compressed Size       00000C43 (3139)\n-718D1 Uncompressed Size     00002F4D (12109)\n-718D5 Filename Length       002B (43)\n-718D7 Extra Length          0000 (0)\n-718D9 Comment Length        0000 (0)\n-718DB Disk Start            0000 (0)\n-718DD Int File Attributes   0000 (0)\n+7223B Compression Method    0008 (8) 'Deflated'\n+7223D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72241 CRC                   693DBCBA (1765653690)\n+72245 Compressed Size       00000C43 (3139)\n+72249 Uncompressed Size     00002F4D (12109)\n+7224D Filename Length       002B (43)\n+7224F Extra Length          0000 (0)\n+72251 Comment Length        0000 (0)\n+72253 Disk Start            0000 (0)\n+72255 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-718DF Ext File Attributes   81A40000 (2175008768)\n+72257 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-718E3 Local Header Offset   0000C886 (51334)\n-718E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7225B Local Header Offset   0000C915 (51477)\n+7225F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x718E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7225F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71912 CENTRAL HEADER #100   02014B50 (33639248)\n-71916 Created Zip Spec      14 (20) '2.0'\n-71917 Created OS            03 (3) 'Unix'\n-71918 Extract Zip Spec      14 (20) '2.0'\n-71919 Extract OS            00 (0) 'MS-DOS'\n-7191A General Purpose Flag  0800 (2048)\n+7228A CENTRAL HEADER #100   02014B50 (33639248)\n+7228E Created Zip Spec      14 (20) '2.0'\n+7228F Created OS            03 (3) 'Unix'\n+72290 Extract Zip Spec      14 (20) '2.0'\n+72291 Extract OS            00 (0) 'MS-DOS'\n+72292 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7191C Compression Method    0008 (8) 'Deflated'\n-7191E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71922 CRC                   44BCC62B (1153222187)\n-71926 Compressed Size       00000F74 (3956)\n-7192A Uncompressed Size     00004608 (17928)\n-7192E Filename Length       002D (45)\n-71930 Extra Length          0000 (0)\n-71932 Comment Length        0000 (0)\n-71934 Disk Start            0000 (0)\n-71936 Int File Attributes   0000 (0)\n+72294 Compression Method    0008 (8) 'Deflated'\n+72296 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7229A CRC                   44BCC62B (1153222187)\n+7229E Compressed Size       00000F74 (3956)\n+722A2 Uncompressed Size     00004608 (17928)\n+722A6 Filename Length       002D (45)\n+722A8 Extra Length          0000 (0)\n+722AA Comment Length        0000 (0)\n+722AC Disk Start            0000 (0)\n+722AE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71938 Ext File Attributes   81A40000 (2175008768)\n+722B0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7193C Local Header Offset   0000D512 (54546)\n-71940 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+722B4 Local Header Offset   0000D5A1 (54689)\n+722B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71940: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x722B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7196D CENTRAL HEADER #101   02014B50 (33639248)\n-71971 Created Zip Spec      14 (20) '2.0'\n-71972 Created OS            03 (3) 'Unix'\n-71973 Extract Zip Spec      14 (20) '2.0'\n-71974 Extract OS            00 (0) 'MS-DOS'\n-71975 General Purpose Flag  0800 (2048)\n+722E5 CENTRAL HEADER #101   02014B50 (33639248)\n+722E9 Created Zip Spec      14 (20) '2.0'\n+722EA Created OS            03 (3) 'Unix'\n+722EB Extract Zip Spec      14 (20) '2.0'\n+722EC Extract OS            00 (0) 'MS-DOS'\n+722ED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71977 Compression Method    0008 (8) 'Deflated'\n-71979 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7197D CRC                   01EEDE5E (32431710)\n-71981 Compressed Size       0000028F (655)\n-71985 Uncompressed Size     000004E7 (1255)\n-71989 Filename Length       002E (46)\n-7198B Extra Length          0000 (0)\n-7198D Comment Length        0000 (0)\n-7198F Disk Start            0000 (0)\n-71991 Int File Attributes   0000 (0)\n+722EF Compression Method    0008 (8) 'Deflated'\n+722F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+722F5 CRC                   01EEDE5E (32431710)\n+722F9 Compressed Size       0000028F (655)\n+722FD Uncompressed Size     000004E7 (1255)\n+72301 Filename Length       002E (46)\n+72303 Extra Length          0000 (0)\n+72305 Comment Length        0000 (0)\n+72307 Disk Start            0000 (0)\n+72309 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71993 Ext File Attributes   81A40000 (2175008768)\n+7230B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71997 Local Header Offset   0000E4D1 (58577)\n-7199B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7230F Local Header Offset   0000E560 (58720)\n+72313 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7199B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72313: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-719C9 CENTRAL HEADER #102   02014B50 (33639248)\n-719CD Created Zip Spec      14 (20) '2.0'\n-719CE Created OS            03 (3) 'Unix'\n-719CF Extract Zip Spec      14 (20) '2.0'\n-719D0 Extract OS            00 (0) 'MS-DOS'\n-719D1 General Purpose Flag  0800 (2048)\n+72341 CENTRAL HEADER #102   02014B50 (33639248)\n+72345 Created Zip Spec      14 (20) '2.0'\n+72346 Created OS            03 (3) 'Unix'\n+72347 Extract Zip Spec      14 (20) '2.0'\n+72348 Extract OS            00 (0) 'MS-DOS'\n+72349 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-719D3 Compression Method    0008 (8) 'Deflated'\n-719D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-719D9 CRC                   20854F04 (545607428)\n-719DD Compressed Size       00000490 (1168)\n-719E1 Uncompressed Size     00000B1B (2843)\n-719E5 Filename Length       003E (62)\n-719E7 Extra Length          0000 (0)\n-719E9 Comment Length        0000 (0)\n-719EB Disk Start            0000 (0)\n-719ED Int File Attributes   0000 (0)\n+7234B Compression Method    0008 (8) 'Deflated'\n+7234D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72351 CRC                   20854F04 (545607428)\n+72355 Compressed Size       00000490 (1168)\n+72359 Uncompressed Size     00000B1B (2843)\n+7235D Filename Length       003E (62)\n+7235F Extra Length          0000 (0)\n+72361 Comment Length        0000 (0)\n+72363 Disk Start            0000 (0)\n+72365 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-719EF Ext File Attributes   81A40000 (2175008768)\n+72367 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-719F3 Local Header Offset   0000E7AC (59308)\n-719F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7236B Local Header Offset   0000E83B (59451)\n+7236F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x719F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7236F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71A35 CENTRAL HEADER #103   02014B50 (33639248)\n-71A39 Created Zip Spec      14 (20) '2.0'\n-71A3A Created OS            03 (3) 'Unix'\n-71A3B Extract Zip Spec      14 (20) '2.0'\n-71A3C Extract OS            00 (0) 'MS-DOS'\n-71A3D General Purpose Flag  0800 (2048)\n+723AD CENTRAL HEADER #103   02014B50 (33639248)\n+723B1 Created Zip Spec      14 (20) '2.0'\n+723B2 Created OS            03 (3) 'Unix'\n+723B3 Extract Zip Spec      14 (20) '2.0'\n+723B4 Extract OS            00 (0) 'MS-DOS'\n+723B5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71A3F Compression Method    0008 (8) 'Deflated'\n-71A41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71A45 CRC                   D19D012A (3516727594)\n-71A49 Compressed Size       00000338 (824)\n-71A4D Uncompressed Size     00000733 (1843)\n-71A51 Filename Length       003E (62)\n-71A53 Extra Length          0000 (0)\n-71A55 Comment Length        0000 (0)\n-71A57 Disk Start            0000 (0)\n-71A59 Int File Attributes   0000 (0)\n+723B7 Compression Method    0008 (8) 'Deflated'\n+723B9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+723BD CRC                   D19D012A (3516727594)\n+723C1 Compressed Size       00000338 (824)\n+723C5 Uncompressed Size     00000733 (1843)\n+723C9 Filename Length       003E (62)\n+723CB Extra Length          0000 (0)\n+723CD Comment Length        0000 (0)\n+723CF Disk Start            0000 (0)\n+723D1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71A5B Ext File Attributes   81A40000 (2175008768)\n+723D3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71A5F Local Header Offset   0000EC98 (60568)\n-71A63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+723D7 Local Header Offset   0000ED27 (60711)\n+723DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71A63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x723DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71AA1 CENTRAL HEADER #104   02014B50 (33639248)\n-71AA5 Created Zip Spec      14 (20) '2.0'\n-71AA6 Created OS            03 (3) 'Unix'\n-71AA7 Extract Zip Spec      14 (20) '2.0'\n-71AA8 Extract OS            00 (0) 'MS-DOS'\n-71AA9 General Purpose Flag  0800 (2048)\n+72419 CENTRAL HEADER #104   02014B50 (33639248)\n+7241D Created Zip Spec      14 (20) '2.0'\n+7241E Created OS            03 (3) 'Unix'\n+7241F Extract Zip Spec      14 (20) '2.0'\n+72420 Extract OS            00 (0) 'MS-DOS'\n+72421 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71AAB Compression Method    0008 (8) 'Deflated'\n-71AAD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71AB1 CRC                   489CA2B6 (1218224822)\n-71AB5 Compressed Size       00000D33 (3379)\n-71AB9 Uncompressed Size     00003CC4 (15556)\n-71ABD Filename Length       0038 (56)\n-71ABF Extra Length          0000 (0)\n-71AC1 Comment Length        0000 (0)\n-71AC3 Disk Start            0000 (0)\n-71AC5 Int File Attributes   0000 (0)\n+72423 Compression Method    0008 (8) 'Deflated'\n+72425 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72429 CRC                   489CA2B6 (1218224822)\n+7242D Compressed Size       00000D33 (3379)\n+72431 Uncompressed Size     00003CC4 (15556)\n+72435 Filename Length       0038 (56)\n+72437 Extra Length          0000 (0)\n+72439 Comment Length        0000 (0)\n+7243B Disk Start            0000 (0)\n+7243D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71AC7 Ext File Attributes   81A40000 (2175008768)\n+7243F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71ACB Local Header Offset   0000F02C (61484)\n-71ACF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72443 Local Header Offset   0000F0BB (61627)\n+72447 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71ACF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72447: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71B07 CENTRAL HEADER #105   02014B50 (33639248)\n-71B0B Created Zip Spec      14 (20) '2.0'\n-71B0C Created OS            03 (3) 'Unix'\n-71B0D Extract Zip Spec      14 (20) '2.0'\n-71B0E Extract OS            00 (0) 'MS-DOS'\n-71B0F General Purpose Flag  0800 (2048)\n+7247F CENTRAL HEADER #105   02014B50 (33639248)\n+72483 Created Zip Spec      14 (20) '2.0'\n+72484 Created OS            03 (3) 'Unix'\n+72485 Extract Zip Spec      14 (20) '2.0'\n+72486 Extract OS            00 (0) 'MS-DOS'\n+72487 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71B11 Compression Method    0008 (8) 'Deflated'\n-71B13 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71B17 CRC                   BD63F8B8 (3177445560)\n-71B1B Compressed Size       000005F8 (1528)\n-71B1F Uncompressed Size     000013BA (5050)\n-71B23 Filename Length       003C (60)\n-71B25 Extra Length          0000 (0)\n-71B27 Comment Length        0000 (0)\n-71B29 Disk Start            0000 (0)\n-71B2B Int File Attributes   0000 (0)\n+72489 Compression Method    0008 (8) 'Deflated'\n+7248B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7248F CRC                   BD63F8B8 (3177445560)\n+72493 Compressed Size       000005F8 (1528)\n+72497 Uncompressed Size     000013BA (5050)\n+7249B Filename Length       003C (60)\n+7249D Extra Length          0000 (0)\n+7249F Comment Length        0000 (0)\n+724A1 Disk Start            0000 (0)\n+724A3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71B2D Ext File Attributes   81A40000 (2175008768)\n+724A5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71B31 Local Header Offset   0000FDB5 (64949)\n-71B35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+724A9 Local Header Offset   0000FE44 (65092)\n+724AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71B35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x724AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71B71 CENTRAL HEADER #106   02014B50 (33639248)\n-71B75 Created Zip Spec      14 (20) '2.0'\n-71B76 Created OS            03 (3) 'Unix'\n-71B77 Extract Zip Spec      14 (20) '2.0'\n-71B78 Extract OS            00 (0) 'MS-DOS'\n-71B79 General Purpose Flag  0800 (2048)\n+724E9 CENTRAL HEADER #106   02014B50 (33639248)\n+724ED Created Zip Spec      14 (20) '2.0'\n+724EE Created OS            03 (3) 'Unix'\n+724EF Extract Zip Spec      14 (20) '2.0'\n+724F0 Extract OS            00 (0) 'MS-DOS'\n+724F1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71B7B Compression Method    0008 (8) 'Deflated'\n-71B7D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71B81 CRC                   C96B89A9 (3379268009)\n-71B85 Compressed Size       0000053B (1339)\n-71B89 Uncompressed Size     00000DB0 (3504)\n-71B8D Filename Length       003F (63)\n-71B8F Extra Length          0000 (0)\n-71B91 Comment Length        0000 (0)\n-71B93 Disk Start            0000 (0)\n-71B95 Int File Attributes   0000 (0)\n+724F3 Compression Method    0008 (8) 'Deflated'\n+724F5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+724F9 CRC                   C96B89A9 (3379268009)\n+724FD Compressed Size       0000053B (1339)\n+72501 Uncompressed Size     00000DB0 (3504)\n+72505 Filename Length       003F (63)\n+72507 Extra Length          0000 (0)\n+72509 Comment Length        0000 (0)\n+7250B Disk Start            0000 (0)\n+7250D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71B97 Ext File Attributes   81A40000 (2175008768)\n+7250F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71B9B Local Header Offset   00010407 (66567)\n-71B9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72513 Local Header Offset   00010496 (66710)\n+72517 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71B9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72517: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71BDE CENTRAL HEADER #107   02014B50 (33639248)\n-71BE2 Created Zip Spec      14 (20) '2.0'\n-71BE3 Created OS            03 (3) 'Unix'\n-71BE4 Extract Zip Spec      14 (20) '2.0'\n-71BE5 Extract OS            00 (0) 'MS-DOS'\n-71BE6 General Purpose Flag  0800 (2048)\n+72556 CENTRAL HEADER #107   02014B50 (33639248)\n+7255A Created Zip Spec      14 (20) '2.0'\n+7255B Created OS            03 (3) 'Unix'\n+7255C Extract Zip Spec      14 (20) '2.0'\n+7255D Extract OS            00 (0) 'MS-DOS'\n+7255E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71BE8 Compression Method    0008 (8) 'Deflated'\n-71BEA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71BEE CRC                   3FE3ACCB (1071885515)\n-71BF2 Compressed Size       00000B15 (2837)\n-71BF6 Uncompressed Size     00002CC5 (11461)\n-71BFA Filename Length       0039 (57)\n-71BFC Extra Length          0000 (0)\n-71BFE Comment Length        0000 (0)\n-71C00 Disk Start            0000 (0)\n-71C02 Int File Attributes   0000 (0)\n+72560 Compression Method    0008 (8) 'Deflated'\n+72562 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72566 CRC                   3FE3ACCB (1071885515)\n+7256A Compressed Size       00000B15 (2837)\n+7256E Uncompressed Size     00002CC5 (11461)\n+72572 Filename Length       0039 (57)\n+72574 Extra Length          0000 (0)\n+72576 Comment Length        0000 (0)\n+72578 Disk Start            0000 (0)\n+7257A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71C04 Ext File Attributes   81A40000 (2175008768)\n+7257C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71C08 Local Header Offset   0001099F (67999)\n-71C0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72580 Local Header Offset   00010A2E (68142)\n+72584 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71C0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72584: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71C45 CENTRAL HEADER #108   02014B50 (33639248)\n-71C49 Created Zip Spec      14 (20) '2.0'\n-71C4A Created OS            03 (3) 'Unix'\n-71C4B Extract Zip Spec      14 (20) '2.0'\n-71C4C Extract OS            00 (0) 'MS-DOS'\n-71C4D General Purpose Flag  0800 (2048)\n+725BD CENTRAL HEADER #108   02014B50 (33639248)\n+725C1 Created Zip Spec      14 (20) '2.0'\n+725C2 Created OS            03 (3) 'Unix'\n+725C3 Extract Zip Spec      14 (20) '2.0'\n+725C4 Extract OS            00 (0) 'MS-DOS'\n+725C5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71C4F Compression Method    0008 (8) 'Deflated'\n-71C51 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71C55 CRC                   F325AC46 (4079332422)\n-71C59 Compressed Size       00000588 (1416)\n-71C5D Uncompressed Size     000010FE (4350)\n-71C61 Filename Length       003A (58)\n-71C63 Extra Length          0000 (0)\n-71C65 Comment Length        0000 (0)\n-71C67 Disk Start            0000 (0)\n-71C69 Int File Attributes   0000 (0)\n+725C7 Compression Method    0008 (8) 'Deflated'\n+725C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+725CD CRC                   A81790A7 (2820116647)\n+725D1 Compressed Size       00000596 (1430)\n+725D5 Uncompressed Size     0000117D (4477)\n+725D9 Filename Length       003A (58)\n+725DB Extra Length          0000 (0)\n+725DD Comment Length        0000 (0)\n+725DF Disk Start            0000 (0)\n+725E1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71C6B Ext File Attributes   81A40000 (2175008768)\n+725E3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71C6F Local Header Offset   0001150B (70923)\n-71C73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+725E7 Local Header Offset   0001159A (71066)\n+725EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71C73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x725EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71CAD CENTRAL HEADER #109   02014B50 (33639248)\n-71CB1 Created Zip Spec      14 (20) '2.0'\n-71CB2 Created OS            03 (3) 'Unix'\n-71CB3 Extract Zip Spec      14 (20) '2.0'\n-71CB4 Extract OS            00 (0) 'MS-DOS'\n-71CB5 General Purpose Flag  0800 (2048)\n+72625 CENTRAL HEADER #109   02014B50 (33639248)\n+72629 Created Zip Spec      14 (20) '2.0'\n+7262A Created OS            03 (3) 'Unix'\n+7262B Extract Zip Spec      14 (20) '2.0'\n+7262C Extract OS            00 (0) 'MS-DOS'\n+7262D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71CB7 Compression Method    0008 (8) 'Deflated'\n-71CB9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71CBD CRC                   9BAFC26A (2611987050)\n-71CC1 Compressed Size       000007B7 (1975)\n-71CC5 Uncompressed Size     00001AC5 (6853)\n-71CC9 Filename Length       0031 (49)\n-71CCB Extra Length          0000 (0)\n-71CCD Comment Length        0000 (0)\n-71CCF Disk Start            0000 (0)\n-71CD1 Int File Attributes   0000 (0)\n+7262F Compression Method    0008 (8) 'Deflated'\n+72631 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72635 CRC                   AB15E1E2 (2870338018)\n+72639 Compressed Size       000007C7 (1991)\n+7263D Uncompressed Size     00001B78 (7032)\n+72641 Filename Length       0031 (49)\n+72643 Extra Length          0000 (0)\n+72645 Comment Length        0000 (0)\n+72647 Disk Start            0000 (0)\n+72649 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71CD3 Ext File Attributes   81A40000 (2175008768)\n+7264B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71CD7 Local Header Offset   00011AEB (72427)\n-71CDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7264F Local Header Offset   00011B88 (72584)\n+72653 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71CDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72653: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71D0C CENTRAL HEADER #110   02014B50 (33639248)\n-71D10 Created Zip Spec      14 (20) '2.0'\n-71D11 Created OS            03 (3) 'Unix'\n-71D12 Extract Zip Spec      14 (20) '2.0'\n-71D13 Extract OS            00 (0) 'MS-DOS'\n-71D14 General Purpose Flag  0800 (2048)\n+72684 CENTRAL HEADER #110   02014B50 (33639248)\n+72688 Created Zip Spec      14 (20) '2.0'\n+72689 Created OS            03 (3) 'Unix'\n+7268A Extract Zip Spec      14 (20) '2.0'\n+7268B Extract OS            00 (0) 'MS-DOS'\n+7268C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71D16 Compression Method    0008 (8) 'Deflated'\n-71D18 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71D1C CRC                   68B50306 (1756693254)\n-71D20 Compressed Size       00000597 (1431)\n-71D24 Uncompressed Size     000012AB (4779)\n-71D28 Filename Length       0036 (54)\n-71D2A Extra Length          0000 (0)\n-71D2C Comment Length        0000 (0)\n-71D2E Disk Start            0000 (0)\n-71D30 Int File Attributes   0000 (0)\n+7268E Compression Method    0008 (8) 'Deflated'\n+72690 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72694 CRC                   7B55AE57 (2069212759)\n+72698 Compressed Size       000005A3 (1443)\n+7269C Uncompressed Size     00001330 (4912)\n+726A0 Filename Length       0036 (54)\n+726A2 Extra Length          0000 (0)\n+726A4 Comment Length        0000 (0)\n+726A6 Disk Start            0000 (0)\n+726A8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71D32 Ext File Attributes   81A40000 (2175008768)\n+726AA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71D36 Local Header Offset   000122F1 (74481)\n-71D3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+726AE Local Header Offset   0001239E (74654)\n+726B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71D3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x726B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71D70 CENTRAL HEADER #111   02014B50 (33639248)\n-71D74 Created Zip Spec      14 (20) '2.0'\n-71D75 Created OS            03 (3) 'Unix'\n-71D76 Extract Zip Spec      14 (20) '2.0'\n-71D77 Extract OS            00 (0) 'MS-DOS'\n-71D78 General Purpose Flag  0800 (2048)\n+726E8 CENTRAL HEADER #111   02014B50 (33639248)\n+726EC Created Zip Spec      14 (20) '2.0'\n+726ED Created OS            03 (3) 'Unix'\n+726EE Extract Zip Spec      14 (20) '2.0'\n+726EF Extract OS            00 (0) 'MS-DOS'\n+726F0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71D7A Compression Method    0008 (8) 'Deflated'\n-71D7C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71D80 CRC                   0BFFCD1E (201313566)\n-71D84 Compressed Size       000008D8 (2264)\n-71D88 Uncompressed Size     00002715 (10005)\n-71D8C Filename Length       002F (47)\n-71D8E Extra Length          0000 (0)\n-71D90 Comment Length        0000 (0)\n-71D92 Disk Start            0000 (0)\n-71D94 Int File Attributes   0000 (0)\n+726F2 Compression Method    0008 (8) 'Deflated'\n+726F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+726F8 CRC                   8F24621B (2401526299)\n+726FC Compressed Size       000008E8 (2280)\n+72700 Uncompressed Size     000027FE (10238)\n+72704 Filename Length       002F (47)\n+72706 Extra Length          0000 (0)\n+72708 Comment Length        0000 (0)\n+7270A Disk Start            0000 (0)\n+7270C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71D96 Ext File Attributes   81A40000 (2175008768)\n+7270E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71D9A Local Header Offset   000128DC (75996)\n-71D9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72712 Local Header Offset   00012995 (76181)\n+72716 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71D9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72716: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71DCD CENTRAL HEADER #112   02014B50 (33639248)\n-71DD1 Created Zip Spec      14 (20) '2.0'\n-71DD2 Created OS            03 (3) 'Unix'\n-71DD3 Extract Zip Spec      14 (20) '2.0'\n-71DD4 Extract OS            00 (0) 'MS-DOS'\n-71DD5 General Purpose Flag  0800 (2048)\n+72745 CENTRAL HEADER #112   02014B50 (33639248)\n+72749 Created Zip Spec      14 (20) '2.0'\n+7274A Created OS            03 (3) 'Unix'\n+7274B Extract Zip Spec      14 (20) '2.0'\n+7274C Extract OS            00 (0) 'MS-DOS'\n+7274D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71DD7 Compression Method    0008 (8) 'Deflated'\n-71DD9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71DDD CRC                   94D758DF (2497140959)\n-71DE1 Compressed Size       00000294 (660)\n-71DE5 Uncompressed Size     000004F3 (1267)\n-71DE9 Filename Length       003C (60)\n-71DEB Extra Length          0000 (0)\n-71DED Comment Length        0000 (0)\n-71DEF Disk Start            0000 (0)\n-71DF1 Int File Attributes   0000 (0)\n+7274F Compression Method    0008 (8) 'Deflated'\n+72751 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72755 CRC                   2A9E8F07 (715034375)\n+72759 Compressed Size       0000029C (668)\n+7275D Uncompressed Size     00000516 (1302)\n+72761 Filename Length       003C (60)\n+72763 Extra Length          0000 (0)\n+72765 Comment Length        0000 (0)\n+72767 Disk Start            0000 (0)\n+72769 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71DF3 Ext File Attributes   81A40000 (2175008768)\n+7276B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71DF7 Local Header Offset   00013201 (78337)\n-71DFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7276F Local Header Offset   000132CA (78538)\n+72773 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71DFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72773: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71E37 CENTRAL HEADER #113   02014B50 (33639248)\n-71E3B Created Zip Spec      14 (20) '2.0'\n-71E3C Created OS            03 (3) 'Unix'\n-71E3D Extract Zip Spec      14 (20) '2.0'\n-71E3E Extract OS            00 (0) 'MS-DOS'\n-71E3F General Purpose Flag  0800 (2048)\n+727AF CENTRAL HEADER #113   02014B50 (33639248)\n+727B3 Created Zip Spec      14 (20) '2.0'\n+727B4 Created OS            03 (3) 'Unix'\n+727B5 Extract Zip Spec      14 (20) '2.0'\n+727B6 Extract OS            00 (0) 'MS-DOS'\n+727B7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71E41 Compression Method    0008 (8) 'Deflated'\n-71E43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71E47 CRC                   778123FC (2004952060)\n-71E4B Compressed Size       00000346 (838)\n-71E4F Uncompressed Size     00000770 (1904)\n-71E53 Filename Length       0039 (57)\n-71E55 Extra Length          0000 (0)\n-71E57 Comment Length        0000 (0)\n-71E59 Disk Start            0000 (0)\n-71E5B Int File Attributes   0000 (0)\n+727B9 Compression Method    0008 (8) 'Deflated'\n+727BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+727BF CRC                   C6D0F0BC (3335581884)\n+727C3 Compressed Size       0000034F (847)\n+727C7 Uncompressed Size     000007B0 (1968)\n+727CB Filename Length       0039 (57)\n+727CD Extra Length          0000 (0)\n+727CF Comment Length        0000 (0)\n+727D1 Disk Start            0000 (0)\n+727D3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71E5D Ext File Attributes   81A40000 (2175008768)\n+727D5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71E61 Local Header Offset   000134EF (79087)\n-71E65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+727D9 Local Header Offset   000135C0 (79296)\n+727DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71E65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x727DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71E9E CENTRAL HEADER #114   02014B50 (33639248)\n-71EA2 Created Zip Spec      14 (20) '2.0'\n-71EA3 Created OS            03 (3) 'Unix'\n-71EA4 Extract Zip Spec      14 (20) '2.0'\n-71EA5 Extract OS            00 (0) 'MS-DOS'\n-71EA6 General Purpose Flag  0800 (2048)\n+72816 CENTRAL HEADER #114   02014B50 (33639248)\n+7281A Created Zip Spec      14 (20) '2.0'\n+7281B Created OS            03 (3) 'Unix'\n+7281C Extract Zip Spec      14 (20) '2.0'\n+7281D Extract OS            00 (0) 'MS-DOS'\n+7281E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71EA8 Compression Method    0008 (8) 'Deflated'\n-71EAA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71EAE CRC                   041CAAC9 (68987593)\n-71EB2 Compressed Size       00000273 (627)\n-71EB6 Uncompressed Size     000004B1 (1201)\n-71EBA Filename Length       003D (61)\n-71EBC Extra Length          0000 (0)\n-71EBE Comment Length        0000 (0)\n-71EC0 Disk Start            0000 (0)\n-71EC2 Int File Attributes   0000 (0)\n+72820 Compression Method    0008 (8) 'Deflated'\n+72822 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72826 CRC                   A545EC4C (2772823116)\n+7282A Compressed Size       0000027C (636)\n+7282E Uncompressed Size     000004DD (1245)\n+72832 Filename Length       003D (61)\n+72834 Extra Length          0000 (0)\n+72836 Comment Length        0000 (0)\n+72838 Disk Start            0000 (0)\n+7283A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71EC4 Ext File Attributes   81A40000 (2175008768)\n+7283C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71EC8 Local Header Offset   0001388C (80012)\n-71ECC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72840 Local Header Offset   00013966 (80230)\n+72844 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71ECC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72844: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71F09 CENTRAL HEADER #115   02014B50 (33639248)\n-71F0D Created Zip Spec      14 (20) '2.0'\n-71F0E Created OS            03 (3) 'Unix'\n-71F0F Extract Zip Spec      14 (20) '2.0'\n-71F10 Extract OS            00 (0) 'MS-DOS'\n-71F11 General Purpose Flag  0800 (2048)\n+72881 CENTRAL HEADER #115   02014B50 (33639248)\n+72885 Created Zip Spec      14 (20) '2.0'\n+72886 Created OS            03 (3) 'Unix'\n+72887 Extract Zip Spec      14 (20) '2.0'\n+72888 Extract OS            00 (0) 'MS-DOS'\n+72889 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71F13 Compression Method    0008 (8) 'Deflated'\n-71F15 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71F19 CRC                   01D0CBB6 (30460854)\n-71F1D Compressed Size       000003B8 (952)\n-71F21 Uncompressed Size     00000A4C (2636)\n-71F25 Filename Length       003B (59)\n-71F27 Extra Length          0000 (0)\n-71F29 Comment Length        0000 (0)\n-71F2B Disk Start            0000 (0)\n-71F2D Int File Attributes   0000 (0)\n+7288B Compression Method    0008 (8) 'Deflated'\n+7288D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72891 CRC                   8BA4EDED (2342841837)\n+72895 Compressed Size       000003C0 (960)\n+72899 Uncompressed Size     00000A8C (2700)\n+7289D Filename Length       003B (59)\n+7289F Extra Length          0000 (0)\n+728A1 Comment Length        0000 (0)\n+728A3 Disk Start            0000 (0)\n+728A5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71F2F Ext File Attributes   81A40000 (2175008768)\n+728A7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71F33 Local Header Offset   00013B5A (80730)\n-71F37 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+728AB Local Header Offset   00013C3D (80957)\n+728AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71F37: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x728AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71F72 CENTRAL HEADER #116   02014B50 (33639248)\n-71F76 Created Zip Spec      14 (20) '2.0'\n-71F77 Created OS            03 (3) 'Unix'\n-71F78 Extract Zip Spec      14 (20) '2.0'\n-71F79 Extract OS            00 (0) 'MS-DOS'\n-71F7A General Purpose Flag  0800 (2048)\n+728EA CENTRAL HEADER #116   02014B50 (33639248)\n+728EE Created Zip Spec      14 (20) '2.0'\n+728EF Created OS            03 (3) 'Unix'\n+728F0 Extract Zip Spec      14 (20) '2.0'\n+728F1 Extract OS            00 (0) 'MS-DOS'\n+728F2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71F7C Compression Method    0008 (8) 'Deflated'\n-71F7E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71F82 CRC                   790D5CAF (2030918831)\n-71F86 Compressed Size       00000288 (648)\n-71F8A Uncompressed Size     000004AD (1197)\n-71F8E Filename Length       0037 (55)\n-71F90 Extra Length          0000 (0)\n-71F92 Comment Length        0000 (0)\n-71F94 Disk Start            0000 (0)\n-71F96 Int File Attributes   0000 (0)\n+728F4 Compression Method    0008 (8) 'Deflated'\n+728F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+728FA CRC                   C8BED78D (3367950221)\n+728FE Compressed Size       00000290 (656)\n+72902 Uncompressed Size     000004CE (1230)\n+72906 Filename Length       0037 (55)\n+72908 Extra Length          0000 (0)\n+7290A Comment Length        0000 (0)\n+7290C Disk Start            0000 (0)\n+7290E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71F98 Ext File Attributes   81A40000 (2175008768)\n+72910 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-71F9C Local Header Offset   00013F6B (81771)\n-71FA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72914 Local Header Offset   00014056 (82006)\n+72918 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71FA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72918: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71FD7 CENTRAL HEADER #117   02014B50 (33639248)\n-71FDB Created Zip Spec      14 (20) '2.0'\n-71FDC Created OS            03 (3) 'Unix'\n-71FDD Extract Zip Spec      14 (20) '2.0'\n-71FDE Extract OS            00 (0) 'MS-DOS'\n-71FDF General Purpose Flag  0800 (2048)\n+7294F CENTRAL HEADER #117   02014B50 (33639248)\n+72953 Created Zip Spec      14 (20) '2.0'\n+72954 Created OS            03 (3) 'Unix'\n+72955 Extract Zip Spec      14 (20) '2.0'\n+72956 Extract OS            00 (0) 'MS-DOS'\n+72957 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-71FE1 Compression Method    0008 (8) 'Deflated'\n-71FE3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71FE7 CRC                   A679BD52 (2792996178)\n-71FEB Compressed Size       0000095F (2399)\n-71FEF Uncompressed Size     0000264E (9806)\n-71FF3 Filename Length       004D (77)\n-71FF5 Extra Length          0000 (0)\n-71FF7 Comment Length        0000 (0)\n-71FF9 Disk Start            0000 (0)\n-71FFB Int File Attributes   0000 (0)\n+72959 Compression Method    0008 (8) 'Deflated'\n+7295B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7295F CRC                   8153B7AF (2169747375)\n+72963 Compressed Size       00000970 (2416)\n+72967 Uncompressed Size     00002780 (10112)\n+7296B Filename Length       004D (77)\n+7296D Extra Length          0000 (0)\n+7296F Comment Length        0000 (0)\n+72971 Disk Start            0000 (0)\n+72973 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-71FFD Ext File Attributes   81A40000 (2175008768)\n+72975 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72001 Local Header Offset   00014248 (82504)\n-72005 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72979 Local Header Offset   0001433B (82747)\n+7297D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72005: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7297D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72052 CENTRAL HEADER #118   02014B50 (33639248)\n-72056 Created Zip Spec      14 (20) '2.0'\n-72057 Created OS            03 (3) 'Unix'\n-72058 Extract Zip Spec      14 (20) '2.0'\n-72059 Extract OS            00 (0) 'MS-DOS'\n-7205A General Purpose Flag  0800 (2048)\n+729CA CENTRAL HEADER #118   02014B50 (33639248)\n+729CE Created Zip Spec      14 (20) '2.0'\n+729CF Created OS            03 (3) 'Unix'\n+729D0 Extract Zip Spec      14 (20) '2.0'\n+729D1 Extract OS            00 (0) 'MS-DOS'\n+729D2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7205C Compression Method    0008 (8) 'Deflated'\n-7205E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72062 CRC                   5C1CB033 (1545383987)\n-72066 Compressed Size       0000032F (815)\n-7206A Uncompressed Size     000006CB (1739)\n-7206E Filename Length       0054 (84)\n-72070 Extra Length          0000 (0)\n-72072 Comment Length        0000 (0)\n-72074 Disk Start            0000 (0)\n-72076 Int File Attributes   0000 (0)\n+729D4 Compression Method    0008 (8) 'Deflated'\n+729D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+729DA CRC                   B055C4D7 (2958410967)\n+729DE Compressed Size       00000337 (823)\n+729E2 Uncompressed Size     000006F6 (1782)\n+729E6 Filename Length       0054 (84)\n+729E8 Extra Length          0000 (0)\n+729EA Comment Length        0000 (0)\n+729EC Disk Start            0000 (0)\n+729EE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72078 Ext File Attributes   81A40000 (2175008768)\n+729F0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7207C Local Header Offset   00014C12 (85010)\n-72080 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+729F4 Local Header Offset   00014D16 (85270)\n+729F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72080: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x729F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-720D4 CENTRAL HEADER #119   02014B50 (33639248)\n-720D8 Created Zip Spec      14 (20) '2.0'\n-720D9 Created OS            03 (3) 'Unix'\n-720DA Extract Zip Spec      14 (20) '2.0'\n-720DB Extract OS            00 (0) 'MS-DOS'\n-720DC General Purpose Flag  0800 (2048)\n+72A4C CENTRAL HEADER #119   02014B50 (33639248)\n+72A50 Created Zip Spec      14 (20) '2.0'\n+72A51 Created OS            03 (3) 'Unix'\n+72A52 Extract Zip Spec      14 (20) '2.0'\n+72A53 Extract OS            00 (0) 'MS-DOS'\n+72A54 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-720DE Compression Method    0008 (8) 'Deflated'\n-720E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-720E4 CRC                   E6853BBE (3867491262)\n-720E8 Compressed Size       00000241 (577)\n-720EC Uncompressed Size     00000448 (1096)\n-720F0 Filename Length       0041 (65)\n-720F2 Extra Length          0000 (0)\n-720F4 Comment Length        0000 (0)\n-720F6 Disk Start            0000 (0)\n-720F8 Int File Attributes   0000 (0)\n+72A56 Compression Method    0008 (8) 'Deflated'\n+72A58 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72A5C CRC                   46172F4A (1175924554)\n+72A60 Compressed Size       0000024D (589)\n+72A64 Uncompressed Size     0000046D (1133)\n+72A68 Filename Length       0041 (65)\n+72A6A Extra Length          0000 (0)\n+72A6C Comment Length        0000 (0)\n+72A6E Disk Start            0000 (0)\n+72A70 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-720FA Ext File Attributes   81A40000 (2175008768)\n+72A72 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-720FE Local Header Offset   00014FB3 (85939)\n-72102 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72A76 Local Header Offset   000150BF (86207)\n+72A7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72102: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72A7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72143 CENTRAL HEADER #120   02014B50 (33639248)\n-72147 Created Zip Spec      14 (20) '2.0'\n-72148 Created OS            03 (3) 'Unix'\n-72149 Extract Zip Spec      14 (20) '2.0'\n-7214A Extract OS            00 (0) 'MS-DOS'\n-7214B General Purpose Flag  0800 (2048)\n+72ABB CENTRAL HEADER #120   02014B50 (33639248)\n+72ABF Created Zip Spec      14 (20) '2.0'\n+72AC0 Created OS            03 (3) 'Unix'\n+72AC1 Extract Zip Spec      14 (20) '2.0'\n+72AC2 Extract OS            00 (0) 'MS-DOS'\n+72AC3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7214D Compression Method    0008 (8) 'Deflated'\n-7214F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72153 CRC                   B9E6C475 (3118908533)\n-72157 Compressed Size       000003ED (1005)\n-7215B Uncompressed Size     00000B0B (2827)\n-7215F Filename Length       0043 (67)\n-72161 Extra Length          0000 (0)\n-72163 Comment Length        0000 (0)\n-72165 Disk Start            0000 (0)\n-72167 Int File Attributes   0000 (0)\n+72AC5 Compression Method    0008 (8) 'Deflated'\n+72AC7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72ACB CRC                   D56D83FB (3580724219)\n+72ACF Compressed Size       000003F6 (1014)\n+72AD3 Uncompressed Size     00000B69 (2921)\n+72AD7 Filename Length       0043 (67)\n+72AD9 Extra Length          0000 (0)\n+72ADB Comment Length        0000 (0)\n+72ADD Disk Start            0000 (0)\n+72ADF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72169 Ext File Attributes   81A40000 (2175008768)\n+72AE1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7216D Local Header Offset   00015253 (86611)\n-72171 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72AE5 Local Header Offset   0001536B (86891)\n+72AE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72171: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72AE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-721B4 CENTRAL HEADER #121   02014B50 (33639248)\n-721B8 Created Zip Spec      14 (20) '2.0'\n-721B9 Created OS            03 (3) 'Unix'\n-721BA Extract Zip Spec      14 (20) '2.0'\n-721BB Extract OS            00 (0) 'MS-DOS'\n-721BC General Purpose Flag  0800 (2048)\n+72B2C CENTRAL HEADER #121   02014B50 (33639248)\n+72B30 Created Zip Spec      14 (20) '2.0'\n+72B31 Created OS            03 (3) 'Unix'\n+72B32 Extract Zip Spec      14 (20) '2.0'\n+72B33 Extract OS            00 (0) 'MS-DOS'\n+72B34 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-721BE Compression Method    0008 (8) 'Deflated'\n-721C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-721C4 CRC                   74E6231A (1961239322)\n-721C8 Compressed Size       000002A7 (679)\n-721CC Uncompressed Size     00000511 (1297)\n-721D0 Filename Length       0046 (70)\n-721D2 Extra Length          0000 (0)\n-721D4 Comment Length        0000 (0)\n-721D6 Disk Start            0000 (0)\n-721D8 Int File Attributes   0000 (0)\n+72B36 Compression Method    0008 (8) 'Deflated'\n+72B38 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72B3C CRC                   69A63658 (1772500568)\n+72B40 Compressed Size       000002B1 (689)\n+72B44 Uncompressed Size     00000532 (1330)\n+72B48 Filename Length       0046 (70)\n+72B4A Extra Length          0000 (0)\n+72B4C Comment Length        0000 (0)\n+72B4E Disk Start            0000 (0)\n+72B50 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-721DA Ext File Attributes   81A40000 (2175008768)\n+72B52 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-721DE Local Header Offset   000156A1 (87713)\n-721E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72B56 Local Header Offset   000157C2 (88002)\n+72B5A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x721E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72B5A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72228 CENTRAL HEADER #122   02014B50 (33639248)\n-7222C Created Zip Spec      14 (20) '2.0'\n-7222D Created OS            03 (3) 'Unix'\n-7222E Extract Zip Spec      14 (20) '2.0'\n-7222F Extract OS            00 (0) 'MS-DOS'\n-72230 General Purpose Flag  0800 (2048)\n+72BA0 CENTRAL HEADER #122   02014B50 (33639248)\n+72BA4 Created Zip Spec      14 (20) '2.0'\n+72BA5 Created OS            03 (3) 'Unix'\n+72BA6 Extract Zip Spec      14 (20) '2.0'\n+72BA7 Extract OS            00 (0) 'MS-DOS'\n+72BA8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72232 Compression Method    0008 (8) 'Deflated'\n-72234 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72238 CRC                   695FC9AE (1767885230)\n-7223C Compressed Size       00000254 (596)\n-72240 Uncompressed Size     00000447 (1095)\n-72244 Filename Length       003A (58)\n-72246 Extra Length          0000 (0)\n-72248 Comment Length        0000 (0)\n-7224A Disk Start            0000 (0)\n-7224C Int File Attributes   0000 (0)\n+72BAA Compression Method    0008 (8) 'Deflated'\n+72BAC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72BB0 CRC                   01D091A7 (30445991)\n+72BB4 Compressed Size       0000025B (603)\n+72BB8 Uncompressed Size     00000460 (1120)\n+72BBC Filename Length       003A (58)\n+72BBE Extra Length          0000 (0)\n+72BC0 Comment Length        0000 (0)\n+72BC2 Disk Start            0000 (0)\n+72BC4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7224E Ext File Attributes   81A40000 (2175008768)\n+72BC6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72252 Local Header Offset   000159AC (88492)\n-72256 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72BCA Local Header Offset   00015AD7 (88791)\n+72BCE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72256: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72BCE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72290 CENTRAL HEADER #123   02014B50 (33639248)\n-72294 Created Zip Spec      14 (20) '2.0'\n-72295 Created OS            03 (3) 'Unix'\n-72296 Extract Zip Spec      14 (20) '2.0'\n-72297 Extract OS            00 (0) 'MS-DOS'\n-72298 General Purpose Flag  0800 (2048)\n+72C08 CENTRAL HEADER #123   02014B50 (33639248)\n+72C0C Created Zip Spec      14 (20) '2.0'\n+72C0D Created OS            03 (3) 'Unix'\n+72C0E Extract Zip Spec      14 (20) '2.0'\n+72C0F Extract OS            00 (0) 'MS-DOS'\n+72C10 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7229A Compression Method    0008 (8) 'Deflated'\n-7229C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-722A0 CRC                   1744C936 (390383926)\n-722A4 Compressed Size       000008C8 (2248)\n-722A8 Uncompressed Size     000023F1 (9201)\n-722AC Filename Length       0045 (69)\n-722AE Extra Length          0000 (0)\n-722B0 Comment Length        0000 (0)\n-722B2 Disk Start            0000 (0)\n-722B4 Int File Attributes   0000 (0)\n+72C12 Compression Method    0008 (8) 'Deflated'\n+72C14 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72C18 CRC                   FCBE727C (4240339580)\n+72C1C Compressed Size       000008D8 (2264)\n+72C20 Uncompressed Size     000024E6 (9446)\n+72C24 Filename Length       0045 (69)\n+72C26 Extra Length          0000 (0)\n+72C28 Comment Length        0000 (0)\n+72C2A Disk Start            0000 (0)\n+72C2C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-722B6 Ext File Attributes   81A40000 (2175008768)\n+72C2E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-722BA Local Header Offset   00015C58 (89176)\n-722BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72C32 Local Header Offset   00015D8A (89482)\n+72C36 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x722BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72C36: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72303 CENTRAL HEADER #124   02014B50 (33639248)\n-72307 Created Zip Spec      14 (20) '2.0'\n-72308 Created OS            03 (3) 'Unix'\n-72309 Extract Zip Spec      14 (20) '2.0'\n-7230A Extract OS            00 (0) 'MS-DOS'\n-7230B General Purpose Flag  0800 (2048)\n+72C7B CENTRAL HEADER #124   02014B50 (33639248)\n+72C7F Created Zip Spec      14 (20) '2.0'\n+72C80 Created OS            03 (3) 'Unix'\n+72C81 Extract Zip Spec      14 (20) '2.0'\n+72C82 Extract OS            00 (0) 'MS-DOS'\n+72C83 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7230D Compression Method    0008 (8) 'Deflated'\n-7230F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72313 CRC                   287FAB99 (679455641)\n-72317 Compressed Size       0000033C (828)\n-7231B Uncompressed Size     000007C3 (1987)\n-7231F Filename Length       004C (76)\n-72321 Extra Length          0000 (0)\n-72323 Comment Length        0000 (0)\n-72325 Disk Start            0000 (0)\n-72327 Int File Attributes   0000 (0)\n+72C85 Compression Method    0008 (8) 'Deflated'\n+72C87 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72C8B CRC                   E7C23E33 (3888266803)\n+72C8F Compressed Size       00000343 (835)\n+72C93 Uncompressed Size     000007F1 (2033)\n+72C97 Filename Length       004C (76)\n+72C99 Extra Length          0000 (0)\n+72C9B Comment Length        0000 (0)\n+72C9D Disk Start            0000 (0)\n+72C9F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72329 Ext File Attributes   81A40000 (2175008768)\n+72CA1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7232D Local Header Offset   00016583 (91523)\n-72331 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72CA5 Local Header Offset   000166C5 (91845)\n+72CA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72331: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72CA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7237D CENTRAL HEADER #125   02014B50 (33639248)\n-72381 Created Zip Spec      14 (20) '2.0'\n-72382 Created OS            03 (3) 'Unix'\n-72383 Extract Zip Spec      14 (20) '2.0'\n-72384 Extract OS            00 (0) 'MS-DOS'\n-72385 General Purpose Flag  0800 (2048)\n+72CF5 CENTRAL HEADER #125   02014B50 (33639248)\n+72CF9 Created Zip Spec      14 (20) '2.0'\n+72CFA Created OS            03 (3) 'Unix'\n+72CFB Extract Zip Spec      14 (20) '2.0'\n+72CFC Extract OS            00 (0) 'MS-DOS'\n+72CFD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72387 Compression Method    0008 (8) 'Deflated'\n-72389 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7238D CRC                   9083C03B (2424553531)\n-72391 Compressed Size       0000072C (1836)\n-72395 Uncompressed Size     00001B7B (7035)\n-72399 Filename Length       004D (77)\n-7239B Extra Length          0000 (0)\n-7239D Comment Length        0000 (0)\n-7239F Disk Start            0000 (0)\n-723A1 Int File Attributes   0000 (0)\n+72CFF Compression Method    0008 (8) 'Deflated'\n+72D01 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72D05 CRC                   A4ED9691 (2767034001)\n+72D09 Compressed Size       00000739 (1849)\n+72D0D Uncompressed Size     00001C35 (7221)\n+72D11 Filename Length       004D (77)\n+72D13 Extra Length          0000 (0)\n+72D15 Comment Length        0000 (0)\n+72D17 Disk Start            0000 (0)\n+72D19 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-723A3 Ext File Attributes   81A40000 (2175008768)\n+72D1B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-723A7 Local Header Offset   00016929 (92457)\n-723AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72D1F Local Header Offset   00016A72 (92786)\n+72D23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x723AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72D23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-723F8 CENTRAL HEADER #126   02014B50 (33639248)\n-723FC Created Zip Spec      14 (20) '2.0'\n-723FD Created OS            03 (3) 'Unix'\n-723FE Extract Zip Spec      14 (20) '2.0'\n-723FF Extract OS            00 (0) 'MS-DOS'\n-72400 General Purpose Flag  0800 (2048)\n+72D70 CENTRAL HEADER #126   02014B50 (33639248)\n+72D74 Created Zip Spec      14 (20) '2.0'\n+72D75 Created OS            03 (3) 'Unix'\n+72D76 Extract Zip Spec      14 (20) '2.0'\n+72D77 Extract OS            00 (0) 'MS-DOS'\n+72D78 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72402 Compression Method    0008 (8) 'Deflated'\n-72404 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72408 CRC                   F23B4D60 (4063972704)\n-7240C Compressed Size       00001468 (5224)\n-72410 Uncompressed Size     0000582A (22570)\n-72414 Filename Length       0054 (84)\n-72416 Extra Length          0000 (0)\n-72418 Comment Length        0000 (0)\n-7241A Disk Start            0000 (0)\n-7241C Int File Attributes   0000 (0)\n+72D7A Compression Method    0008 (8) 'Deflated'\n+72D7C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72D80 CRC                   BAE14165 (3135324517)\n+72D84 Compressed Size       00001488 (5256)\n+72D88 Uncompressed Size     00005A88 (23176)\n+72D8C Filename Length       0054 (84)\n+72D8E Extra Length          0000 (0)\n+72D90 Comment Length        0000 (0)\n+72D92 Disk Start            0000 (0)\n+72D94 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7241E Ext File Attributes   81A40000 (2175008768)\n+72D96 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72422 Local Header Offset   000170C0 (94400)\n-72426 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72D9A Local Header Offset   00017216 (94742)\n+72D9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72426: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72D9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7247A CENTRAL HEADER #127   02014B50 (33639248)\n-7247E Created Zip Spec      14 (20) '2.0'\n-7247F Created OS            03 (3) 'Unix'\n-72480 Extract Zip Spec      14 (20) '2.0'\n-72481 Extract OS            00 (0) 'MS-DOS'\n-72482 General Purpose Flag  0800 (2048)\n+72DF2 CENTRAL HEADER #127   02014B50 (33639248)\n+72DF6 Created Zip Spec      14 (20) '2.0'\n+72DF7 Created OS            03 (3) 'Unix'\n+72DF8 Extract Zip Spec      14 (20) '2.0'\n+72DF9 Extract OS            00 (0) 'MS-DOS'\n+72DFA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72484 Compression Method    0008 (8) 'Deflated'\n-72486 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7248A CRC                   E57CCA12 (3850160658)\n-7248E Compressed Size       0000029B (667)\n-72492 Uncompressed Size     000005CF (1487)\n-72496 Filename Length       005B (91)\n-72498 Extra Length          0000 (0)\n-7249A Comment Length        0000 (0)\n-7249C Disk Start            0000 (0)\n-7249E Int File Attributes   0000 (0)\n+72DFC Compression Method    0008 (8) 'Deflated'\n+72DFE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72E02 CRC                   BA62C70E (3127035662)\n+72E06 Compressed Size       000002A4 (676)\n+72E0A Uncompressed Size     000005F2 (1522)\n+72E0E Filename Length       005B (91)\n+72E10 Extra Length          0000 (0)\n+72E12 Comment Length        0000 (0)\n+72E14 Disk Start            0000 (0)\n+72E16 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-724A0 Ext File Attributes   81A40000 (2175008768)\n+72E18 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-724A4 Local Header Offset   0001859A (99738)\n-724A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72E1C Local Header Offset   00018710 (100112)\n+72E20 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x724A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72E20: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72503 CENTRAL HEADER #128   02014B50 (33639248)\n-72507 Created Zip Spec      14 (20) '2.0'\n-72508 Created OS            03 (3) 'Unix'\n-72509 Extract Zip Spec      14 (20) '2.0'\n-7250A Extract OS            00 (0) 'MS-DOS'\n-7250B General Purpose Flag  0800 (2048)\n+72E7B CENTRAL HEADER #128   02014B50 (33639248)\n+72E7F Created Zip Spec      14 (20) '2.0'\n+72E80 Created OS            03 (3) 'Unix'\n+72E81 Extract Zip Spec      14 (20) '2.0'\n+72E82 Extract OS            00 (0) 'MS-DOS'\n+72E83 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7250D Compression Method    0008 (8) 'Deflated'\n-7250F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72513 CRC                   B946295F (3108383071)\n-72517 Compressed Size       00000376 (886)\n-7251B Uncompressed Size     000008A7 (2215)\n-7251F Filename Length       004C (76)\n-72521 Extra Length          0000 (0)\n-72523 Comment Length        0000 (0)\n-72525 Disk Start            0000 (0)\n-72527 Int File Attributes   0000 (0)\n+72E85 Compression Method    0008 (8) 'Deflated'\n+72E87 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72E8B CRC                   B653D686 (3058947718)\n+72E8F Compressed Size       0000037B (891)\n+72E93 Uncompressed Size     000008EF (2287)\n+72E97 Filename Length       004C (76)\n+72E99 Extra Length          0000 (0)\n+72E9B Comment Length        0000 (0)\n+72E9D Disk Start            0000 (0)\n+72E9F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72529 Ext File Attributes   81A40000 (2175008768)\n+72EA1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7252D Local Header Offset   000188AE (100526)\n-72531 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72EA5 Local Header Offset   00018A2D (100909)\n+72EA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72531: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72EA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7257D CENTRAL HEADER #129   02014B50 (33639248)\n-72581 Created Zip Spec      14 (20) '2.0'\n-72582 Created OS            03 (3) 'Unix'\n-72583 Extract Zip Spec      14 (20) '2.0'\n-72584 Extract OS            00 (0) 'MS-DOS'\n-72585 General Purpose Flag  0800 (2048)\n+72EF5 CENTRAL HEADER #129   02014B50 (33639248)\n+72EF9 Created Zip Spec      14 (20) '2.0'\n+72EFA Created OS            03 (3) 'Unix'\n+72EFB Extract Zip Spec      14 (20) '2.0'\n+72EFC Extract OS            00 (0) 'MS-DOS'\n+72EFD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72587 Compression Method    0008 (8) 'Deflated'\n-72589 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7258D CRC                   208B91F5 (546017781)\n-72591 Compressed Size       00000272 (626)\n-72595 Uncompressed Size     00000524 (1316)\n-72599 Filename Length       0053 (83)\n-7259B Extra Length          0000 (0)\n-7259D Comment Length        0000 (0)\n-7259F Disk Start            0000 (0)\n-725A1 Int File Attributes   0000 (0)\n+72EFF Compression Method    0008 (8) 'Deflated'\n+72F01 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72F05 CRC                   0495D293 (76927635)\n+72F09 Compressed Size       0000027B (635)\n+72F0D Uncompressed Size     00000545 (1349)\n+72F11 Filename Length       0053 (83)\n+72F13 Extra Length          0000 (0)\n+72F15 Comment Length        0000 (0)\n+72F17 Disk Start            0000 (0)\n+72F19 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-725A3 Ext File Attributes   81A40000 (2175008768)\n+72F1B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-725A7 Local Header Offset   00018C8E (101518)\n-725AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72F1F Local Header Offset   00018E12 (101906)\n+72F23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x725AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72F23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-725FE CENTRAL HEADER #130   02014B50 (33639248)\n-72602 Created Zip Spec      14 (20) '2.0'\n-72603 Created OS            03 (3) 'Unix'\n-72604 Extract Zip Spec      14 (20) '2.0'\n-72605 Extract OS            00 (0) 'MS-DOS'\n-72606 General Purpose Flag  0800 (2048)\n+72F76 CENTRAL HEADER #130   02014B50 (33639248)\n+72F7A Created Zip Spec      14 (20) '2.0'\n+72F7B Created OS            03 (3) 'Unix'\n+72F7C Extract Zip Spec      14 (20) '2.0'\n+72F7D Extract OS            00 (0) 'MS-DOS'\n+72F7E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72608 Compression Method    0008 (8) 'Deflated'\n-7260A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7260E CRC                   C03FB50A (3225400586)\n-72612 Compressed Size       00000492 (1170)\n-72616 Uncompressed Size     00000F4A (3914)\n-7261A Filename Length       0056 (86)\n-7261C Extra Length          0000 (0)\n-7261E Comment Length        0000 (0)\n-72620 Disk Start            0000 (0)\n-72622 Int File Attributes   0000 (0)\n+72F80 Compression Method    0008 (8) 'Deflated'\n+72F82 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72F86 CRC                   2171436F (561070959)\n+72F8A Compressed Size       0000049C (1180)\n+72F8E Uncompressed Size     00000FAF (4015)\n+72F92 Filename Length       0056 (86)\n+72F94 Extra Length          0000 (0)\n+72F96 Comment Length        0000 (0)\n+72F98 Disk Start            0000 (0)\n+72F9A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72624 Ext File Attributes   81A40000 (2175008768)\n+72F9C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72628 Local Header Offset   00018F71 (102257)\n-7262C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72FA0 Local Header Offset   000190FE (102654)\n+72FA4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7262C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72FA4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72682 CENTRAL HEADER #131   02014B50 (33639248)\n-72686 Created Zip Spec      14 (20) '2.0'\n-72687 Created OS            03 (3) 'Unix'\n-72688 Extract Zip Spec      14 (20) '2.0'\n-72689 Extract OS            00 (0) 'MS-DOS'\n-7268A General Purpose Flag  0800 (2048)\n+72FFA CENTRAL HEADER #131   02014B50 (33639248)\n+72FFE Created Zip Spec      14 (20) '2.0'\n+72FFF Created OS            03 (3) 'Unix'\n+73000 Extract Zip Spec      14 (20) '2.0'\n+73001 Extract OS            00 (0) 'MS-DOS'\n+73002 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7268C Compression Method    0008 (8) 'Deflated'\n-7268E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72692 CRC                   2CFFA2CA (754950858)\n-72696 Compressed Size       00000CF7 (3319)\n-7269A Uncompressed Size     00002810 (10256)\n-7269E Filename Length       0036 (54)\n-726A0 Extra Length          0000 (0)\n-726A2 Comment Length        0000 (0)\n-726A4 Disk Start            0000 (0)\n-726A6 Int File Attributes   0000 (0)\n+73004 Compression Method    0008 (8) 'Deflated'\n+73006 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7300A CRC                   2E0F2713 (772744979)\n+7300E Compressed Size       00000D0C (3340)\n+73012 Uncompressed Size     00002999 (10649)\n+73016 Filename Length       0036 (54)\n+73018 Extra Length          0000 (0)\n+7301A Comment Length        0000 (0)\n+7301C Disk Start            0000 (0)\n+7301E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-726A8 Ext File Attributes   81A40000 (2175008768)\n+73020 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-726AC Local Header Offset   00019477 (103543)\n-726B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73024 Local Header Offset   0001960E (103950)\n+73028 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x726B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73028: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-726E6 CENTRAL HEADER #132   02014B50 (33639248)\n-726EA Created Zip Spec      14 (20) '2.0'\n-726EB Created OS            03 (3) 'Unix'\n-726EC Extract Zip Spec      14 (20) '2.0'\n-726ED Extract OS            00 (0) 'MS-DOS'\n-726EE General Purpose Flag  0800 (2048)\n+7305E CENTRAL HEADER #132   02014B50 (33639248)\n+73062 Created Zip Spec      14 (20) '2.0'\n+73063 Created OS            03 (3) 'Unix'\n+73064 Extract Zip Spec      14 (20) '2.0'\n+73065 Extract OS            00 (0) 'MS-DOS'\n+73066 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-726F0 Compression Method    0008 (8) 'Deflated'\n-726F2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-726F6 CRC                   A6E18129 (2799796521)\n-726FA Compressed Size       00000222 (546)\n-726FE Uncompressed Size     000003BF (959)\n-72702 Filename Length       0036 (54)\n-72704 Extra Length          0000 (0)\n-72706 Comment Length        0000 (0)\n-72708 Disk Start            0000 (0)\n-7270A Int File Attributes   0000 (0)\n+73068 Compression Method    0008 (8) 'Deflated'\n+7306A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7306E CRC                   B7E4B654 (3085219412)\n+73072 Compressed Size       0000022A (554)\n+73076 Uncompressed Size     000003D7 (983)\n+7307A Filename Length       0036 (54)\n+7307C Extra Length          0000 (0)\n+7307E Comment Length        0000 (0)\n+73080 Disk Start            0000 (0)\n+73082 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7270C Ext File Attributes   81A40000 (2175008768)\n+73084 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72710 Local Header Offset   0001A1C2 (106946)\n-72714 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73088 Local Header Offset   0001A36E (107374)\n+7308C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72714: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7308C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7274A CENTRAL HEADER #133   02014B50 (33639248)\n-7274E Created Zip Spec      14 (20) '2.0'\n-7274F Created OS            03 (3) 'Unix'\n-72750 Extract Zip Spec      14 (20) '2.0'\n-72751 Extract OS            00 (0) 'MS-DOS'\n-72752 General Purpose Flag  0800 (2048)\n+730C2 CENTRAL HEADER #133   02014B50 (33639248)\n+730C6 Created Zip Spec      14 (20) '2.0'\n+730C7 Created OS            03 (3) 'Unix'\n+730C8 Extract Zip Spec      14 (20) '2.0'\n+730C9 Extract OS            00 (0) 'MS-DOS'\n+730CA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72754 Compression Method    0008 (8) 'Deflated'\n-72756 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7275A CRC                   0D4F07B4 (223283124)\n-7275E Compressed Size       00000250 (592)\n-72762 Uncompressed Size     0000042F (1071)\n-72766 Filename Length       0033 (51)\n-72768 Extra Length          0000 (0)\n-7276A Comment Length        0000 (0)\n-7276C Disk Start            0000 (0)\n-7276E Int File Attributes   0000 (0)\n+730CC Compression Method    0008 (8) 'Deflated'\n+730CE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+730D2 CRC                   67723A29 (1735539241)\n+730D6 Compressed Size       00000257 (599)\n+730DA Uncompressed Size     0000044F (1103)\n+730DE Filename Length       0033 (51)\n+730E0 Extra Length          0000 (0)\n+730E2 Comment Length        0000 (0)\n+730E4 Disk Start            0000 (0)\n+730E6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72770 Ext File Attributes   81A40000 (2175008768)\n+730E8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72774 Local Header Offset   0001A438 (107576)\n-72778 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+730EC Local Header Offset   0001A5EC (108012)\n+730F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72778: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x730F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-727AB CENTRAL HEADER #134   02014B50 (33639248)\n-727AF Created Zip Spec      14 (20) '2.0'\n-727B0 Created OS            03 (3) 'Unix'\n-727B1 Extract Zip Spec      14 (20) '2.0'\n-727B2 Extract OS            00 (0) 'MS-DOS'\n-727B3 General Purpose Flag  0800 (2048)\n+73123 CENTRAL HEADER #134   02014B50 (33639248)\n+73127 Created Zip Spec      14 (20) '2.0'\n+73128 Created OS            03 (3) 'Unix'\n+73129 Extract Zip Spec      14 (20) '2.0'\n+7312A Extract OS            00 (0) 'MS-DOS'\n+7312B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-727B5 Compression Method    0008 (8) 'Deflated'\n-727B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-727BB CRC                   E90F01CB (3910074827)\n-727BF Compressed Size       000004E1 (1249)\n-727C3 Uncompressed Size     00000D8D (3469)\n-727C7 Filename Length       0038 (56)\n-727C9 Extra Length          0000 (0)\n-727CB Comment Length        0000 (0)\n-727CD Disk Start            0000 (0)\n-727CF Int File Attributes   0000 (0)\n+7312D Compression Method    0008 (8) 'Deflated'\n+7312F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73133 CRC                   EBE34920 (3957541152)\n+73137 Compressed Size       000004EB (1259)\n+7313B Uncompressed Size     00000E07 (3591)\n+7313F Filename Length       0038 (56)\n+73141 Extra Length          0000 (0)\n+73143 Comment Length        0000 (0)\n+73145 Disk Start            0000 (0)\n+73147 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-727D1 Ext File Attributes   81A40000 (2175008768)\n+73149 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-727D5 Local Header Offset   0001A6D9 (108249)\n-727D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7314D Local Header Offset   0001A894 (108692)\n+73151 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x727D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73151: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72811 CENTRAL HEADER #135   02014B50 (33639248)\n-72815 Created Zip Spec      14 (20) '2.0'\n-72816 Created OS            03 (3) 'Unix'\n-72817 Extract Zip Spec      14 (20) '2.0'\n-72818 Extract OS            00 (0) 'MS-DOS'\n-72819 General Purpose Flag  0800 (2048)\n+73189 CENTRAL HEADER #135   02014B50 (33639248)\n+7318D Created Zip Spec      14 (20) '2.0'\n+7318E Created OS            03 (3) 'Unix'\n+7318F Extract Zip Spec      14 (20) '2.0'\n+73190 Extract OS            00 (0) 'MS-DOS'\n+73191 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7281B Compression Method    0008 (8) 'Deflated'\n-7281D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72821 CRC                   1B8CE743 (462219075)\n-72825 Compressed Size       0000021E (542)\n-72829 Uncompressed Size     000003B6 (950)\n-7282D Filename Length       0038 (56)\n-7282F Extra Length          0000 (0)\n-72831 Comment Length        0000 (0)\n-72833 Disk Start            0000 (0)\n-72835 Int File Attributes   0000 (0)\n+73193 Compression Method    0008 (8) 'Deflated'\n+73195 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73199 CRC                   F01E112A (4028502314)\n+7319D Compressed Size       00000224 (548)\n+731A1 Uncompressed Size     000003D0 (976)\n+731A5 Filename Length       0038 (56)\n+731A7 Extra Length          0000 (0)\n+731A9 Comment Length        0000 (0)\n+731AB Disk Start            0000 (0)\n+731AD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72837 Ext File Attributes   81A40000 (2175008768)\n+731AF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7283B Local Header Offset   0001AC10 (109584)\n-7283F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+731B3 Local Header Offset   0001ADD5 (110037)\n+731B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7283F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x731B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72877 CENTRAL HEADER #136   02014B50 (33639248)\n-7287B Created Zip Spec      14 (20) '2.0'\n-7287C Created OS            03 (3) 'Unix'\n-7287D Extract Zip Spec      14 (20) '2.0'\n-7287E Extract OS            00 (0) 'MS-DOS'\n-7287F General Purpose Flag  0800 (2048)\n+731EF CENTRAL HEADER #136   02014B50 (33639248)\n+731F3 Created Zip Spec      14 (20) '2.0'\n+731F4 Created OS            03 (3) 'Unix'\n+731F5 Extract Zip Spec      14 (20) '2.0'\n+731F6 Extract OS            00 (0) 'MS-DOS'\n+731F7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72881 Compression Method    0008 (8) 'Deflated'\n-72883 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72887 CRC                   94BF4E7B (2495565435)\n-7288B Compressed Size       00000219 (537)\n-7288F Uncompressed Size     000003B5 (949)\n-72893 Filename Length       0031 (49)\n-72895 Extra Length          0000 (0)\n-72897 Comment Length        0000 (0)\n-72899 Disk Start            0000 (0)\n-7289B Int File Attributes   0000 (0)\n+731F9 Compression Method    0008 (8) 'Deflated'\n+731FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+731FF CRC                   16DF264E (383723086)\n+73203 Compressed Size       00000221 (545)\n+73207 Uncompressed Size     000003CD (973)\n+7320B Filename Length       0031 (49)\n+7320D Extra Length          0000 (0)\n+7320F Comment Length        0000 (0)\n+73211 Disk Start            0000 (0)\n+73213 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7289D Ext File Attributes   81A40000 (2175008768)\n+73215 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-728A1 Local Header Offset   0001AE84 (110212)\n-728A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73219 Local Header Offset   0001B04F (110671)\n+7321D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x728A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7321D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-728D6 CENTRAL HEADER #137   02014B50 (33639248)\n-728DA Created Zip Spec      14 (20) '2.0'\n-728DB Created OS            03 (3) 'Unix'\n-728DC Extract Zip Spec      14 (20) '2.0'\n-728DD Extract OS            00 (0) 'MS-DOS'\n-728DE General Purpose Flag  0800 (2048)\n+7324E CENTRAL HEADER #137   02014B50 (33639248)\n+73252 Created Zip Spec      14 (20) '2.0'\n+73253 Created OS            03 (3) 'Unix'\n+73254 Extract Zip Spec      14 (20) '2.0'\n+73255 Extract OS            00 (0) 'MS-DOS'\n+73256 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-728E0 Compression Method    0008 (8) 'Deflated'\n-728E2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-728E6 CRC                   01244711 (19154705)\n-728EA Compressed Size       00000293 (659)\n-728EE Uncompressed Size     000005BD (1469)\n-728F2 Filename Length       002E (46)\n-728F4 Extra Length          0000 (0)\n-728F6 Comment Length        0000 (0)\n-728F8 Disk Start            0000 (0)\n-728FA Int File Attributes   0000 (0)\n+73258 Compression Method    0008 (8) 'Deflated'\n+7325A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7325E CRC                   66454DE7 (1715817959)\n+73262 Compressed Size       0000029A (666)\n+73266 Uncompressed Size     000005ED (1517)\n+7326A Filename Length       002E (46)\n+7326C Extra Length          0000 (0)\n+7326E Comment Length        0000 (0)\n+73270 Disk Start            0000 (0)\n+73272 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-728FC Ext File Attributes   81A40000 (2175008768)\n+73274 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72900 Local Header Offset   0001B0EC (110828)\n-72904 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73278 Local Header Offset   0001B2BF (111295)\n+7327C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72904: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7327C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72932 CENTRAL HEADER #138   02014B50 (33639248)\n-72936 Created Zip Spec      14 (20) '2.0'\n-72937 Created OS            03 (3) 'Unix'\n-72938 Extract Zip Spec      14 (20) '2.0'\n-72939 Extract OS            00 (0) 'MS-DOS'\n-7293A General Purpose Flag  0800 (2048)\n+732AA CENTRAL HEADER #138   02014B50 (33639248)\n+732AE Created Zip Spec      14 (20) '2.0'\n+732AF Created OS            03 (3) 'Unix'\n+732B0 Extract Zip Spec      14 (20) '2.0'\n+732B1 Extract OS            00 (0) 'MS-DOS'\n+732B2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7293C Compression Method    0008 (8) 'Deflated'\n-7293E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72942 CRC                   8B9FA779 (2342496121)\n-72946 Compressed Size       00000248 (584)\n-7294A Uncompressed Size     0000047A (1146)\n-7294E Filename Length       0035 (53)\n-72950 Extra Length          0000 (0)\n-72952 Comment Length        0000 (0)\n-72954 Disk Start            0000 (0)\n-72956 Int File Attributes   0000 (0)\n+732B4 Compression Method    0008 (8) 'Deflated'\n+732B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+732BA CRC                   F8009358 (4160787288)\n+732BE Compressed Size       0000024E (590)\n+732C2 Uncompressed Size     0000049D (1181)\n+732C6 Filename Length       0035 (53)\n+732C8 Extra Length          0000 (0)\n+732CA Comment Length        0000 (0)\n+732CC Disk Start            0000 (0)\n+732CE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72958 Ext File Attributes   81A40000 (2175008768)\n+732D0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7295C Local Header Offset   0001B3CB (111563)\n-72960 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+732D4 Local Header Offset   0001B5A5 (112037)\n+732D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72960: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x732D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72995 CENTRAL HEADER #139   02014B50 (33639248)\n-72999 Created Zip Spec      14 (20) '2.0'\n-7299A Created OS            03 (3) 'Unix'\n-7299B Extract Zip Spec      14 (20) '2.0'\n-7299C Extract OS            00 (0) 'MS-DOS'\n-7299D General Purpose Flag  0800 (2048)\n+7330D CENTRAL HEADER #139   02014B50 (33639248)\n+73311 Created Zip Spec      14 (20) '2.0'\n+73312 Created OS            03 (3) 'Unix'\n+73313 Extract Zip Spec      14 (20) '2.0'\n+73314 Extract OS            00 (0) 'MS-DOS'\n+73315 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7299F Compression Method    0008 (8) 'Deflated'\n-729A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-729A5 CRC                   6A25F272 (1780871794)\n-729A9 Compressed Size       000004C1 (1217)\n-729AD Uncompressed Size     00000E60 (3680)\n-729B1 Filename Length       002E (46)\n-729B3 Extra Length          0000 (0)\n-729B5 Comment Length        0000 (0)\n-729B7 Disk Start            0000 (0)\n-729B9 Int File Attributes   0000 (0)\n+73317 Compression Method    0008 (8) 'Deflated'\n+73319 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7331D CRC                   C8C419A3 (3368294819)\n+73321 Compressed Size       000004CC (1228)\n+73325 Uncompressed Size     00000ECC (3788)\n+73329 Filename Length       002E (46)\n+7332B Extra Length          0000 (0)\n+7332D Comment Length        0000 (0)\n+7332F Disk Start            0000 (0)\n+73331 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-729BB Ext File Attributes   81A40000 (2175008768)\n+73333 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-729BF Local Header Offset   0001B666 (112230)\n-729C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73337 Local Header Offset   0001B846 (112710)\n+7333B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x729C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7333B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-729F1 CENTRAL HEADER #140   02014B50 (33639248)\n-729F5 Created Zip Spec      14 (20) '2.0'\n-729F6 Created OS            03 (3) 'Unix'\n-729F7 Extract Zip Spec      14 (20) '2.0'\n-729F8 Extract OS            00 (0) 'MS-DOS'\n-729F9 General Purpose Flag  0800 (2048)\n+73369 CENTRAL HEADER #140   02014B50 (33639248)\n+7336D Created Zip Spec      14 (20) '2.0'\n+7336E Created OS            03 (3) 'Unix'\n+7336F Extract Zip Spec      14 (20) '2.0'\n+73370 Extract OS            00 (0) 'MS-DOS'\n+73371 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-729FB Compression Method    0008 (8) 'Deflated'\n-729FD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72A01 CRC                   94774B8E (2490846094)\n-72A05 Compressed Size       0000024C (588)\n-72A09 Uncompressed Size     00000411 (1041)\n-72A0D Filename Length       0034 (52)\n-72A0F Extra Length          0000 (0)\n-72A11 Comment Length        0000 (0)\n-72A13 Disk Start            0000 (0)\n-72A15 Int File Attributes   0000 (0)\n+73373 Compression Method    0008 (8) 'Deflated'\n+73375 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73379 CRC                   C31C00DA (3273392346)\n+7337D Compressed Size       00000255 (597)\n+73381 Uncompressed Size     0000042C (1068)\n+73385 Filename Length       0034 (52)\n+73387 Extra Length          0000 (0)\n+73389 Comment Length        0000 (0)\n+7338B Disk Start            0000 (0)\n+7338D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72A17 Ext File Attributes   81A40000 (2175008768)\n+7338F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72A1B Local Header Offset   0001BB73 (113523)\n-72A1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73393 Local Header Offset   0001BD5E (114014)\n+73397 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72A1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73397: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72A53 CENTRAL HEADER #141   02014B50 (33639248)\n-72A57 Created Zip Spec      14 (20) '2.0'\n-72A58 Created OS            03 (3) 'Unix'\n-72A59 Extract Zip Spec      14 (20) '2.0'\n-72A5A Extract OS            00 (0) 'MS-DOS'\n-72A5B General Purpose Flag  0800 (2048)\n+733CB CENTRAL HEADER #141   02014B50 (33639248)\n+733CF Created Zip Spec      14 (20) '2.0'\n+733D0 Created OS            03 (3) 'Unix'\n+733D1 Extract Zip Spec      14 (20) '2.0'\n+733D2 Extract OS            00 (0) 'MS-DOS'\n+733D3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72A5D Compression Method    0008 (8) 'Deflated'\n-72A5F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72A63 CRC                   A95D9412 (2841482258)\n-72A67 Compressed Size       000002B6 (694)\n-72A6B Uncompressed Size     00000532 (1330)\n-72A6F Filename Length       003D (61)\n-72A71 Extra Length          0000 (0)\n-72A73 Comment Length        0000 (0)\n-72A75 Disk Start            0000 (0)\n-72A77 Int File Attributes   0000 (0)\n+733D5 Compression Method    0008 (8) 'Deflated'\n+733D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+733DB CRC                   C4FF04D7 (3305047255)\n+733DF Compressed Size       000002C0 (704)\n+733E3 Uncompressed Size     00000558 (1368)\n+733E7 Filename Length       003D (61)\n+733E9 Extra Length          0000 (0)\n+733EB Comment Length        0000 (0)\n+733ED Disk Start            0000 (0)\n+733EF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72A79 Ext File Attributes   81A40000 (2175008768)\n+733F1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72A7D Local Header Offset   0001BE11 (114193)\n-72A81 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+733F5 Local Header Offset   0001C005 (114693)\n+733F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72A81: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x733F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72ABE CENTRAL HEADER #142   02014B50 (33639248)\n-72AC2 Created Zip Spec      14 (20) '2.0'\n-72AC3 Created OS            03 (3) 'Unix'\n-72AC4 Extract Zip Spec      14 (20) '2.0'\n-72AC5 Extract OS            00 (0) 'MS-DOS'\n-72AC6 General Purpose Flag  0800 (2048)\n+73436 CENTRAL HEADER #142   02014B50 (33639248)\n+7343A Created Zip Spec      14 (20) '2.0'\n+7343B Created OS            03 (3) 'Unix'\n+7343C Extract Zip Spec      14 (20) '2.0'\n+7343D Extract OS            00 (0) 'MS-DOS'\n+7343E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72AC8 Compression Method    0008 (8) 'Deflated'\n-72ACA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72ACE CRC                   578BE304 (1468785412)\n-72AD2 Compressed Size       000002B2 (690)\n-72AD6 Uncompressed Size     00000514 (1300)\n-72ADA Filename Length       003F (63)\n-72ADC Extra Length          0000 (0)\n-72ADE Comment Length        0000 (0)\n-72AE0 Disk Start            0000 (0)\n-72AE2 Int File Attributes   0000 (0)\n+73440 Compression Method    0008 (8) 'Deflated'\n+73442 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73446 CRC                   B8E6EA58 (3102141016)\n+7344A Compressed Size       000002BB (699)\n+7344E Uncompressed Size     0000053B (1339)\n+73452 Filename Length       003F (63)\n+73454 Extra Length          0000 (0)\n+73456 Comment Length        0000 (0)\n+73458 Disk Start            0000 (0)\n+7345A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72AE4 Ext File Attributes   81A40000 (2175008768)\n+7345C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72AE8 Local Header Offset   0001C122 (114978)\n-72AEC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73460 Local Header Offset   0001C320 (115488)\n+73464 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72AEC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73464: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72B2B CENTRAL HEADER #143   02014B50 (33639248)\n-72B2F Created Zip Spec      14 (20) '2.0'\n-72B30 Created OS            03 (3) 'Unix'\n-72B31 Extract Zip Spec      14 (20) '2.0'\n-72B32 Extract OS            00 (0) 'MS-DOS'\n-72B33 General Purpose Flag  0800 (2048)\n+734A3 CENTRAL HEADER #143   02014B50 (33639248)\n+734A7 Created Zip Spec      14 (20) '2.0'\n+734A8 Created OS            03 (3) 'Unix'\n+734A9 Extract Zip Spec      14 (20) '2.0'\n+734AA Extract OS            00 (0) 'MS-DOS'\n+734AB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72B35 Compression Method    0008 (8) 'Deflated'\n-72B37 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72B3B CRC                   8AE0BB27 (2329983783)\n-72B3F Compressed Size       000002F3 (755)\n-72B43 Uncompressed Size     000005DA (1498)\n-72B47 Filename Length       003F (63)\n-72B49 Extra Length          0000 (0)\n-72B4B Comment Length        0000 (0)\n-72B4D Disk Start            0000 (0)\n-72B4F Int File Attributes   0000 (0)\n+734AD Compression Method    0008 (8) 'Deflated'\n+734AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+734B3 CRC                   27EF74B8 (670004408)\n+734B7 Compressed Size       000002FD (765)\n+734BB Uncompressed Size     00000606 (1542)\n+734BF Filename Length       003F (63)\n+734C1 Extra Length          0000 (0)\n+734C3 Comment Length        0000 (0)\n+734C5 Disk Start            0000 (0)\n+734C7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72B51 Ext File Attributes   81A40000 (2175008768)\n+734C9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72B55 Local Header Offset   0001C431 (115761)\n-72B59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+734CD Local Header Offset   0001C638 (116280)\n+734D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72B59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x734D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72B98 CENTRAL HEADER #144   02014B50 (33639248)\n-72B9C Created Zip Spec      14 (20) '2.0'\n-72B9D Created OS            03 (3) 'Unix'\n-72B9E Extract Zip Spec      14 (20) '2.0'\n-72B9F Extract OS            00 (0) 'MS-DOS'\n-72BA0 General Purpose Flag  0800 (2048)\n+73510 CENTRAL HEADER #144   02014B50 (33639248)\n+73514 Created Zip Spec      14 (20) '2.0'\n+73515 Created OS            03 (3) 'Unix'\n+73516 Extract Zip Spec      14 (20) '2.0'\n+73517 Extract OS            00 (0) 'MS-DOS'\n+73518 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72BA2 Compression Method    0008 (8) 'Deflated'\n-72BA4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72BA8 CRC                   D8EB7635 (3639309877)\n-72BAC Compressed Size       000002B6 (694)\n-72BB0 Uncompressed Size     0000052E (1326)\n-72BB4 Filename Length       003C (60)\n-72BB6 Extra Length          0000 (0)\n-72BB8 Comment Length        0000 (0)\n-72BBA Disk Start            0000 (0)\n-72BBC Int File Attributes   0000 (0)\n+7351A Compression Method    0008 (8) 'Deflated'\n+7351C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73520 CRC                   3F610BCB (1063324619)\n+73524 Compressed Size       000002C0 (704)\n+73528 Uncompressed Size     00000555 (1365)\n+7352C Filename Length       003C (60)\n+7352E Extra Length          0000 (0)\n+73530 Comment Length        0000 (0)\n+73532 Disk Start            0000 (0)\n+73534 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72BBE Ext File Attributes   81A40000 (2175008768)\n+73536 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72BC2 Local Header Offset   0001C781 (116609)\n-72BC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7353A Local Header Offset   0001C992 (117138)\n+7353E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72BC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7353E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72C02 CENTRAL HEADER #145   02014B50 (33639248)\n-72C06 Created Zip Spec      14 (20) '2.0'\n-72C07 Created OS            03 (3) 'Unix'\n-72C08 Extract Zip Spec      14 (20) '2.0'\n-72C09 Extract OS            00 (0) 'MS-DOS'\n-72C0A General Purpose Flag  0800 (2048)\n+7357A CENTRAL HEADER #145   02014B50 (33639248)\n+7357E Created Zip Spec      14 (20) '2.0'\n+7357F Created OS            03 (3) 'Unix'\n+73580 Extract Zip Spec      14 (20) '2.0'\n+73581 Extract OS            00 (0) 'MS-DOS'\n+73582 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72C0C Compression Method    0008 (8) 'Deflated'\n-72C0E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72C12 CRC                   7C7DD03D (2088620093)\n-72C16 Compressed Size       000002B5 (693)\n-72C1A Uncompressed Size     00000528 (1320)\n-72C1E Filename Length       003B (59)\n-72C20 Extra Length          0000 (0)\n-72C22 Comment Length        0000 (0)\n-72C24 Disk Start            0000 (0)\n-72C26 Int File Attributes   0000 (0)\n+73584 Compression Method    0008 (8) 'Deflated'\n+73586 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7358A CRC                   15F2A538 (368223544)\n+7358E Compressed Size       000002BE (702)\n+73592 Uncompressed Size     0000054E (1358)\n+73596 Filename Length       003B (59)\n+73598 Extra Length          0000 (0)\n+7359A Comment Length        0000 (0)\n+7359C Disk Start            0000 (0)\n+7359E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72C28 Ext File Attributes   81A40000 (2175008768)\n+735A0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72C2C Local Header Offset   0001CA91 (117393)\n-72C30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+735A4 Local Header Offset   0001CCAC (117932)\n+735A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72C30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x735A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72C6B CENTRAL HEADER #146   02014B50 (33639248)\n-72C6F Created Zip Spec      14 (20) '2.0'\n-72C70 Created OS            03 (3) 'Unix'\n-72C71 Extract Zip Spec      14 (20) '2.0'\n-72C72 Extract OS            00 (0) 'MS-DOS'\n-72C73 General Purpose Flag  0800 (2048)\n+735E3 CENTRAL HEADER #146   02014B50 (33639248)\n+735E7 Created Zip Spec      14 (20) '2.0'\n+735E8 Created OS            03 (3) 'Unix'\n+735E9 Extract Zip Spec      14 (20) '2.0'\n+735EA Extract OS            00 (0) 'MS-DOS'\n+735EB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72C75 Compression Method    0008 (8) 'Deflated'\n-72C77 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72C7B CRC                   39AACB0F (967494415)\n-72C7F Compressed Size       000002B2 (690)\n-72C83 Uncompressed Size     0000052E (1326)\n-72C87 Filename Length       003D (61)\n-72C89 Extra Length          0000 (0)\n-72C8B Comment Length        0000 (0)\n-72C8D Disk Start            0000 (0)\n-72C8F Int File Attributes   0000 (0)\n+735ED Compression Method    0008 (8) 'Deflated'\n+735EF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+735F3 CRC                   DB3985F1 (3677980145)\n+735F7 Compressed Size       000002BC (700)\n+735FB Uncompressed Size     00000554 (1364)\n+735FF Filename Length       003D (61)\n+73601 Extra Length          0000 (0)\n+73603 Comment Length        0000 (0)\n+73605 Disk Start            0000 (0)\n+73607 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72C91 Ext File Attributes   81A40000 (2175008768)\n+73609 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72C95 Local Header Offset   0001CD9F (118175)\n-72C99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7360D Local Header Offset   0001CFC3 (118723)\n+73611 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72C99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73611: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72CD6 CENTRAL HEADER #147   02014B50 (33639248)\n-72CDA Created Zip Spec      14 (20) '2.0'\n-72CDB Created OS            03 (3) 'Unix'\n-72CDC Extract Zip Spec      14 (20) '2.0'\n-72CDD Extract OS            00 (0) 'MS-DOS'\n-72CDE General Purpose Flag  0800 (2048)\n+7364E CENTRAL HEADER #147   02014B50 (33639248)\n+73652 Created Zip Spec      14 (20) '2.0'\n+73653 Created OS            03 (3) 'Unix'\n+73654 Extract Zip Spec      14 (20) '2.0'\n+73655 Extract OS            00 (0) 'MS-DOS'\n+73656 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72CE0 Compression Method    0008 (8) 'Deflated'\n-72CE2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72CE6 CRC                   5BF59138 (1542820152)\n-72CEA Compressed Size       000002B4 (692)\n-72CEE Uncompressed Size     00000524 (1316)\n-72CF2 Filename Length       003A (58)\n-72CF4 Extra Length          0000 (0)\n-72CF6 Comment Length        0000 (0)\n-72CF8 Disk Start            0000 (0)\n-72CFA Int File Attributes   0000 (0)\n+73658 Compression Method    0008 (8) 'Deflated'\n+7365A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7365E CRC                   7AC3DE73 (2059656819)\n+73662 Compressed Size       000002BF (703)\n+73666 Uncompressed Size     0000054B (1355)\n+7366A Filename Length       003A (58)\n+7366C Extra Length          0000 (0)\n+7366E Comment Length        0000 (0)\n+73670 Disk Start            0000 (0)\n+73672 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72CFC Ext File Attributes   81A40000 (2175008768)\n+73674 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72D00 Local Header Offset   0001D0AC (118956)\n-72D04 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73678 Local Header Offset   0001D2DA (119514)\n+7367C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72D04: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7367C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72D3E CENTRAL HEADER #148   02014B50 (33639248)\n-72D42 Created Zip Spec      14 (20) '2.0'\n-72D43 Created OS            03 (3) 'Unix'\n-72D44 Extract Zip Spec      14 (20) '2.0'\n-72D45 Extract OS            00 (0) 'MS-DOS'\n-72D46 General Purpose Flag  0800 (2048)\n+736B6 CENTRAL HEADER #148   02014B50 (33639248)\n+736BA Created Zip Spec      14 (20) '2.0'\n+736BB Created OS            03 (3) 'Unix'\n+736BC Extract Zip Spec      14 (20) '2.0'\n+736BD Extract OS            00 (0) 'MS-DOS'\n+736BE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72D48 Compression Method    0008 (8) 'Deflated'\n-72D4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72D4E CRC                   9AA4AEC4 (2594483908)\n-72D52 Compressed Size       00000295 (661)\n-72D56 Uncompressed Size     000004F3 (1267)\n-72D5A Filename Length       003E (62)\n-72D5C Extra Length          0000 (0)\n-72D5E Comment Length        0000 (0)\n-72D60 Disk Start            0000 (0)\n-72D62 Int File Attributes   0000 (0)\n+736C0 Compression Method    0008 (8) 'Deflated'\n+736C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+736C6 CRC                   190CB88A (420264074)\n+736CA Compressed Size       0000029F (671)\n+736CE Uncompressed Size     0000051B (1307)\n+736D2 Filename Length       003E (62)\n+736D4 Extra Length          0000 (0)\n+736D6 Comment Length        0000 (0)\n+736D8 Disk Start            0000 (0)\n+736DA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72D64 Ext File Attributes   81A40000 (2175008768)\n+736DC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72D68 Local Header Offset   0001D3B8 (119736)\n-72D6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+736E0 Local Header Offset   0001D5F1 (120305)\n+736E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72D6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x736E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72DAA CENTRAL HEADER #149   02014B50 (33639248)\n-72DAE Created Zip Spec      14 (20) '2.0'\n-72DAF Created OS            03 (3) 'Unix'\n-72DB0 Extract Zip Spec      14 (20) '2.0'\n-72DB1 Extract OS            00 (0) 'MS-DOS'\n-72DB2 General Purpose Flag  0800 (2048)\n+73722 CENTRAL HEADER #149   02014B50 (33639248)\n+73726 Created Zip Spec      14 (20) '2.0'\n+73727 Created OS            03 (3) 'Unix'\n+73728 Extract Zip Spec      14 (20) '2.0'\n+73729 Extract OS            00 (0) 'MS-DOS'\n+7372A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72DB4 Compression Method    0008 (8) 'Deflated'\n-72DB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72DBA CRC                   FD88956D (4253586797)\n-72DBE Compressed Size       000002B4 (692)\n-72DC2 Uncompressed Size     00000529 (1321)\n-72DC6 Filename Length       003B (59)\n-72DC8 Extra Length          0000 (0)\n-72DCA Comment Length        0000 (0)\n-72DCC Disk Start            0000 (0)\n-72DCE Int File Attributes   0000 (0)\n+7372C Compression Method    0008 (8) 'Deflated'\n+7372E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73732 CRC                   94D0E691 (2496718481)\n+73736 Compressed Size       000002BF (703)\n+7373A Uncompressed Size     00000550 (1360)\n+7373E Filename Length       003B (59)\n+73740 Extra Length          0000 (0)\n+73742 Comment Length        0000 (0)\n+73744 Disk Start            0000 (0)\n+73746 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72DD0 Ext File Attributes   81A40000 (2175008768)\n+73748 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72DD4 Local Header Offset   0001D6A9 (120489)\n-72DD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7374C Local Header Offset   0001D8EC (121068)\n+73750 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72DD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73750: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72E13 CENTRAL HEADER #150   02014B50 (33639248)\n-72E17 Created Zip Spec      14 (20) '2.0'\n-72E18 Created OS            03 (3) 'Unix'\n-72E19 Extract Zip Spec      14 (20) '2.0'\n-72E1A Extract OS            00 (0) 'MS-DOS'\n-72E1B General Purpose Flag  0800 (2048)\n+7378B CENTRAL HEADER #150   02014B50 (33639248)\n+7378F Created Zip Spec      14 (20) '2.0'\n+73790 Created OS            03 (3) 'Unix'\n+73791 Extract Zip Spec      14 (20) '2.0'\n+73792 Extract OS            00 (0) 'MS-DOS'\n+73793 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72E1D Compression Method    0008 (8) 'Deflated'\n-72E1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72E23 CRC                   88F80863 (2297956451)\n-72E27 Compressed Size       0000025F (607)\n-72E2B Uncompressed Size     00000452 (1106)\n-72E2F Filename Length       003C (60)\n-72E31 Extra Length          0000 (0)\n-72E33 Comment Length        0000 (0)\n-72E35 Disk Start            0000 (0)\n-72E37 Int File Attributes   0000 (0)\n+73795 Compression Method    0008 (8) 'Deflated'\n+73797 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7379B CRC                   E4FF1EF0 (3841924848)\n+7379F Compressed Size       00000267 (615)\n+737A3 Uncompressed Size     00000470 (1136)\n+737A7 Filename Length       003C (60)\n+737A9 Extra Length          0000 (0)\n+737AB Comment Length        0000 (0)\n+737AD Disk Start            0000 (0)\n+737AF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72E39 Ext File Attributes   81A40000 (2175008768)\n+737B1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72E3D Local Header Offset   0001D9B6 (121270)\n-72E41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+737B5 Local Header Offset   0001DC04 (121860)\n+737B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72E41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x737B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72E7D CENTRAL HEADER #151   02014B50 (33639248)\n-72E81 Created Zip Spec      14 (20) '2.0'\n-72E82 Created OS            03 (3) 'Unix'\n-72E83 Extract Zip Spec      14 (20) '2.0'\n-72E84 Extract OS            00 (0) 'MS-DOS'\n-72E85 General Purpose Flag  0800 (2048)\n+737F5 CENTRAL HEADER #151   02014B50 (33639248)\n+737F9 Created Zip Spec      14 (20) '2.0'\n+737FA Created OS            03 (3) 'Unix'\n+737FB Extract Zip Spec      14 (20) '2.0'\n+737FC Extract OS            00 (0) 'MS-DOS'\n+737FD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72E87 Compression Method    0008 (8) 'Deflated'\n-72E89 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72E8D CRC                   56E92431 (1458119729)\n-72E91 Compressed Size       000004C7 (1223)\n-72E95 Uncompressed Size     00000D31 (3377)\n-72E99 Filename Length       0041 (65)\n-72E9B Extra Length          0000 (0)\n-72E9D Comment Length        0000 (0)\n-72E9F Disk Start            0000 (0)\n-72EA1 Int File Attributes   0000 (0)\n+737FF Compression Method    0008 (8) 'Deflated'\n+73801 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73805 CRC                   54CD8A2A (1422756394)\n+73809 Compressed Size       000004D2 (1234)\n+7380D Uncompressed Size     00000D8D (3469)\n+73811 Filename Length       0041 (65)\n+73813 Extra Length          0000 (0)\n+73815 Comment Length        0000 (0)\n+73817 Disk Start            0000 (0)\n+73819 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72EA3 Ext File Attributes   81A40000 (2175008768)\n+7381B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72EA7 Local Header Offset   0001DC6F (121967)\n-72EAB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7381F Local Header Offset   0001DEC5 (122565)\n+73823 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72EAB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73823: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72EEC CENTRAL HEADER #152   02014B50 (33639248)\n-72EF0 Created Zip Spec      14 (20) '2.0'\n-72EF1 Created OS            03 (3) 'Unix'\n-72EF2 Extract Zip Spec      14 (20) '2.0'\n-72EF3 Extract OS            00 (0) 'MS-DOS'\n-72EF4 General Purpose Flag  0800 (2048)\n+73864 CENTRAL HEADER #152   02014B50 (33639248)\n+73868 Created Zip Spec      14 (20) '2.0'\n+73869 Created OS            03 (3) 'Unix'\n+7386A Extract Zip Spec      14 (20) '2.0'\n+7386B Extract OS            00 (0) 'MS-DOS'\n+7386C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72EF6 Compression Method    0008 (8) 'Deflated'\n-72EF8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72EFC CRC                   54A7512C (1420251436)\n-72F00 Compressed Size       0000037E (894)\n-72F04 Uncompressed Size     00000774 (1908)\n-72F08 Filename Length       0044 (68)\n-72F0A Extra Length          0000 (0)\n-72F0C Comment Length        0000 (0)\n-72F0E Disk Start            0000 (0)\n-72F10 Int File Attributes   0000 (0)\n+7386E Compression Method    0008 (8) 'Deflated'\n+73870 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73874 CRC                   6FAB873E (1873512254)\n+73878 Compressed Size       00000388 (904)\n+7387C Uncompressed Size     000007B0 (1968)\n+73880 Filename Length       0044 (68)\n+73882 Extra Length          0000 (0)\n+73884 Comment Length        0000 (0)\n+73886 Disk Start            0000 (0)\n+73888 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72F12 Ext File Attributes   81A40000 (2175008768)\n+7388A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72F16 Local Header Offset   0001E195 (123285)\n-72F1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7388E Local Header Offset   0001E3F6 (123894)\n+73892 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72F1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73892: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72F5E CENTRAL HEADER #153   02014B50 (33639248)\n-72F62 Created Zip Spec      14 (20) '2.0'\n-72F63 Created OS            03 (3) 'Unix'\n-72F64 Extract Zip Spec      14 (20) '2.0'\n-72F65 Extract OS            00 (0) 'MS-DOS'\n-72F66 General Purpose Flag  0800 (2048)\n+738D6 CENTRAL HEADER #153   02014B50 (33639248)\n+738DA Created Zip Spec      14 (20) '2.0'\n+738DB Created OS            03 (3) 'Unix'\n+738DC Extract Zip Spec      14 (20) '2.0'\n+738DD Extract OS            00 (0) 'MS-DOS'\n+738DE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72F68 Compression Method    0008 (8) 'Deflated'\n-72F6A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72F6E CRC                   44B63BF0 (1152793584)\n-72F72 Compressed Size       000002B1 (689)\n-72F76 Uncompressed Size     0000050F (1295)\n-72F7A Filename Length       004C (76)\n-72F7C Extra Length          0000 (0)\n-72F7E Comment Length        0000 (0)\n-72F80 Disk Start            0000 (0)\n-72F82 Int File Attributes   0000 (0)\n+738E0 Compression Method    0008 (8) 'Deflated'\n+738E2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+738E6 CRC                   0C78A9F4 (209234420)\n+738EA Compressed Size       000002BC (700)\n+738EE Uncompressed Size     00000530 (1328)\n+738F2 Filename Length       004C (76)\n+738F4 Extra Length          0000 (0)\n+738F6 Comment Length        0000 (0)\n+738F8 Disk Start            0000 (0)\n+738FA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72F84 Ext File Attributes   81A40000 (2175008768)\n+738FC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-72F88 Local Header Offset   0001E575 (124277)\n-72F8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73900 Local Header Offset   0001E7E0 (124896)\n+73904 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72F8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73904: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72FD8 CENTRAL HEADER #154   02014B50 (33639248)\n-72FDC Created Zip Spec      14 (20) '2.0'\n-72FDD Created OS            03 (3) 'Unix'\n-72FDE Extract Zip Spec      14 (20) '2.0'\n-72FDF Extract OS            00 (0) 'MS-DOS'\n-72FE0 General Purpose Flag  0800 (2048)\n+73950 CENTRAL HEADER #154   02014B50 (33639248)\n+73954 Created Zip Spec      14 (20) '2.0'\n+73955 Created OS            03 (3) 'Unix'\n+73956 Extract Zip Spec      14 (20) '2.0'\n+73957 Extract OS            00 (0) 'MS-DOS'\n+73958 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-72FE2 Compression Method    0008 (8) 'Deflated'\n-72FE4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72FE8 CRC                   6FDF7D92 (1876917650)\n-72FEC Compressed Size       000002BA (698)\n-72FF0 Uncompressed Size     00000538 (1336)\n-72FF4 Filename Length       004C (76)\n-72FF6 Extra Length          0000 (0)\n-72FF8 Comment Length        0000 (0)\n-72FFA Disk Start            0000 (0)\n-72FFC Int File Attributes   0000 (0)\n+7395A Compression Method    0008 (8) 'Deflated'\n+7395C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73960 CRC                   5D42735B (1564635995)\n+73964 Compressed Size       000002C4 (708)\n+73968 Uncompressed Size     0000055A (1370)\n+7396C Filename Length       004C (76)\n+7396E Extra Length          0000 (0)\n+73970 Comment Length        0000 (0)\n+73972 Disk Start            0000 (0)\n+73974 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-72FFE Ext File Attributes   81A40000 (2175008768)\n+73976 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73002 Local Header Offset   0001E890 (125072)\n-73006 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7397A Local Header Offset   0001EB06 (125702)\n+7397E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73006: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7397E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73052 CENTRAL HEADER #155   02014B50 (33639248)\n-73056 Created Zip Spec      14 (20) '2.0'\n-73057 Created OS            03 (3) 'Unix'\n-73058 Extract Zip Spec      14 (20) '2.0'\n-73059 Extract OS            00 (0) 'MS-DOS'\n-7305A General Purpose Flag  0800 (2048)\n+739CA CENTRAL HEADER #155   02014B50 (33639248)\n+739CE Created Zip Spec      14 (20) '2.0'\n+739CF Created OS            03 (3) 'Unix'\n+739D0 Extract Zip Spec      14 (20) '2.0'\n+739D1 Extract OS            00 (0) 'MS-DOS'\n+739D2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7305C Compression Method    0008 (8) 'Deflated'\n-7305E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73062 CRC                   E28B1205 (3800764933)\n-73066 Compressed Size       000002A4 (676)\n-7306A Uncompressed Size     000004D6 (1238)\n-7306E Filename Length       0049 (73)\n-73070 Extra Length          0000 (0)\n-73072 Comment Length        0000 (0)\n-73074 Disk Start            0000 (0)\n-73076 Int File Attributes   0000 (0)\n+739D4 Compression Method    0008 (8) 'Deflated'\n+739D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+739DA CRC                   FE374BB9 (4265036729)\n+739DE Compressed Size       000002AF (687)\n+739E2 Uncompressed Size     000004F7 (1271)\n+739E6 Filename Length       0049 (73)\n+739E8 Extra Length          0000 (0)\n+739EA Comment Length        0000 (0)\n+739EC Disk Start            0000 (0)\n+739EE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73078 Ext File Attributes   81A40000 (2175008768)\n+739F0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7307C Local Header Offset   0001EBB4 (125876)\n-73080 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+739F4 Local Header Offset   0001EE34 (126516)\n+739F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73080: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x739F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-730C9 CENTRAL HEADER #156   02014B50 (33639248)\n-730CD Created Zip Spec      14 (20) '2.0'\n-730CE Created OS            03 (3) 'Unix'\n-730CF Extract Zip Spec      14 (20) '2.0'\n-730D0 Extract OS            00 (0) 'MS-DOS'\n-730D1 General Purpose Flag  0800 (2048)\n+73A41 CENTRAL HEADER #156   02014B50 (33639248)\n+73A45 Created Zip Spec      14 (20) '2.0'\n+73A46 Created OS            03 (3) 'Unix'\n+73A47 Extract Zip Spec      14 (20) '2.0'\n+73A48 Extract OS            00 (0) 'MS-DOS'\n+73A49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-730D3 Compression Method    0008 (8) 'Deflated'\n-730D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-730D9 CRC                   8C9A6BCF (2358930383)\n-730DD Compressed Size       0000029F (671)\n-730E1 Uncompressed Size     000004BF (1215)\n-730E5 Filename Length       0044 (68)\n-730E7 Extra Length          0000 (0)\n-730E9 Comment Length        0000 (0)\n-730EB Disk Start            0000 (0)\n-730ED Int File Attributes   0000 (0)\n+73A4B Compression Method    0008 (8) 'Deflated'\n+73A4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73A51 CRC                   EF9E0DDB (4020112859)\n+73A55 Compressed Size       000002A9 (681)\n+73A59 Uncompressed Size     000004E0 (1248)\n+73A5D Filename Length       0044 (68)\n+73A5F Extra Length          0000 (0)\n+73A61 Comment Length        0000 (0)\n+73A63 Disk Start            0000 (0)\n+73A65 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-730EF Ext File Attributes   81A40000 (2175008768)\n+73A67 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-730F3 Local Header Offset   0001EEBF (126655)\n-730F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73A6B Local Header Offset   0001F14A (127306)\n+73A6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x730F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73A6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7313B CENTRAL HEADER #157   02014B50 (33639248)\n-7313F Created Zip Spec      14 (20) '2.0'\n-73140 Created OS            03 (3) 'Unix'\n-73141 Extract Zip Spec      14 (20) '2.0'\n-73142 Extract OS            00 (0) 'MS-DOS'\n-73143 General Purpose Flag  0800 (2048)\n+73AB3 CENTRAL HEADER #157   02014B50 (33639248)\n+73AB7 Created Zip Spec      14 (20) '2.0'\n+73AB8 Created OS            03 (3) 'Unix'\n+73AB9 Extract Zip Spec      14 (20) '2.0'\n+73ABA Extract OS            00 (0) 'MS-DOS'\n+73ABB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73145 Compression Method    0008 (8) 'Deflated'\n-73147 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7314B CRC                   17228680 (388138624)\n-7314F Compressed Size       0000048F (1167)\n-73153 Uncompressed Size     00000C22 (3106)\n-73157 Filename Length       0047 (71)\n-73159 Extra Length          0000 (0)\n-7315B Comment Length        0000 (0)\n-7315D Disk Start            0000 (0)\n-7315F Int File Attributes   0000 (0)\n+73ABD Compression Method    0008 (8) 'Deflated'\n+73ABF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73AC3 CRC                   65FB8949 (1710983497)\n+73AC7 Compressed Size       0000049B (1179)\n+73ACB Uncompressed Size     00000C72 (3186)\n+73ACF Filename Length       0047 (71)\n+73AD1 Extra Length          0000 (0)\n+73AD3 Comment Length        0000 (0)\n+73AD5 Disk Start            0000 (0)\n+73AD7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73161 Ext File Attributes   81A40000 (2175008768)\n+73AD9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73165 Local Header Offset   0001F1C0 (127424)\n-73169 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73ADD Local Header Offset   0001F455 (128085)\n+73AE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73169: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73AE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-731B0 CENTRAL HEADER #158   02014B50 (33639248)\n-731B4 Created Zip Spec      14 (20) '2.0'\n-731B5 Created OS            03 (3) 'Unix'\n-731B6 Extract Zip Spec      14 (20) '2.0'\n-731B7 Extract OS            00 (0) 'MS-DOS'\n-731B8 General Purpose Flag  0800 (2048)\n+73B28 CENTRAL HEADER #158   02014B50 (33639248)\n+73B2C Created Zip Spec      14 (20) '2.0'\n+73B2D Created OS            03 (3) 'Unix'\n+73B2E Extract Zip Spec      14 (20) '2.0'\n+73B2F Extract OS            00 (0) 'MS-DOS'\n+73B30 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-731BA Compression Method    0008 (8) 'Deflated'\n-731BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-731C0 CRC                   90DCE257 (2430394967)\n-731C4 Compressed Size       0000029D (669)\n-731C8 Uncompressed Size     000004B8 (1208)\n-731CC Filename Length       0043 (67)\n-731CE Extra Length          0000 (0)\n-731D0 Comment Length        0000 (0)\n-731D2 Disk Start            0000 (0)\n-731D4 Int File Attributes   0000 (0)\n+73B32 Compression Method    0008 (8) 'Deflated'\n+73B34 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73B38 CRC                   CC224977 (3424799095)\n+73B3C Compressed Size       000002A9 (681)\n+73B40 Uncompressed Size     000004D9 (1241)\n+73B44 Filename Length       0043 (67)\n+73B46 Extra Length          0000 (0)\n+73B48 Comment Length        0000 (0)\n+73B4A Disk Start            0000 (0)\n+73B4C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-731D6 Ext File Attributes   81A40000 (2175008768)\n+73B4E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-731DA Local Header Offset   0001F6B4 (128692)\n-731DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73B52 Local Header Offset   0001F955 (129365)\n+73B56 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x731DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73B56: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73221 CENTRAL HEADER #159   02014B50 (33639248)\n-73225 Created Zip Spec      14 (20) '2.0'\n-73226 Created OS            03 (3) 'Unix'\n-73227 Extract Zip Spec      14 (20) '2.0'\n-73228 Extract OS            00 (0) 'MS-DOS'\n-73229 General Purpose Flag  0800 (2048)\n+73B99 CENTRAL HEADER #159   02014B50 (33639248)\n+73B9D Created Zip Spec      14 (20) '2.0'\n+73B9E Created OS            03 (3) 'Unix'\n+73B9F Extract Zip Spec      14 (20) '2.0'\n+73BA0 Extract OS            00 (0) 'MS-DOS'\n+73BA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7322B Compression Method    0008 (8) 'Deflated'\n-7322D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73231 CRC                   092E21B3 (154018227)\n-73235 Compressed Size       000003A4 (932)\n-73239 Uncompressed Size     00000873 (2163)\n-7323D Filename Length       0049 (73)\n-7323F Extra Length          0000 (0)\n-73241 Comment Length        0000 (0)\n-73243 Disk Start            0000 (0)\n-73245 Int File Attributes   0000 (0)\n+73BA3 Compression Method    0008 (8) 'Deflated'\n+73BA5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73BA9 CRC                   38CBB90F (952875279)\n+73BAD Compressed Size       000003AE (942)\n+73BB1 Uncompressed Size     000008B0 (2224)\n+73BB5 Filename Length       0049 (73)\n+73BB7 Extra Length          0000 (0)\n+73BB9 Comment Length        0000 (0)\n+73BBB Disk Start            0000 (0)\n+73BBD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73247 Ext File Attributes   81A40000 (2175008768)\n+73BBF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7324B Local Header Offset   0001F9B2 (129458)\n-7324F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73BC3 Local Header Offset   0001FC5F (130143)\n+73BC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7324F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73BC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73298 CENTRAL HEADER #160   02014B50 (33639248)\n-7329C Created Zip Spec      14 (20) '2.0'\n-7329D Created OS            03 (3) 'Unix'\n-7329E Extract Zip Spec      14 (20) '2.0'\n-7329F Extract OS            00 (0) 'MS-DOS'\n-732A0 General Purpose Flag  0800 (2048)\n+73C10 CENTRAL HEADER #160   02014B50 (33639248)\n+73C14 Created Zip Spec      14 (20) '2.0'\n+73C15 Created OS            03 (3) 'Unix'\n+73C16 Extract Zip Spec      14 (20) '2.0'\n+73C17 Extract OS            00 (0) 'MS-DOS'\n+73C18 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-732A2 Compression Method    0008 (8) 'Deflated'\n-732A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-732A8 CRC                   D50997CD (3574175693)\n-732AC Compressed Size       000002A8 (680)\n-732B0 Uncompressed Size     000004F1 (1265)\n-732B4 Filename Length       004B (75)\n-732B6 Extra Length          0000 (0)\n-732B8 Comment Length        0000 (0)\n-732BA Disk Start            0000 (0)\n-732BC Int File Attributes   0000 (0)\n+73C1A Compression Method    0008 (8) 'Deflated'\n+73C1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73C20 CRC                   F0075F17 (4027014935)\n+73C24 Compressed Size       000002B2 (690)\n+73C28 Uncompressed Size     00000513 (1299)\n+73C2C Filename Length       004B (75)\n+73C2E Extra Length          0000 (0)\n+73C30 Comment Length        0000 (0)\n+73C32 Disk Start            0000 (0)\n+73C34 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-732BE Ext File Attributes   81A40000 (2175008768)\n+73C36 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-732C2 Local Header Offset   0001FDBD (130493)\n-732C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73C3A Local Header Offset   00020074 (131188)\n+73C3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x732C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73C3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73311 CENTRAL HEADER #161   02014B50 (33639248)\n-73315 Created Zip Spec      14 (20) '2.0'\n-73316 Created OS            03 (3) 'Unix'\n-73317 Extract Zip Spec      14 (20) '2.0'\n-73318 Extract OS            00 (0) 'MS-DOS'\n-73319 General Purpose Flag  0800 (2048)\n+73C89 CENTRAL HEADER #161   02014B50 (33639248)\n+73C8D Created Zip Spec      14 (20) '2.0'\n+73C8E Created OS            03 (3) 'Unix'\n+73C8F Extract Zip Spec      14 (20) '2.0'\n+73C90 Extract OS            00 (0) 'MS-DOS'\n+73C91 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7331B Compression Method    0008 (8) 'Deflated'\n-7331D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73321 CRC                   1389D7CB (327800779)\n-73325 Compressed Size       000002A6 (678)\n-73329 Uncompressed Size     000004D7 (1239)\n-7332D Filename Length       0044 (68)\n-7332F Extra Length          0000 (0)\n-73331 Comment Length        0000 (0)\n-73333 Disk Start            0000 (0)\n-73335 Int File Attributes   0000 (0)\n+73C93 Compression Method    0008 (8) 'Deflated'\n+73C95 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73C99 CRC                   42E91C9D (1122573469)\n+73C9D Compressed Size       000002AE (686)\n+73CA1 Uncompressed Size     000004F9 (1273)\n+73CA5 Filename Length       0044 (68)\n+73CA7 Extra Length          0000 (0)\n+73CA9 Comment Length        0000 (0)\n+73CAB Disk Start            0000 (0)\n+73CAD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73337 Ext File Attributes   81A40000 (2175008768)\n+73CAF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7333B Local Header Offset   000200CE (131278)\n-7333F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73CB3 Local Header Offset   0002038F (131983)\n+73CB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7333F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73CB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73383 CENTRAL HEADER #162   02014B50 (33639248)\n-73387 Created Zip Spec      14 (20) '2.0'\n-73388 Created OS            03 (3) 'Unix'\n-73389 Extract Zip Spec      14 (20) '2.0'\n-7338A Extract OS            00 (0) 'MS-DOS'\n-7338B General Purpose Flag  0800 (2048)\n+73CFB CENTRAL HEADER #162   02014B50 (33639248)\n+73CFF Created Zip Spec      14 (20) '2.0'\n+73D00 Created OS            03 (3) 'Unix'\n+73D01 Extract Zip Spec      14 (20) '2.0'\n+73D02 Extract OS            00 (0) 'MS-DOS'\n+73D03 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7338D Compression Method    0008 (8) 'Deflated'\n-7338F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73393 CRC                   0204ADF7 (33861111)\n-73397 Compressed Size       0000029C (668)\n-7339B Uncompressed Size     000004AF (1199)\n-7339F Filename Length       0042 (66)\n-733A1 Extra Length          0000 (0)\n-733A3 Comment Length        0000 (0)\n-733A5 Disk Start            0000 (0)\n-733A7 Int File Attributes   0000 (0)\n+73D05 Compression Method    0008 (8) 'Deflated'\n+73D07 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73D0B CRC                   85A11C0C (2241928204)\n+73D0F Compressed Size       000002A6 (678)\n+73D13 Uncompressed Size     000004D0 (1232)\n+73D17 Filename Length       0042 (66)\n+73D19 Extra Length          0000 (0)\n+73D1B Comment Length        0000 (0)\n+73D1D Disk Start            0000 (0)\n+73D1F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-733A9 Ext File Attributes   81A40000 (2175008768)\n+73D21 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-733AD Local Header Offset   000203D6 (132054)\n-733B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73D25 Local Header Offset   0002069F (132767)\n+73D29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x733B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73D29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-733F3 CENTRAL HEADER #163   02014B50 (33639248)\n-733F7 Created Zip Spec      14 (20) '2.0'\n-733F8 Created OS            03 (3) 'Unix'\n-733F9 Extract Zip Spec      14 (20) '2.0'\n-733FA Extract OS            00 (0) 'MS-DOS'\n-733FB General Purpose Flag  0800 (2048)\n+73D6B CENTRAL HEADER #163   02014B50 (33639248)\n+73D6F Created Zip Spec      14 (20) '2.0'\n+73D70 Created OS            03 (3) 'Unix'\n+73D71 Extract Zip Spec      14 (20) '2.0'\n+73D72 Extract OS            00 (0) 'MS-DOS'\n+73D73 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-733FD Compression Method    0008 (8) 'Deflated'\n-733FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73403 CRC                   DE2764C3 (3727123651)\n-73407 Compressed Size       0000029F (671)\n-7340B Uncompressed Size     000004C9 (1225)\n-7340F Filename Length       0048 (72)\n-73411 Extra Length          0000 (0)\n-73413 Comment Length        0000 (0)\n-73415 Disk Start            0000 (0)\n-73417 Int File Attributes   0000 (0)\n+73D75 Compression Method    0008 (8) 'Deflated'\n+73D77 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73D7B CRC                   667CA259 (1719444057)\n+73D7F Compressed Size       000002AA (682)\n+73D83 Uncompressed Size     000004EA (1258)\n+73D87 Filename Length       0048 (72)\n+73D89 Extra Length          0000 (0)\n+73D8B Comment Length        0000 (0)\n+73D8D Disk Start            0000 (0)\n+73D8F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73419 Ext File Attributes   81A40000 (2175008768)\n+73D91 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7341D Local Header Offset   000206D2 (132818)\n-73421 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73D95 Local Header Offset   000209A5 (133541)\n+73D99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73421: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73D99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73469 CENTRAL HEADER #164   02014B50 (33639248)\n-7346D Created Zip Spec      14 (20) '2.0'\n-7346E Created OS            03 (3) 'Unix'\n-7346F Extract Zip Spec      14 (20) '2.0'\n-73470 Extract OS            00 (0) 'MS-DOS'\n-73471 General Purpose Flag  0800 (2048)\n+73DE1 CENTRAL HEADER #164   02014B50 (33639248)\n+73DE5 Created Zip Spec      14 (20) '2.0'\n+73DE6 Created OS            03 (3) 'Unix'\n+73DE7 Extract Zip Spec      14 (20) '2.0'\n+73DE8 Extract OS            00 (0) 'MS-DOS'\n+73DE9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73473 Compression Method    0008 (8) 'Deflated'\n-73475 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73479 CRC                   A00FADB6 (2685382070)\n-7347D Compressed Size       000002AE (686)\n-73481 Uncompressed Size     0000050B (1291)\n-73485 Filename Length       004C (76)\n-73487 Extra Length          0000 (0)\n-73489 Comment Length        0000 (0)\n-7348B Disk Start            0000 (0)\n-7348D Int File Attributes   0000 (0)\n+73DEB Compression Method    0008 (8) 'Deflated'\n+73DED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73DF1 CRC                   4E4FEF3B (1313861435)\n+73DF5 Compressed Size       000002BA (698)\n+73DF9 Uncompressed Size     0000052C (1324)\n+73DFD Filename Length       004C (76)\n+73DFF Extra Length          0000 (0)\n+73E01 Comment Length        0000 (0)\n+73E03 Disk Start            0000 (0)\n+73E05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7348F Ext File Attributes   81A40000 (2175008768)\n+73E07 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73493 Local Header Offset   000209D7 (133591)\n-73497 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73E0B Local Header Offset   00020CB5 (134325)\n+73E0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73497: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73E0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-734E3 CENTRAL HEADER #165   02014B50 (33639248)\n-734E7 Created Zip Spec      14 (20) '2.0'\n-734E8 Created OS            03 (3) 'Unix'\n-734E9 Extract Zip Spec      14 (20) '2.0'\n-734EA Extract OS            00 (0) 'MS-DOS'\n-734EB General Purpose Flag  0800 (2048)\n+73E5B CENTRAL HEADER #165   02014B50 (33639248)\n+73E5F Created Zip Spec      14 (20) '2.0'\n+73E60 Created OS            03 (3) 'Unix'\n+73E61 Extract Zip Spec      14 (20) '2.0'\n+73E62 Extract OS            00 (0) 'MS-DOS'\n+73E63 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-734ED Compression Method    0008 (8) 'Deflated'\n-734EF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-734F3 CRC                   9A2D2058 (2586648664)\n-734F7 Compressed Size       000004E4 (1252)\n-734FB Uncompressed Size     00000D7A (3450)\n-734FF Filename Length       002F (47)\n-73501 Extra Length          0000 (0)\n-73503 Comment Length        0000 (0)\n-73505 Disk Start            0000 (0)\n-73507 Int File Attributes   0000 (0)\n+73E65 Compression Method    0008 (8) 'Deflated'\n+73E67 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73E6B CRC                   9A2D2058 (2586648664)\n+73E6F Compressed Size       000004E4 (1252)\n+73E73 Uncompressed Size     00000D7A (3450)\n+73E77 Filename Length       002F (47)\n+73E79 Extra Length          0000 (0)\n+73E7B Comment Length        0000 (0)\n+73E7D Disk Start            0000 (0)\n+73E7F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73509 Ext File Attributes   81A40000 (2175008768)\n+73E81 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7350D Local Header Offset   00020CEF (134383)\n-73511 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73E85 Local Header Offset   00020FD9 (135129)\n+73E89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73511: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73E89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73540 CENTRAL HEADER #166   02014B50 (33639248)\n-73544 Created Zip Spec      14 (20) '2.0'\n-73545 Created OS            03 (3) 'Unix'\n-73546 Extract Zip Spec      14 (20) '2.0'\n-73547 Extract OS            00 (0) 'MS-DOS'\n-73548 General Purpose Flag  0800 (2048)\n+73EB8 CENTRAL HEADER #166   02014B50 (33639248)\n+73EBC Created Zip Spec      14 (20) '2.0'\n+73EBD Created OS            03 (3) 'Unix'\n+73EBE Extract Zip Spec      14 (20) '2.0'\n+73EBF Extract OS            00 (0) 'MS-DOS'\n+73EC0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7354A Compression Method    0008 (8) 'Deflated'\n-7354C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73550 CRC                   5D8BAE4F (1569435215)\n-73554 Compressed Size       0000049E (1182)\n-73558 Uncompressed Size     00000A47 (2631)\n-7355C Filename Length       002F (47)\n-7355E Extra Length          0000 (0)\n-73560 Comment Length        0000 (0)\n-73562 Disk Start            0000 (0)\n-73564 Int File Attributes   0000 (0)\n+73EC2 Compression Method    0008 (8) 'Deflated'\n+73EC4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73EC8 CRC                   8FD49BC2 (2413075394)\n+73ECC Compressed Size       000004A9 (1193)\n+73ED0 Uncompressed Size     00000A82 (2690)\n+73ED4 Filename Length       002F (47)\n+73ED6 Extra Length          0000 (0)\n+73ED8 Comment Length        0000 (0)\n+73EDA Disk Start            0000 (0)\n+73EDC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73566 Ext File Attributes   81A40000 (2175008768)\n+73EDE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7356A Local Header Offset   00021220 (135712)\n-7356E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73EE2 Local Header Offset   0002150A (136458)\n+73EE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7356E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73EE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7359D CENTRAL HEADER #167   02014B50 (33639248)\n-735A1 Created Zip Spec      14 (20) '2.0'\n-735A2 Created OS            03 (3) 'Unix'\n-735A3 Extract Zip Spec      14 (20) '2.0'\n-735A4 Extract OS            00 (0) 'MS-DOS'\n-735A5 General Purpose Flag  0800 (2048)\n+73F15 CENTRAL HEADER #167   02014B50 (33639248)\n+73F19 Created Zip Spec      14 (20) '2.0'\n+73F1A Created OS            03 (3) 'Unix'\n+73F1B Extract Zip Spec      14 (20) '2.0'\n+73F1C Extract OS            00 (0) 'MS-DOS'\n+73F1D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-735A7 Compression Method    0008 (8) 'Deflated'\n-735A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-735AD CRC                   B148CBF0 (2974338032)\n-735B1 Compressed Size       00000E08 (3592)\n-735B5 Uncompressed Size     00003C07 (15367)\n-735B9 Filename Length       0041 (65)\n-735BB Extra Length          0000 (0)\n-735BD Comment Length        0000 (0)\n-735BF Disk Start            0000 (0)\n-735C1 Int File Attributes   0000 (0)\n+73F1F Compression Method    0008 (8) 'Deflated'\n+73F21 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73F25 CRC                   DFC97490 (3754521744)\n+73F29 Compressed Size       00000E1E (3614)\n+73F2D Uncompressed Size     00003D93 (15763)\n+73F31 Filename Length       0041 (65)\n+73F33 Extra Length          0000 (0)\n+73F35 Comment Length        0000 (0)\n+73F37 Disk Start            0000 (0)\n+73F39 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-735C3 Ext File Attributes   81A40000 (2175008768)\n+73F3B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-735C7 Local Header Offset   0002170B (136971)\n-735CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73F3F Local Header Offset   00021A00 (137728)\n+73F43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x735CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73F43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7360C CENTRAL HEADER #168   02014B50 (33639248)\n-73610 Created Zip Spec      14 (20) '2.0'\n-73611 Created OS            03 (3) 'Unix'\n-73612 Extract Zip Spec      14 (20) '2.0'\n-73613 Extract OS            00 (0) 'MS-DOS'\n-73614 General Purpose Flag  0800 (2048)\n+73F84 CENTRAL HEADER #168   02014B50 (33639248)\n+73F88 Created Zip Spec      14 (20) '2.0'\n+73F89 Created OS            03 (3) 'Unix'\n+73F8A Extract Zip Spec      14 (20) '2.0'\n+73F8B Extract OS            00 (0) 'MS-DOS'\n+73F8C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73616 Compression Method    0008 (8) 'Deflated'\n-73618 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7361C CRC                   D1BB774A (3518723914)\n-73620 Compressed Size       00000267 (615)\n-73624 Uncompressed Size     000004B9 (1209)\n-73628 Filename Length       0034 (52)\n-7362A Extra Length          0000 (0)\n-7362C Comment Length        0000 (0)\n-7362E Disk Start            0000 (0)\n-73630 Int File Attributes   0000 (0)\n+73F8E Compression Method    0008 (8) 'Deflated'\n+73F90 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73F94 CRC                   D1BB774A (3518723914)\n+73F98 Compressed Size       00000267 (615)\n+73F9C Uncompressed Size     000004B9 (1209)\n+73FA0 Filename Length       0034 (52)\n+73FA2 Extra Length          0000 (0)\n+73FA4 Comment Length        0000 (0)\n+73FA6 Disk Start            0000 (0)\n+73FA8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73632 Ext File Attributes   81A40000 (2175008768)\n+73FAA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73636 Local Header Offset   00022572 (140658)\n-7363A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73FAE Local Header Offset   0002287D (141437)\n+73FB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7363A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73FB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7366E CENTRAL HEADER #169   02014B50 (33639248)\n-73672 Created Zip Spec      14 (20) '2.0'\n-73673 Created OS            03 (3) 'Unix'\n-73674 Extract Zip Spec      14 (20) '2.0'\n-73675 Extract OS            00 (0) 'MS-DOS'\n-73676 General Purpose Flag  0800 (2048)\n+73FE6 CENTRAL HEADER #169   02014B50 (33639248)\n+73FEA Created Zip Spec      14 (20) '2.0'\n+73FEB Created OS            03 (3) 'Unix'\n+73FEC Extract Zip Spec      14 (20) '2.0'\n+73FED Extract OS            00 (0) 'MS-DOS'\n+73FEE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73678 Compression Method    0008 (8) 'Deflated'\n-7367A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7367E CRC                   F2DE48ED (4074653933)\n-73682 Compressed Size       00000279 (633)\n-73686 Uncompressed Size     0000048D (1165)\n-7368A Filename Length       0043 (67)\n-7368C Extra Length          0000 (0)\n-7368E Comment Length        0000 (0)\n-73690 Disk Start            0000 (0)\n-73692 Int File Attributes   0000 (0)\n+73FF0 Compression Method    0008 (8) 'Deflated'\n+73FF2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73FF6 CRC                   B3A8C3FA (3014181882)\n+73FFA Compressed Size       0000027E (638)\n+73FFE Uncompressed Size     000004B0 (1200)\n+74002 Filename Length       0043 (67)\n+74004 Extra Length          0000 (0)\n+74006 Comment Length        0000 (0)\n+74008 Disk Start            0000 (0)\n+7400A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73694 Ext File Attributes   81A40000 (2175008768)\n+7400C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73698 Local Header Offset   0002282B (141355)\n-7369C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74010 Local Header Offset   00022B36 (142134)\n+74014 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7369C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74014: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-736DF CENTRAL HEADER #170   02014B50 (33639248)\n-736E3 Created Zip Spec      14 (20) '2.0'\n-736E4 Created OS            03 (3) 'Unix'\n-736E5 Extract Zip Spec      14 (20) '2.0'\n-736E6 Extract OS            00 (0) 'MS-DOS'\n-736E7 General Purpose Flag  0800 (2048)\n+74057 CENTRAL HEADER #170   02014B50 (33639248)\n+7405B Created Zip Spec      14 (20) '2.0'\n+7405C Created OS            03 (3) 'Unix'\n+7405D Extract Zip Spec      14 (20) '2.0'\n+7405E Extract OS            00 (0) 'MS-DOS'\n+7405F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-736E9 Compression Method    0008 (8) 'Deflated'\n-736EB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-736EF CRC                   0662480F (107104271)\n-736F3 Compressed Size       00000281 (641)\n-736F7 Uncompressed Size     000004C4 (1220)\n-736FB Filename Length       003B (59)\n-736FD Extra Length          0000 (0)\n-736FF Comment Length        0000 (0)\n-73701 Disk Start            0000 (0)\n-73703 Int File Attributes   0000 (0)\n+74061 Compression Method    0008 (8) 'Deflated'\n+74063 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74067 CRC                   663E77E4 (1715369956)\n+7406B Compressed Size       0000028A (650)\n+7406F Uncompressed Size     000004EE (1262)\n+74073 Filename Length       003B (59)\n+74075 Extra Length          0000 (0)\n+74077 Comment Length        0000 (0)\n+74079 Disk Start            0000 (0)\n+7407B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73705 Ext File Attributes   81A40000 (2175008768)\n+7407D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73709 Local Header Offset   00022B05 (142085)\n-7370D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74081 Local Header Offset   00022E15 (142869)\n+74085 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7370D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74085: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73748 CENTRAL HEADER #171   02014B50 (33639248)\n-7374C Created Zip Spec      14 (20) '2.0'\n-7374D Created OS            03 (3) 'Unix'\n-7374E Extract Zip Spec      14 (20) '2.0'\n-7374F Extract OS            00 (0) 'MS-DOS'\n-73750 General Purpose Flag  0800 (2048)\n+740C0 CENTRAL HEADER #171   02014B50 (33639248)\n+740C4 Created Zip Spec      14 (20) '2.0'\n+740C5 Created OS            03 (3) 'Unix'\n+740C6 Extract Zip Spec      14 (20) '2.0'\n+740C7 Extract OS            00 (0) 'MS-DOS'\n+740C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73752 Compression Method    0008 (8) 'Deflated'\n-73754 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73758 CRC                   4C849D6C (1283759468)\n-7375C Compressed Size       00000265 (613)\n-73760 Uncompressed Size     0000047A (1146)\n-73764 Filename Length       0037 (55)\n-73766 Extra Length          0000 (0)\n-73768 Comment Length        0000 (0)\n-7376A Disk Start            0000 (0)\n-7376C Int File Attributes   0000 (0)\n+740CA Compression Method    0008 (8) 'Deflated'\n+740CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+740D0 CRC                   4C849D6C (1283759468)\n+740D4 Compressed Size       00000265 (613)\n+740D8 Uncompressed Size     0000047A (1146)\n+740DC Filename Length       0037 (55)\n+740DE Extra Length          0000 (0)\n+740E0 Comment Length        0000 (0)\n+740E2 Disk Start            0000 (0)\n+740E4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7376E Ext File Attributes   81A40000 (2175008768)\n+740E6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73772 Local Header Offset   00022DDF (142815)\n-73776 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+740EA Local Header Offset   000230F8 (143608)\n+740EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73776: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x740EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-737AD CENTRAL HEADER #172   02014B50 (33639248)\n-737B1 Created Zip Spec      14 (20) '2.0'\n-737B2 Created OS            03 (3) 'Unix'\n-737B3 Extract Zip Spec      14 (20) '2.0'\n-737B4 Extract OS            00 (0) 'MS-DOS'\n-737B5 General Purpose Flag  0800 (2048)\n+74125 CENTRAL HEADER #172   02014B50 (33639248)\n+74129 Created Zip Spec      14 (20) '2.0'\n+7412A Created OS            03 (3) 'Unix'\n+7412B Extract Zip Spec      14 (20) '2.0'\n+7412C Extract OS            00 (0) 'MS-DOS'\n+7412D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-737B7 Compression Method    0008 (8) 'Deflated'\n-737B9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-737BD CRC                   A96FE6E5 (2842683109)\n-737C1 Compressed Size       00002019 (8217)\n-737C5 Uncompressed Size     00009CEF (40175)\n-737C9 Filename Length       0036 (54)\n-737CB Extra Length          0000 (0)\n-737CD Comment Length        0000 (0)\n-737CF Disk Start            0000 (0)\n-737D1 Int File Attributes   0000 (0)\n+7412F Compression Method    0008 (8) 'Deflated'\n+74131 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74135 CRC                   1F091D5A (520691034)\n+74139 Compressed Size       00002040 (8256)\n+7413D Uncompressed Size     0000A106 (41222)\n+74141 Filename Length       0036 (54)\n+74143 Extra Length          0000 (0)\n+74145 Comment Length        0000 (0)\n+74147 Disk Start            0000 (0)\n+74149 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-737D3 Ext File Attributes   81A40000 (2175008768)\n+7414B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-737D7 Local Header Offset   00023099 (143513)\n-737DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7414F Local Header Offset   000233B2 (144306)\n+74153 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x737DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74153: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73811 CENTRAL HEADER #173   02014B50 (33639248)\n-73815 Created Zip Spec      14 (20) '2.0'\n-73816 Created OS            03 (3) 'Unix'\n-73817 Extract Zip Spec      14 (20) '2.0'\n-73818 Extract OS            00 (0) 'MS-DOS'\n-73819 General Purpose Flag  0800 (2048)\n+74189 CENTRAL HEADER #173   02014B50 (33639248)\n+7418D Created Zip Spec      14 (20) '2.0'\n+7418E Created OS            03 (3) 'Unix'\n+7418F Extract Zip Spec      14 (20) '2.0'\n+74190 Extract OS            00 (0) 'MS-DOS'\n+74191 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7381B Compression Method    0008 (8) 'Deflated'\n-7381D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73821 CRC                   CA31D6AC (3392263852)\n-73825 Compressed Size       000002DD (733)\n-73829 Uncompressed Size     0000058E (1422)\n-7382D Filename Length       0036 (54)\n-7382F Extra Length          0000 (0)\n-73831 Comment Length        0000 (0)\n-73833 Disk Start            0000 (0)\n-73835 Int File Attributes   0000 (0)\n+74193 Compression Method    0008 (8) 'Deflated'\n+74195 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74199 CRC                   BC70E4F4 (3161515252)\n+7419D Compressed Size       000002E4 (740)\n+741A1 Uncompressed Size     000005B8 (1464)\n+741A5 Filename Length       0036 (54)\n+741A7 Extra Length          0000 (0)\n+741A9 Comment Length        0000 (0)\n+741AB Disk Start            0000 (0)\n+741AD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73837 Ext File Attributes   81A40000 (2175008768)\n+741AF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7383B Local Header Offset   00025106 (151814)\n-7383F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+741B3 Local Header Offset   00025446 (152646)\n+741B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7383F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x741B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73875 CENTRAL HEADER #174   02014B50 (33639248)\n-73879 Created Zip Spec      14 (20) '2.0'\n-7387A Created OS            03 (3) 'Unix'\n-7387B Extract Zip Spec      14 (20) '2.0'\n-7387C Extract OS            00 (0) 'MS-DOS'\n-7387D General Purpose Flag  0800 (2048)\n+741ED CENTRAL HEADER #174   02014B50 (33639248)\n+741F1 Created Zip Spec      14 (20) '2.0'\n+741F2 Created OS            03 (3) 'Unix'\n+741F3 Extract Zip Spec      14 (20) '2.0'\n+741F4 Extract OS            00 (0) 'MS-DOS'\n+741F5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7387F Compression Method    0008 (8) 'Deflated'\n-73881 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73885 CRC                   48D76DDD (1222077917)\n-73889 Compressed Size       0000043E (1086)\n-7388D Uncompressed Size     00000932 (2354)\n-73891 Filename Length       002A (42)\n-73893 Extra Length          0000 (0)\n-73895 Comment Length        0000 (0)\n-73897 Disk Start            0000 (0)\n-73899 Int File Attributes   0000 (0)\n+741F7 Compression Method    0008 (8) 'Deflated'\n+741F9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+741FD CRC                   48D76DDD (1222077917)\n+74201 Compressed Size       0000043E (1086)\n+74205 Uncompressed Size     00000932 (2354)\n+74209 Filename Length       002A (42)\n+7420B Extra Length          0000 (0)\n+7420D Comment Length        0000 (0)\n+7420F Disk Start            0000 (0)\n+74211 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7389B Ext File Attributes   81A40000 (2175008768)\n+74213 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7389F Local Header Offset   00025437 (152631)\n-738A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74217 Local Header Offset   0002577E (153470)\n+7421B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x738A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7421B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-738CD CENTRAL HEADER #175   02014B50 (33639248)\n-738D1 Created Zip Spec      14 (20) '2.0'\n-738D2 Created OS            03 (3) 'Unix'\n-738D3 Extract Zip Spec      14 (20) '2.0'\n-738D4 Extract OS            00 (0) 'MS-DOS'\n-738D5 General Purpose Flag  0800 (2048)\n+74245 CENTRAL HEADER #175   02014B50 (33639248)\n+74249 Created Zip Spec      14 (20) '2.0'\n+7424A Created OS            03 (3) 'Unix'\n+7424B Extract Zip Spec      14 (20) '2.0'\n+7424C Extract OS            00 (0) 'MS-DOS'\n+7424D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-738D7 Compression Method    0008 (8) 'Deflated'\n-738D9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-738DD CRC                   C525F495 (3307598997)\n-738E1 Compressed Size       00000283 (643)\n-738E5 Uncompressed Size     000004C9 (1225)\n-738E9 Filename Length       003E (62)\n-738EB Extra Length          0000 (0)\n-738ED Comment Length        0000 (0)\n-738EF Disk Start            0000 (0)\n-738F1 Int File Attributes   0000 (0)\n+7424F Compression Method    0008 (8) 'Deflated'\n+74251 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74255 CRC                   8DAF0532 (2377057586)\n+74259 Compressed Size       00000289 (649)\n+7425D Uncompressed Size     000004F2 (1266)\n+74261 Filename Length       003E (62)\n+74263 Extra Length          0000 (0)\n+74265 Comment Length        0000 (0)\n+74267 Disk Start            0000 (0)\n+74269 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-738F3 Ext File Attributes   81A40000 (2175008768)\n+7426B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-738F7 Local Header Offset   000258BD (153789)\n-738FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7426F Local Header Offset   00025C04 (154628)\n+74273 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x738FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74273: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73939 CENTRAL HEADER #176   02014B50 (33639248)\n-7393D Created Zip Spec      14 (20) '2.0'\n-7393E Created OS            03 (3) 'Unix'\n-7393F Extract Zip Spec      14 (20) '2.0'\n-73940 Extract OS            00 (0) 'MS-DOS'\n-73941 General Purpose Flag  0800 (2048)\n+742B1 CENTRAL HEADER #176   02014B50 (33639248)\n+742B5 Created Zip Spec      14 (20) '2.0'\n+742B6 Created OS            03 (3) 'Unix'\n+742B7 Extract Zip Spec      14 (20) '2.0'\n+742B8 Extract OS            00 (0) 'MS-DOS'\n+742B9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73943 Compression Method    0008 (8) 'Deflated'\n-73945 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73949 CRC                   25A296EC (631412460)\n-7394D Compressed Size       00000291 (657)\n-73951 Uncompressed Size     00000510 (1296)\n-73955 Filename Length       002E (46)\n-73957 Extra Length          0000 (0)\n-73959 Comment Length        0000 (0)\n-7395B Disk Start            0000 (0)\n-7395D Int File Attributes   0000 (0)\n+742BB Compression Method    0008 (8) 'Deflated'\n+742BD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+742C1 CRC                   5CF3A6C0 (1559471808)\n+742C5 Compressed Size       0000029B (667)\n+742C9 Uncompressed Size     00000535 (1333)\n+742CD Filename Length       002E (46)\n+742CF Extra Length          0000 (0)\n+742D1 Comment Length        0000 (0)\n+742D3 Disk Start            0000 (0)\n+742D5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7395F Ext File Attributes   81A40000 (2175008768)\n+742D7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73963 Local Header Offset   00025B9C (154524)\n-73967 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+742DB Local Header Offset   00025EE9 (155369)\n+742DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73967: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x742DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73995 CENTRAL HEADER #177   02014B50 (33639248)\n-73999 Created Zip Spec      14 (20) '2.0'\n-7399A Created OS            03 (3) 'Unix'\n-7399B Extract Zip Spec      14 (20) '2.0'\n-7399C Extract OS            00 (0) 'MS-DOS'\n-7399D General Purpose Flag  0800 (2048)\n+7430D CENTRAL HEADER #177   02014B50 (33639248)\n+74311 Created Zip Spec      14 (20) '2.0'\n+74312 Created OS            03 (3) 'Unix'\n+74313 Extract Zip Spec      14 (20) '2.0'\n+74314 Extract OS            00 (0) 'MS-DOS'\n+74315 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7399F Compression Method    0008 (8) 'Deflated'\n-739A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-739A5 CRC                   EA8B59C6 (3935001030)\n-739A9 Compressed Size       0000033F (831)\n-739AD Uncompressed Size     00000800 (2048)\n-739B1 Filename Length       0047 (71)\n-739B3 Extra Length          0000 (0)\n-739B5 Comment Length        0000 (0)\n-739B7 Disk Start            0000 (0)\n-739B9 Int File Attributes   0000 (0)\n+74317 Compression Method    0008 (8) 'Deflated'\n+74319 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7431D CRC                   EA8B59C6 (3935001030)\n+74321 Compressed Size       0000033F (831)\n+74325 Uncompressed Size     00000800 (2048)\n+74329 Filename Length       0047 (71)\n+7432B Extra Length          0000 (0)\n+7432D Comment Length        0000 (0)\n+7432F Disk Start            0000 (0)\n+74331 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-739BB Ext File Attributes   81A40000 (2175008768)\n+74333 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-739BF Local Header Offset   00025E79 (155257)\n-739C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74337 Local Header Offset   000261D0 (156112)\n+7433B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x739C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7433B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73A0A CENTRAL HEADER #178   02014B50 (33639248)\n-73A0E Created Zip Spec      14 (20) '2.0'\n-73A0F Created OS            03 (3) 'Unix'\n-73A10 Extract Zip Spec      14 (20) '2.0'\n-73A11 Extract OS            00 (0) 'MS-DOS'\n-73A12 General Purpose Flag  0800 (2048)\n+74382 CENTRAL HEADER #178   02014B50 (33639248)\n+74386 Created Zip Spec      14 (20) '2.0'\n+74387 Created OS            03 (3) 'Unix'\n+74388 Extract Zip Spec      14 (20) '2.0'\n+74389 Extract OS            00 (0) 'MS-DOS'\n+7438A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73A14 Compression Method    0008 (8) 'Deflated'\n-73A16 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73A1A CRC                   3280412A (847266090)\n-73A1E Compressed Size       000002CE (718)\n-73A22 Uncompressed Size     0000060F (1551)\n-73A26 Filename Length       0042 (66)\n-73A28 Extra Length          0000 (0)\n-73A2A Comment Length        0000 (0)\n-73A2C Disk Start            0000 (0)\n-73A2E Int File Attributes   0000 (0)\n+7438C Compression Method    0008 (8) 'Deflated'\n+7438E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74392 CRC                   3280412A (847266090)\n+74396 Compressed Size       000002CE (718)\n+7439A Uncompressed Size     0000060F (1551)\n+7439E Filename Length       0042 (66)\n+743A0 Extra Length          0000 (0)\n+743A2 Comment Length        0000 (0)\n+743A4 Disk Start            0000 (0)\n+743A6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73A30 Ext File Attributes   81A40000 (2175008768)\n+743A8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73A34 Local Header Offset   0002621D (156189)\n-73A38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+743AC Local Header Offset   00026574 (157044)\n+743B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73A38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x743B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73A7A CENTRAL HEADER #179   02014B50 (33639248)\n-73A7E Created Zip Spec      14 (20) '2.0'\n-73A7F Created OS            03 (3) 'Unix'\n-73A80 Extract Zip Spec      14 (20) '2.0'\n-73A81 Extract OS            00 (0) 'MS-DOS'\n-73A82 General Purpose Flag  0800 (2048)\n+743F2 CENTRAL HEADER #179   02014B50 (33639248)\n+743F6 Created Zip Spec      14 (20) '2.0'\n+743F7 Created OS            03 (3) 'Unix'\n+743F8 Extract Zip Spec      14 (20) '2.0'\n+743F9 Extract OS            00 (0) 'MS-DOS'\n+743FA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73A84 Compression Method    0008 (8) 'Deflated'\n-73A86 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73A8A CRC                   B81BB8E1 (3088824545)\n-73A8E Compressed Size       0000054D (1357)\n-73A92 Uncompressed Size     000011D4 (4564)\n-73A96 Filename Length       0041 (65)\n-73A98 Extra Length          0000 (0)\n-73A9A Comment Length        0000 (0)\n-73A9C Disk Start            0000 (0)\n-73A9E Int File Attributes   0000 (0)\n+743FC Compression Method    0008 (8) 'Deflated'\n+743FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74402 CRC                   B81BB8E1 (3088824545)\n+74406 Compressed Size       0000054D (1357)\n+7440A Uncompressed Size     000011D4 (4564)\n+7440E Filename Length       0041 (65)\n+74410 Extra Length          0000 (0)\n+74412 Comment Length        0000 (0)\n+74414 Disk Start            0000 (0)\n+74416 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73AA0 Ext File Attributes   81A40000 (2175008768)\n+74418 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73AA4 Local Header Offset   0002654B (157003)\n-73AA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7441C Local Header Offset   000268A2 (157858)\n+74420 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73AA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74420: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73AE9 CENTRAL HEADER #180   02014B50 (33639248)\n-73AED Created Zip Spec      14 (20) '2.0'\n-73AEE Created OS            03 (3) 'Unix'\n-73AEF Extract Zip Spec      14 (20) '2.0'\n-73AF0 Extract OS            00 (0) 'MS-DOS'\n-73AF1 General Purpose Flag  0800 (2048)\n+74461 CENTRAL HEADER #180   02014B50 (33639248)\n+74465 Created Zip Spec      14 (20) '2.0'\n+74466 Created OS            03 (3) 'Unix'\n+74467 Extract Zip Spec      14 (20) '2.0'\n+74468 Extract OS            00 (0) 'MS-DOS'\n+74469 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73AF3 Compression Method    0008 (8) 'Deflated'\n-73AF5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73AF9 CRC                   C0FD96E7 (3237844711)\n-73AFD Compressed Size       00000451 (1105)\n-73B01 Uncompressed Size     00000BFA (3066)\n-73B05 Filename Length       0040 (64)\n-73B07 Extra Length          0000 (0)\n-73B09 Comment Length        0000 (0)\n-73B0B Disk Start            0000 (0)\n-73B0D Int File Attributes   0000 (0)\n+7446B Compression Method    0008 (8) 'Deflated'\n+7446D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74471 CRC                   1FF4288F (536094863)\n+74475 Compressed Size       0000045C (1116)\n+74479 Uncompressed Size     00000C58 (3160)\n+7447D Filename Length       0040 (64)\n+7447F Extra Length          0000 (0)\n+74481 Comment Length        0000 (0)\n+74483 Disk Start            0000 (0)\n+74485 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73B0F Ext File Attributes   81A40000 (2175008768)\n+74487 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73B13 Local Header Offset   00026AF7 (158455)\n-73B17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7448B Local Header Offset   00026E4E (159310)\n+7448F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73B17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7448F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73B57 CENTRAL HEADER #181   02014B50 (33639248)\n-73B5B Created Zip Spec      14 (20) '2.0'\n-73B5C Created OS            03 (3) 'Unix'\n-73B5D Extract Zip Spec      14 (20) '2.0'\n-73B5E Extract OS            00 (0) 'MS-DOS'\n-73B5F General Purpose Flag  0800 (2048)\n+744CF CENTRAL HEADER #181   02014B50 (33639248)\n+744D3 Created Zip Spec      14 (20) '2.0'\n+744D4 Created OS            03 (3) 'Unix'\n+744D5 Extract Zip Spec      14 (20) '2.0'\n+744D6 Extract OS            00 (0) 'MS-DOS'\n+744D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73B61 Compression Method    0008 (8) 'Deflated'\n-73B63 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73B67 CRC                   3980931B (964727579)\n-73B6B Compressed Size       0000036A (874)\n-73B6F Uncompressed Size     00000925 (2341)\n-73B73 Filename Length       0030 (48)\n-73B75 Extra Length          0000 (0)\n-73B77 Comment Length        0000 (0)\n-73B79 Disk Start            0000 (0)\n-73B7B Int File Attributes   0000 (0)\n+744D9 Compression Method    0008 (8) 'Deflated'\n+744DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+744DF CRC                   C191912C (3247542572)\n+744E3 Compressed Size       00000375 (885)\n+744E7 Uncompressed Size     0000096F (2415)\n+744EB Filename Length       0030 (48)\n+744ED Extra Length          0000 (0)\n+744EF Comment Length        0000 (0)\n+744F1 Disk Start            0000 (0)\n+744F3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73B7D Ext File Attributes   81A40000 (2175008768)\n+744F5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73B81 Local Header Offset   00026FA6 (159654)\n-73B85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+744F9 Local Header Offset   00027308 (160520)\n+744FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73B85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x744FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73BB5 CENTRAL HEADER #182   02014B50 (33639248)\n-73BB9 Created Zip Spec      14 (20) '2.0'\n-73BBA Created OS            03 (3) 'Unix'\n-73BBB Extract Zip Spec      14 (20) '2.0'\n-73BBC Extract OS            00 (0) 'MS-DOS'\n-73BBD General Purpose Flag  0800 (2048)\n+7452D CENTRAL HEADER #182   02014B50 (33639248)\n+74531 Created Zip Spec      14 (20) '2.0'\n+74532 Created OS            03 (3) 'Unix'\n+74533 Extract Zip Spec      14 (20) '2.0'\n+74534 Extract OS            00 (0) 'MS-DOS'\n+74535 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73BBF Compression Method    0008 (8) 'Deflated'\n-73BC1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73BC5 CRC                   4F8202FE (1333920510)\n-73BC9 Compressed Size       000003A8 (936)\n-73BCD Uncompressed Size     00000A7B (2683)\n-73BD1 Filename Length       002D (45)\n-73BD3 Extra Length          0000 (0)\n-73BD5 Comment Length        0000 (0)\n-73BD7 Disk Start            0000 (0)\n-73BD9 Int File Attributes   0000 (0)\n+74537 Compression Method    0008 (8) 'Deflated'\n+74539 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7453D CRC                   B9F68231 (3119940145)\n+74541 Compressed Size       000003B3 (947)\n+74545 Uncompressed Size     00000AC2 (2754)\n+74549 Filename Length       002D (45)\n+7454B Extra Length          0000 (0)\n+7454D Comment Length        0000 (0)\n+7454F Disk Start            0000 (0)\n+74551 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73BDB Ext File Attributes   81A40000 (2175008768)\n+74553 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73BDF Local Header Offset   0002735E (160606)\n-73BE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74557 Local Header Offset   000276CB (161483)\n+7455B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73BE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7455B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73C10 CENTRAL HEADER #183   02014B50 (33639248)\n-73C14 Created Zip Spec      14 (20) '2.0'\n-73C15 Created OS            03 (3) 'Unix'\n-73C16 Extract Zip Spec      14 (20) '2.0'\n-73C17 Extract OS            00 (0) 'MS-DOS'\n-73C18 General Purpose Flag  0800 (2048)\n+74588 CENTRAL HEADER #183   02014B50 (33639248)\n+7458C Created Zip Spec      14 (20) '2.0'\n+7458D Created OS            03 (3) 'Unix'\n+7458E Extract Zip Spec      14 (20) '2.0'\n+7458F Extract OS            00 (0) 'MS-DOS'\n+74590 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73C1A Compression Method    0008 (8) 'Deflated'\n-73C1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73C20 CRC                   3F1DB4B7 (1058911415)\n-73C24 Compressed Size       000002DE (734)\n-73C28 Uncompressed Size     00000638 (1592)\n-73C2C Filename Length       0035 (53)\n-73C2E Extra Length          0000 (0)\n-73C30 Comment Length        0000 (0)\n-73C32 Disk Start            0000 (0)\n-73C34 Int File Attributes   0000 (0)\n+74592 Compression Method    0008 (8) 'Deflated'\n+74594 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74598 CRC                   9A0865B9 (2584241593)\n+7459C Compressed Size       000002E7 (743)\n+745A0 Uncompressed Size     0000066B (1643)\n+745A4 Filename Length       0035 (53)\n+745A6 Extra Length          0000 (0)\n+745A8 Comment Length        0000 (0)\n+745AA Disk Start            0000 (0)\n+745AC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73C36 Ext File Attributes   81A40000 (2175008768)\n+745AE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73C3A Local Header Offset   00027751 (161617)\n-73C3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+745B2 Local Header Offset   00027AC9 (162505)\n+745B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73C3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x745B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73C73 CENTRAL HEADER #184   02014B50 (33639248)\n-73C77 Created Zip Spec      14 (20) '2.0'\n-73C78 Created OS            03 (3) 'Unix'\n-73C79 Extract Zip Spec      14 (20) '2.0'\n-73C7A Extract OS            00 (0) 'MS-DOS'\n-73C7B General Purpose Flag  0800 (2048)\n+745EB CENTRAL HEADER #184   02014B50 (33639248)\n+745EF Created Zip Spec      14 (20) '2.0'\n+745F0 Created OS            03 (3) 'Unix'\n+745F1 Extract Zip Spec      14 (20) '2.0'\n+745F2 Extract OS            00 (0) 'MS-DOS'\n+745F3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73C7D Compression Method    0008 (8) 'Deflated'\n-73C7F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73C83 CRC                   86537D4A (2253618506)\n-73C87 Compressed Size       00000360 (864)\n-73C8B Uncompressed Size     000007F0 (2032)\n-73C8F Filename Length       0037 (55)\n-73C91 Extra Length          0000 (0)\n-73C93 Comment Length        0000 (0)\n-73C95 Disk Start            0000 (0)\n-73C97 Int File Attributes   0000 (0)\n+745F5 Compression Method    0008 (8) 'Deflated'\n+745F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+745FB CRC                   5F2ADB9F (1596644255)\n+745FF Compressed Size       00000368 (872)\n+74603 Uncompressed Size     00000832 (2098)\n+74607 Filename Length       0037 (55)\n+74609 Extra Length          0000 (0)\n+7460B Comment Length        0000 (0)\n+7460D Disk Start            0000 (0)\n+7460F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73C99 Ext File Attributes   81A40000 (2175008768)\n+74611 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73C9D Local Header Offset   00027A82 (162434)\n-73CA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74615 Local Header Offset   00027E03 (163331)\n+74619 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73CA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74619: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73CD8 CENTRAL HEADER #185   02014B50 (33639248)\n-73CDC Created Zip Spec      14 (20) '2.0'\n-73CDD Created OS            03 (3) 'Unix'\n-73CDE Extract Zip Spec      14 (20) '2.0'\n-73CDF Extract OS            00 (0) 'MS-DOS'\n-73CE0 General Purpose Flag  0800 (2048)\n+74650 CENTRAL HEADER #185   02014B50 (33639248)\n+74654 Created Zip Spec      14 (20) '2.0'\n+74655 Created OS            03 (3) 'Unix'\n+74656 Extract Zip Spec      14 (20) '2.0'\n+74657 Extract OS            00 (0) 'MS-DOS'\n+74658 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73CE2 Compression Method    0008 (8) 'Deflated'\n-73CE4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73CE8 CRC                   76835014 (1988317204)\n-73CEC Compressed Size       00000372 (882)\n-73CF0 Uncompressed Size     00000885 (2181)\n-73CF4 Filename Length       0037 (55)\n-73CF6 Extra Length          0000 (0)\n-73CF8 Comment Length        0000 (0)\n-73CFA Disk Start            0000 (0)\n-73CFC Int File Attributes   0000 (0)\n+7465A Compression Method    0008 (8) 'Deflated'\n+7465C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74660 CRC                   4D1AEB96 (1293609878)\n+74664 Compressed Size       0000037C (892)\n+74668 Uncompressed Size     000008CC (2252)\n+7466C Filename Length       0037 (55)\n+7466E Extra Length          0000 (0)\n+74670 Comment Length        0000 (0)\n+74672 Disk Start            0000 (0)\n+74674 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73CFE Ext File Attributes   81A40000 (2175008768)\n+74676 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73D02 Local Header Offset   00027E37 (163383)\n-73D06 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7467A Local Header Offset   000281C0 (164288)\n+7467E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73D06: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7467E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73D3D CENTRAL HEADER #186   02014B50 (33639248)\n-73D41 Created Zip Spec      14 (20) '2.0'\n-73D42 Created OS            03 (3) 'Unix'\n-73D43 Extract Zip Spec      14 (20) '2.0'\n-73D44 Extract OS            00 (0) 'MS-DOS'\n-73D45 General Purpose Flag  0800 (2048)\n+746B5 CENTRAL HEADER #186   02014B50 (33639248)\n+746B9 Created Zip Spec      14 (20) '2.0'\n+746BA Created OS            03 (3) 'Unix'\n+746BB Extract Zip Spec      14 (20) '2.0'\n+746BC Extract OS            00 (0) 'MS-DOS'\n+746BD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73D47 Compression Method    0008 (8) 'Deflated'\n-73D49 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73D4D CRC                   7A06D81E (2047268894)\n-73D51 Compressed Size       0000031E (798)\n-73D55 Uncompressed Size     00000619 (1561)\n-73D59 Filename Length       002F (47)\n-73D5B Extra Length          0000 (0)\n-73D5D Comment Length        0000 (0)\n-73D5F Disk Start            0000 (0)\n-73D61 Int File Attributes   0000 (0)\n+746BF Compression Method    0008 (8) 'Deflated'\n+746C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+746C5 CRC                   D1400D79 (3510635897)\n+746C9 Compressed Size       00000327 (807)\n+746CD Uncompressed Size     00000647 (1607)\n+746D1 Filename Length       002F (47)\n+746D3 Extra Length          0000 (0)\n+746D5 Comment Length        0000 (0)\n+746D7 Disk Start            0000 (0)\n+746D9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73D63 Ext File Attributes   81A40000 (2175008768)\n+746DB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73D67 Local Header Offset   000281FE (164350)\n-73D6B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+746DF Local Header Offset   00028591 (165265)\n+746E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73D6B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x746E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73D9A CENTRAL HEADER #187   02014B50 (33639248)\n-73D9E Created Zip Spec      14 (20) '2.0'\n-73D9F Created OS            03 (3) 'Unix'\n-73DA0 Extract Zip Spec      14 (20) '2.0'\n-73DA1 Extract OS            00 (0) 'MS-DOS'\n-73DA2 General Purpose Flag  0800 (2048)\n+74712 CENTRAL HEADER #187   02014B50 (33639248)\n+74716 Created Zip Spec      14 (20) '2.0'\n+74717 Created OS            03 (3) 'Unix'\n+74718 Extract Zip Spec      14 (20) '2.0'\n+74719 Extract OS            00 (0) 'MS-DOS'\n+7471A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73DA4 Compression Method    0008 (8) 'Deflated'\n-73DA6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73DAA CRC                   596F5AFB (1500470011)\n-73DAE Compressed Size       00000283 (643)\n-73DB2 Uncompressed Size     00000504 (1284)\n-73DB6 Filename Length       0036 (54)\n-73DB8 Extra Length          0000 (0)\n-73DBA Comment Length        0000 (0)\n-73DBC Disk Start            0000 (0)\n-73DBE Int File Attributes   0000 (0)\n+7471C Compression Method    0008 (8) 'Deflated'\n+7471E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74722 CRC                   4A87D325 (1250415397)\n+74726 Compressed Size       0000028C (652)\n+7472A Uncompressed Size     0000052B (1323)\n+7472E Filename Length       0036 (54)\n+74730 Extra Length          0000 (0)\n+74732 Comment Length        0000 (0)\n+74734 Disk Start            0000 (0)\n+74736 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73DC0 Ext File Attributes   81A40000 (2175008768)\n+74738 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73DC4 Local Header Offset   00028569 (165225)\n-73DC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7473C Local Header Offset   00028905 (166149)\n+74740 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73DC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74740: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73DFE CENTRAL HEADER #188   02014B50 (33639248)\n-73E02 Created Zip Spec      14 (20) '2.0'\n-73E03 Created OS            03 (3) 'Unix'\n-73E04 Extract Zip Spec      14 (20) '2.0'\n-73E05 Extract OS            00 (0) 'MS-DOS'\n-73E06 General Purpose Flag  0800 (2048)\n+74776 CENTRAL HEADER #188   02014B50 (33639248)\n+7477A Created Zip Spec      14 (20) '2.0'\n+7477B Created OS            03 (3) 'Unix'\n+7477C Extract Zip Spec      14 (20) '2.0'\n+7477D Extract OS            00 (0) 'MS-DOS'\n+7477E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73E08 Compression Method    0008 (8) 'Deflated'\n-73E0A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73E0E CRC                   DAE5D322 (3672494882)\n-73E12 Compressed Size       00000417 (1047)\n-73E16 Uncompressed Size     00000B55 (2901)\n-73E1A Filename Length       003D (61)\n-73E1C Extra Length          0000 (0)\n-73E1E Comment Length        0000 (0)\n-73E20 Disk Start            0000 (0)\n-73E22 Int File Attributes   0000 (0)\n+74780 Compression Method    0008 (8) 'Deflated'\n+74782 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74786 CRC                   382251E3 (941773283)\n+7478A Compressed Size       00000423 (1059)\n+7478E Uncompressed Size     00000B9D (2973)\n+74792 Filename Length       003D (61)\n+74794 Extra Length          0000 (0)\n+74796 Comment Length        0000 (0)\n+74798 Disk Start            0000 (0)\n+7479A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73E24 Ext File Attributes   81A40000 (2175008768)\n+7479C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73E28 Local Header Offset   00028840 (165952)\n-73E2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+747A0 Local Header Offset   00028BE5 (166885)\n+747A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73E2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x747A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73E69 CENTRAL HEADER #189   02014B50 (33639248)\n-73E6D Created Zip Spec      14 (20) '2.0'\n-73E6E Created OS            03 (3) 'Unix'\n-73E6F Extract Zip Spec      14 (20) '2.0'\n-73E70 Extract OS            00 (0) 'MS-DOS'\n-73E71 General Purpose Flag  0800 (2048)\n+747E1 CENTRAL HEADER #189   02014B50 (33639248)\n+747E5 Created Zip Spec      14 (20) '2.0'\n+747E6 Created OS            03 (3) 'Unix'\n+747E7 Extract Zip Spec      14 (20) '2.0'\n+747E8 Extract OS            00 (0) 'MS-DOS'\n+747E9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73E73 Compression Method    0008 (8) 'Deflated'\n-73E75 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73E79 CRC                   0BDE6714 (199124756)\n-73E7D Compressed Size       00000F70 (3952)\n-73E81 Uncompressed Size     00006518 (25880)\n-73E85 Filename Length       0025 (37)\n-73E87 Extra Length          0000 (0)\n-73E89 Comment Length        0000 (0)\n-73E8B Disk Start            0000 (0)\n-73E8D Int File Attributes   0000 (0)\n+747EB Compression Method    0008 (8) 'Deflated'\n+747ED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+747F1 CRC                   7D41B4B3 (2101458099)\n+747F5 Compressed Size       00000F90 (3984)\n+747F9 Uncompressed Size     000068BF (26815)\n+747FD Filename Length       0025 (37)\n+747FF Extra Length          0000 (0)\n+74801 Comment Length        0000 (0)\n+74803 Disk Start            0000 (0)\n+74805 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73E8F Ext File Attributes   81A40000 (2175008768)\n+74807 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73E93 Local Header Offset   00028CB2 (167090)\n-73E97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7480B Local Header Offset   00029063 (168035)\n+7480F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73E97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7480F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73EBC CENTRAL HEADER #190   02014B50 (33639248)\n-73EC0 Created Zip Spec      14 (20) '2.0'\n-73EC1 Created OS            03 (3) 'Unix'\n-73EC2 Extract Zip Spec      14 (20) '2.0'\n-73EC3 Extract OS            00 (0) 'MS-DOS'\n-73EC4 General Purpose Flag  0800 (2048)\n+74834 CENTRAL HEADER #190   02014B50 (33639248)\n+74838 Created Zip Spec      14 (20) '2.0'\n+74839 Created OS            03 (3) 'Unix'\n+7483A Extract Zip Spec      14 (20) '2.0'\n+7483B Extract OS            00 (0) 'MS-DOS'\n+7483C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73EC6 Compression Method    0008 (8) 'Deflated'\n-73EC8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73ECC CRC                   16F10E62 (384896610)\n-73ED0 Compressed Size       00000639 (1593)\n-73ED4 Uncompressed Size     00001B02 (6914)\n-73ED8 Filename Length       002B (43)\n-73EDA Extra Length          0000 (0)\n-73EDC Comment Length        0000 (0)\n-73EDE Disk Start            0000 (0)\n-73EE0 Int File Attributes   0000 (0)\n+7483E Compression Method    0008 (8) 'Deflated'\n+74840 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74844 CRC                   D2FF4595 (3539944853)\n+74848 Compressed Size       00000644 (1604)\n+7484C Uncompressed Size     00001BE9 (7145)\n+74850 Filename Length       002B (43)\n+74852 Extra Length          0000 (0)\n+74854 Comment Length        0000 (0)\n+74856 Disk Start            0000 (0)\n+74858 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73EE2 Ext File Attributes   81A40000 (2175008768)\n+7485A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73EE6 Local Header Offset   00029C65 (171109)\n-73EEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7485E Local Header Offset   0002A036 (172086)\n+74862 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73EEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74862: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73F15 CENTRAL HEADER #191   02014B50 (33639248)\n-73F19 Created Zip Spec      14 (20) '2.0'\n-73F1A Created OS            03 (3) 'Unix'\n-73F1B Extract Zip Spec      14 (20) '2.0'\n-73F1C Extract OS            00 (0) 'MS-DOS'\n-73F1D General Purpose Flag  0800 (2048)\n+7488D CENTRAL HEADER #191   02014B50 (33639248)\n+74891 Created Zip Spec      14 (20) '2.0'\n+74892 Created OS            03 (3) 'Unix'\n+74893 Extract Zip Spec      14 (20) '2.0'\n+74894 Extract OS            00 (0) 'MS-DOS'\n+74895 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73F1F Compression Method    0008 (8) 'Deflated'\n-73F21 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73F25 CRC                   A6F50F6E (2801078126)\n-73F29 Compressed Size       0000041D (1053)\n-73F2D Uncompressed Size     00000BEB (3051)\n-73F31 Filename Length       003A (58)\n-73F33 Extra Length          0000 (0)\n-73F35 Comment Length        0000 (0)\n-73F37 Disk Start            0000 (0)\n-73F39 Int File Attributes   0000 (0)\n+74897 Compression Method    0008 (8) 'Deflated'\n+74899 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7489D CRC                   D8BBACF0 (3636178160)\n+748A1 Compressed Size       00000428 (1064)\n+748A5 Uncompressed Size     00000C61 (3169)\n+748A9 Filename Length       003A (58)\n+748AB Extra Length          0000 (0)\n+748AD Comment Length        0000 (0)\n+748AF Disk Start            0000 (0)\n+748B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73F3B Ext File Attributes   81A40000 (2175008768)\n+748B3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73F3F Local Header Offset   0002A2E7 (172775)\n-73F43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+748B7 Local Header Offset   0002A6C3 (173763)\n+748BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73F43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x748BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73F7D CENTRAL HEADER #192   02014B50 (33639248)\n-73F81 Created Zip Spec      14 (20) '2.0'\n-73F82 Created OS            03 (3) 'Unix'\n-73F83 Extract Zip Spec      14 (20) '2.0'\n-73F84 Extract OS            00 (0) 'MS-DOS'\n-73F85 General Purpose Flag  0800 (2048)\n+748F5 CENTRAL HEADER #192   02014B50 (33639248)\n+748F9 Created Zip Spec      14 (20) '2.0'\n+748FA Created OS            03 (3) 'Unix'\n+748FB Extract Zip Spec      14 (20) '2.0'\n+748FC Extract OS            00 (0) 'MS-DOS'\n+748FD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73F87 Compression Method    0008 (8) 'Deflated'\n-73F89 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73F8D CRC                   5110A2B9 (1360044729)\n-73F91 Compressed Size       0000041B (1051)\n-73F95 Uncompressed Size     00000B8E (2958)\n-73F99 Filename Length       003B (59)\n-73F9B Extra Length          0000 (0)\n-73F9D Comment Length        0000 (0)\n-73F9F Disk Start            0000 (0)\n-73FA1 Int File Attributes   0000 (0)\n+748FF Compression Method    0008 (8) 'Deflated'\n+74901 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74905 CRC                   DCFCECF5 (3707563253)\n+74909 Compressed Size       00000425 (1061)\n+7490D Uncompressed Size     00000BF3 (3059)\n+74911 Filename Length       003B (59)\n+74913 Extra Length          0000 (0)\n+74915 Comment Length        0000 (0)\n+74917 Disk Start            0000 (0)\n+74919 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-73FA3 Ext File Attributes   81A40000 (2175008768)\n+7491B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-73FA7 Local Header Offset   0002A75C (173916)\n-73FAB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7491F Local Header Offset   0002AB43 (174915)\n+74923 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x73FAB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74923: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73FE6 CENTRAL HEADER #193   02014B50 (33639248)\n-73FEA Created Zip Spec      14 (20) '2.0'\n-73FEB Created OS            03 (3) 'Unix'\n-73FEC Extract Zip Spec      14 (20) '2.0'\n-73FED Extract OS            00 (0) 'MS-DOS'\n-73FEE General Purpose Flag  0800 (2048)\n+7495E CENTRAL HEADER #193   02014B50 (33639248)\n+74962 Created Zip Spec      14 (20) '2.0'\n+74963 Created OS            03 (3) 'Unix'\n+74964 Extract Zip Spec      14 (20) '2.0'\n+74965 Extract OS            00 (0) 'MS-DOS'\n+74966 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-73FF0 Compression Method    0008 (8) 'Deflated'\n-73FF2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73FF6 CRC                   490F11E6 (1225724390)\n-73FFA Compressed Size       0000041C (1052)\n-73FFE Uncompressed Size     00000C65 (3173)\n-74002 Filename Length       0032 (50)\n-74004 Extra Length          0000 (0)\n-74006 Comment Length        0000 (0)\n-74008 Disk Start            0000 (0)\n-7400A Int File Attributes   0000 (0)\n+74968 Compression Method    0008 (8) 'Deflated'\n+7496A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7496E CRC                   490F11E6 (1225724390)\n+74972 Compressed Size       0000041C (1052)\n+74976 Uncompressed Size     00000C65 (3173)\n+7497A Filename Length       0032 (50)\n+7497C Extra Length          0000 (0)\n+7497E Comment Length        0000 (0)\n+74980 Disk Start            0000 (0)\n+74982 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7400C Ext File Attributes   81A40000 (2175008768)\n+74984 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74010 Local Header Offset   0002ABD0 (175056)\n-74014 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74988 Local Header Offset   0002AFC1 (176065)\n+7498C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74014: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7498C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74046 CENTRAL HEADER #194   02014B50 (33639248)\n-7404A Created Zip Spec      14 (20) '2.0'\n-7404B Created OS            03 (3) 'Unix'\n-7404C Extract Zip Spec      14 (20) '2.0'\n-7404D Extract OS            00 (0) 'MS-DOS'\n-7404E General Purpose Flag  0800 (2048)\n+749BE CENTRAL HEADER #194   02014B50 (33639248)\n+749C2 Created Zip Spec      14 (20) '2.0'\n+749C3 Created OS            03 (3) 'Unix'\n+749C4 Extract Zip Spec      14 (20) '2.0'\n+749C5 Extract OS            00 (0) 'MS-DOS'\n+749C6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74050 Compression Method    0008 (8) 'Deflated'\n-74052 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74056 CRC                   2D3D8039 (759005241)\n-7405A Compressed Size       000003D3 (979)\n-7405E Uncompressed Size     00000AD5 (2773)\n-74062 Filename Length       0032 (50)\n-74064 Extra Length          0000 (0)\n-74066 Comment Length        0000 (0)\n-74068 Disk Start            0000 (0)\n-7406A Int File Attributes   0000 (0)\n+749C8 Compression Method    0008 (8) 'Deflated'\n+749CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+749CE CRC                   3A9B5BED (983260141)\n+749D2 Compressed Size       000003DD (989)\n+749D6 Uncompressed Size     00000B3F (2879)\n+749DA Filename Length       0032 (50)\n+749DC Extra Length          0000 (0)\n+749DE Comment Length        0000 (0)\n+749E0 Disk Start            0000 (0)\n+749E2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7406C Ext File Attributes   81A40000 (2175008768)\n+749E4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74070 Local Header Offset   0002B03C (176188)\n-74074 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+749E8 Local Header Offset   0002B42D (177197)\n+749EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74074: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x749EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-740A6 CENTRAL HEADER #195   02014B50 (33639248)\n-740AA Created Zip Spec      14 (20) '2.0'\n-740AB Created OS            03 (3) 'Unix'\n-740AC Extract Zip Spec      14 (20) '2.0'\n-740AD Extract OS            00 (0) 'MS-DOS'\n-740AE General Purpose Flag  0800 (2048)\n+74A1E CENTRAL HEADER #195   02014B50 (33639248)\n+74A22 Created Zip Spec      14 (20) '2.0'\n+74A23 Created OS            03 (3) 'Unix'\n+74A24 Extract Zip Spec      14 (20) '2.0'\n+74A25 Extract OS            00 (0) 'MS-DOS'\n+74A26 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-740B0 Compression Method    0008 (8) 'Deflated'\n-740B2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-740B6 CRC                   BACA53B9 (3133821881)\n-740BA Compressed Size       00000A93 (2707)\n-740BE Uncompressed Size     000044D5 (17621)\n-740C2 Filename Length       0036 (54)\n-740C4 Extra Length          0000 (0)\n-740C6 Comment Length        0000 (0)\n-740C8 Disk Start            0000 (0)\n-740CA Int File Attributes   0000 (0)\n+74A28 Compression Method    0008 (8) 'Deflated'\n+74A2A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74A2E CRC                   30256F45 (807759685)\n+74A32 Compressed Size       00000AA5 (2725)\n+74A36 Uncompressed Size     000046E5 (18149)\n+74A3A Filename Length       0036 (54)\n+74A3C Extra Length          0000 (0)\n+74A3E Comment Length        0000 (0)\n+74A40 Disk Start            0000 (0)\n+74A42 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-740CC Ext File Attributes   81A40000 (2175008768)\n+74A44 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-740D0 Local Header Offset   0002B45F (177247)\n-740D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74A48 Local Header Offset   0002B85A (178266)\n+74A4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x740D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74A4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7410A CENTRAL HEADER #196   02014B50 (33639248)\n-7410E Created Zip Spec      14 (20) '2.0'\n-7410F Created OS            03 (3) 'Unix'\n-74110 Extract Zip Spec      14 (20) '2.0'\n-74111 Extract OS            00 (0) 'MS-DOS'\n-74112 General Purpose Flag  0800 (2048)\n+74A82 CENTRAL HEADER #196   02014B50 (33639248)\n+74A86 Created Zip Spec      14 (20) '2.0'\n+74A87 Created OS            03 (3) 'Unix'\n+74A88 Extract Zip Spec      14 (20) '2.0'\n+74A89 Extract OS            00 (0) 'MS-DOS'\n+74A8A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74114 Compression Method    0008 (8) 'Deflated'\n-74116 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7411A CRC                   FA032BB6 (4194511798)\n-7411E Compressed Size       00000A68 (2664)\n-74122 Uncompressed Size     00003385 (13189)\n-74126 Filename Length       002C (44)\n-74128 Extra Length          0000 (0)\n-7412A Comment Length        0000 (0)\n-7412C Disk Start            0000 (0)\n-7412E Int File Attributes   0000 (0)\n+74A8C Compression Method    0008 (8) 'Deflated'\n+74A8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74A92 CRC                   FA032BB6 (4194511798)\n+74A96 Compressed Size       00000A68 (2664)\n+74A9A Uncompressed Size     00003385 (13189)\n+74A9E Filename Length       002C (44)\n+74AA0 Extra Length          0000 (0)\n+74AA2 Comment Length        0000 (0)\n+74AA4 Disk Start            0000 (0)\n+74AA6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74130 Ext File Attributes   81A40000 (2175008768)\n+74AA8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74134 Local Header Offset   0002BF46 (180038)\n-74138 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74AAC Local Header Offset   0002C353 (181075)\n+74AB0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74138: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74AB0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74164 CENTRAL HEADER #197   02014B50 (33639248)\n-74168 Created Zip Spec      14 (20) '2.0'\n-74169 Created OS            03 (3) 'Unix'\n-7416A Extract Zip Spec      14 (20) '2.0'\n-7416B Extract OS            00 (0) 'MS-DOS'\n-7416C General Purpose Flag  0800 (2048)\n+74ADC CENTRAL HEADER #197   02014B50 (33639248)\n+74AE0 Created Zip Spec      14 (20) '2.0'\n+74AE1 Created OS            03 (3) 'Unix'\n+74AE2 Extract Zip Spec      14 (20) '2.0'\n+74AE3 Extract OS            00 (0) 'MS-DOS'\n+74AE4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7416E Compression Method    0008 (8) 'Deflated'\n-74170 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74174 CRC                   39C07894 (968915092)\n-74178 Compressed Size       00000BBA (3002)\n-7417C Uncompressed Size     00006AA4 (27300)\n-74180 Filename Length       0026 (38)\n-74182 Extra Length          0000 (0)\n-74184 Comment Length        0000 (0)\n-74186 Disk Start            0000 (0)\n-74188 Int File Attributes   0000 (0)\n+74AE6 Compression Method    0008 (8) 'Deflated'\n+74AE8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74AEC CRC                   39C07894 (968915092)\n+74AF0 Compressed Size       00000BBA (3002)\n+74AF4 Uncompressed Size     00006AA4 (27300)\n+74AF8 Filename Length       0026 (38)\n+74AFA Extra Length          0000 (0)\n+74AFC Comment Length        0000 (0)\n+74AFE Disk Start            0000 (0)\n+74B00 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7418A Ext File Attributes   81A40000 (2175008768)\n+74B02 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7418E Local Header Offset   0002C9F8 (182776)\n-74192 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74B06 Local Header Offset   0002CE05 (183813)\n+74B0A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74192: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74B0A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-741B8 CENTRAL HEADER #198   02014B50 (33639248)\n-741BC Created Zip Spec      14 (20) '2.0'\n-741BD Created OS            03 (3) 'Unix'\n-741BE Extract Zip Spec      14 (20) '2.0'\n-741BF Extract OS            00 (0) 'MS-DOS'\n-741C0 General Purpose Flag  0800 (2048)\n+74B30 CENTRAL HEADER #198   02014B50 (33639248)\n+74B34 Created Zip Spec      14 (20) '2.0'\n+74B35 Created OS            03 (3) 'Unix'\n+74B36 Extract Zip Spec      14 (20) '2.0'\n+74B37 Extract OS            00 (0) 'MS-DOS'\n+74B38 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-741C2 Compression Method    0008 (8) 'Deflated'\n-741C4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-741C8 CRC                   2313A478 (588489848)\n-741CC Compressed Size       000004D5 (1237)\n-741D0 Uncompressed Size     00001330 (4912)\n-741D4 Filename Length       002B (43)\n-741D6 Extra Length          0000 (0)\n-741D8 Comment Length        0000 (0)\n-741DA Disk Start            0000 (0)\n-741DC Int File Attributes   0000 (0)\n+74B3A Compression Method    0008 (8) 'Deflated'\n+74B3C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74B40 CRC                   2313A478 (588489848)\n+74B44 Compressed Size       000004D5 (1237)\n+74B48 Uncompressed Size     00001330 (4912)\n+74B4C Filename Length       002B (43)\n+74B4E Extra Length          0000 (0)\n+74B50 Comment Length        0000 (0)\n+74B52 Disk Start            0000 (0)\n+74B54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-741DE Ext File Attributes   81A40000 (2175008768)\n+74B56 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-741E2 Local Header Offset   0002D5F6 (185846)\n-741E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74B5A Local Header Offset   0002DA03 (186883)\n+74B5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x741E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74B5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74211 CENTRAL HEADER #199   02014B50 (33639248)\n-74215 Created Zip Spec      14 (20) '2.0'\n-74216 Created OS            03 (3) 'Unix'\n-74217 Extract Zip Spec      14 (20) '2.0'\n-74218 Extract OS            00 (0) 'MS-DOS'\n-74219 General Purpose Flag  0800 (2048)\n+74B89 CENTRAL HEADER #199   02014B50 (33639248)\n+74B8D Created Zip Spec      14 (20) '2.0'\n+74B8E Created OS            03 (3) 'Unix'\n+74B8F Extract Zip Spec      14 (20) '2.0'\n+74B90 Extract OS            00 (0) 'MS-DOS'\n+74B91 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7421B Compression Method    0008 (8) 'Deflated'\n-7421D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74221 CRC                   10BC97FD (280795133)\n-74225 Compressed Size       000002C3 (707)\n-74229 Uncompressed Size     000005B5 (1461)\n-7422D Filename Length       002F (47)\n-7422F Extra Length          0000 (0)\n-74231 Comment Length        0000 (0)\n-74233 Disk Start            0000 (0)\n-74235 Int File Attributes   0000 (0)\n+74B93 Compression Method    0008 (8) 'Deflated'\n+74B95 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74B99 CRC                   10BC97FD (280795133)\n+74B9D Compressed Size       000002C3 (707)\n+74BA1 Uncompressed Size     000005B5 (1461)\n+74BA5 Filename Length       002F (47)\n+74BA7 Extra Length          0000 (0)\n+74BA9 Comment Length        0000 (0)\n+74BAB Disk Start            0000 (0)\n+74BAD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74237 Ext File Attributes   81A40000 (2175008768)\n+74BAF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7423B Local Header Offset   0002DB14 (187156)\n-7423F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74BB3 Local Header Offset   0002DF21 (188193)\n+74BB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7423F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74BB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7426E CENTRAL HEADER #200   02014B50 (33639248)\n-74272 Created Zip Spec      14 (20) '2.0'\n-74273 Created OS            03 (3) 'Unix'\n-74274 Extract Zip Spec      14 (20) '2.0'\n-74275 Extract OS            00 (0) 'MS-DOS'\n-74276 General Purpose Flag  0800 (2048)\n+74BE6 CENTRAL HEADER #200   02014B50 (33639248)\n+74BEA Created Zip Spec      14 (20) '2.0'\n+74BEB Created OS            03 (3) 'Unix'\n+74BEC Extract Zip Spec      14 (20) '2.0'\n+74BED Extract OS            00 (0) 'MS-DOS'\n+74BEE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74278 Compression Method    0008 (8) 'Deflated'\n-7427A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7427E CRC                   982A34CC (2552902860)\n-74282 Compressed Size       0000027E (638)\n-74286 Uncompressed Size     000004AE (1198)\n-7428A Filename Length       002A (42)\n-7428C Extra Length          0000 (0)\n-7428E Comment Length        0000 (0)\n-74290 Disk Start            0000 (0)\n-74292 Int File Attributes   0000 (0)\n+74BF0 Compression Method    0008 (8) 'Deflated'\n+74BF2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74BF6 CRC                   982A34CC (2552902860)\n+74BFA Compressed Size       0000027E (638)\n+74BFE Uncompressed Size     000004AE (1198)\n+74C02 Filename Length       002A (42)\n+74C04 Extra Length          0000 (0)\n+74C06 Comment Length        0000 (0)\n+74C08 Disk Start            0000 (0)\n+74C0A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74294 Ext File Attributes   81A40000 (2175008768)\n+74C0C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74298 Local Header Offset   0002DE24 (187940)\n-7429C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74C10 Local Header Offset   0002E231 (188977)\n+74C14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7429C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74C14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-742C6 CENTRAL HEADER #201   02014B50 (33639248)\n-742CA Created Zip Spec      14 (20) '2.0'\n-742CB Created OS            03 (3) 'Unix'\n-742CC Extract Zip Spec      14 (20) '2.0'\n-742CD Extract OS            00 (0) 'MS-DOS'\n-742CE General Purpose Flag  0800 (2048)\n+74C3E CENTRAL HEADER #201   02014B50 (33639248)\n+74C42 Created Zip Spec      14 (20) '2.0'\n+74C43 Created OS            03 (3) 'Unix'\n+74C44 Extract Zip Spec      14 (20) '2.0'\n+74C45 Extract OS            00 (0) 'MS-DOS'\n+74C46 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-742D0 Compression Method    0008 (8) 'Deflated'\n-742D2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-742D6 CRC                   7653CF57 (1985204055)\n-742DA Compressed Size       00000592 (1426)\n-742DE Uncompressed Size     000015FB (5627)\n-742E2 Filename Length       002C (44)\n-742E4 Extra Length          0000 (0)\n-742E6 Comment Length        0000 (0)\n-742E8 Disk Start            0000 (0)\n-742EA Int File Attributes   0000 (0)\n+74C48 Compression Method    0008 (8) 'Deflated'\n+74C4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74C4E CRC                   7653CF57 (1985204055)\n+74C52 Compressed Size       00000592 (1426)\n+74C56 Uncompressed Size     000015FB (5627)\n+74C5A Filename Length       002C (44)\n+74C5C Extra Length          0000 (0)\n+74C5E Comment Length        0000 (0)\n+74C60 Disk Start            0000 (0)\n+74C62 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-742EC Ext File Attributes   81A40000 (2175008768)\n+74C64 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-742F0 Local Header Offset   0002E0EA (188650)\n-742F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74C68 Local Header Offset   0002E4F7 (189687)\n+74C6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x742F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74C6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74320 CENTRAL HEADER #202   02014B50 (33639248)\n-74324 Created Zip Spec      14 (20) '2.0'\n-74325 Created OS            03 (3) 'Unix'\n-74326 Extract Zip Spec      14 (20) '2.0'\n-74327 Extract OS            00 (0) 'MS-DOS'\n-74328 General Purpose Flag  0800 (2048)\n+74C98 CENTRAL HEADER #202   02014B50 (33639248)\n+74C9C Created Zip Spec      14 (20) '2.0'\n+74C9D Created OS            03 (3) 'Unix'\n+74C9E Extract Zip Spec      14 (20) '2.0'\n+74C9F Extract OS            00 (0) 'MS-DOS'\n+74CA0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7432A Compression Method    0008 (8) 'Deflated'\n-7432C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74330 CRC                   4D87180A (1300699146)\n-74334 Compressed Size       0000037F (895)\n-74338 Uncompressed Size     000008A6 (2214)\n-7433C Filename Length       002C (44)\n-7433E Extra Length          0000 (0)\n-74340 Comment Length        0000 (0)\n-74342 Disk Start            0000 (0)\n-74344 Int File Attributes   0000 (0)\n+74CA2 Compression Method    0008 (8) 'Deflated'\n+74CA4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74CA8 CRC                   4D87180A (1300699146)\n+74CAC Compressed Size       0000037F (895)\n+74CB0 Uncompressed Size     000008A6 (2214)\n+74CB4 Filename Length       002C (44)\n+74CB6 Extra Length          0000 (0)\n+74CB8 Comment Length        0000 (0)\n+74CBA Disk Start            0000 (0)\n+74CBC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74346 Ext File Attributes   81A40000 (2175008768)\n+74CBE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7434A Local Header Offset   0002E6C6 (190150)\n-7434E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74CC2 Local Header Offset   0002EAD3 (191187)\n+74CC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7434E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74CC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7437A CENTRAL HEADER #203   02014B50 (33639248)\n-7437E Created Zip Spec      14 (20) '2.0'\n-7437F Created OS            03 (3) 'Unix'\n-74380 Extract Zip Spec      14 (20) '2.0'\n-74381 Extract OS            00 (0) 'MS-DOS'\n-74382 General Purpose Flag  0800 (2048)\n+74CF2 CENTRAL HEADER #203   02014B50 (33639248)\n+74CF6 Created Zip Spec      14 (20) '2.0'\n+74CF7 Created OS            03 (3) 'Unix'\n+74CF8 Extract Zip Spec      14 (20) '2.0'\n+74CF9 Extract OS            00 (0) 'MS-DOS'\n+74CFA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74384 Compression Method    0008 (8) 'Deflated'\n-74386 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7438A CRC                   8F2D4992 (2402109842)\n-7438E Compressed Size       00000368 (872)\n-74392 Uncompressed Size     000008C7 (2247)\n-74396 Filename Length       002B (43)\n-74398 Extra Length          0000 (0)\n-7439A Comment Length        0000 (0)\n-7439C Disk Start            0000 (0)\n-7439E Int File Attributes   0000 (0)\n+74CFC Compression Method    0008 (8) 'Deflated'\n+74CFE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74D02 CRC                   8F2D4992 (2402109842)\n+74D06 Compressed Size       00000368 (872)\n+74D0A Uncompressed Size     000008C7 (2247)\n+74D0E Filename Length       002B (43)\n+74D10 Extra Length          0000 (0)\n+74D12 Comment Length        0000 (0)\n+74D14 Disk Start            0000 (0)\n+74D16 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-743A0 Ext File Attributes   81A40000 (2175008768)\n+74D18 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-743A4 Local Header Offset   0002EA8F (191119)\n-743A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74D1C Local Header Offset   0002EE9C (192156)\n+74D20 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x743A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74D20: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-743D3 CENTRAL HEADER #204   02014B50 (33639248)\n-743D7 Created Zip Spec      14 (20) '2.0'\n-743D8 Created OS            03 (3) 'Unix'\n-743D9 Extract Zip Spec      14 (20) '2.0'\n-743DA Extract OS            00 (0) 'MS-DOS'\n-743DB General Purpose Flag  0800 (2048)\n+74D4B CENTRAL HEADER #204   02014B50 (33639248)\n+74D4F Created Zip Spec      14 (20) '2.0'\n+74D50 Created OS            03 (3) 'Unix'\n+74D51 Extract Zip Spec      14 (20) '2.0'\n+74D52 Extract OS            00 (0) 'MS-DOS'\n+74D53 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-743DD Compression Method    0008 (8) 'Deflated'\n-743DF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-743E3 CRC                   33828390 (864191376)\n-743E7 Compressed Size       00000359 (857)\n-743EB Uncompressed Size     00000AEC (2796)\n-743EF Filename Length       002D (45)\n-743F1 Extra Length          0000 (0)\n-743F3 Comment Length        0000 (0)\n-743F5 Disk Start            0000 (0)\n-743F7 Int File Attributes   0000 (0)\n+74D55 Compression Method    0008 (8) 'Deflated'\n+74D57 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74D5B CRC                   33828390 (864191376)\n+74D5F Compressed Size       00000359 (857)\n+74D63 Uncompressed Size     00000AEC (2796)\n+74D67 Filename Length       002D (45)\n+74D69 Extra Length          0000 (0)\n+74D6B Comment Length        0000 (0)\n+74D6D Disk Start            0000 (0)\n+74D6F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-743F9 Ext File Attributes   81A40000 (2175008768)\n+74D71 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-743FD Local Header Offset   0002EE40 (192064)\n-74401 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74D75 Local Header Offset   0002F24D (193101)\n+74D79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74401: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74D79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7442E CENTRAL HEADER #205   02014B50 (33639248)\n-74432 Created Zip Spec      14 (20) '2.0'\n-74433 Created OS            03 (3) 'Unix'\n-74434 Extract Zip Spec      14 (20) '2.0'\n-74435 Extract OS            00 (0) 'MS-DOS'\n-74436 General Purpose Flag  0800 (2048)\n+74DA6 CENTRAL HEADER #205   02014B50 (33639248)\n+74DAA Created Zip Spec      14 (20) '2.0'\n+74DAB Created OS            03 (3) 'Unix'\n+74DAC Extract Zip Spec      14 (20) '2.0'\n+74DAD Extract OS            00 (0) 'MS-DOS'\n+74DAE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74438 Compression Method    0008 (8) 'Deflated'\n-7443A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7443E CRC                   ECCF2EAF (3973000879)\n-74442 Compressed Size       00000708 (1800)\n-74446 Uncompressed Size     00001FDF (8159)\n-7444A Filename Length       002C (44)\n-7444C Extra Length          0000 (0)\n-7444E Comment Length        0000 (0)\n-74450 Disk Start            0000 (0)\n-74452 Int File Attributes   0000 (0)\n+74DB0 Compression Method    0008 (8) 'Deflated'\n+74DB2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74DB6 CRC                   ECCF2EAF (3973000879)\n+74DBA Compressed Size       00000708 (1800)\n+74DBE Uncompressed Size     00001FDF (8159)\n+74DC2 Filename Length       002C (44)\n+74DC4 Extra Length          0000 (0)\n+74DC6 Comment Length        0000 (0)\n+74DC8 Disk Start            0000 (0)\n+74DCA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74454 Ext File Attributes   81A40000 (2175008768)\n+74DCC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74458 Local Header Offset   0002F1E4 (192996)\n-7445C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74DD0 Local Header Offset   0002F5F1 (194033)\n+74DD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7445C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74DD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74488 CENTRAL HEADER #206   02014B50 (33639248)\n-7448C Created Zip Spec      14 (20) '2.0'\n-7448D Created OS            03 (3) 'Unix'\n-7448E Extract Zip Spec      14 (20) '2.0'\n-7448F Extract OS            00 (0) 'MS-DOS'\n-74490 General Purpose Flag  0800 (2048)\n+74E00 CENTRAL HEADER #206   02014B50 (33639248)\n+74E04 Created Zip Spec      14 (20) '2.0'\n+74E05 Created OS            03 (3) 'Unix'\n+74E06 Extract Zip Spec      14 (20) '2.0'\n+74E07 Extract OS            00 (0) 'MS-DOS'\n+74E08 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74492 Compression Method    0008 (8) 'Deflated'\n-74494 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74498 CRC                   4EF6CDD0 (1324797392)\n-7449C Compressed Size       00000272 (626)\n-744A0 Uncompressed Size     00000489 (1161)\n-744A4 Filename Length       0030 (48)\n-744A6 Extra Length          0000 (0)\n-744A8 Comment Length        0000 (0)\n-744AA Disk Start            0000 (0)\n-744AC Int File Attributes   0000 (0)\n+74E0A Compression Method    0008 (8) 'Deflated'\n+74E0C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74E10 CRC                   4EF6CDD0 (1324797392)\n+74E14 Compressed Size       00000272 (626)\n+74E18 Uncompressed Size     00000489 (1161)\n+74E1C Filename Length       0030 (48)\n+74E1E Extra Length          0000 (0)\n+74E20 Comment Length        0000 (0)\n+74E22 Disk Start            0000 (0)\n+74E24 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-744AE Ext File Attributes   81A40000 (2175008768)\n+74E26 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-744B2 Local Header Offset   0002F936 (194870)\n-744B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74E2A Local Header Offset   0002FD43 (195907)\n+74E2E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x744B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74E2E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-744E6 CENTRAL HEADER #207   02014B50 (33639248)\n-744EA Created Zip Spec      14 (20) '2.0'\n-744EB Created OS            03 (3) 'Unix'\n-744EC Extract Zip Spec      14 (20) '2.0'\n-744ED Extract OS            00 (0) 'MS-DOS'\n-744EE General Purpose Flag  0800 (2048)\n+74E5E CENTRAL HEADER #207   02014B50 (33639248)\n+74E62 Created Zip Spec      14 (20) '2.0'\n+74E63 Created OS            03 (3) 'Unix'\n+74E64 Extract Zip Spec      14 (20) '2.0'\n+74E65 Extract OS            00 (0) 'MS-DOS'\n+74E66 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-744F0 Compression Method    0008 (8) 'Deflated'\n-744F2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-744F6 CRC                   D5F1D071 (3589394545)\n-744FA Compressed Size       00001720 (5920)\n-744FE Uncompressed Size     000072B9 (29369)\n-74502 Filename Length       0027 (39)\n-74504 Extra Length          0000 (0)\n-74506 Comment Length        0000 (0)\n-74508 Disk Start            0000 (0)\n-7450A Int File Attributes   0000 (0)\n+74E68 Compression Method    0008 (8) 'Deflated'\n+74E6A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74E6E CRC                   8192FABF (2173893311)\n+74E72 Compressed Size       00001742 (5954)\n+74E76 Uncompressed Size     00007607 (30215)\n+74E7A Filename Length       0027 (39)\n+74E7C Extra Length          0000 (0)\n+74E7E Comment Length        0000 (0)\n+74E80 Disk Start            0000 (0)\n+74E82 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7450C Ext File Attributes   81A40000 (2175008768)\n+74E84 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74510 Local Header Offset   0002FBF6 (195574)\n-74514 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74E88 Local Header Offset   00030003 (196611)\n+74E8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74514: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74E8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7453B CENTRAL HEADER #208   02014B50 (33639248)\n-7453F Created Zip Spec      14 (20) '2.0'\n-74540 Created OS            03 (3) 'Unix'\n-74541 Extract Zip Spec      14 (20) '2.0'\n-74542 Extract OS            00 (0) 'MS-DOS'\n-74543 General Purpose Flag  0800 (2048)\n+74EB3 CENTRAL HEADER #208   02014B50 (33639248)\n+74EB7 Created Zip Spec      14 (20) '2.0'\n+74EB8 Created OS            03 (3) 'Unix'\n+74EB9 Extract Zip Spec      14 (20) '2.0'\n+74EBA Extract OS            00 (0) 'MS-DOS'\n+74EBB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74545 Compression Method    0008 (8) 'Deflated'\n-74547 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7454B CRC                   99C9FFC3 (2580152259)\n-7454F Compressed Size       000003F2 (1010)\n-74553 Uncompressed Size     00000902 (2306)\n-74557 Filename Length       002D (45)\n-74559 Extra Length          0000 (0)\n-7455B Comment Length        0000 (0)\n-7455D Disk Start            0000 (0)\n-7455F Int File Attributes   0000 (0)\n+74EBD Compression Method    0008 (8) 'Deflated'\n+74EBF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74EC3 CRC                   36088937 (906529079)\n+74EC7 Compressed Size       000003FC (1020)\n+74ECB Uncompressed Size     0000094E (2382)\n+74ECF Filename Length       002D (45)\n+74ED1 Extra Length          0000 (0)\n+74ED3 Comment Length        0000 (0)\n+74ED5 Disk Start            0000 (0)\n+74ED7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74561 Ext File Attributes   81A40000 (2175008768)\n+74ED9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74565 Local Header Offset   0003135B (201563)\n-74569 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74EDD Local Header Offset   0003178A (202634)\n+74EE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74569: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74EE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74596 CENTRAL HEADER #209   02014B50 (33639248)\n-7459A Created Zip Spec      14 (20) '2.0'\n-7459B Created OS            03 (3) 'Unix'\n-7459C Extract Zip Spec      14 (20) '2.0'\n-7459D Extract OS            00 (0) 'MS-DOS'\n-7459E General Purpose Flag  0800 (2048)\n+74F0E CENTRAL HEADER #209   02014B50 (33639248)\n+74F12 Created Zip Spec      14 (20) '2.0'\n+74F13 Created OS            03 (3) 'Unix'\n+74F14 Extract Zip Spec      14 (20) '2.0'\n+74F15 Extract OS            00 (0) 'MS-DOS'\n+74F16 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-745A0 Compression Method    0008 (8) 'Deflated'\n-745A2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-745A6 CRC                   C53EC878 (3309226104)\n-745AA Compressed Size       00000274 (628)\n-745AE Uncompressed Size     00000488 (1160)\n-745B2 Filename Length       0036 (54)\n-745B4 Extra Length          0000 (0)\n-745B6 Comment Length        0000 (0)\n-745B8 Disk Start            0000 (0)\n-745BA Int File Attributes   0000 (0)\n+74F18 Compression Method    0008 (8) 'Deflated'\n+74F1A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74F1E CRC                   C67E8FBE (3330183102)\n+74F22 Compressed Size       0000027E (638)\n+74F26 Uncompressed Size     000004AB (1195)\n+74F2A Filename Length       0036 (54)\n+74F2C Extra Length          0000 (0)\n+74F2E Comment Length        0000 (0)\n+74F30 Disk Start            0000 (0)\n+74F32 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-745BC Ext File Attributes   81A40000 (2175008768)\n+74F34 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-745C0 Local Header Offset   00031798 (202648)\n-745C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74F38 Local Header Offset   00031BD1 (203729)\n+74F3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x745C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74F3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-745FA CENTRAL HEADER #210   02014B50 (33639248)\n-745FE Created Zip Spec      14 (20) '2.0'\n-745FF Created OS            03 (3) 'Unix'\n-74600 Extract Zip Spec      14 (20) '2.0'\n-74601 Extract OS            00 (0) 'MS-DOS'\n-74602 General Purpose Flag  0800 (2048)\n+74F72 CENTRAL HEADER #210   02014B50 (33639248)\n+74F76 Created Zip Spec      14 (20) '2.0'\n+74F77 Created OS            03 (3) 'Unix'\n+74F78 Extract Zip Spec      14 (20) '2.0'\n+74F79 Extract OS            00 (0) 'MS-DOS'\n+74F7A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74604 Compression Method    0008 (8) 'Deflated'\n-74606 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7460A CRC                   8EF8ABEC (2398661612)\n-7460E Compressed Size       00000392 (914)\n-74612 Uncompressed Size     00000920 (2336)\n-74616 Filename Length       0037 (55)\n-74618 Extra Length          0000 (0)\n-7461A Comment Length        0000 (0)\n-7461C Disk Start            0000 (0)\n-7461E Int File Attributes   0000 (0)\n+74F7C Compression Method    0008 (8) 'Deflated'\n+74F7E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74F82 CRC                   8F418EA5 (2403438245)\n+74F86 Compressed Size       0000039C (924)\n+74F8A Uncompressed Size     00000967 (2407)\n+74F8E Filename Length       0037 (55)\n+74F90 Extra Length          0000 (0)\n+74F92 Comment Length        0000 (0)\n+74F94 Disk Start            0000 (0)\n+74F96 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74620 Ext File Attributes   81A40000 (2175008768)\n+74F98 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74624 Local Header Offset   00031A60 (203360)\n-74628 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74F9C Local Header Offset   00031EA3 (204451)\n+74FA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74628: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74FA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7465F CENTRAL HEADER #211   02014B50 (33639248)\n-74663 Created Zip Spec      14 (20) '2.0'\n-74664 Created OS            03 (3) 'Unix'\n-74665 Extract Zip Spec      14 (20) '2.0'\n-74666 Extract OS            00 (0) 'MS-DOS'\n-74667 General Purpose Flag  0800 (2048)\n+74FD7 CENTRAL HEADER #211   02014B50 (33639248)\n+74FDB Created Zip Spec      14 (20) '2.0'\n+74FDC Created OS            03 (3) 'Unix'\n+74FDD Extract Zip Spec      14 (20) '2.0'\n+74FDE Extract OS            00 (0) 'MS-DOS'\n+74FDF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74669 Compression Method    0008 (8) 'Deflated'\n-7466B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7466F CRC                   9D821087 (2642546823)\n-74673 Compressed Size       00000249 (585)\n-74677 Uncompressed Size     000004BE (1214)\n-7467B Filename Length       0029 (41)\n-7467D Extra Length          0000 (0)\n-7467F Comment Length        0000 (0)\n-74681 Disk Start            0000 (0)\n-74683 Int File Attributes   0000 (0)\n+74FE1 Compression Method    0008 (8) 'Deflated'\n+74FE3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74FE7 CRC                   9D821087 (2642546823)\n+74FEB Compressed Size       00000249 (585)\n+74FEF Uncompressed Size     000004BE (1214)\n+74FF3 Filename Length       0029 (41)\n+74FF5 Extra Length          0000 (0)\n+74FF7 Comment Length        0000 (0)\n+74FF9 Disk Start            0000 (0)\n+74FFB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74685 Ext File Attributes   81A40000 (2175008768)\n+74FFD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74689 Local Header Offset   00031E47 (204359)\n-7468D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75001 Local Header Offset   00032294 (205460)\n+75005 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7468D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75005: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-746B6 CENTRAL HEADER #212   02014B50 (33639248)\n-746BA Created Zip Spec      14 (20) '2.0'\n-746BB Created OS            03 (3) 'Unix'\n-746BC Extract Zip Spec      14 (20) '2.0'\n-746BD Extract OS            00 (0) 'MS-DOS'\n-746BE General Purpose Flag  0800 (2048)\n+7502E CENTRAL HEADER #212   02014B50 (33639248)\n+75032 Created Zip Spec      14 (20) '2.0'\n+75033 Created OS            03 (3) 'Unix'\n+75034 Extract Zip Spec      14 (20) '2.0'\n+75035 Extract OS            00 (0) 'MS-DOS'\n+75036 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-746C0 Compression Method    0008 (8) 'Deflated'\n-746C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-746C6 CRC                   7A6DF346 (2054026054)\n-746CA Compressed Size       00000371 (881)\n-746CE Uncompressed Size     00000ED8 (3800)\n-746D2 Filename Length       002A (42)\n-746D4 Extra Length          0000 (0)\n-746D6 Comment Length        0000 (0)\n-746D8 Disk Start            0000 (0)\n-746DA Int File Attributes   0000 (0)\n+75038 Compression Method    0008 (8) 'Deflated'\n+7503A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7503E CRC                   0D8DFECE (227409614)\n+75042 Compressed Size       00000376 (886)\n+75046 Uncompressed Size     00000F82 (3970)\n+7504A Filename Length       002A (42)\n+7504C Extra Length          0000 (0)\n+7504E Comment Length        0000 (0)\n+75050 Disk Start            0000 (0)\n+75052 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-746DC Ext File Attributes   81A40000 (2175008768)\n+75054 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-746E0 Local Header Offset   000320D7 (205015)\n-746E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75058 Local Header Offset   00032524 (206116)\n+7505C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x746E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7505C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7470E CENTRAL HEADER #213   02014B50 (33639248)\n-74712 Created Zip Spec      14 (20) '2.0'\n-74713 Created OS            03 (3) 'Unix'\n-74714 Extract Zip Spec      14 (20) '2.0'\n-74715 Extract OS            00 (0) 'MS-DOS'\n-74716 General Purpose Flag  0800 (2048)\n+75086 CENTRAL HEADER #213   02014B50 (33639248)\n+7508A Created Zip Spec      14 (20) '2.0'\n+7508B Created OS            03 (3) 'Unix'\n+7508C Extract Zip Spec      14 (20) '2.0'\n+7508D Extract OS            00 (0) 'MS-DOS'\n+7508E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74718 Compression Method    0008 (8) 'Deflated'\n-7471A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7471E CRC                   A6EF1A57 (2800687703)\n-74722 Compressed Size       000002E4 (740)\n-74726 Uncompressed Size     00000745 (1861)\n-7472A Filename Length       0031 (49)\n-7472C Extra Length          0000 (0)\n-7472E Comment Length        0000 (0)\n-74730 Disk Start            0000 (0)\n-74732 Int File Attributes   0000 (0)\n+75090 Compression Method    0008 (8) 'Deflated'\n+75092 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75096 CRC                   A6EF1A57 (2800687703)\n+7509A Compressed Size       000002E4 (740)\n+7509E Uncompressed Size     00000745 (1861)\n+750A2 Filename Length       0031 (49)\n+750A4 Extra Length          0000 (0)\n+750A6 Comment Length        0000 (0)\n+750A8 Disk Start            0000 (0)\n+750AA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74734 Ext File Attributes   81A40000 (2175008768)\n+750AC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74738 Local Header Offset   00032490 (205968)\n-7473C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+750B0 Local Header Offset   000328E2 (207074)\n+750B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7473C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x750B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7476D CENTRAL HEADER #214   02014B50 (33639248)\n-74771 Created Zip Spec      14 (20) '2.0'\n-74772 Created OS            03 (3) 'Unix'\n-74773 Extract Zip Spec      14 (20) '2.0'\n-74774 Extract OS            00 (0) 'MS-DOS'\n-74775 General Purpose Flag  0800 (2048)\n+750E5 CENTRAL HEADER #214   02014B50 (33639248)\n+750E9 Created Zip Spec      14 (20) '2.0'\n+750EA Created OS            03 (3) 'Unix'\n+750EB Extract Zip Spec      14 (20) '2.0'\n+750EC Extract OS            00 (0) 'MS-DOS'\n+750ED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74777 Compression Method    0008 (8) 'Deflated'\n-74779 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7477D CRC                   626EDC3E (1651432510)\n-74781 Compressed Size       000005BE (1470)\n-74785 Uncompressed Size     00001485 (5253)\n-74789 Filename Length       0031 (49)\n-7478B Extra Length          0000 (0)\n-7478D Comment Length        0000 (0)\n-7478F Disk Start            0000 (0)\n-74791 Int File Attributes   0000 (0)\n+750EF Compression Method    0008 (8) 'Deflated'\n+750F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+750F5 CRC                   626EDC3E (1651432510)\n+750F9 Compressed Size       000005BE (1470)\n+750FD Uncompressed Size     00001485 (5253)\n+75101 Filename Length       0031 (49)\n+75103 Extra Length          0000 (0)\n+75105 Comment Length        0000 (0)\n+75107 Disk Start            0000 (0)\n+75109 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74793 Ext File Attributes   81A40000 (2175008768)\n+7510B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74797 Local Header Offset   000327C3 (206787)\n-7479B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7510F Local Header Offset   00032C15 (207893)\n+75113 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7479B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75113: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-747CC CENTRAL HEADER #215   02014B50 (33639248)\n-747D0 Created Zip Spec      14 (20) '2.0'\n-747D1 Created OS            03 (3) 'Unix'\n-747D2 Extract Zip Spec      14 (20) '2.0'\n-747D3 Extract OS            00 (0) 'MS-DOS'\n-747D4 General Purpose Flag  0800 (2048)\n+75144 CENTRAL HEADER #215   02014B50 (33639248)\n+75148 Created Zip Spec      14 (20) '2.0'\n+75149 Created OS            03 (3) 'Unix'\n+7514A Extract Zip Spec      14 (20) '2.0'\n+7514B Extract OS            00 (0) 'MS-DOS'\n+7514C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-747D6 Compression Method    0008 (8) 'Deflated'\n-747D8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-747DC CRC                   65EBC1EB (1709949419)\n-747E0 Compressed Size       000003A6 (934)\n-747E4 Uncompressed Size     00000D0E (3342)\n-747E8 Filename Length       0031 (49)\n-747EA Extra Length          0000 (0)\n-747EC Comment Length        0000 (0)\n-747EE Disk Start            0000 (0)\n-747F0 Int File Attributes   0000 (0)\n+7514E Compression Method    0008 (8) 'Deflated'\n+75150 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75154 CRC                   65EBC1EB (1709949419)\n+75158 Compressed Size       000003A6 (934)\n+7515C Uncompressed Size     00000D0E (3342)\n+75160 Filename Length       0031 (49)\n+75162 Extra Length          0000 (0)\n+75164 Comment Length        0000 (0)\n+75166 Disk Start            0000 (0)\n+75168 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-747F2 Ext File Attributes   81A40000 (2175008768)\n+7516A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-747F6 Local Header Offset   00032DD0 (208336)\n-747FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7516E Local Header Offset   00033222 (209442)\n+75172 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x747FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75172: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7482B CENTRAL HEADER #216   02014B50 (33639248)\n-7482F Created Zip Spec      14 (20) '2.0'\n-74830 Created OS            03 (3) 'Unix'\n-74831 Extract Zip Spec      14 (20) '2.0'\n-74832 Extract OS            00 (0) 'MS-DOS'\n-74833 General Purpose Flag  0800 (2048)\n+751A3 CENTRAL HEADER #216   02014B50 (33639248)\n+751A7 Created Zip Spec      14 (20) '2.0'\n+751A8 Created OS            03 (3) 'Unix'\n+751A9 Extract Zip Spec      14 (20) '2.0'\n+751AA Extract OS            00 (0) 'MS-DOS'\n+751AB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74835 Compression Method    0008 (8) 'Deflated'\n-74837 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7483B CRC                   006A5B46 (6970182)\n-7483F Compressed Size       000002C9 (713)\n-74843 Uncompressed Size     000006F8 (1784)\n-74847 Filename Length       0038 (56)\n-74849 Extra Length          0000 (0)\n-7484B Comment Length        0000 (0)\n-7484D Disk Start            0000 (0)\n-7484F Int File Attributes   0000 (0)\n+751AD Compression Method    0008 (8) 'Deflated'\n+751AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+751B3 CRC                   006A5B46 (6970182)\n+751B7 Compressed Size       000002C9 (713)\n+751BB Uncompressed Size     000006F8 (1784)\n+751BF Filename Length       0038 (56)\n+751C1 Extra Length          0000 (0)\n+751C3 Comment Length        0000 (0)\n+751C5 Disk Start            0000 (0)\n+751C7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74851 Ext File Attributes   81A40000 (2175008768)\n+751C9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74855 Local Header Offset   000331C5 (209349)\n-74859 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+751CD Local Header Offset   00033617 (210455)\n+751D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74859: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x751D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74891 CENTRAL HEADER #217   02014B50 (33639248)\n-74895 Created Zip Spec      14 (20) '2.0'\n-74896 Created OS            03 (3) 'Unix'\n-74897 Extract Zip Spec      14 (20) '2.0'\n-74898 Extract OS            00 (0) 'MS-DOS'\n-74899 General Purpose Flag  0800 (2048)\n+75209 CENTRAL HEADER #217   02014B50 (33639248)\n+7520D Created Zip Spec      14 (20) '2.0'\n+7520E Created OS            03 (3) 'Unix'\n+7520F Extract Zip Spec      14 (20) '2.0'\n+75210 Extract OS            00 (0) 'MS-DOS'\n+75211 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7489B Compression Method    0008 (8) 'Deflated'\n-7489D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-748A1 CRC                   8FD172CF (2412868303)\n-748A5 Compressed Size       0000034C (844)\n-748A9 Uncompressed Size     00000D1B (3355)\n-748AD Filename Length       0031 (49)\n-748AF Extra Length          0000 (0)\n-748B1 Comment Length        0000 (0)\n-748B3 Disk Start            0000 (0)\n-748B5 Int File Attributes   0000 (0)\n+75213 Compression Method    0008 (8) 'Deflated'\n+75215 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75219 CRC                   8FD172CF (2412868303)\n+7521D Compressed Size       0000034C (844)\n+75221 Uncompressed Size     00000D1B (3355)\n+75225 Filename Length       0031 (49)\n+75227 Extra Length          0000 (0)\n+75229 Comment Length        0000 (0)\n+7522B Disk Start            0000 (0)\n+7522D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-748B7 Ext File Attributes   81A40000 (2175008768)\n+7522F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-748BB Local Header Offset   000334E4 (210148)\n-748BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75233 Local Header Offset   00033936 (211254)\n+75237 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x748BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75237: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-748F0 CENTRAL HEADER #218   02014B50 (33639248)\n-748F4 Created Zip Spec      14 (20) '2.0'\n-748F5 Created OS            03 (3) 'Unix'\n-748F6 Extract Zip Spec      14 (20) '2.0'\n-748F7 Extract OS            00 (0) 'MS-DOS'\n-748F8 General Purpose Flag  0800 (2048)\n+75268 CENTRAL HEADER #218   02014B50 (33639248)\n+7526C Created Zip Spec      14 (20) '2.0'\n+7526D Created OS            03 (3) 'Unix'\n+7526E Extract Zip Spec      14 (20) '2.0'\n+7526F Extract OS            00 (0) 'MS-DOS'\n+75270 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-748FA Compression Method    0008 (8) 'Deflated'\n-748FC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74900 CRC                   7ADBDBE0 (2061229024)\n-74904 Compressed Size       0000055C (1372)\n-74908 Uncompressed Size     000012FC (4860)\n-7490C Filename Length       0038 (56)\n-7490E Extra Length          0000 (0)\n-74910 Comment Length        0000 (0)\n-74912 Disk Start            0000 (0)\n-74914 Int File Attributes   0000 (0)\n+75272 Compression Method    0008 (8) 'Deflated'\n+75274 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75278 CRC                   7ADBDBE0 (2061229024)\n+7527C Compressed Size       0000055C (1372)\n+75280 Uncompressed Size     000012FC (4860)\n+75284 Filename Length       0038 (56)\n+75286 Extra Length          0000 (0)\n+75288 Comment Length        0000 (0)\n+7528A Disk Start            0000 (0)\n+7528C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74916 Ext File Attributes   81A40000 (2175008768)\n+7528E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7491A Local Header Offset   0003387F (211071)\n-7491E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75292 Local Header Offset   00033CD1 (212177)\n+75296 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7491E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75296: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74956 CENTRAL HEADER #219   02014B50 (33639248)\n-7495A Created Zip Spec      14 (20) '2.0'\n-7495B Created OS            03 (3) 'Unix'\n-7495C Extract Zip Spec      14 (20) '2.0'\n-7495D Extract OS            00 (0) 'MS-DOS'\n-7495E General Purpose Flag  0800 (2048)\n+752CE CENTRAL HEADER #219   02014B50 (33639248)\n+752D2 Created Zip Spec      14 (20) '2.0'\n+752D3 Created OS            03 (3) 'Unix'\n+752D4 Extract Zip Spec      14 (20) '2.0'\n+752D5 Extract OS            00 (0) 'MS-DOS'\n+752D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74960 Compression Method    0008 (8) 'Deflated'\n-74962 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74966 CRC                   0237005F (37159007)\n-7496A Compressed Size       00000393 (915)\n-7496E Uncompressed Size     00000E61 (3681)\n-74972 Filename Length       0035 (53)\n-74974 Extra Length          0000 (0)\n-74976 Comment Length        0000 (0)\n-74978 Disk Start            0000 (0)\n-7497A Int File Attributes   0000 (0)\n+752D8 Compression Method    0008 (8) 'Deflated'\n+752DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+752DE CRC                   0237005F (37159007)\n+752E2 Compressed Size       00000393 (915)\n+752E6 Uncompressed Size     00000E61 (3681)\n+752EA Filename Length       0035 (53)\n+752EC Extra Length          0000 (0)\n+752EE Comment Length        0000 (0)\n+752F0 Disk Start            0000 (0)\n+752F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7497C Ext File Attributes   81A40000 (2175008768)\n+752F4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74980 Local Header Offset   00033E31 (212529)\n-74984 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+752F8 Local Header Offset   00034283 (213635)\n+752FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74984: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x752FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-749B9 CENTRAL HEADER #220   02014B50 (33639248)\n-749BD Created Zip Spec      14 (20) '2.0'\n-749BE Created OS            03 (3) 'Unix'\n-749BF Extract Zip Spec      14 (20) '2.0'\n-749C0 Extract OS            00 (0) 'MS-DOS'\n-749C1 General Purpose Flag  0800 (2048)\n+75331 CENTRAL HEADER #220   02014B50 (33639248)\n+75335 Created Zip Spec      14 (20) '2.0'\n+75336 Created OS            03 (3) 'Unix'\n+75337 Extract Zip Spec      14 (20) '2.0'\n+75338 Extract OS            00 (0) 'MS-DOS'\n+75339 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-749C3 Compression Method    0008 (8) 'Deflated'\n-749C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-749C9 CRC                   CE737695 (3463673493)\n-749CD Compressed Size       00000481 (1153)\n-749D1 Uncompressed Size     000010CC (4300)\n-749D5 Filename Length       003C (60)\n-749D7 Extra Length          0000 (0)\n-749D9 Comment Length        0000 (0)\n-749DB Disk Start            0000 (0)\n-749DD Int File Attributes   0000 (0)\n+7533B Compression Method    0008 (8) 'Deflated'\n+7533D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75341 CRC                   CE737695 (3463673493)\n+75345 Compressed Size       00000481 (1153)\n+75349 Uncompressed Size     000010CC (4300)\n+7534D Filename Length       003C (60)\n+7534F Extra Length          0000 (0)\n+75351 Comment Length        0000 (0)\n+75353 Disk Start            0000 (0)\n+75355 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-749DF Ext File Attributes   81A40000 (2175008768)\n+75357 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-749E3 Local Header Offset   00034217 (213527)\n-749E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7535B Local Header Offset   00034669 (214633)\n+7535F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x749E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7535F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74A23 CENTRAL HEADER #221   02014B50 (33639248)\n-74A27 Created Zip Spec      14 (20) '2.0'\n-74A28 Created OS            03 (3) 'Unix'\n-74A29 Extract Zip Spec      14 (20) '2.0'\n-74A2A Extract OS            00 (0) 'MS-DOS'\n-74A2B General Purpose Flag  0800 (2048)\n+7539B CENTRAL HEADER #221   02014B50 (33639248)\n+7539F Created Zip Spec      14 (20) '2.0'\n+753A0 Created OS            03 (3) 'Unix'\n+753A1 Extract Zip Spec      14 (20) '2.0'\n+753A2 Extract OS            00 (0) 'MS-DOS'\n+753A3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74A2D Compression Method    0008 (8) 'Deflated'\n-74A2F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74A33 CRC                   719AAFB0 (1905962928)\n-74A37 Compressed Size       00000343 (835)\n-74A3B Uncompressed Size     00000C98 (3224)\n-74A3F Filename Length       0037 (55)\n-74A41 Extra Length          0000 (0)\n-74A43 Comment Length        0000 (0)\n-74A45 Disk Start            0000 (0)\n-74A47 Int File Attributes   0000 (0)\n+753A5 Compression Method    0008 (8) 'Deflated'\n+753A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+753AB CRC                   719AAFB0 (1905962928)\n+753AF Compressed Size       00000343 (835)\n+753B3 Uncompressed Size     00000C98 (3224)\n+753B7 Filename Length       0037 (55)\n+753B9 Extra Length          0000 (0)\n+753BB Comment Length        0000 (0)\n+753BD Disk Start            0000 (0)\n+753BF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74A49 Ext File Attributes   81A40000 (2175008768)\n+753C1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74A4D Local Header Offset   000346F2 (214770)\n-74A51 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+753C5 Local Header Offset   00034B44 (215876)\n+753C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74A51: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x753C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74A88 CENTRAL HEADER #222   02014B50 (33639248)\n-74A8C Created Zip Spec      14 (20) '2.0'\n-74A8D Created OS            03 (3) 'Unix'\n-74A8E Extract Zip Spec      14 (20) '2.0'\n-74A8F Extract OS            00 (0) 'MS-DOS'\n-74A90 General Purpose Flag  0800 (2048)\n+75400 CENTRAL HEADER #222   02014B50 (33639248)\n+75404 Created Zip Spec      14 (20) '2.0'\n+75405 Created OS            03 (3) 'Unix'\n+75406 Extract Zip Spec      14 (20) '2.0'\n+75407 Extract OS            00 (0) 'MS-DOS'\n+75408 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74A92 Compression Method    0008 (8) 'Deflated'\n-74A94 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74A98 CRC                   B7D93D08 (3084467464)\n-74A9C Compressed Size       00000375 (885)\n-74AA0 Uncompressed Size     00000CED (3309)\n-74AA4 Filename Length       003E (62)\n-74AA6 Extra Length          0000 (0)\n-74AA8 Comment Length        0000 (0)\n-74AAA Disk Start            0000 (0)\n-74AAC Int File Attributes   0000 (0)\n+7540A Compression Method    0008 (8) 'Deflated'\n+7540C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75410 CRC                   B7D93D08 (3084467464)\n+75414 Compressed Size       00000375 (885)\n+75418 Uncompressed Size     00000CED (3309)\n+7541C Filename Length       003E (62)\n+7541E Extra Length          0000 (0)\n+75420 Comment Length        0000 (0)\n+75422 Disk Start            0000 (0)\n+75424 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74AAE Ext File Attributes   81A40000 (2175008768)\n+75426 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74AB2 Local Header Offset   00034A8A (215690)\n-74AB6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7542A Local Header Offset   00034EDC (216796)\n+7542E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74AB6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7542E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74AF4 CENTRAL HEADER #223   02014B50 (33639248)\n-74AF8 Created Zip Spec      14 (20) '2.0'\n-74AF9 Created OS            03 (3) 'Unix'\n-74AFA Extract Zip Spec      14 (20) '2.0'\n-74AFB Extract OS            00 (0) 'MS-DOS'\n-74AFC General Purpose Flag  0800 (2048)\n+7546C CENTRAL HEADER #223   02014B50 (33639248)\n+75470 Created Zip Spec      14 (20) '2.0'\n+75471 Created OS            03 (3) 'Unix'\n+75472 Extract Zip Spec      14 (20) '2.0'\n+75473 Extract OS            00 (0) 'MS-DOS'\n+75474 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74AFE Compression Method    0008 (8) 'Deflated'\n-74B00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74B04 CRC                   FD6565BB (4251280827)\n-74B08 Compressed Size       0000044E (1102)\n-74B0C Uncompressed Size     00001876 (6262)\n-74B10 Filename Length       0035 (53)\n-74B12 Extra Length          0000 (0)\n-74B14 Comment Length        0000 (0)\n-74B16 Disk Start            0000 (0)\n-74B18 Int File Attributes   0000 (0)\n+75476 Compression Method    0008 (8) 'Deflated'\n+75478 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7547C CRC                   FD6565BB (4251280827)\n+75480 Compressed Size       0000044E (1102)\n+75484 Uncompressed Size     00001876 (6262)\n+75488 Filename Length       0035 (53)\n+7548A Extra Length          0000 (0)\n+7548C Comment Length        0000 (0)\n+7548E Disk Start            0000 (0)\n+75490 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74B1A Ext File Attributes   81A40000 (2175008768)\n+75492 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74B1E Local Header Offset   00034E5B (216667)\n-74B22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75496 Local Header Offset   000352AD (217773)\n+7549A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74B22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7549A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74B57 CENTRAL HEADER #224   02014B50 (33639248)\n-74B5B Created Zip Spec      14 (20) '2.0'\n-74B5C Created OS            03 (3) 'Unix'\n-74B5D Extract Zip Spec      14 (20) '2.0'\n-74B5E Extract OS            00 (0) 'MS-DOS'\n-74B5F General Purpose Flag  0800 (2048)\n+754CF CENTRAL HEADER #224   02014B50 (33639248)\n+754D3 Created Zip Spec      14 (20) '2.0'\n+754D4 Created OS            03 (3) 'Unix'\n+754D5 Extract Zip Spec      14 (20) '2.0'\n+754D6 Extract OS            00 (0) 'MS-DOS'\n+754D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74B61 Compression Method    0008 (8) 'Deflated'\n-74B63 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74B67 CRC                   2D853131 (763703601)\n-74B6B Compressed Size       000002C6 (710)\n-74B6F Uncompressed Size     000006EF (1775)\n-74B73 Filename Length       003C (60)\n-74B75 Extra Length          0000 (0)\n-74B77 Comment Length        0000 (0)\n-74B79 Disk Start            0000 (0)\n-74B7B Int File Attributes   0000 (0)\n+754D9 Compression Method    0008 (8) 'Deflated'\n+754DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+754DF CRC                   2D853131 (763703601)\n+754E3 Compressed Size       000002C6 (710)\n+754E7 Uncompressed Size     000006EF (1775)\n+754EB Filename Length       003C (60)\n+754ED Extra Length          0000 (0)\n+754EF Comment Length        0000 (0)\n+754F1 Disk Start            0000 (0)\n+754F3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74B7D Ext File Attributes   81A40000 (2175008768)\n+754F5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74B81 Local Header Offset   000352FC (217852)\n-74B85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+754F9 Local Header Offset   0003574E (218958)\n+754FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74B85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x754FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74BC1 CENTRAL HEADER #225   02014B50 (33639248)\n-74BC5 Created Zip Spec      14 (20) '2.0'\n-74BC6 Created OS            03 (3) 'Unix'\n-74BC7 Extract Zip Spec      14 (20) '2.0'\n-74BC8 Extract OS            00 (0) 'MS-DOS'\n-74BC9 General Purpose Flag  0800 (2048)\n+75539 CENTRAL HEADER #225   02014B50 (33639248)\n+7553D Created Zip Spec      14 (20) '2.0'\n+7553E Created OS            03 (3) 'Unix'\n+7553F Extract Zip Spec      14 (20) '2.0'\n+75540 Extract OS            00 (0) 'MS-DOS'\n+75541 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74BCB Compression Method    0008 (8) 'Deflated'\n-74BCD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74BD1 CRC                   01B8CE5D (28888669)\n-74BD5 Compressed Size       000003B8 (952)\n-74BD9 Uncompressed Size     000013B5 (5045)\n-74BDD Filename Length       003A (58)\n-74BDF Extra Length          0000 (0)\n-74BE1 Comment Length        0000 (0)\n-74BE3 Disk Start            0000 (0)\n-74BE5 Int File Attributes   0000 (0)\n+75543 Compression Method    0008 (8) 'Deflated'\n+75545 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75549 CRC                   01B8CE5D (28888669)\n+7554D Compressed Size       000003B8 (952)\n+75551 Uncompressed Size     000013B5 (5045)\n+75555 Filename Length       003A (58)\n+75557 Extra Length          0000 (0)\n+75559 Comment Length        0000 (0)\n+7555B Disk Start            0000 (0)\n+7555D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74BE7 Ext File Attributes   81A40000 (2175008768)\n+7555F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74BEB Local Header Offset   0003561C (218652)\n-74BEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75563 Local Header Offset   00035A6E (219758)\n+75567 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74BEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75567: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74C29 CENTRAL HEADER #226   02014B50 (33639248)\n-74C2D Created Zip Spec      14 (20) '2.0'\n-74C2E Created OS            03 (3) 'Unix'\n-74C2F Extract Zip Spec      14 (20) '2.0'\n-74C30 Extract OS            00 (0) 'MS-DOS'\n-74C31 General Purpose Flag  0800 (2048)\n+755A1 CENTRAL HEADER #226   02014B50 (33639248)\n+755A5 Created Zip Spec      14 (20) '2.0'\n+755A6 Created OS            03 (3) 'Unix'\n+755A7 Extract Zip Spec      14 (20) '2.0'\n+755A8 Extract OS            00 (0) 'MS-DOS'\n+755A9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74C33 Compression Method    0008 (8) 'Deflated'\n-74C35 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74C39 CRC                   EE49CD50 (3997814096)\n-74C3D Compressed Size       000002D6 (726)\n-74C41 Uncompressed Size     0000075D (1885)\n-74C45 Filename Length       002A (42)\n-74C47 Extra Length          0000 (0)\n-74C49 Comment Length        0000 (0)\n-74C4B Disk Start            0000 (0)\n-74C4D Int File Attributes   0000 (0)\n+755AB Compression Method    0008 (8) 'Deflated'\n+755AD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+755B1 CRC                   EE49CD50 (3997814096)\n+755B5 Compressed Size       000002D6 (726)\n+755B9 Uncompressed Size     0000075D (1885)\n+755BD Filename Length       002A (42)\n+755BF Extra Length          0000 (0)\n+755C1 Comment Length        0000 (0)\n+755C3 Disk Start            0000 (0)\n+755C5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74C4F Ext File Attributes   81A40000 (2175008768)\n+755C7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74C53 Local Header Offset   00035A2C (219692)\n-74C57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+755CB Local Header Offset   00035E7E (220798)\n+755CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74C57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x755CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74C81 CENTRAL HEADER #227   02014B50 (33639248)\n-74C85 Created Zip Spec      14 (20) '2.0'\n-74C86 Created OS            03 (3) 'Unix'\n-74C87 Extract Zip Spec      14 (20) '2.0'\n-74C88 Extract OS            00 (0) 'MS-DOS'\n-74C89 General Purpose Flag  0800 (2048)\n+755F9 CENTRAL HEADER #227   02014B50 (33639248)\n+755FD Created Zip Spec      14 (20) '2.0'\n+755FE Created OS            03 (3) 'Unix'\n+755FF Extract Zip Spec      14 (20) '2.0'\n+75600 Extract OS            00 (0) 'MS-DOS'\n+75601 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74C8B Compression Method    0008 (8) 'Deflated'\n-74C8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74C91 CRC                   4C723E93 (1282555539)\n-74C95 Compressed Size       0000023F (575)\n-74C99 Uncompressed Size     00000432 (1074)\n-74C9D Filename Length       0031 (49)\n-74C9F Extra Length          0000 (0)\n-74CA1 Comment Length        0000 (0)\n-74CA3 Disk Start            0000 (0)\n-74CA5 Int File Attributes   0000 (0)\n+75603 Compression Method    0008 (8) 'Deflated'\n+75605 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75609 CRC                   4C723E93 (1282555539)\n+7560D Compressed Size       0000023F (575)\n+75611 Uncompressed Size     00000432 (1074)\n+75615 Filename Length       0031 (49)\n+75617 Extra Length          0000 (0)\n+75619 Comment Length        0000 (0)\n+7561B Disk Start            0000 (0)\n+7561D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74CA7 Ext File Attributes   81A40000 (2175008768)\n+7561F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74CAB Local Header Offset   00035D4A (220490)\n-74CAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75623 Local Header Offset   0003619C (221596)\n+75627 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74CAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75627: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74CE0 CENTRAL HEADER #228   02014B50 (33639248)\n-74CE4 Created Zip Spec      14 (20) '2.0'\n-74CE5 Created OS            03 (3) 'Unix'\n-74CE6 Extract Zip Spec      14 (20) '2.0'\n-74CE7 Extract OS            00 (0) 'MS-DOS'\n-74CE8 General Purpose Flag  0800 (2048)\n+75658 CENTRAL HEADER #228   02014B50 (33639248)\n+7565C Created Zip Spec      14 (20) '2.0'\n+7565D Created OS            03 (3) 'Unix'\n+7565E Extract Zip Spec      14 (20) '2.0'\n+7565F Extract OS            00 (0) 'MS-DOS'\n+75660 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74CEA Compression Method    0008 (8) 'Deflated'\n-74CEC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74CF0 CRC                   CD3068DB (3442501851)\n-74CF4 Compressed Size       000003A9 (937)\n-74CF8 Uncompressed Size     000008A7 (2215)\n-74CFC Filename Length       003D (61)\n-74CFE Extra Length          0000 (0)\n-74D00 Comment Length        0000 (0)\n-74D02 Disk Start            0000 (0)\n-74D04 Int File Attributes   0000 (0)\n+75662 Compression Method    0008 (8) 'Deflated'\n+75664 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75668 CRC                   CD3068DB (3442501851)\n+7566C Compressed Size       000003A9 (937)\n+75670 Uncompressed Size     000008A7 (2215)\n+75674 Filename Length       003D (61)\n+75676 Extra Length          0000 (0)\n+75678 Comment Length        0000 (0)\n+7567A Disk Start            0000 (0)\n+7567C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74D06 Ext File Attributes   81A40000 (2175008768)\n+7567E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74D0A Local Header Offset   00035FD8 (221144)\n-74D0E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75682 Local Header Offset   0003642A (222250)\n+75686 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74D0E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75686: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74D4B CENTRAL HEADER #229   02014B50 (33639248)\n-74D4F Created Zip Spec      14 (20) '2.0'\n-74D50 Created OS            03 (3) 'Unix'\n-74D51 Extract Zip Spec      14 (20) '2.0'\n-74D52 Extract OS            00 (0) 'MS-DOS'\n-74D53 General Purpose Flag  0800 (2048)\n+756C3 CENTRAL HEADER #229   02014B50 (33639248)\n+756C7 Created Zip Spec      14 (20) '2.0'\n+756C8 Created OS            03 (3) 'Unix'\n+756C9 Extract Zip Spec      14 (20) '2.0'\n+756CA Extract OS            00 (0) 'MS-DOS'\n+756CB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74D55 Compression Method    0008 (8) 'Deflated'\n-74D57 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74D5B CRC                   E601D6EE (3858880238)\n-74D5F Compressed Size       00000326 (806)\n-74D63 Uncompressed Size     00000701 (1793)\n-74D67 Filename Length       003F (63)\n-74D69 Extra Length          0000 (0)\n-74D6B Comment Length        0000 (0)\n-74D6D Disk Start            0000 (0)\n-74D6F Int File Attributes   0000 (0)\n+756CD Compression Method    0008 (8) 'Deflated'\n+756CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+756D3 CRC                   E601D6EE (3858880238)\n+756D7 Compressed Size       00000326 (806)\n+756DB Uncompressed Size     00000701 (1793)\n+756DF Filename Length       003F (63)\n+756E1 Extra Length          0000 (0)\n+756E3 Comment Length        0000 (0)\n+756E5 Disk Start            0000 (0)\n+756E7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74D71 Ext File Attributes   81A40000 (2175008768)\n+756E9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74D75 Local Header Offset   000363DC (222172)\n-74D79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+756ED Local Header Offset   0003682E (223278)\n+756F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74D79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x756F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74DB8 CENTRAL HEADER #230   02014B50 (33639248)\n-74DBC Created Zip Spec      14 (20) '2.0'\n-74DBD Created OS            03 (3) 'Unix'\n-74DBE Extract Zip Spec      14 (20) '2.0'\n-74DBF Extract OS            00 (0) 'MS-DOS'\n-74DC0 General Purpose Flag  0800 (2048)\n+75730 CENTRAL HEADER #230   02014B50 (33639248)\n+75734 Created Zip Spec      14 (20) '2.0'\n+75735 Created OS            03 (3) 'Unix'\n+75736 Extract Zip Spec      14 (20) '2.0'\n+75737 Extract OS            00 (0) 'MS-DOS'\n+75738 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74DC2 Compression Method    0008 (8) 'Deflated'\n-74DC4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74DC8 CRC                   577B6C79 (1467706489)\n-74DCC Compressed Size       00000331 (817)\n-74DD0 Uncompressed Size     000007D4 (2004)\n-74DD4 Filename Length       0037 (55)\n-74DD6 Extra Length          0000 (0)\n-74DD8 Comment Length        0000 (0)\n-74DDA Disk Start            0000 (0)\n-74DDC Int File Attributes   0000 (0)\n+7573A Compression Method    0008 (8) 'Deflated'\n+7573C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75740 CRC                   577B6C79 (1467706489)\n+75744 Compressed Size       00000331 (817)\n+75748 Uncompressed Size     000007D4 (2004)\n+7574C Filename Length       0037 (55)\n+7574E Extra Length          0000 (0)\n+75750 Comment Length        0000 (0)\n+75752 Disk Start            0000 (0)\n+75754 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74DDE Ext File Attributes   81A40000 (2175008768)\n+75756 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74DE2 Local Header Offset   0003675F (223071)\n-74DE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7575A Local Header Offset   00036BB1 (224177)\n+7575E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74DE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7575E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74E1D CENTRAL HEADER #231   02014B50 (33639248)\n-74E21 Created Zip Spec      14 (20) '2.0'\n-74E22 Created OS            03 (3) 'Unix'\n-74E23 Extract Zip Spec      14 (20) '2.0'\n-74E24 Extract OS            00 (0) 'MS-DOS'\n-74E25 General Purpose Flag  0800 (2048)\n+75795 CENTRAL HEADER #231   02014B50 (33639248)\n+75799 Created Zip Spec      14 (20) '2.0'\n+7579A Created OS            03 (3) 'Unix'\n+7579B Extract Zip Spec      14 (20) '2.0'\n+7579C Extract OS            00 (0) 'MS-DOS'\n+7579D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74E27 Compression Method    0008 (8) 'Deflated'\n-74E29 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74E2D CRC                   BF5F9C1E (3210714142)\n-74E31 Compressed Size       00000287 (647)\n-74E35 Uncompressed Size     00000500 (1280)\n-74E39 Filename Length       002C (44)\n-74E3B Extra Length          0000 (0)\n-74E3D Comment Length        0000 (0)\n-74E3F Disk Start            0000 (0)\n-74E41 Int File Attributes   0000 (0)\n+7579F Compression Method    0008 (8) 'Deflated'\n+757A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+757A5 CRC                   BF5F9C1E (3210714142)\n+757A9 Compressed Size       00000287 (647)\n+757AD Uncompressed Size     00000500 (1280)\n+757B1 Filename Length       002C (44)\n+757B3 Extra Length          0000 (0)\n+757B5 Comment Length        0000 (0)\n+757B7 Disk Start            0000 (0)\n+757B9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74E43 Ext File Attributes   81A40000 (2175008768)\n+757BB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74E47 Local Header Offset   00036AE5 (223973)\n-74E4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+757BF Local Header Offset   00036F37 (225079)\n+757C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74E4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x757C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74E77 CENTRAL HEADER #232   02014B50 (33639248)\n-74E7B Created Zip Spec      14 (20) '2.0'\n-74E7C Created OS            03 (3) 'Unix'\n-74E7D Extract Zip Spec      14 (20) '2.0'\n-74E7E Extract OS            00 (0) 'MS-DOS'\n-74E7F General Purpose Flag  0800 (2048)\n+757EF CENTRAL HEADER #232   02014B50 (33639248)\n+757F3 Created Zip Spec      14 (20) '2.0'\n+757F4 Created OS            03 (3) 'Unix'\n+757F5 Extract Zip Spec      14 (20) '2.0'\n+757F6 Extract OS            00 (0) 'MS-DOS'\n+757F7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74E81 Compression Method    0008 (8) 'Deflated'\n-74E83 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74E87 CRC                   5E930431 (1586693169)\n-74E8B Compressed Size       0000034F (847)\n-74E8F Uncompressed Size     000008C7 (2247)\n-74E93 Filename Length       003A (58)\n-74E95 Extra Length          0000 (0)\n-74E97 Comment Length        0000 (0)\n-74E99 Disk Start            0000 (0)\n-74E9B Int File Attributes   0000 (0)\n+757F9 Compression Method    0008 (8) 'Deflated'\n+757FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+757FF CRC                   6A2AB119 (1781182745)\n+75803 Compressed Size       00000354 (852)\n+75807 Uncompressed Size     00000908 (2312)\n+7580B Filename Length       003A (58)\n+7580D Extra Length          0000 (0)\n+7580F Comment Length        0000 (0)\n+75811 Disk Start            0000 (0)\n+75813 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74E9D Ext File Attributes   81A40000 (2175008768)\n+75815 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74EA1 Local Header Offset   00036DB6 (224694)\n-74EA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75819 Local Header Offset   00037208 (225800)\n+7581D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74EA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7581D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74EDF CENTRAL HEADER #233   02014B50 (33639248)\n-74EE3 Created Zip Spec      14 (20) '2.0'\n-74EE4 Created OS            03 (3) 'Unix'\n-74EE5 Extract Zip Spec      14 (20) '2.0'\n-74EE6 Extract OS            00 (0) 'MS-DOS'\n-74EE7 General Purpose Flag  0800 (2048)\n+75857 CENTRAL HEADER #233   02014B50 (33639248)\n+7585B Created Zip Spec      14 (20) '2.0'\n+7585C Created OS            03 (3) 'Unix'\n+7585D Extract Zip Spec      14 (20) '2.0'\n+7585E Extract OS            00 (0) 'MS-DOS'\n+7585F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74EE9 Compression Method    0008 (8) 'Deflated'\n-74EEB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74EEF CRC                   54C421FF (1422139903)\n-74EF3 Compressed Size       00000358 (856)\n-74EF7 Uncompressed Size     00000739 (1849)\n-74EFB Filename Length       0039 (57)\n-74EFD Extra Length          0000 (0)\n-74EFF Comment Length        0000 (0)\n-74F01 Disk Start            0000 (0)\n-74F03 Int File Attributes   0000 (0)\n+75861 Compression Method    0008 (8) 'Deflated'\n+75863 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75867 CRC                   19AC3747 (430716743)\n+7586B Compressed Size       00000362 (866)\n+7586F Uncompressed Size     0000076E (1902)\n+75873 Filename Length       0039 (57)\n+75875 Extra Length          0000 (0)\n+75877 Comment Length        0000 (0)\n+75879 Disk Start            0000 (0)\n+7587B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74F05 Ext File Attributes   81A40000 (2175008768)\n+7587D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74F09 Local Header Offset   0003715D (225629)\n-74F0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75881 Local Header Offset   000375B4 (226740)\n+75885 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74F0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75885: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74F46 CENTRAL HEADER #234   02014B50 (33639248)\n-74F4A Created Zip Spec      14 (20) '2.0'\n-74F4B Created OS            03 (3) 'Unix'\n-74F4C Extract Zip Spec      14 (20) '2.0'\n-74F4D Extract OS            00 (0) 'MS-DOS'\n-74F4E General Purpose Flag  0800 (2048)\n+758BE CENTRAL HEADER #234   02014B50 (33639248)\n+758C2 Created Zip Spec      14 (20) '2.0'\n+758C3 Created OS            03 (3) 'Unix'\n+758C4 Extract Zip Spec      14 (20) '2.0'\n+758C5 Extract OS            00 (0) 'MS-DOS'\n+758C6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74F50 Compression Method    0008 (8) 'Deflated'\n-74F52 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74F56 CRC                   DFEE0135 (3756917045)\n-74F5A Compressed Size       00000330 (816)\n-74F5E Uncompressed Size     0000098D (2445)\n-74F62 Filename Length       0037 (55)\n-74F64 Extra Length          0000 (0)\n-74F66 Comment Length        0000 (0)\n-74F68 Disk Start            0000 (0)\n-74F6A Int File Attributes   0000 (0)\n+758C8 Compression Method    0008 (8) 'Deflated'\n+758CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+758CE CRC                   DFEE0135 (3756917045)\n+758D2 Compressed Size       00000330 (816)\n+758D6 Uncompressed Size     0000098D (2445)\n+758DA Filename Length       0037 (55)\n+758DC Extra Length          0000 (0)\n+758DE Comment Length        0000 (0)\n+758E0 Disk Start            0000 (0)\n+758E2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74F6C Ext File Attributes   81A40000 (2175008768)\n+758E4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74F70 Local Header Offset   0003750C (226572)\n-74F74 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+758E8 Local Header Offset   0003796D (227693)\n+758EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74F74: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x758EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74FAB CENTRAL HEADER #235   02014B50 (33639248)\n-74FAF Created Zip Spec      14 (20) '2.0'\n-74FB0 Created OS            03 (3) 'Unix'\n-74FB1 Extract Zip Spec      14 (20) '2.0'\n-74FB2 Extract OS            00 (0) 'MS-DOS'\n-74FB3 General Purpose Flag  0800 (2048)\n+75923 CENTRAL HEADER #235   02014B50 (33639248)\n+75927 Created Zip Spec      14 (20) '2.0'\n+75928 Created OS            03 (3) 'Unix'\n+75929 Extract Zip Spec      14 (20) '2.0'\n+7592A Extract OS            00 (0) 'MS-DOS'\n+7592B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-74FB5 Compression Method    0008 (8) 'Deflated'\n-74FB7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74FBB CRC                   F7472DA9 (4148637097)\n-74FBF Compressed Size       00000722 (1826)\n-74FC3 Uncompressed Size     00001AF8 (6904)\n-74FC7 Filename Length       003C (60)\n-74FC9 Extra Length          0000 (0)\n-74FCB Comment Length        0000 (0)\n-74FCD Disk Start            0000 (0)\n-74FCF Int File Attributes   0000 (0)\n+7592D Compression Method    0008 (8) 'Deflated'\n+7592F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75933 CRC                   E4E72DDD (3840355805)\n+75937 Compressed Size       0000072D (1837)\n+7593B Uncompressed Size     00001BBE (7102)\n+7593F Filename Length       003C (60)\n+75941 Extra Length          0000 (0)\n+75943 Comment Length        0000 (0)\n+75945 Disk Start            0000 (0)\n+75947 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-74FD1 Ext File Attributes   81A40000 (2175008768)\n+75949 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-74FD5 Local Header Offset   00037891 (227473)\n-74FD9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7594D Local Header Offset   00037CF2 (228594)\n+75951 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74FD9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75951: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75015 CENTRAL HEADER #236   02014B50 (33639248)\n-75019 Created Zip Spec      14 (20) '2.0'\n-7501A Created OS            03 (3) 'Unix'\n-7501B Extract Zip Spec      14 (20) '2.0'\n-7501C Extract OS            00 (0) 'MS-DOS'\n-7501D General Purpose Flag  0800 (2048)\n+7598D CENTRAL HEADER #236   02014B50 (33639248)\n+75991 Created Zip Spec      14 (20) '2.0'\n+75992 Created OS            03 (3) 'Unix'\n+75993 Extract Zip Spec      14 (20) '2.0'\n+75994 Extract OS            00 (0) 'MS-DOS'\n+75995 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7501F Compression Method    0008 (8) 'Deflated'\n-75021 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75025 CRC                   17B25B54 (397564756)\n-75029 Compressed Size       00000613 (1555)\n-7502D Uncompressed Size     00001558 (5464)\n-75031 Filename Length       003F (63)\n-75033 Extra Length          0000 (0)\n-75035 Comment Length        0000 (0)\n-75037 Disk Start            0000 (0)\n-75039 Int File Attributes   0000 (0)\n+75997 Compression Method    0008 (8) 'Deflated'\n+75999 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7599D CRC                   5E80C56B (1585497451)\n+759A1 Compressed Size       0000061E (1566)\n+759A5 Uncompressed Size     000015FF (5631)\n+759A9 Filename Length       003F (63)\n+759AB Extra Length          0000 (0)\n+759AD Comment Length        0000 (0)\n+759AF Disk Start            0000 (0)\n+759B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7503B Ext File Attributes   81A40000 (2175008768)\n+759B3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7503F Local Header Offset   0003800D (229389)\n-75043 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+759B7 Local Header Offset   00038479 (230521)\n+759BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75043: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x759BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75082 CENTRAL HEADER #237   02014B50 (33639248)\n-75086 Created Zip Spec      14 (20) '2.0'\n-75087 Created OS            03 (3) 'Unix'\n-75088 Extract Zip Spec      14 (20) '2.0'\n-75089 Extract OS            00 (0) 'MS-DOS'\n-7508A General Purpose Flag  0800 (2048)\n+759FA CENTRAL HEADER #237   02014B50 (33639248)\n+759FE Created Zip Spec      14 (20) '2.0'\n+759FF Created OS            03 (3) 'Unix'\n+75A00 Extract Zip Spec      14 (20) '2.0'\n+75A01 Extract OS            00 (0) 'MS-DOS'\n+75A02 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7508C Compression Method    0008 (8) 'Deflated'\n-7508E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75092 CRC                   9C1B711A (2619044122)\n-75096 Compressed Size       000002EE (750)\n-7509A Uncompressed Size     0000065E (1630)\n-7509E Filename Length       0043 (67)\n-750A0 Extra Length          0000 (0)\n-750A2 Comment Length        0000 (0)\n-750A4 Disk Start            0000 (0)\n-750A6 Int File Attributes   0000 (0)\n+75A04 Compression Method    0008 (8) 'Deflated'\n+75A06 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75A0A CRC                   D1666DFC (3513150972)\n+75A0E Compressed Size       000002F6 (758)\n+75A12 Uncompressed Size     0000068D (1677)\n+75A16 Filename Length       0043 (67)\n+75A18 Extra Length          0000 (0)\n+75A1A Comment Length        0000 (0)\n+75A1C Disk Start            0000 (0)\n+75A1E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-750A8 Ext File Attributes   81A40000 (2175008768)\n+75A20 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-750AC Local Header Offset   0003867D (231037)\n-750B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75A24 Local Header Offset   00038AF4 (232180)\n+75A28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x750B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75A28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-750F3 CENTRAL HEADER #238   02014B50 (33639248)\n-750F7 Created Zip Spec      14 (20) '2.0'\n-750F8 Created OS            03 (3) 'Unix'\n-750F9 Extract Zip Spec      14 (20) '2.0'\n-750FA Extract OS            00 (0) 'MS-DOS'\n-750FB General Purpose Flag  0800 (2048)\n+75A6B CENTRAL HEADER #238   02014B50 (33639248)\n+75A6F Created Zip Spec      14 (20) '2.0'\n+75A70 Created OS            03 (3) 'Unix'\n+75A71 Extract Zip Spec      14 (20) '2.0'\n+75A72 Extract OS            00 (0) 'MS-DOS'\n+75A73 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-750FD Compression Method    0008 (8) 'Deflated'\n-750FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75103 CRC                   8247BF31 (2185740081)\n-75107 Compressed Size       000002AF (687)\n-7510B Uncompressed Size     0000054B (1355)\n-7510F Filename Length       0032 (50)\n-75111 Extra Length          0000 (0)\n-75113 Comment Length        0000 (0)\n-75115 Disk Start            0000 (0)\n-75117 Int File Attributes   0000 (0)\n+75A75 Compression Method    0008 (8) 'Deflated'\n+75A77 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75A7B CRC                   25E239BD (635582909)\n+75A7F Compressed Size       000002B9 (697)\n+75A83 Uncompressed Size     00000575 (1397)\n+75A87 Filename Length       0032 (50)\n+75A89 Extra Length          0000 (0)\n+75A8B Comment Length        0000 (0)\n+75A8D Disk Start            0000 (0)\n+75A8F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75119 Ext File Attributes   81A40000 (2175008768)\n+75A91 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7511D Local Header Offset   000389CC (231884)\n-75121 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75A95 Local Header Offset   00038E4B (233035)\n+75A99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75121: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75A99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75153 CENTRAL HEADER #239   02014B50 (33639248)\n-75157 Created Zip Spec      14 (20) '2.0'\n-75158 Created OS            03 (3) 'Unix'\n-75159 Extract Zip Spec      14 (20) '2.0'\n-7515A Extract OS            00 (0) 'MS-DOS'\n-7515B General Purpose Flag  0800 (2048)\n+75ACB CENTRAL HEADER #239   02014B50 (33639248)\n+75ACF Created Zip Spec      14 (20) '2.0'\n+75AD0 Created OS            03 (3) 'Unix'\n+75AD1 Extract Zip Spec      14 (20) '2.0'\n+75AD2 Extract OS            00 (0) 'MS-DOS'\n+75AD3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7515D Compression Method    0008 (8) 'Deflated'\n-7515F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75163 CRC                   8DDA963E (2379912766)\n-75167 Compressed Size       000008EC (2284)\n-7516B Uncompressed Size     00001A95 (6805)\n-7516F Filename Length       003A (58)\n-75171 Extra Length          0000 (0)\n-75173 Comment Length        0000 (0)\n-75175 Disk Start            0000 (0)\n-75177 Int File Attributes   0000 (0)\n+75AD5 Compression Method    0008 (8) 'Deflated'\n+75AD7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75ADB CRC                   6E8E196C (1854806380)\n+75ADF Compressed Size       000008FC (2300)\n+75AE3 Uncompressed Size     00001B5F (7007)\n+75AE7 Filename Length       003A (58)\n+75AE9 Extra Length          0000 (0)\n+75AEB Comment Length        0000 (0)\n+75AED Disk Start            0000 (0)\n+75AEF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75179 Ext File Attributes   81A40000 (2175008768)\n+75AF1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7517D Local Header Offset   00038CCB (232651)\n-75181 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75AF5 Local Header Offset   00039154 (233812)\n+75AF9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75181: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75AF9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-751BB CENTRAL HEADER #240   02014B50 (33639248)\n-751BF Created Zip Spec      14 (20) '2.0'\n-751C0 Created OS            03 (3) 'Unix'\n-751C1 Extract Zip Spec      14 (20) '2.0'\n-751C2 Extract OS            00 (0) 'MS-DOS'\n-751C3 General Purpose Flag  0800 (2048)\n+75B33 CENTRAL HEADER #240   02014B50 (33639248)\n+75B37 Created Zip Spec      14 (20) '2.0'\n+75B38 Created OS            03 (3) 'Unix'\n+75B39 Extract Zip Spec      14 (20) '2.0'\n+75B3A Extract OS            00 (0) 'MS-DOS'\n+75B3B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-751C5 Compression Method    0008 (8) 'Deflated'\n-751C7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-751CB CRC                   A445CFD0 (2756038608)\n-751CF Compressed Size       00000303 (771)\n-751D3 Uncompressed Size     0000090C (2316)\n-751D7 Filename Length       004D (77)\n-751D9 Extra Length          0000 (0)\n-751DB Comment Length        0000 (0)\n-751DD Disk Start            0000 (0)\n-751DF Int File Attributes   0000 (0)\n+75B3D Compression Method    0008 (8) 'Deflated'\n+75B3F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75B43 CRC                   4F941D99 (1335106969)\n+75B47 Compressed Size       0000030B (779)\n+75B4B Uncompressed Size     0000094D (2381)\n+75B4F Filename Length       004D (77)\n+75B51 Extra Length          0000 (0)\n+75B53 Comment Length        0000 (0)\n+75B55 Disk Start            0000 (0)\n+75B57 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-751E1 Ext File Attributes   81A40000 (2175008768)\n+75B59 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-751E5 Local Header Offset   0003960F (235023)\n-751E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75B5D Local Header Offset   00039AA8 (236200)\n+75B61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x751E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75B61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75236 CENTRAL HEADER #241   02014B50 (33639248)\n-7523A Created Zip Spec      14 (20) '2.0'\n-7523B Created OS            03 (3) 'Unix'\n-7523C Extract Zip Spec      14 (20) '2.0'\n-7523D Extract OS            00 (0) 'MS-DOS'\n-7523E General Purpose Flag  0800 (2048)\n+75BAE CENTRAL HEADER #241   02014B50 (33639248)\n+75BB2 Created Zip Spec      14 (20) '2.0'\n+75BB3 Created OS            03 (3) 'Unix'\n+75BB4 Extract Zip Spec      14 (20) '2.0'\n+75BB5 Extract OS            00 (0) 'MS-DOS'\n+75BB6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75240 Compression Method    0008 (8) 'Deflated'\n-75242 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75246 CRC                   0A4E202C (172892204)\n-7524A Compressed Size       0000028F (655)\n-7524E Uncompressed Size     000004DB (1243)\n-75252 Filename Length       0046 (70)\n-75254 Extra Length          0000 (0)\n-75256 Comment Length        0000 (0)\n-75258 Disk Start            0000 (0)\n-7525A Int File Attributes   0000 (0)\n+75BB8 Compression Method    0008 (8) 'Deflated'\n+75BBA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75BBE CRC                   9F5D6B51 (2673699665)\n+75BC2 Compressed Size       00000297 (663)\n+75BC6 Uncompressed Size     00000501 (1281)\n+75BCA Filename Length       0046 (70)\n+75BCC Extra Length          0000 (0)\n+75BCE Comment Length        0000 (0)\n+75BD0 Disk Start            0000 (0)\n+75BD2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7525C Ext File Attributes   81A40000 (2175008768)\n+75BD4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75260 Local Header Offset   0003997D (235901)\n-75264 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75BD8 Local Header Offset   00039E1E (237086)\n+75BDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75264: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75BDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-752AA CENTRAL HEADER #242   02014B50 (33639248)\n-752AE Created Zip Spec      14 (20) '2.0'\n-752AF Created OS            03 (3) 'Unix'\n-752B0 Extract Zip Spec      14 (20) '2.0'\n-752B1 Extract OS            00 (0) 'MS-DOS'\n-752B2 General Purpose Flag  0800 (2048)\n+75C22 CENTRAL HEADER #242   02014B50 (33639248)\n+75C26 Created Zip Spec      14 (20) '2.0'\n+75C27 Created OS            03 (3) 'Unix'\n+75C28 Extract Zip Spec      14 (20) '2.0'\n+75C29 Extract OS            00 (0) 'MS-DOS'\n+75C2A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-752B4 Compression Method    0008 (8) 'Deflated'\n-752B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-752BA CRC                   6D3F9D1E (1832885534)\n-752BE Compressed Size       000008A8 (2216)\n-752C2 Uncompressed Size     00001E30 (7728)\n-752C6 Filename Length       0049 (73)\n-752C8 Extra Length          0000 (0)\n-752CA Comment Length        0000 (0)\n-752CC Disk Start            0000 (0)\n-752CE Int File Attributes   0000 (0)\n+75C2C Compression Method    0008 (8) 'Deflated'\n+75C2E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75C32 CRC                   C15BEF93 (3244027795)\n+75C36 Compressed Size       000008B8 (2232)\n+75C3A Uncompressed Size     00001EDF (7903)\n+75C3E Filename Length       0049 (73)\n+75C40 Extra Length          0000 (0)\n+75C42 Comment Length        0000 (0)\n+75C44 Disk Start            0000 (0)\n+75C46 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-752D0 Ext File Attributes   81A40000 (2175008768)\n+75C48 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-752D4 Local Header Offset   00039C70 (236656)\n-752D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75C4C Local Header Offset   0003A119 (237849)\n+75C50 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x752D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75C50: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75321 CENTRAL HEADER #243   02014B50 (33639248)\n-75325 Created Zip Spec      14 (20) '2.0'\n-75326 Created OS            03 (3) 'Unix'\n-75327 Extract Zip Spec      14 (20) '2.0'\n-75328 Extract OS            00 (0) 'MS-DOS'\n-75329 General Purpose Flag  0800 (2048)\n+75C99 CENTRAL HEADER #243   02014B50 (33639248)\n+75C9D Created Zip Spec      14 (20) '2.0'\n+75C9E Created OS            03 (3) 'Unix'\n+75C9F Extract Zip Spec      14 (20) '2.0'\n+75CA0 Extract OS            00 (0) 'MS-DOS'\n+75CA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7532B Compression Method    0008 (8) 'Deflated'\n-7532D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75331 CRC                   355480AB (894730411)\n-75335 Compressed Size       00000414 (1044)\n-75339 Uncompressed Size     00000919 (2329)\n-7533D Filename Length       0042 (66)\n-7533F Extra Length          0000 (0)\n-75341 Comment Length        0000 (0)\n-75343 Disk Start            0000 (0)\n-75345 Int File Attributes   0000 (0)\n+75CA3 Compression Method    0008 (8) 'Deflated'\n+75CA5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75CA9 CRC                   EF70124F (4017099343)\n+75CAD Compressed Size       00000421 (1057)\n+75CB1 Uncompressed Size     00000960 (2400)\n+75CB5 Filename Length       0042 (66)\n+75CB7 Extra Length          0000 (0)\n+75CB9 Comment Length        0000 (0)\n+75CBB Disk Start            0000 (0)\n+75CBD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75347 Ext File Attributes   81A40000 (2175008768)\n+75CBF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7534B Local Header Offset   0003A57F (238975)\n-7534F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75CC3 Local Header Offset   0003AA38 (240184)\n+75CC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7534F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75CC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75391 CENTRAL HEADER #244   02014B50 (33639248)\n-75395 Created Zip Spec      14 (20) '2.0'\n-75396 Created OS            03 (3) 'Unix'\n-75397 Extract Zip Spec      14 (20) '2.0'\n-75398 Extract OS            00 (0) 'MS-DOS'\n-75399 General Purpose Flag  0800 (2048)\n+75D09 CENTRAL HEADER #244   02014B50 (33639248)\n+75D0D Created Zip Spec      14 (20) '2.0'\n+75D0E Created OS            03 (3) 'Unix'\n+75D0F Extract Zip Spec      14 (20) '2.0'\n+75D10 Extract OS            00 (0) 'MS-DOS'\n+75D11 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7539B Compression Method    0008 (8) 'Deflated'\n-7539D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-753A1 CRC                   47FCDE13 (1207754259)\n-753A5 Compressed Size       00000343 (835)\n-753A9 Uncompressed Size     000007FA (2042)\n-753AD Filename Length       0034 (52)\n-753AF Extra Length          0000 (0)\n-753B1 Comment Length        0000 (0)\n-753B3 Disk Start            0000 (0)\n-753B5 Int File Attributes   0000 (0)\n+75D13 Compression Method    0008 (8) 'Deflated'\n+75D15 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75D19 CRC                   B2FA49D8 (3002747352)\n+75D1D Compressed Size       0000034B (843)\n+75D21 Uncompressed Size     0000083C (2108)\n+75D25 Filename Length       0034 (52)\n+75D27 Extra Length          0000 (0)\n+75D29 Comment Length        0000 (0)\n+75D2B Disk Start            0000 (0)\n+75D2D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-753B7 Ext File Attributes   81A40000 (2175008768)\n+75D2F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-753BB Local Header Offset   0003A9F3 (240115)\n-753BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75D33 Local Header Offset   0003AEB9 (241337)\n+75D37 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x753BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75D37: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-753F3 CENTRAL HEADER #245   02014B50 (33639248)\n-753F7 Created Zip Spec      14 (20) '2.0'\n-753F8 Created OS            03 (3) 'Unix'\n-753F9 Extract Zip Spec      14 (20) '2.0'\n-753FA Extract OS            00 (0) 'MS-DOS'\n-753FB General Purpose Flag  0800 (2048)\n+75D6B CENTRAL HEADER #245   02014B50 (33639248)\n+75D6F Created Zip Spec      14 (20) '2.0'\n+75D70 Created OS            03 (3) 'Unix'\n+75D71 Extract Zip Spec      14 (20) '2.0'\n+75D72 Extract OS            00 (0) 'MS-DOS'\n+75D73 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-753FD Compression Method    0008 (8) 'Deflated'\n-753FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75403 CRC                   A9E4FF87 (2850357127)\n-75407 Compressed Size       0000080E (2062)\n-7540B Uncompressed Size     00001767 (5991)\n-7540F Filename Length       0045 (69)\n-75411 Extra Length          0000 (0)\n-75413 Comment Length        0000 (0)\n-75415 Disk Start            0000 (0)\n-75417 Int File Attributes   0000 (0)\n+75D75 Compression Method    0008 (8) 'Deflated'\n+75D77 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75D7B CRC                   A9E4FF87 (2850357127)\n+75D7F Compressed Size       0000080E (2062)\n+75D83 Uncompressed Size     00001767 (5991)\n+75D87 Filename Length       0045 (69)\n+75D89 Extra Length          0000 (0)\n+75D8B Comment Length        0000 (0)\n+75D8D Disk Start            0000 (0)\n+75D8F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75419 Ext File Attributes   81A40000 (2175008768)\n+75D91 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7541D Local Header Offset   0003AD88 (241032)\n-75421 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75D95 Local Header Offset   0003B256 (242262)\n+75D99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75421: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75D99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75466 CENTRAL HEADER #246   02014B50 (33639248)\n-7546A Created Zip Spec      14 (20) '2.0'\n-7546B Created OS            03 (3) 'Unix'\n-7546C Extract Zip Spec      14 (20) '2.0'\n-7546D Extract OS            00 (0) 'MS-DOS'\n-7546E General Purpose Flag  0800 (2048)\n+75DDE CENTRAL HEADER #246   02014B50 (33639248)\n+75DE2 Created Zip Spec      14 (20) '2.0'\n+75DE3 Created OS            03 (3) 'Unix'\n+75DE4 Extract Zip Spec      14 (20) '2.0'\n+75DE5 Extract OS            00 (0) 'MS-DOS'\n+75DE6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75470 Compression Method    0008 (8) 'Deflated'\n-75472 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75476 CRC                   7C2CDC15 (2083314709)\n-7547A Compressed Size       00000444 (1092)\n-7547E Uncompressed Size     00000C7D (3197)\n-75482 Filename Length       0047 (71)\n-75484 Extra Length          0000 (0)\n-75486 Comment Length        0000 (0)\n-75488 Disk Start            0000 (0)\n-7548A Int File Attributes   0000 (0)\n+75DE8 Compression Method    0008 (8) 'Deflated'\n+75DEA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75DEE CRC                   7C2CDC15 (2083314709)\n+75DF2 Compressed Size       00000444 (1092)\n+75DF6 Uncompressed Size     00000C7D (3197)\n+75DFA Filename Length       0047 (71)\n+75DFC Extra Length          0000 (0)\n+75DFE Comment Length        0000 (0)\n+75E00 Disk Start            0000 (0)\n+75E02 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7548C Ext File Attributes   81A40000 (2175008768)\n+75E04 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75490 Local Header Offset   0003B5F9 (243193)\n-75494 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75E08 Local Header Offset   0003BAC7 (244423)\n+75E0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75494: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75E0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-754DB CENTRAL HEADER #247   02014B50 (33639248)\n-754DF Created Zip Spec      14 (20) '2.0'\n-754E0 Created OS            03 (3) 'Unix'\n-754E1 Extract Zip Spec      14 (20) '2.0'\n-754E2 Extract OS            00 (0) 'MS-DOS'\n-754E3 General Purpose Flag  0800 (2048)\n+75E53 CENTRAL HEADER #247   02014B50 (33639248)\n+75E57 Created Zip Spec      14 (20) '2.0'\n+75E58 Created OS            03 (3) 'Unix'\n+75E59 Extract Zip Spec      14 (20) '2.0'\n+75E5A Extract OS            00 (0) 'MS-DOS'\n+75E5B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-754E5 Compression Method    0008 (8) 'Deflated'\n-754E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-754EB CRC                   DF3FC6E9 (3745498857)\n-754EF Compressed Size       00000418 (1048)\n-754F3 Uncompressed Size     00000BC1 (3009)\n-754F7 Filename Length       0045 (69)\n-754F9 Extra Length          0000 (0)\n-754FB Comment Length        0000 (0)\n-754FD Disk Start            0000 (0)\n-754FF Int File Attributes   0000 (0)\n+75E5D Compression Method    0008 (8) 'Deflated'\n+75E5F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75E63 CRC                   C7D99F04 (3352928004)\n+75E67 Compressed Size       00000423 (1059)\n+75E6B Uncompressed Size     00000C02 (3074)\n+75E6F Filename Length       0045 (69)\n+75E71 Extra Length          0000 (0)\n+75E73 Comment Length        0000 (0)\n+75E75 Disk Start            0000 (0)\n+75E77 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75501 Ext File Attributes   81A40000 (2175008768)\n+75E79 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75505 Local Header Offset   0003BAA2 (244386)\n-75509 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75E7D Local Header Offset   0003BF70 (245616)\n+75E81 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75509: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75E81: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7554E CENTRAL HEADER #248   02014B50 (33639248)\n-75552 Created Zip Spec      14 (20) '2.0'\n-75553 Created OS            03 (3) 'Unix'\n-75554 Extract Zip Spec      14 (20) '2.0'\n-75555 Extract OS            00 (0) 'MS-DOS'\n-75556 General Purpose Flag  0800 (2048)\n+75EC6 CENTRAL HEADER #248   02014B50 (33639248)\n+75ECA Created Zip Spec      14 (20) '2.0'\n+75ECB Created OS            03 (3) 'Unix'\n+75ECC Extract Zip Spec      14 (20) '2.0'\n+75ECD Extract OS            00 (0) 'MS-DOS'\n+75ECE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75558 Compression Method    0008 (8) 'Deflated'\n-7555A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7555E CRC                   B7E8049A (3085436058)\n-75562 Compressed Size       00000487 (1159)\n-75566 Uncompressed Size     00000CBE (3262)\n-7556A Filename Length       004D (77)\n-7556C Extra Length          0000 (0)\n-7556E Comment Length        0000 (0)\n-75570 Disk Start            0000 (0)\n-75572 Int File Attributes   0000 (0)\n+75ED0 Compression Method    0008 (8) 'Deflated'\n+75ED2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75ED6 CRC                   B7E8049A (3085436058)\n+75EDA Compressed Size       00000487 (1159)\n+75EDE Uncompressed Size     00000CBE (3262)\n+75EE2 Filename Length       004D (77)\n+75EE4 Extra Length          0000 (0)\n+75EE6 Comment Length        0000 (0)\n+75EE8 Disk Start            0000 (0)\n+75EEA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75574 Ext File Attributes   81A40000 (2175008768)\n+75EEC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75578 Local Header Offset   0003BF1D (245533)\n-7557C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75EF0 Local Header Offset   0003C3F6 (246774)\n+75EF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7557C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75EF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-755C9 CENTRAL HEADER #249   02014B50 (33639248)\n-755CD Created Zip Spec      14 (20) '2.0'\n-755CE Created OS            03 (3) 'Unix'\n-755CF Extract Zip Spec      14 (20) '2.0'\n-755D0 Extract OS            00 (0) 'MS-DOS'\n-755D1 General Purpose Flag  0800 (2048)\n+75F41 CENTRAL HEADER #249   02014B50 (33639248)\n+75F45 Created Zip Spec      14 (20) '2.0'\n+75F46 Created OS            03 (3) 'Unix'\n+75F47 Extract Zip Spec      14 (20) '2.0'\n+75F48 Extract OS            00 (0) 'MS-DOS'\n+75F49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-755D3 Compression Method    0008 (8) 'Deflated'\n-755D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-755D9 CRC                   365FEBC7 (912255943)\n-755DD Compressed Size       000004A6 (1190)\n-755E1 Uncompressed Size     00000B87 (2951)\n-755E5 Filename Length       003F (63)\n-755E7 Extra Length          0000 (0)\n-755E9 Comment Length        0000 (0)\n-755EB Disk Start            0000 (0)\n-755ED Int File Attributes   0000 (0)\n+75F4B Compression Method    0008 (8) 'Deflated'\n+75F4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75F51 CRC                   365FEBC7 (912255943)\n+75F55 Compressed Size       000004A6 (1190)\n+75F59 Uncompressed Size     00000B87 (2951)\n+75F5D Filename Length       003F (63)\n+75F5F Extra Length          0000 (0)\n+75F61 Comment Length        0000 (0)\n+75F63 Disk Start            0000 (0)\n+75F65 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-755EF Ext File Attributes   81A40000 (2175008768)\n+75F67 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-755F3 Local Header Offset   0003C40F (246799)\n-755F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75F6B Local Header Offset   0003C8E8 (248040)\n+75F6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x755F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75F6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75636 CENTRAL HEADER #250   02014B50 (33639248)\n-7563A Created Zip Spec      14 (20) '2.0'\n-7563B Created OS            03 (3) 'Unix'\n-7563C Extract Zip Spec      14 (20) '2.0'\n-7563D Extract OS            00 (0) 'MS-DOS'\n-7563E General Purpose Flag  0800 (2048)\n+75FAE CENTRAL HEADER #250   02014B50 (33639248)\n+75FB2 Created Zip Spec      14 (20) '2.0'\n+75FB3 Created OS            03 (3) 'Unix'\n+75FB4 Extract Zip Spec      14 (20) '2.0'\n+75FB5 Extract OS            00 (0) 'MS-DOS'\n+75FB6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75640 Compression Method    0008 (8) 'Deflated'\n-75642 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75646 CRC                   3EDDC0EF (1054720239)\n-7564A Compressed Size       000003D8 (984)\n-7564E Uncompressed Size     00000AA3 (2723)\n-75652 Filename Length       0045 (69)\n-75654 Extra Length          0000 (0)\n-75656 Comment Length        0000 (0)\n-75658 Disk Start            0000 (0)\n-7565A Int File Attributes   0000 (0)\n+75FB8 Compression Method    0008 (8) 'Deflated'\n+75FBA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75FBE CRC                   3EDDC0EF (1054720239)\n+75FC2 Compressed Size       000003D8 (984)\n+75FC6 Uncompressed Size     00000AA3 (2723)\n+75FCA Filename Length       0045 (69)\n+75FCC Extra Length          0000 (0)\n+75FCE Comment Length        0000 (0)\n+75FD0 Disk Start            0000 (0)\n+75FD2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7565C Ext File Attributes   81A40000 (2175008768)\n+75FD4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75660 Local Header Offset   0003C912 (248082)\n-75664 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75FD8 Local Header Offset   0003CDEB (249323)\n+75FDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75664: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75FDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-756A9 CENTRAL HEADER #251   02014B50 (33639248)\n-756AD Created Zip Spec      14 (20) '2.0'\n-756AE Created OS            03 (3) 'Unix'\n-756AF Extract Zip Spec      14 (20) '2.0'\n-756B0 Extract OS            00 (0) 'MS-DOS'\n-756B1 General Purpose Flag  0800 (2048)\n+76021 CENTRAL HEADER #251   02014B50 (33639248)\n+76025 Created Zip Spec      14 (20) '2.0'\n+76026 Created OS            03 (3) 'Unix'\n+76027 Extract Zip Spec      14 (20) '2.0'\n+76028 Extract OS            00 (0) 'MS-DOS'\n+76029 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-756B3 Compression Method    0008 (8) 'Deflated'\n-756B5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-756B9 CRC                   25691E02 (627645954)\n-756BD Compressed Size       00000405 (1029)\n-756C1 Uncompressed Size     00000B75 (2933)\n-756C5 Filename Length       0049 (73)\n-756C7 Extra Length          0000 (0)\n-756C9 Comment Length        0000 (0)\n-756CB Disk Start            0000 (0)\n-756CD Int File Attributes   0000 (0)\n+7602B Compression Method    0008 (8) 'Deflated'\n+7602D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76031 CRC                   9B40567E (2604684926)\n+76035 Compressed Size       0000040D (1037)\n+76039 Uncompressed Size     00000BB0 (2992)\n+7603D Filename Length       0049 (73)\n+7603F Extra Length          0000 (0)\n+76041 Comment Length        0000 (0)\n+76043 Disk Start            0000 (0)\n+76045 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-756CF Ext File Attributes   81A40000 (2175008768)\n+76047 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-756D3 Local Header Offset   0003CD4D (249165)\n-756D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7604B Local Header Offset   0003D226 (250406)\n+7604F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x756D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7604F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75720 CENTRAL HEADER #252   02014B50 (33639248)\n-75724 Created Zip Spec      14 (20) '2.0'\n-75725 Created OS            03 (3) 'Unix'\n-75726 Extract Zip Spec      14 (20) '2.0'\n-75727 Extract OS            00 (0) 'MS-DOS'\n-75728 General Purpose Flag  0800 (2048)\n+76098 CENTRAL HEADER #252   02014B50 (33639248)\n+7609C Created Zip Spec      14 (20) '2.0'\n+7609D Created OS            03 (3) 'Unix'\n+7609E Extract Zip Spec      14 (20) '2.0'\n+7609F Extract OS            00 (0) 'MS-DOS'\n+760A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7572A Compression Method    0008 (8) 'Deflated'\n-7572C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75730 CRC                   15C91CF2 (365501682)\n-75734 Compressed Size       00001C34 (7220)\n-75738 Uncompressed Size     000079B9 (31161)\n-7573C Filename Length       0033 (51)\n-7573E Extra Length          0000 (0)\n-75740 Comment Length        0000 (0)\n-75742 Disk Start            0000 (0)\n-75744 Int File Attributes   0000 (0)\n+760A2 Compression Method    0008 (8) 'Deflated'\n+760A4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+760A8 CRC                   6BA20F13 (1805782803)\n+760AC Compressed Size       00001C52 (7250)\n+760B0 Uncompressed Size     00007CE7 (31975)\n+760B4 Filename Length       0033 (51)\n+760B6 Extra Length          0000 (0)\n+760B8 Comment Length        0000 (0)\n+760BA Disk Start            0000 (0)\n+760BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75746 Ext File Attributes   81A40000 (2175008768)\n+760BE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7574A Local Header Offset   0003D1B9 (250297)\n-7574E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+760C2 Local Header Offset   0003D69A (251546)\n+760C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7574E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x760C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75781 CENTRAL HEADER #253   02014B50 (33639248)\n-75785 Created Zip Spec      14 (20) '2.0'\n-75786 Created OS            03 (3) 'Unix'\n-75787 Extract Zip Spec      14 (20) '2.0'\n-75788 Extract OS            00 (0) 'MS-DOS'\n-75789 General Purpose Flag  0800 (2048)\n+760F9 CENTRAL HEADER #253   02014B50 (33639248)\n+760FD Created Zip Spec      14 (20) '2.0'\n+760FE Created OS            03 (3) 'Unix'\n+760FF Extract Zip Spec      14 (20) '2.0'\n+76100 Extract OS            00 (0) 'MS-DOS'\n+76101 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7578B Compression Method    0008 (8) 'Deflated'\n-7578D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75791 CRC                   896B8386 (2305524614)\n-75795 Compressed Size       000002C6 (710)\n-75799 Uncompressed Size     0000069C (1692)\n-7579D Filename Length       002A (42)\n-7579F Extra Length          0000 (0)\n-757A1 Comment Length        0000 (0)\n-757A3 Disk Start            0000 (0)\n-757A5 Int File Attributes   0000 (0)\n+76103 Compression Method    0008 (8) 'Deflated'\n+76105 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76109 CRC                   896B8386 (2305524614)\n+7610D Compressed Size       000002C6 (710)\n+76111 Uncompressed Size     0000069C (1692)\n+76115 Filename Length       002A (42)\n+76117 Extra Length          0000 (0)\n+76119 Comment Length        0000 (0)\n+7611B Disk Start            0000 (0)\n+7611D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-757A7 Ext File Attributes   81A40000 (2175008768)\n+7611F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-757AB Local Header Offset   0003EE3E (257598)\n-757AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76123 Local Header Offset   0003F33D (258877)\n+76127 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x757AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76127: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-757D9 CENTRAL HEADER #254   02014B50 (33639248)\n-757DD Created Zip Spec      14 (20) '2.0'\n-757DE Created OS            03 (3) 'Unix'\n-757DF Extract Zip Spec      14 (20) '2.0'\n-757E0 Extract OS            00 (0) 'MS-DOS'\n-757E1 General Purpose Flag  0800 (2048)\n+76151 CENTRAL HEADER #254   02014B50 (33639248)\n+76155 Created Zip Spec      14 (20) '2.0'\n+76156 Created OS            03 (3) 'Unix'\n+76157 Extract Zip Spec      14 (20) '2.0'\n+76158 Extract OS            00 (0) 'MS-DOS'\n+76159 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-757E3 Compression Method    0008 (8) 'Deflated'\n-757E5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-757E9 CRC                   2D8D7FE9 (764248041)\n-757ED Compressed Size       00000366 (870)\n-757F1 Uncompressed Size     00000769 (1897)\n-757F5 Filename Length       0028 (40)\n-757F7 Extra Length          0000 (0)\n-757F9 Comment Length        0000 (0)\n-757FB Disk Start            0000 (0)\n-757FD Int File Attributes   0000 (0)\n+7615B Compression Method    0008 (8) 'Deflated'\n+7615D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76161 CRC                   2D8D7FE9 (764248041)\n+76165 Compressed Size       00000366 (870)\n+76169 Uncompressed Size     00000769 (1897)\n+7616D Filename Length       0028 (40)\n+7616F Extra Length          0000 (0)\n+76171 Comment Length        0000 (0)\n+76173 Disk Start            0000 (0)\n+76175 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-757FF Ext File Attributes   81A40000 (2175008768)\n+76177 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75803 Local Header Offset   0003F14C (258380)\n-75807 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7617B Local Header Offset   0003F64B (259659)\n+7617F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75807: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7617F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7582F CENTRAL HEADER #255   02014B50 (33639248)\n-75833 Created Zip Spec      14 (20) '2.0'\n-75834 Created OS            03 (3) 'Unix'\n-75835 Extract Zip Spec      14 (20) '2.0'\n-75836 Extract OS            00 (0) 'MS-DOS'\n-75837 General Purpose Flag  0800 (2048)\n+761A7 CENTRAL HEADER #255   02014B50 (33639248)\n+761AB Created Zip Spec      14 (20) '2.0'\n+761AC Created OS            03 (3) 'Unix'\n+761AD Extract Zip Spec      14 (20) '2.0'\n+761AE Extract OS            00 (0) 'MS-DOS'\n+761AF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75839 Compression Method    0008 (8) 'Deflated'\n-7583B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7583F CRC                   E9761FB8 (3916832696)\n-75843 Compressed Size       0000025D (605)\n-75847 Uncompressed Size     00000497 (1175)\n-7584B Filename Length       002C (44)\n-7584D Extra Length          0000 (0)\n-7584F Comment Length        0000 (0)\n-75851 Disk Start            0000 (0)\n-75853 Int File Attributes   0000 (0)\n+761B1 Compression Method    0008 (8) 'Deflated'\n+761B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+761B7 CRC                   E9761FB8 (3916832696)\n+761BB Compressed Size       0000025D (605)\n+761BF Uncompressed Size     00000497 (1175)\n+761C3 Filename Length       002C (44)\n+761C5 Extra Length          0000 (0)\n+761C7 Comment Length        0000 (0)\n+761C9 Disk Start            0000 (0)\n+761CB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75855 Ext File Attributes   81A40000 (2175008768)\n+761CD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75859 Local Header Offset   0003F4F8 (259320)\n-7585D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+761D1 Local Header Offset   0003F9F7 (260599)\n+761D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7585D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x761D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75889 CENTRAL HEADER #256   02014B50 (33639248)\n-7588D Created Zip Spec      14 (20) '2.0'\n-7588E Created OS            03 (3) 'Unix'\n-7588F Extract Zip Spec      14 (20) '2.0'\n-75890 Extract OS            00 (0) 'MS-DOS'\n-75891 General Purpose Flag  0800 (2048)\n+76201 CENTRAL HEADER #256   02014B50 (33639248)\n+76205 Created Zip Spec      14 (20) '2.0'\n+76206 Created OS            03 (3) 'Unix'\n+76207 Extract Zip Spec      14 (20) '2.0'\n+76208 Extract OS            00 (0) 'MS-DOS'\n+76209 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75893 Compression Method    0008 (8) 'Deflated'\n-75895 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75899 CRC                   24647E40 (610565696)\n-7589D Compressed Size       00000D80 (3456)\n-758A1 Uncompressed Size     00005305 (21253)\n-758A5 Filename Length       0032 (50)\n-758A7 Extra Length          0000 (0)\n-758A9 Comment Length        0000 (0)\n-758AB Disk Start            0000 (0)\n-758AD Int File Attributes   0000 (0)\n+7620B Compression Method    0008 (8) 'Deflated'\n+7620D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76211 CRC                   7F03CBF8 (2130955256)\n+76215 Compressed Size       00000D92 (3474)\n+76219 Uncompressed Size     000054E7 (21735)\n+7621D Filename Length       0032 (50)\n+7621F Extra Length          0000 (0)\n+76221 Comment Length        0000 (0)\n+76223 Disk Start            0000 (0)\n+76225 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-758AF Ext File Attributes   81A40000 (2175008768)\n+76227 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-758B3 Local Header Offset   0003F79F (259999)\n-758B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7622B Local Header Offset   0003FC9E (261278)\n+7622F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x758B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7622F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-758E9 CENTRAL HEADER #257   02014B50 (33639248)\n-758ED Created Zip Spec      14 (20) '2.0'\n-758EE Created OS            03 (3) 'Unix'\n-758EF Extract Zip Spec      14 (20) '2.0'\n-758F0 Extract OS            00 (0) 'MS-DOS'\n-758F1 General Purpose Flag  0800 (2048)\n+76261 CENTRAL HEADER #257   02014B50 (33639248)\n+76265 Created Zip Spec      14 (20) '2.0'\n+76266 Created OS            03 (3) 'Unix'\n+76267 Extract Zip Spec      14 (20) '2.0'\n+76268 Extract OS            00 (0) 'MS-DOS'\n+76269 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-758F3 Compression Method    0008 (8) 'Deflated'\n-758F5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-758F9 CRC                   9612E24D (2517819981)\n-758FD Compressed Size       000003AC (940)\n-75901 Uncompressed Size     00000936 (2358)\n-75905 Filename Length       002D (45)\n-75907 Extra Length          0000 (0)\n-75909 Comment Length        0000 (0)\n-7590B Disk Start            0000 (0)\n-7590D Int File Attributes   0000 (0)\n+7626B Compression Method    0008 (8) 'Deflated'\n+7626D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76271 CRC                   255BC4C2 (626771138)\n+76275 Compressed Size       000003B6 (950)\n+76279 Uncompressed Size     00000985 (2437)\n+7627D Filename Length       002D (45)\n+7627F Extra Length          0000 (0)\n+76281 Comment Length        0000 (0)\n+76283 Disk Start            0000 (0)\n+76285 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7590F Ext File Attributes   81A40000 (2175008768)\n+76287 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75913 Local Header Offset   0004056F (263535)\n-75917 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7628B Local Header Offset   00040A80 (264832)\n+7628F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75917: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7628F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75944 CENTRAL HEADER #258   02014B50 (33639248)\n-75948 Created Zip Spec      14 (20) '2.0'\n-75949 Created OS            03 (3) 'Unix'\n-7594A Extract Zip Spec      14 (20) '2.0'\n-7594B Extract OS            00 (0) 'MS-DOS'\n-7594C General Purpose Flag  0800 (2048)\n+762BC CENTRAL HEADER #258   02014B50 (33639248)\n+762C0 Created Zip Spec      14 (20) '2.0'\n+762C1 Created OS            03 (3) 'Unix'\n+762C2 Extract Zip Spec      14 (20) '2.0'\n+762C3 Extract OS            00 (0) 'MS-DOS'\n+762C4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7594E Compression Method    0008 (8) 'Deflated'\n-75950 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75954 CRC                   40170699 (1075250841)\n-75958 Compressed Size       00000296 (662)\n-7595C Uncompressed Size     0000059E (1438)\n-75960 Filename Length       0029 (41)\n-75962 Extra Length          0000 (0)\n-75964 Comment Length        0000 (0)\n-75966 Disk Start            0000 (0)\n-75968 Int File Attributes   0000 (0)\n+762C6 Compression Method    0008 (8) 'Deflated'\n+762C8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+762CC CRC                   40170699 (1075250841)\n+762D0 Compressed Size       00000296 (662)\n+762D4 Uncompressed Size     0000059E (1438)\n+762D8 Filename Length       0029 (41)\n+762DA Extra Length          0000 (0)\n+762DC Comment Length        0000 (0)\n+762DE Disk Start            0000 (0)\n+762E0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7596A Ext File Attributes   81A40000 (2175008768)\n+762E2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7596E Local Header Offset   00040966 (264550)\n-75972 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+762E6 Local Header Offset   00040E81 (265857)\n+762EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75972: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x762EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7599B CENTRAL HEADER #259   02014B50 (33639248)\n-7599F Created Zip Spec      14 (20) '2.0'\n-759A0 Created OS            03 (3) 'Unix'\n-759A1 Extract Zip Spec      14 (20) '2.0'\n-759A2 Extract OS            00 (0) 'MS-DOS'\n-759A3 General Purpose Flag  0800 (2048)\n+76313 CENTRAL HEADER #259   02014B50 (33639248)\n+76317 Created Zip Spec      14 (20) '2.0'\n+76318 Created OS            03 (3) 'Unix'\n+76319 Extract Zip Spec      14 (20) '2.0'\n+7631A Extract OS            00 (0) 'MS-DOS'\n+7631B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-759A5 Compression Method    0008 (8) 'Deflated'\n-759A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-759AB CRC                   A604EAF8 (2785340152)\n-759AF Compressed Size       000004E6 (1254)\n-759B3 Uncompressed Size     00001249 (4681)\n-759B7 Filename Length       0038 (56)\n-759B9 Extra Length          0000 (0)\n-759BB Comment Length        0000 (0)\n-759BD Disk Start            0000 (0)\n-759BF Int File Attributes   0000 (0)\n+7631D Compression Method    0008 (8) 'Deflated'\n+7631F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76323 CRC                   A604EAF8 (2785340152)\n+76327 Compressed Size       000004E6 (1254)\n+7632B Uncompressed Size     00001249 (4681)\n+7632F Filename Length       0038 (56)\n+76331 Extra Length          0000 (0)\n+76333 Comment Length        0000 (0)\n+76335 Disk Start            0000 (0)\n+76337 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-759C1 Ext File Attributes   81A40000 (2175008768)\n+76339 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-759C5 Local Header Offset   00040C43 (265283)\n-759C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7633D Local Header Offset   0004115E (266590)\n+76341 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x759C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76341: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75A01 CENTRAL HEADER #260   02014B50 (33639248)\n-75A05 Created Zip Spec      14 (20) '2.0'\n-75A06 Created OS            03 (3) 'Unix'\n-75A07 Extract Zip Spec      14 (20) '2.0'\n-75A08 Extract OS            00 (0) 'MS-DOS'\n-75A09 General Purpose Flag  0800 (2048)\n+76379 CENTRAL HEADER #260   02014B50 (33639248)\n+7637D Created Zip Spec      14 (20) '2.0'\n+7637E Created OS            03 (3) 'Unix'\n+7637F Extract Zip Spec      14 (20) '2.0'\n+76380 Extract OS            00 (0) 'MS-DOS'\n+76381 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75A0B Compression Method    0008 (8) 'Deflated'\n-75A0D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75A11 CRC                   D7EB77B9 (3622533049)\n-75A15 Compressed Size       00000731 (1841)\n-75A19 Uncompressed Size     0000137A (4986)\n-75A1D Filename Length       002C (44)\n-75A1F Extra Length          0000 (0)\n-75A21 Comment Length        0000 (0)\n-75A23 Disk Start            0000 (0)\n-75A25 Int File Attributes   0000 (0)\n+76383 Compression Method    0008 (8) 'Deflated'\n+76385 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76389 CRC                   D7EB77B9 (3622533049)\n+7638D Compressed Size       00000731 (1841)\n+76391 Uncompressed Size     0000137A (4986)\n+76395 Filename Length       002C (44)\n+76397 Extra Length          0000 (0)\n+76399 Comment Length        0000 (0)\n+7639B Disk Start            0000 (0)\n+7639D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75A27 Ext File Attributes   81A40000 (2175008768)\n+7639F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75A2B Local Header Offset   0004117F (266623)\n-75A2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+763A3 Local Header Offset   0004169A (267930)\n+763A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75A2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x763A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75A5B CENTRAL HEADER #261   02014B50 (33639248)\n-75A5F Created Zip Spec      14 (20) '2.0'\n-75A60 Created OS            03 (3) 'Unix'\n-75A61 Extract Zip Spec      14 (20) '2.0'\n-75A62 Extract OS            00 (0) 'MS-DOS'\n-75A63 General Purpose Flag  0800 (2048)\n+763D3 CENTRAL HEADER #261   02014B50 (33639248)\n+763D7 Created Zip Spec      14 (20) '2.0'\n+763D8 Created OS            03 (3) 'Unix'\n+763D9 Extract Zip Spec      14 (20) '2.0'\n+763DA Extract OS            00 (0) 'MS-DOS'\n+763DB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75A65 Compression Method    0008 (8) 'Deflated'\n-75A67 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75A6B CRC                   95FCA49F (2516362399)\n-75A6F Compressed Size       0000029C (668)\n-75A73 Uncompressed Size     00000510 (1296)\n-75A77 Filename Length       0039 (57)\n-75A79 Extra Length          0000 (0)\n-75A7B Comment Length        0000 (0)\n-75A7D Disk Start            0000 (0)\n-75A7F Int File Attributes   0000 (0)\n+763DD Compression Method    0008 (8) 'Deflated'\n+763DF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+763E3 CRC                   7518C2B8 (1964556984)\n+763E7 Compressed Size       000002A4 (676)\n+763EB Uncompressed Size     00000535 (1333)\n+763EF Filename Length       0039 (57)\n+763F1 Extra Length          0000 (0)\n+763F3 Comment Length        0000 (0)\n+763F5 Disk Start            0000 (0)\n+763F7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75A81 Ext File Attributes   81A40000 (2175008768)\n+763F9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75A85 Local Header Offset   000418FA (268538)\n-75A89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+763FD Local Header Offset   00041E15 (269845)\n+76401 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75A89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76401: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75AC2 CENTRAL HEADER #262   02014B50 (33639248)\n-75AC6 Created Zip Spec      14 (20) '2.0'\n-75AC7 Created OS            03 (3) 'Unix'\n-75AC8 Extract Zip Spec      14 (20) '2.0'\n-75AC9 Extract OS            00 (0) 'MS-DOS'\n-75ACA General Purpose Flag  0800 (2048)\n+7643A CENTRAL HEADER #262   02014B50 (33639248)\n+7643E Created Zip Spec      14 (20) '2.0'\n+7643F Created OS            03 (3) 'Unix'\n+76440 Extract Zip Spec      14 (20) '2.0'\n+76441 Extract OS            00 (0) 'MS-DOS'\n+76442 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75ACC Compression Method    0008 (8) 'Deflated'\n-75ACE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75AD2 CRC                   EEA257C4 (4003616708)\n-75AD6 Compressed Size       000006A0 (1696)\n-75ADA Uncompressed Size     000015B8 (5560)\n-75ADE Filename Length       002E (46)\n-75AE0 Extra Length          0000 (0)\n-75AE2 Comment Length        0000 (0)\n-75AE4 Disk Start            0000 (0)\n-75AE6 Int File Attributes   0000 (0)\n+76444 Compression Method    0008 (8) 'Deflated'\n+76446 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7644A CRC                   FC613C2C (4234230828)\n+7644E Compressed Size       000006AB (1707)\n+76452 Uncompressed Size     00001651 (5713)\n+76456 Filename Length       002E (46)\n+76458 Extra Length          0000 (0)\n+7645A Comment Length        0000 (0)\n+7645C Disk Start            0000 (0)\n+7645E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75AE8 Ext File Attributes   81A40000 (2175008768)\n+76460 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75AEC Local Header Offset   00041BED (269293)\n-75AF0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76464 Local Header Offset   00042110 (270608)\n+76468 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75AF0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76468: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75B1E CENTRAL HEADER #263   02014B50 (33639248)\n-75B22 Created Zip Spec      14 (20) '2.0'\n-75B23 Created OS            03 (3) 'Unix'\n-75B24 Extract Zip Spec      14 (20) '2.0'\n-75B25 Extract OS            00 (0) 'MS-DOS'\n-75B26 General Purpose Flag  0800 (2048)\n+76496 CENTRAL HEADER #263   02014B50 (33639248)\n+7649A Created Zip Spec      14 (20) '2.0'\n+7649B Created OS            03 (3) 'Unix'\n+7649C Extract Zip Spec      14 (20) '2.0'\n+7649D Extract OS            00 (0) 'MS-DOS'\n+7649E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75B28 Compression Method    0008 (8) 'Deflated'\n-75B2A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75B2E CRC                   54F0EEAE (1425075886)\n-75B32 Compressed Size       00001158 (4440)\n-75B36 Uncompressed Size     00004623 (17955)\n-75B3A Filename Length       002D (45)\n-75B3C Extra Length          0000 (0)\n-75B3E Comment Length        0000 (0)\n-75B40 Disk Start            0000 (0)\n-75B42 Int File Attributes   0000 (0)\n+764A0 Compression Method    0008 (8) 'Deflated'\n+764A2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+764A6 CRC                   75C25786 (1975670662)\n+764AA Compressed Size       00001170 (4464)\n+764AE Uncompressed Size     00004813 (18451)\n+764B2 Filename Length       002D (45)\n+764B4 Extra Length          0000 (0)\n+764B6 Comment Length        0000 (0)\n+764B8 Disk Start            0000 (0)\n+764BA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75B44 Ext File Attributes   81A40000 (2175008768)\n+764BC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75B48 Local Header Offset   000422D9 (271065)\n-75B4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+764C0 Local Header Offset   00042807 (272391)\n+764C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75B4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x764C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75B79 CENTRAL HEADER #264   02014B50 (33639248)\n-75B7D Created Zip Spec      14 (20) '2.0'\n-75B7E Created OS            03 (3) 'Unix'\n-75B7F Extract Zip Spec      14 (20) '2.0'\n-75B80 Extract OS            00 (0) 'MS-DOS'\n-75B81 General Purpose Flag  0800 (2048)\n+764F1 CENTRAL HEADER #264   02014B50 (33639248)\n+764F5 Created Zip Spec      14 (20) '2.0'\n+764F6 Created OS            03 (3) 'Unix'\n+764F7 Extract Zip Spec      14 (20) '2.0'\n+764F8 Extract OS            00 (0) 'MS-DOS'\n+764F9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75B83 Compression Method    0008 (8) 'Deflated'\n-75B85 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75B89 CRC                   49173B6A (1226259306)\n-75B8D Compressed Size       00000B30 (2864)\n-75B91 Uncompressed Size     00002D62 (11618)\n-75B95 Filename Length       0032 (50)\n-75B97 Extra Length          0000 (0)\n-75B99 Comment Length        0000 (0)\n-75B9B Disk Start            0000 (0)\n-75B9D Int File Attributes   0000 (0)\n+764FB Compression Method    0008 (8) 'Deflated'\n+764FD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76501 CRC                   49173B6A (1226259306)\n+76505 Compressed Size       00000B30 (2864)\n+76509 Uncompressed Size     00002D62 (11618)\n+7650D Filename Length       0032 (50)\n+7650F Extra Length          0000 (0)\n+76511 Comment Length        0000 (0)\n+76513 Disk Start            0000 (0)\n+76515 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75B9F Ext File Attributes   81A40000 (2175008768)\n+76517 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75BA3 Local Header Offset   0004347C (275580)\n-75BA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7651B Local Header Offset   000439C2 (276930)\n+7651F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75BA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7651F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75BD9 CENTRAL HEADER #265   02014B50 (33639248)\n-75BDD Created Zip Spec      14 (20) '2.0'\n-75BDE Created OS            03 (3) 'Unix'\n-75BDF Extract Zip Spec      14 (20) '2.0'\n-75BE0 Extract OS            00 (0) 'MS-DOS'\n-75BE1 General Purpose Flag  0800 (2048)\n+76551 CENTRAL HEADER #265   02014B50 (33639248)\n+76555 Created Zip Spec      14 (20) '2.0'\n+76556 Created OS            03 (3) 'Unix'\n+76557 Extract Zip Spec      14 (20) '2.0'\n+76558 Extract OS            00 (0) 'MS-DOS'\n+76559 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75BE3 Compression Method    0008 (8) 'Deflated'\n-75BE5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75BE9 CRC                   094FFA20 (156236320)\n-75BED Compressed Size       000008C5 (2245)\n-75BF1 Uncompressed Size     0000235E (9054)\n-75BF5 Filename Length       0036 (54)\n-75BF7 Extra Length          0000 (0)\n-75BF9 Comment Length        0000 (0)\n-75BFB Disk Start            0000 (0)\n-75BFD Int File Attributes   0000 (0)\n+7655B Compression Method    0008 (8) 'Deflated'\n+7655D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76561 CRC                   8D8AC97C (2374683004)\n+76565 Compressed Size       000008D2 (2258)\n+76569 Uncompressed Size     00002443 (9283)\n+7656D Filename Length       0036 (54)\n+7656F Extra Length          0000 (0)\n+76571 Comment Length        0000 (0)\n+76573 Disk Start            0000 (0)\n+76575 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75BFF Ext File Attributes   81A40000 (2175008768)\n+76577 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75C03 Local Header Offset   00043FFC (278524)\n-75C07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7657B Local Header Offset   00044542 (279874)\n+7657F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75C07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7657F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75C3D CENTRAL HEADER #266   02014B50 (33639248)\n-75C41 Created Zip Spec      14 (20) '2.0'\n-75C42 Created OS            03 (3) 'Unix'\n-75C43 Extract Zip Spec      14 (20) '2.0'\n-75C44 Extract OS            00 (0) 'MS-DOS'\n-75C45 General Purpose Flag  0800 (2048)\n+765B5 CENTRAL HEADER #266   02014B50 (33639248)\n+765B9 Created Zip Spec      14 (20) '2.0'\n+765BA Created OS            03 (3) 'Unix'\n+765BB Extract Zip Spec      14 (20) '2.0'\n+765BC Extract OS            00 (0) 'MS-DOS'\n+765BD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75C47 Compression Method    0008 (8) 'Deflated'\n-75C49 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75C4D CRC                   0EFD7C48 (251493448)\n-75C51 Compressed Size       00000593 (1427)\n-75C55 Uncompressed Size     000011C9 (4553)\n-75C59 Filename Length       0034 (52)\n-75C5B Extra Length          0000 (0)\n-75C5D Comment Length        0000 (0)\n-75C5F Disk Start            0000 (0)\n-75C61 Int File Attributes   0000 (0)\n+765BF Compression Method    0008 (8) 'Deflated'\n+765C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+765C5 CRC                   0EFD7C48 (251493448)\n+765C9 Compressed Size       00000593 (1427)\n+765CD Uncompressed Size     000011C9 (4553)\n+765D1 Filename Length       0034 (52)\n+765D3 Extra Length          0000 (0)\n+765D5 Comment Length        0000 (0)\n+765D7 Disk Start            0000 (0)\n+765D9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75C63 Ext File Attributes   81A40000 (2175008768)\n+765DB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75C67 Local Header Offset   00044915 (280853)\n-75C6B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+765DF Local Header Offset   00044E68 (282216)\n+765E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75C6B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x765E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75C9F CENTRAL HEADER #267   02014B50 (33639248)\n-75CA3 Created Zip Spec      14 (20) '2.0'\n-75CA4 Created OS            03 (3) 'Unix'\n-75CA5 Extract Zip Spec      14 (20) '2.0'\n-75CA6 Extract OS            00 (0) 'MS-DOS'\n-75CA7 General Purpose Flag  0800 (2048)\n+76617 CENTRAL HEADER #267   02014B50 (33639248)\n+7661B Created Zip Spec      14 (20) '2.0'\n+7661C Created OS            03 (3) 'Unix'\n+7661D Extract Zip Spec      14 (20) '2.0'\n+7661E Extract OS            00 (0) 'MS-DOS'\n+7661F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75CA9 Compression Method    0008 (8) 'Deflated'\n-75CAB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75CAF CRC                   8CFD4A70 (2365409904)\n-75CB3 Compressed Size       00000C76 (3190)\n-75CB7 Uncompressed Size     00002FB5 (12213)\n-75CBB Filename Length       002E (46)\n-75CBD Extra Length          0000 (0)\n-75CBF Comment Length        0000 (0)\n-75CC1 Disk Start            0000 (0)\n-75CC3 Int File Attributes   0000 (0)\n+76621 Compression Method    0008 (8) 'Deflated'\n+76623 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76627 CRC                   8CFD4A70 (2365409904)\n+7662B Compressed Size       00000C76 (3190)\n+7662F Uncompressed Size     00002FB5 (12213)\n+76633 Filename Length       002E (46)\n+76635 Extra Length          0000 (0)\n+76637 Comment Length        0000 (0)\n+76639 Disk Start            0000 (0)\n+7663B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75CC5 Ext File Attributes   81A40000 (2175008768)\n+7663D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75CC9 Local Header Offset   00044EFA (282362)\n-75CCD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76641 Local Header Offset   0004544D (283725)\n+76645 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75CCD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76645: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75CFB CENTRAL HEADER #268   02014B50 (33639248)\n-75CFF Created Zip Spec      14 (20) '2.0'\n-75D00 Created OS            03 (3) 'Unix'\n-75D01 Extract Zip Spec      14 (20) '2.0'\n-75D02 Extract OS            00 (0) 'MS-DOS'\n-75D03 General Purpose Flag  0800 (2048)\n+76673 CENTRAL HEADER #268   02014B50 (33639248)\n+76677 Created Zip Spec      14 (20) '2.0'\n+76678 Created OS            03 (3) 'Unix'\n+76679 Extract Zip Spec      14 (20) '2.0'\n+7667A Extract OS            00 (0) 'MS-DOS'\n+7667B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75D05 Compression Method    0008 (8) 'Deflated'\n-75D07 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75D0B CRC                   81A24999 (2174896537)\n-75D0F Compressed Size       00000373 (883)\n-75D13 Uncompressed Size     000008A4 (2212)\n-75D17 Filename Length       002E (46)\n-75D19 Extra Length          0000 (0)\n-75D1B Comment Length        0000 (0)\n-75D1D Disk Start            0000 (0)\n-75D1F Int File Attributes   0000 (0)\n+7667D Compression Method    0008 (8) 'Deflated'\n+7667F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76683 CRC                   F982D49E (4186100894)\n+76687 Compressed Size       0000037B (891)\n+7668B Uncompressed Size     000008F6 (2294)\n+7668F Filename Length       002E (46)\n+76691 Extra Length          0000 (0)\n+76693 Comment Length        0000 (0)\n+76695 Disk Start            0000 (0)\n+76697 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75D21 Ext File Attributes   81A40000 (2175008768)\n+76699 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75D25 Local Header Offset   00045BBC (285628)\n-75D29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7669D Local Header Offset   0004610F (286991)\n+766A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75D29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x766A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75D57 CENTRAL HEADER #269   02014B50 (33639248)\n-75D5B Created Zip Spec      14 (20) '2.0'\n-75D5C Created OS            03 (3) 'Unix'\n-75D5D Extract Zip Spec      14 (20) '2.0'\n-75D5E Extract OS            00 (0) 'MS-DOS'\n-75D5F General Purpose Flag  0800 (2048)\n+766CF CENTRAL HEADER #269   02014B50 (33639248)\n+766D3 Created Zip Spec      14 (20) '2.0'\n+766D4 Created OS            03 (3) 'Unix'\n+766D5 Extract Zip Spec      14 (20) '2.0'\n+766D6 Extract OS            00 (0) 'MS-DOS'\n+766D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75D61 Compression Method    0008 (8) 'Deflated'\n-75D63 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75D67 CRC                   831A7179 (2199548281)\n-75D6B Compressed Size       0000036D (877)\n-75D6F Uncompressed Size     0000080F (2063)\n-75D73 Filename Length       0030 (48)\n-75D75 Extra Length          0000 (0)\n-75D77 Comment Length        0000 (0)\n-75D79 Disk Start            0000 (0)\n-75D7B Int File Attributes   0000 (0)\n+766D9 Compression Method    0008 (8) 'Deflated'\n+766DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+766DF CRC                   831A7179 (2199548281)\n+766E3 Compressed Size       0000036D (877)\n+766E7 Uncompressed Size     0000080F (2063)\n+766EB Filename Length       0030 (48)\n+766ED Extra Length          0000 (0)\n+766EF Comment Length        0000 (0)\n+766F1 Disk Start            0000 (0)\n+766F3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75D7D Ext File Attributes   81A40000 (2175008768)\n+766F5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75D81 Local Header Offset   00045F7B (286587)\n-75D85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+766F9 Local Header Offset   000464D6 (287958)\n+766FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75D85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x766FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75DB5 CENTRAL HEADER #270   02014B50 (33639248)\n-75DB9 Created Zip Spec      14 (20) '2.0'\n-75DBA Created OS            03 (3) 'Unix'\n-75DBB Extract Zip Spec      14 (20) '2.0'\n-75DBC Extract OS            00 (0) 'MS-DOS'\n-75DBD General Purpose Flag  0800 (2048)\n+7672D CENTRAL HEADER #270   02014B50 (33639248)\n+76731 Created Zip Spec      14 (20) '2.0'\n+76732 Created OS            03 (3) 'Unix'\n+76733 Extract Zip Spec      14 (20) '2.0'\n+76734 Extract OS            00 (0) 'MS-DOS'\n+76735 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75DBF Compression Method    0008 (8) 'Deflated'\n-75DC1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75DC5 CRC                   7319AF3E (1931063102)\n-75DC9 Compressed Size       00000643 (1603)\n-75DCD Uncompressed Size     0000143D (5181)\n-75DD1 Filename Length       002F (47)\n-75DD3 Extra Length          0000 (0)\n-75DD5 Comment Length        0000 (0)\n-75DD7 Disk Start            0000 (0)\n-75DD9 Int File Attributes   0000 (0)\n+76737 Compression Method    0008 (8) 'Deflated'\n+76739 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7673D CRC                   239B6511 (597386513)\n+76741 Compressed Size       0000064E (1614)\n+76745 Uncompressed Size     000014C9 (5321)\n+76749 Filename Length       002F (47)\n+7674B Extra Length          0000 (0)\n+7674D Comment Length        0000 (0)\n+7674F Disk Start            0000 (0)\n+76751 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75DDB Ext File Attributes   81A40000 (2175008768)\n+76753 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75DDF Local Header Offset   00046336 (287542)\n-75DE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76757 Local Header Offset   00046891 (288913)\n+7675B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75DE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7675B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75E12 CENTRAL HEADER #271   02014B50 (33639248)\n-75E16 Created Zip Spec      14 (20) '2.0'\n-75E17 Created OS            03 (3) 'Unix'\n-75E18 Extract Zip Spec      14 (20) '2.0'\n-75E19 Extract OS            00 (0) 'MS-DOS'\n-75E1A General Purpose Flag  0800 (2048)\n+7678A CENTRAL HEADER #271   02014B50 (33639248)\n+7678E Created Zip Spec      14 (20) '2.0'\n+7678F Created OS            03 (3) 'Unix'\n+76790 Extract Zip Spec      14 (20) '2.0'\n+76791 Extract OS            00 (0) 'MS-DOS'\n+76792 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75E1C Compression Method    0008 (8) 'Deflated'\n-75E1E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75E22 CRC                   D07CEF7E (3497848702)\n-75E26 Compressed Size       000004C5 (1221)\n-75E2A Uncompressed Size     00001341 (4929)\n-75E2E Filename Length       002D (45)\n-75E30 Extra Length          0000 (0)\n-75E32 Comment Length        0000 (0)\n-75E34 Disk Start            0000 (0)\n-75E36 Int File Attributes   0000 (0)\n+76794 Compression Method    0008 (8) 'Deflated'\n+76796 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7679A CRC                   CB16D394 (3407270804)\n+7679E Compressed Size       000004D2 (1234)\n+767A2 Uncompressed Size     000013CF (5071)\n+767A6 Filename Length       002D (45)\n+767A8 Extra Length          0000 (0)\n+767AA Comment Length        0000 (0)\n+767AC Disk Start            0000 (0)\n+767AE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75E38 Ext File Attributes   81A40000 (2175008768)\n+767B0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75E3C Local Header Offset   000469C6 (289222)\n-75E40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+767B4 Local Header Offset   00046F2C (290604)\n+767B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75E40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x767B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75E6D CENTRAL HEADER #272   02014B50 (33639248)\n-75E71 Created Zip Spec      14 (20) '2.0'\n-75E72 Created OS            03 (3) 'Unix'\n-75E73 Extract Zip Spec      14 (20) '2.0'\n-75E74 Extract OS            00 (0) 'MS-DOS'\n-75E75 General Purpose Flag  0800 (2048)\n+767E5 CENTRAL HEADER #272   02014B50 (33639248)\n+767E9 Created Zip Spec      14 (20) '2.0'\n+767EA Created OS            03 (3) 'Unix'\n+767EB Extract Zip Spec      14 (20) '2.0'\n+767EC Extract OS            00 (0) 'MS-DOS'\n+767ED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75E77 Compression Method    0008 (8) 'Deflated'\n-75E79 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75E7D CRC                   4E3FC833 (1312802867)\n-75E81 Compressed Size       0000024E (590)\n-75E85 Uncompressed Size     00000443 (1091)\n-75E89 Filename Length       0029 (41)\n-75E8B Extra Length          0000 (0)\n-75E8D Comment Length        0000 (0)\n-75E8F Disk Start            0000 (0)\n-75E91 Int File Attributes   0000 (0)\n+767EF Compression Method    0008 (8) 'Deflated'\n+767F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+767F5 CRC                   4E3FC833 (1312802867)\n+767F9 Compressed Size       0000024E (590)\n+767FD Uncompressed Size     00000443 (1091)\n+76801 Filename Length       0029 (41)\n+76803 Extra Length          0000 (0)\n+76805 Comment Length        0000 (0)\n+76807 Disk Start            0000 (0)\n+76809 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75E93 Ext File Attributes   81A40000 (2175008768)\n+7680B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75E97 Local Header Offset   00046ED6 (290518)\n-75E9B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7680F Local Header Offset   00047449 (291913)\n+76813 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75E9B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76813: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75EC4 CENTRAL HEADER #273   02014B50 (33639248)\n-75EC8 Created Zip Spec      14 (20) '2.0'\n-75EC9 Created OS            03 (3) 'Unix'\n-75ECA Extract Zip Spec      14 (20) '2.0'\n-75ECB Extract OS            00 (0) 'MS-DOS'\n-75ECC General Purpose Flag  0800 (2048)\n+7683C CENTRAL HEADER #273   02014B50 (33639248)\n+76840 Created Zip Spec      14 (20) '2.0'\n+76841 Created OS            03 (3) 'Unix'\n+76842 Extract Zip Spec      14 (20) '2.0'\n+76843 Extract OS            00 (0) 'MS-DOS'\n+76844 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75ECE Compression Method    0008 (8) 'Deflated'\n-75ED0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75ED4 CRC                   7A9C058A (2057045386)\n-75ED8 Compressed Size       00000815 (2069)\n-75EDC Uncompressed Size     00002117 (8471)\n-75EE0 Filename Length       002A (42)\n-75EE2 Extra Length          0000 (0)\n-75EE4 Comment Length        0000 (0)\n-75EE6 Disk Start            0000 (0)\n-75EE8 Int File Attributes   0000 (0)\n+76846 Compression Method    0008 (8) 'Deflated'\n+76848 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7684C CRC                   7A9C058A (2057045386)\n+76850 Compressed Size       00000815 (2069)\n+76854 Uncompressed Size     00002117 (8471)\n+76858 Filename Length       002A (42)\n+7685A Extra Length          0000 (0)\n+7685C Comment Length        0000 (0)\n+7685E Disk Start            0000 (0)\n+76860 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75EEA Ext File Attributes   81A40000 (2175008768)\n+76862 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75EEE Local Header Offset   0004716B (291179)\n-75EF2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76866 Local Header Offset   000476DE (292574)\n+7686A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75EF2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7686A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75F1C CENTRAL HEADER #274   02014B50 (33639248)\n-75F20 Created Zip Spec      14 (20) '2.0'\n-75F21 Created OS            03 (3) 'Unix'\n-75F22 Extract Zip Spec      14 (20) '2.0'\n-75F23 Extract OS            00 (0) 'MS-DOS'\n-75F24 General Purpose Flag  0800 (2048)\n+76894 CENTRAL HEADER #274   02014B50 (33639248)\n+76898 Created Zip Spec      14 (20) '2.0'\n+76899 Created OS            03 (3) 'Unix'\n+7689A Extract Zip Spec      14 (20) '2.0'\n+7689B Extract OS            00 (0) 'MS-DOS'\n+7689C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75F26 Compression Method    0008 (8) 'Deflated'\n-75F28 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75F2C CRC                   A4F19F22 (2767298338)\n-75F30 Compressed Size       000004FE (1278)\n-75F34 Uncompressed Size     0000104C (4172)\n-75F38 Filename Length       002A (42)\n-75F3A Extra Length          0000 (0)\n-75F3C Comment Length        0000 (0)\n-75F3E Disk Start            0000 (0)\n-75F40 Int File Attributes   0000 (0)\n+7689E Compression Method    0008 (8) 'Deflated'\n+768A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+768A4 CRC                   A4F19F22 (2767298338)\n+768A8 Compressed Size       000004FE (1278)\n+768AC Uncompressed Size     0000104C (4172)\n+768B0 Filename Length       002A (42)\n+768B2 Extra Length          0000 (0)\n+768B4 Comment Length        0000 (0)\n+768B6 Disk Start            0000 (0)\n+768B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75F42 Ext File Attributes   81A40000 (2175008768)\n+768BA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75F46 Local Header Offset   000479C8 (293320)\n-75F4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+768BE Local Header Offset   00047F3B (294715)\n+768C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75F4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x768C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75F74 CENTRAL HEADER #275   02014B50 (33639248)\n-75F78 Created Zip Spec      14 (20) '2.0'\n-75F79 Created OS            03 (3) 'Unix'\n-75F7A Extract Zip Spec      14 (20) '2.0'\n-75F7B Extract OS            00 (0) 'MS-DOS'\n-75F7C General Purpose Flag  0800 (2048)\n+768EC CENTRAL HEADER #275   02014B50 (33639248)\n+768F0 Created Zip Spec      14 (20) '2.0'\n+768F1 Created OS            03 (3) 'Unix'\n+768F2 Extract Zip Spec      14 (20) '2.0'\n+768F3 Extract OS            00 (0) 'MS-DOS'\n+768F4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75F7E Compression Method    0008 (8) 'Deflated'\n-75F80 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75F84 CRC                   E7A31A4E (3886225998)\n-75F88 Compressed Size       0000094D (2381)\n-75F8C Uncompressed Size     00002166 (8550)\n-75F90 Filename Length       002B (43)\n-75F92 Extra Length          0000 (0)\n-75F94 Comment Length        0000 (0)\n-75F96 Disk Start            0000 (0)\n-75F98 Int File Attributes   0000 (0)\n+768F6 Compression Method    0008 (8) 'Deflated'\n+768F8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+768FC CRC                   CBBE6E80 (3418254976)\n+76900 Compressed Size       0000095E (2398)\n+76904 Uncompressed Size     00002283 (8835)\n+76908 Filename Length       002B (43)\n+7690A Extra Length          0000 (0)\n+7690C Comment Length        0000 (0)\n+7690E Disk Start            0000 (0)\n+76910 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75F9A Ext File Attributes   81A40000 (2175008768)\n+76912 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75F9E Local Header Offset   00047F0E (294670)\n-75FA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76916 Local Header Offset   00048481 (296065)\n+7691A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75FA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7691A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75FCD CENTRAL HEADER #276   02014B50 (33639248)\n-75FD1 Created Zip Spec      14 (20) '2.0'\n-75FD2 Created OS            03 (3) 'Unix'\n-75FD3 Extract Zip Spec      14 (20) '2.0'\n-75FD4 Extract OS            00 (0) 'MS-DOS'\n-75FD5 General Purpose Flag  0800 (2048)\n+76945 CENTRAL HEADER #276   02014B50 (33639248)\n+76949 Created Zip Spec      14 (20) '2.0'\n+7694A Created OS            03 (3) 'Unix'\n+7694B Extract Zip Spec      14 (20) '2.0'\n+7694C Extract OS            00 (0) 'MS-DOS'\n+7694D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-75FD7 Compression Method    0008 (8) 'Deflated'\n-75FD9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75FDD CRC                   139F375C (329201500)\n-75FE1 Compressed Size       000003DF (991)\n-75FE5 Uncompressed Size     00000BC2 (3010)\n-75FE9 Filename Length       002B (43)\n-75FEB Extra Length          0000 (0)\n-75FED Comment Length        0000 (0)\n-75FEF Disk Start            0000 (0)\n-75FF1 Int File Attributes   0000 (0)\n+7694F Compression Method    0008 (8) 'Deflated'\n+76951 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76955 CRC                   139F375C (329201500)\n+76959 Compressed Size       000003DF (991)\n+7695D Uncompressed Size     00000BC2 (3010)\n+76961 Filename Length       002B (43)\n+76963 Extra Length          0000 (0)\n+76965 Comment Length        0000 (0)\n+76967 Disk Start            0000 (0)\n+76969 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-75FF3 Ext File Attributes   81A40000 (2175008768)\n+7696B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-75FF7 Local Header Offset   000488A4 (297124)\n-75FFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7696F Local Header Offset   00048E28 (298536)\n+76973 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x75FFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76973: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76026 CENTRAL HEADER #277   02014B50 (33639248)\n-7602A Created Zip Spec      14 (20) '2.0'\n-7602B Created OS            03 (3) 'Unix'\n-7602C Extract Zip Spec      14 (20) '2.0'\n-7602D Extract OS            00 (0) 'MS-DOS'\n-7602E General Purpose Flag  0800 (2048)\n+7699E CENTRAL HEADER #277   02014B50 (33639248)\n+769A2 Created Zip Spec      14 (20) '2.0'\n+769A3 Created OS            03 (3) 'Unix'\n+769A4 Extract Zip Spec      14 (20) '2.0'\n+769A5 Extract OS            00 (0) 'MS-DOS'\n+769A6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76030 Compression Method    0008 (8) 'Deflated'\n-76032 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76036 CRC                   C39767CB (3281479627)\n-7603A Compressed Size       0000040F (1039)\n-7603E Uncompressed Size     00000DAA (3498)\n-76042 Filename Length       0026 (38)\n-76044 Extra Length          0000 (0)\n-76046 Comment Length        0000 (0)\n-76048 Disk Start            0000 (0)\n-7604A Int File Attributes   0000 (0)\n+769A8 Compression Method    0008 (8) 'Deflated'\n+769AA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+769AE CRC                   C39767CB (3281479627)\n+769B2 Compressed Size       0000040F (1039)\n+769B6 Uncompressed Size     00000DAA (3498)\n+769BA Filename Length       0026 (38)\n+769BC Extra Length          0000 (0)\n+769BE Comment Length        0000 (0)\n+769C0 Disk Start            0000 (0)\n+769C2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7604C Ext File Attributes   81A40000 (2175008768)\n+769C4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76050 Local Header Offset   00048CCC (298188)\n-76054 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+769C8 Local Header Offset   00049250 (299600)\n+769CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76054: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x769CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7607A CENTRAL HEADER #278   02014B50 (33639248)\n-7607E Created Zip Spec      14 (20) '2.0'\n-7607F Created OS            03 (3) 'Unix'\n-76080 Extract Zip Spec      14 (20) '2.0'\n-76081 Extract OS            00 (0) 'MS-DOS'\n-76082 General Purpose Flag  0800 (2048)\n+769F2 CENTRAL HEADER #278   02014B50 (33639248)\n+769F6 Created Zip Spec      14 (20) '2.0'\n+769F7 Created OS            03 (3) 'Unix'\n+769F8 Extract Zip Spec      14 (20) '2.0'\n+769F9 Extract OS            00 (0) 'MS-DOS'\n+769FA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76084 Compression Method    0008 (8) 'Deflated'\n-76086 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7608A CRC                   0C719C80 (208772224)\n-7608E Compressed Size       00000307 (775)\n-76092 Uncompressed Size     000010C1 (4289)\n-76096 Filename Length       002C (44)\n-76098 Extra Length          0000 (0)\n-7609A Comment Length        0000 (0)\n-7609C Disk Start            0000 (0)\n-7609E Int File Attributes   0000 (0)\n+769FC Compression Method    0008 (8) 'Deflated'\n+769FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76A02 CRC                   0C719C80 (208772224)\n+76A06 Compressed Size       00000307 (775)\n+76A0A Uncompressed Size     000010C1 (4289)\n+76A0E Filename Length       002C (44)\n+76A10 Extra Length          0000 (0)\n+76A12 Comment Length        0000 (0)\n+76A14 Disk Start            0000 (0)\n+76A16 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-760A0 Ext File Attributes   81A40000 (2175008768)\n+76A18 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-760A4 Local Header Offset   0004911F (299295)\n-760A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76A1C Local Header Offset   000496A3 (300707)\n+76A20 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x760A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76A20: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-760D4 CENTRAL HEADER #279   02014B50 (33639248)\n-760D8 Created Zip Spec      14 (20) '2.0'\n-760D9 Created OS            03 (3) 'Unix'\n-760DA Extract Zip Spec      14 (20) '2.0'\n-760DB Extract OS            00 (0) 'MS-DOS'\n-760DC General Purpose Flag  0800 (2048)\n+76A4C CENTRAL HEADER #279   02014B50 (33639248)\n+76A50 Created Zip Spec      14 (20) '2.0'\n+76A51 Created OS            03 (3) 'Unix'\n+76A52 Extract Zip Spec      14 (20) '2.0'\n+76A53 Extract OS            00 (0) 'MS-DOS'\n+76A54 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-760DE Compression Method    0008 (8) 'Deflated'\n-760E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-760E4 CRC                   4A73FA6D (1249114733)\n-760E8 Compressed Size       00000441 (1089)\n-760EC Uncompressed Size     000010A2 (4258)\n-760F0 Filename Length       002A (42)\n-760F2 Extra Length          0000 (0)\n-760F4 Comment Length        0000 (0)\n-760F6 Disk Start            0000 (0)\n-760F8 Int File Attributes   0000 (0)\n+76A56 Compression Method    0008 (8) 'Deflated'\n+76A58 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76A5C CRC                   4A73FA6D (1249114733)\n+76A60 Compressed Size       00000441 (1089)\n+76A64 Uncompressed Size     000010A2 (4258)\n+76A68 Filename Length       002A (42)\n+76A6A Extra Length          0000 (0)\n+76A6C Comment Length        0000 (0)\n+76A6E Disk Start            0000 (0)\n+76A70 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-760FA Ext File Attributes   81A40000 (2175008768)\n+76A72 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-760FE Local Header Offset   00049470 (300144)\n-76102 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76A76 Local Header Offset   000499F4 (301556)\n+76A7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76102: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76A7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7612C CENTRAL HEADER #280   02014B50 (33639248)\n-76130 Created Zip Spec      14 (20) '2.0'\n-76131 Created OS            03 (3) 'Unix'\n-76132 Extract Zip Spec      14 (20) '2.0'\n-76133 Extract OS            00 (0) 'MS-DOS'\n-76134 General Purpose Flag  0800 (2048)\n+76AA4 CENTRAL HEADER #280   02014B50 (33639248)\n+76AA8 Created Zip Spec      14 (20) '2.0'\n+76AA9 Created OS            03 (3) 'Unix'\n+76AAA Extract Zip Spec      14 (20) '2.0'\n+76AAB Extract OS            00 (0) 'MS-DOS'\n+76AAC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76136 Compression Method    0008 (8) 'Deflated'\n-76138 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7613C CRC                   7D5526CA (2102732490)\n-76140 Compressed Size       0000032E (814)\n-76144 Uncompressed Size     00000960 (2400)\n-76148 Filename Length       002E (46)\n-7614A Extra Length          0000 (0)\n-7614C Comment Length        0000 (0)\n-7614E Disk Start            0000 (0)\n-76150 Int File Attributes   0000 (0)\n+76AAE Compression Method    0008 (8) 'Deflated'\n+76AB0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76AB4 CRC                   FE0FBB73 (4262443891)\n+76AB8 Compressed Size       0000033B (827)\n+76ABC Uncompressed Size     0000099D (2461)\n+76AC0 Filename Length       002E (46)\n+76AC2 Extra Length          0000 (0)\n+76AC4 Comment Length        0000 (0)\n+76AC6 Disk Start            0000 (0)\n+76AC8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76152 Ext File Attributes   81A40000 (2175008768)\n+76ACA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76156 Local Header Offset   000498F9 (301305)\n-7615A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76ACE Local Header Offset   00049E7D (302717)\n+76AD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7615A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76AD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76188 CENTRAL HEADER #281   02014B50 (33639248)\n-7618C Created Zip Spec      14 (20) '2.0'\n-7618D Created OS            03 (3) 'Unix'\n-7618E Extract Zip Spec      14 (20) '2.0'\n-7618F Extract OS            00 (0) 'MS-DOS'\n-76190 General Purpose Flag  0800 (2048)\n+76B00 CENTRAL HEADER #281   02014B50 (33639248)\n+76B04 Created Zip Spec      14 (20) '2.0'\n+76B05 Created OS            03 (3) 'Unix'\n+76B06 Extract Zip Spec      14 (20) '2.0'\n+76B07 Extract OS            00 (0) 'MS-DOS'\n+76B08 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76192 Compression Method    0008 (8) 'Deflated'\n-76194 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76198 CRC                   3C2ED9BE (1009703358)\n-7619C Compressed Size       000003E9 (1001)\n-761A0 Uncompressed Size     00000939 (2361)\n-761A4 Filename Length       0033 (51)\n-761A6 Extra Length          0000 (0)\n-761A8 Comment Length        0000 (0)\n-761AA Disk Start            0000 (0)\n-761AC Int File Attributes   0000 (0)\n+76B0A Compression Method    0008 (8) 'Deflated'\n+76B0C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76B10 CRC                   F18EE811 (4052674577)\n+76B14 Compressed Size       000003F5 (1013)\n+76B18 Uncompressed Size     00000980 (2432)\n+76B1C Filename Length       0033 (51)\n+76B1E Extra Length          0000 (0)\n+76B20 Comment Length        0000 (0)\n+76B22 Disk Start            0000 (0)\n+76B24 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-761AE Ext File Attributes   81A40000 (2175008768)\n+76B26 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-761B2 Local Header Offset   00049C73 (302195)\n-761B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76B2A Local Header Offset   0004A204 (303620)\n+76B2E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x761B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76B2E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-761E9 CENTRAL HEADER #282   02014B50 (33639248)\n-761ED Created Zip Spec      14 (20) '2.0'\n-761EE Created OS            03 (3) 'Unix'\n-761EF Extract Zip Spec      14 (20) '2.0'\n-761F0 Extract OS            00 (0) 'MS-DOS'\n-761F1 General Purpose Flag  0800 (2048)\n+76B61 CENTRAL HEADER #282   02014B50 (33639248)\n+76B65 Created Zip Spec      14 (20) '2.0'\n+76B66 Created OS            03 (3) 'Unix'\n+76B67 Extract Zip Spec      14 (20) '2.0'\n+76B68 Extract OS            00 (0) 'MS-DOS'\n+76B69 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-761F3 Compression Method    0008 (8) 'Deflated'\n-761F5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-761F9 CRC                   BA95C40E (3130377230)\n-761FD Compressed Size       00000C86 (3206)\n-76201 Uncompressed Size     000039CB (14795)\n-76205 Filename Length       002E (46)\n-76207 Extra Length          0000 (0)\n-76209 Comment Length        0000 (0)\n-7620B Disk Start            0000 (0)\n-7620D Int File Attributes   0000 (0)\n+76B6B Compression Method    0008 (8) 'Deflated'\n+76B6D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76B71 CRC                   3744AF68 (927248232)\n+76B75 Compressed Size       00000C9B (3227)\n+76B79 Uncompressed Size     00003B50 (15184)\n+76B7D Filename Length       002E (46)\n+76B7F Extra Length          0000 (0)\n+76B81 Comment Length        0000 (0)\n+76B83 Disk Start            0000 (0)\n+76B85 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7620F Ext File Attributes   81A40000 (2175008768)\n+76B87 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76213 Local Header Offset   0004A0AD (303277)\n-76217 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76B8B Local Header Offset   0004A64A (304714)\n+76B8F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76217: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76B8F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76245 CENTRAL HEADER #283   02014B50 (33639248)\n-76249 Created Zip Spec      14 (20) '2.0'\n-7624A Created OS            03 (3) 'Unix'\n-7624B Extract Zip Spec      14 (20) '2.0'\n-7624C Extract OS            00 (0) 'MS-DOS'\n-7624D General Purpose Flag  0800 (2048)\n+76BBD CENTRAL HEADER #283   02014B50 (33639248)\n+76BC1 Created Zip Spec      14 (20) '2.0'\n+76BC2 Created OS            03 (3) 'Unix'\n+76BC3 Extract Zip Spec      14 (20) '2.0'\n+76BC4 Extract OS            00 (0) 'MS-DOS'\n+76BC5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7624F Compression Method    0008 (8) 'Deflated'\n-76251 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76255 CRC                   A4EA9AD2 (2766838482)\n-76259 Compressed Size       00000386 (902)\n-7625D Uncompressed Size     0000085B (2139)\n-76261 Filename Length       0035 (53)\n-76263 Extra Length          0000 (0)\n-76265 Comment Length        0000 (0)\n-76267 Disk Start            0000 (0)\n-76269 Int File Attributes   0000 (0)\n+76BC7 Compression Method    0008 (8) 'Deflated'\n+76BC9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76BCD CRC                   A4EA9AD2 (2766838482)\n+76BD1 Compressed Size       00000386 (902)\n+76BD5 Uncompressed Size     0000085B (2139)\n+76BD9 Filename Length       0035 (53)\n+76BDB Extra Length          0000 (0)\n+76BDD Comment Length        0000 (0)\n+76BDF Disk Start            0000 (0)\n+76BE1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7626B Ext File Attributes   81A40000 (2175008768)\n+76BE3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7626F Local Header Offset   0004AD7F (306559)\n-76273 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76BE7 Local Header Offset   0004B331 (308017)\n+76BEB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76273: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76BEB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-762A8 CENTRAL HEADER #284   02014B50 (33639248)\n-762AC Created Zip Spec      14 (20) '2.0'\n-762AD Created OS            03 (3) 'Unix'\n-762AE Extract Zip Spec      14 (20) '2.0'\n-762AF Extract OS            00 (0) 'MS-DOS'\n-762B0 General Purpose Flag  0800 (2048)\n+76C20 CENTRAL HEADER #284   02014B50 (33639248)\n+76C24 Created Zip Spec      14 (20) '2.0'\n+76C25 Created OS            03 (3) 'Unix'\n+76C26 Extract Zip Spec      14 (20) '2.0'\n+76C27 Extract OS            00 (0) 'MS-DOS'\n+76C28 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-762B2 Compression Method    0008 (8) 'Deflated'\n-762B4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-762B8 CRC                   90514D51 (2421247313)\n-762BC Compressed Size       0000141B (5147)\n-762C0 Uncompressed Size     00005DC7 (24007)\n-762C4 Filename Length       002B (43)\n-762C6 Extra Length          0000 (0)\n-762C8 Comment Length        0000 (0)\n-762CA Disk Start            0000 (0)\n-762CC Int File Attributes   0000 (0)\n+76C2A Compression Method    0008 (8) 'Deflated'\n+76C2C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76C30 CRC                   90514D51 (2421247313)\n+76C34 Compressed Size       0000141B (5147)\n+76C38 Uncompressed Size     00005DC7 (24007)\n+76C3C Filename Length       002B (43)\n+76C3E Extra Length          0000 (0)\n+76C40 Comment Length        0000 (0)\n+76C42 Disk Start            0000 (0)\n+76C44 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-762CE Ext File Attributes   81A40000 (2175008768)\n+76C46 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-762D2 Local Header Offset   0004B158 (307544)\n-762D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76C4A Local Header Offset   0004B70A (309002)\n+76C4E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x762D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76C4E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76301 CENTRAL HEADER #285   02014B50 (33639248)\n-76305 Created Zip Spec      14 (20) '2.0'\n-76306 Created OS            03 (3) 'Unix'\n-76307 Extract Zip Spec      14 (20) '2.0'\n-76308 Extract OS            00 (0) 'MS-DOS'\n-76309 General Purpose Flag  0800 (2048)\n+76C79 CENTRAL HEADER #285   02014B50 (33639248)\n+76C7D Created Zip Spec      14 (20) '2.0'\n+76C7E Created OS            03 (3) 'Unix'\n+76C7F Extract Zip Spec      14 (20) '2.0'\n+76C80 Extract OS            00 (0) 'MS-DOS'\n+76C81 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7630B Compression Method    0008 (8) 'Deflated'\n-7630D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76311 CRC                   6148ED28 (1632169256)\n-76315 Compressed Size       00000362 (866)\n-76319 Uncompressed Size     00000813 (2067)\n-7631D Filename Length       0027 (39)\n-7631F Extra Length          0000 (0)\n-76321 Comment Length        0000 (0)\n-76323 Disk Start            0000 (0)\n-76325 Int File Attributes   0000 (0)\n+76C83 Compression Method    0008 (8) 'Deflated'\n+76C85 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76C89 CRC                   3422DF4F (874700623)\n+76C8D Compressed Size       0000036E (878)\n+76C91 Uncompressed Size     0000086A (2154)\n+76C95 Filename Length       0027 (39)\n+76C97 Extra Length          0000 (0)\n+76C99 Comment Length        0000 (0)\n+76C9B Disk Start            0000 (0)\n+76C9D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76327 Ext File Attributes   81A40000 (2175008768)\n+76C9F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7632B Local Header Offset   0004C5BC (312764)\n-7632F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76CA3 Local Header Offset   0004CB6E (314222)\n+76CA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7632F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76CA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76356 CENTRAL HEADER #286   02014B50 (33639248)\n-7635A Created Zip Spec      14 (20) '2.0'\n-7635B Created OS            03 (3) 'Unix'\n-7635C Extract Zip Spec      14 (20) '2.0'\n-7635D Extract OS            00 (0) 'MS-DOS'\n-7635E General Purpose Flag  0800 (2048)\n+76CCE CENTRAL HEADER #286   02014B50 (33639248)\n+76CD2 Created Zip Spec      14 (20) '2.0'\n+76CD3 Created OS            03 (3) 'Unix'\n+76CD4 Extract Zip Spec      14 (20) '2.0'\n+76CD5 Extract OS            00 (0) 'MS-DOS'\n+76CD6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76360 Compression Method    0008 (8) 'Deflated'\n-76362 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76366 CRC                   32B357AB (850614187)\n-7636A Compressed Size       000003EF (1007)\n-7636E Uncompressed Size     0000095A (2394)\n-76372 Filename Length       002C (44)\n-76374 Extra Length          0000 (0)\n-76376 Comment Length        0000 (0)\n-76378 Disk Start            0000 (0)\n-7637A Int File Attributes   0000 (0)\n+76CD8 Compression Method    0008 (8) 'Deflated'\n+76CDA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76CDE CRC                   5087E57A (1351083386)\n+76CE2 Compressed Size       000003F9 (1017)\n+76CE6 Uncompressed Size     000009A4 (2468)\n+76CEA Filename Length       002C (44)\n+76CEC Extra Length          0000 (0)\n+76CEE Comment Length        0000 (0)\n+76CF0 Disk Start            0000 (0)\n+76CF2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7637C Ext File Attributes   81A40000 (2175008768)\n+76CF4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76380 Local Header Offset   0004C963 (313699)\n-76384 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76CF8 Local Header Offset   0004CF21 (315169)\n+76CFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76384: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76CFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-763B0 CENTRAL HEADER #287   02014B50 (33639248)\n-763B4 Created Zip Spec      14 (20) '2.0'\n-763B5 Created OS            03 (3) 'Unix'\n-763B6 Extract Zip Spec      14 (20) '2.0'\n-763B7 Extract OS            00 (0) 'MS-DOS'\n-763B8 General Purpose Flag  0800 (2048)\n+76D28 CENTRAL HEADER #287   02014B50 (33639248)\n+76D2C Created Zip Spec      14 (20) '2.0'\n+76D2D Created OS            03 (3) 'Unix'\n+76D2E Extract Zip Spec      14 (20) '2.0'\n+76D2F Extract OS            00 (0) 'MS-DOS'\n+76D30 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-763BA Compression Method    0008 (8) 'Deflated'\n-763BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-763C0 CRC                   34D97477 (886666359)\n-763C4 Compressed Size       000019E7 (6631)\n-763C8 Uncompressed Size     00008320 (33568)\n-763CC Filename Length       002C (44)\n-763CE Extra Length          0000 (0)\n-763D0 Comment Length        0000 (0)\n-763D2 Disk Start            0000 (0)\n-763D4 Int File Attributes   0000 (0)\n+76D32 Compression Method    0008 (8) 'Deflated'\n+76D34 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76D38 CRC                   34D97477 (886666359)\n+76D3C Compressed Size       000019E7 (6631)\n+76D40 Uncompressed Size     00008320 (33568)\n+76D44 Filename Length       002C (44)\n+76D46 Extra Length          0000 (0)\n+76D48 Comment Length        0000 (0)\n+76D4A Disk Start            0000 (0)\n+76D4C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-763D6 Ext File Attributes   81A40000 (2175008768)\n+76D4E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-763DA Local Header Offset   0004CD9C (314780)\n-763DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76D52 Local Header Offset   0004D364 (316260)\n+76D56 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x763DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76D56: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7640A CENTRAL HEADER #288   02014B50 (33639248)\n-7640E Created Zip Spec      14 (20) '2.0'\n-7640F Created OS            03 (3) 'Unix'\n-76410 Extract Zip Spec      14 (20) '2.0'\n-76411 Extract OS            00 (0) 'MS-DOS'\n-76412 General Purpose Flag  0800 (2048)\n+76D82 CENTRAL HEADER #288   02014B50 (33639248)\n+76D86 Created Zip Spec      14 (20) '2.0'\n+76D87 Created OS            03 (3) 'Unix'\n+76D88 Extract Zip Spec      14 (20) '2.0'\n+76D89 Extract OS            00 (0) 'MS-DOS'\n+76D8A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76414 Compression Method    0008 (8) 'Deflated'\n-76416 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7641A CRC                   6788144F (1736971343)\n-7641E Compressed Size       00002056 (8278)\n-76422 Uncompressed Size     0000B91D (47389)\n-76426 Filename Length       002F (47)\n-76428 Extra Length          0000 (0)\n-7642A Comment Length        0000 (0)\n-7642C Disk Start            0000 (0)\n-7642E Int File Attributes   0000 (0)\n+76D8C Compression Method    0008 (8) 'Deflated'\n+76D8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76D92 CRC                   4414A4AD (1142203565)\n+76D96 Compressed Size       0000207F (8319)\n+76D9A Uncompressed Size     0000BE90 (48784)\n+76D9E Filename Length       002F (47)\n+76DA0 Extra Length          0000 (0)\n+76DA2 Comment Length        0000 (0)\n+76DA4 Disk Start            0000 (0)\n+76DA6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76430 Ext File Attributes   81A40000 (2175008768)\n+76DA8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76434 Local Header Offset   0004E7CD (321485)\n-76438 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76DAC Local Header Offset   0004ED95 (322965)\n+76DB0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76438: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76DB0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76467 CENTRAL HEADER #289   02014B50 (33639248)\n-7646B Created Zip Spec      14 (20) '2.0'\n-7646C Created OS            03 (3) 'Unix'\n-7646D Extract Zip Spec      14 (20) '2.0'\n-7646E Extract OS            00 (0) 'MS-DOS'\n-7646F General Purpose Flag  0800 (2048)\n+76DDF CENTRAL HEADER #289   02014B50 (33639248)\n+76DE3 Created Zip Spec      14 (20) '2.0'\n+76DE4 Created OS            03 (3) 'Unix'\n+76DE5 Extract Zip Spec      14 (20) '2.0'\n+76DE6 Extract OS            00 (0) 'MS-DOS'\n+76DE7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76471 Compression Method    0008 (8) 'Deflated'\n-76473 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76477 CRC                   9D4E3C73 (2639150195)\n-7647B Compressed Size       0000075E (1886)\n-7647F Uncompressed Size     00001707 (5895)\n-76483 Filename Length       0038 (56)\n-76485 Extra Length          0000 (0)\n-76487 Comment Length        0000 (0)\n-76489 Disk Start            0000 (0)\n-7648B Int File Attributes   0000 (0)\n+76DE9 Compression Method    0008 (8) 'Deflated'\n+76DEB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76DEF CRC                   20B97A60 (549026400)\n+76DF3 Compressed Size       0000076D (1901)\n+76DF7 Uncompressed Size     0000179D (6045)\n+76DFB Filename Length       0038 (56)\n+76DFD Extra Length          0000 (0)\n+76DFF Comment Length        0000 (0)\n+76E01 Disk Start            0000 (0)\n+76E03 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7648D Ext File Attributes   81A40000 (2175008768)\n+76E05 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76491 Local Header Offset   00050870 (329840)\n-76495 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76E09 Local Header Offset   00050E61 (331361)\n+76E0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76495: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76E0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-764CD CENTRAL HEADER #290   02014B50 (33639248)\n-764D1 Created Zip Spec      14 (20) '2.0'\n-764D2 Created OS            03 (3) 'Unix'\n-764D3 Extract Zip Spec      14 (20) '2.0'\n-764D4 Extract OS            00 (0) 'MS-DOS'\n-764D5 General Purpose Flag  0800 (2048)\n+76E45 CENTRAL HEADER #290   02014B50 (33639248)\n+76E49 Created Zip Spec      14 (20) '2.0'\n+76E4A Created OS            03 (3) 'Unix'\n+76E4B Extract Zip Spec      14 (20) '2.0'\n+76E4C Extract OS            00 (0) 'MS-DOS'\n+76E4D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-764D7 Compression Method    0008 (8) 'Deflated'\n-764D9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-764DD CRC                   359BAAF7 (899394295)\n-764E1 Compressed Size       00000598 (1432)\n-764E5 Uncompressed Size     000011CA (4554)\n-764E9 Filename Length       003C (60)\n-764EB Extra Length          0000 (0)\n-764ED Comment Length        0000 (0)\n-764EF Disk Start            0000 (0)\n-764F1 Int File Attributes   0000 (0)\n+76E4F Compression Method    0008 (8) 'Deflated'\n+76E51 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76E55 CRC                   0B75FDAE (192282030)\n+76E59 Compressed Size       000005A6 (1446)\n+76E5D Uncompressed Size     0000124E (4686)\n+76E61 Filename Length       003C (60)\n+76E63 Extra Length          0000 (0)\n+76E65 Comment Length        0000 (0)\n+76E67 Disk Start            0000 (0)\n+76E69 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-764F3 Ext File Attributes   81A40000 (2175008768)\n+76E6B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-764F7 Local Header Offset   00051024 (331812)\n-764FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76E6F Local Header Offset   00051624 (333348)\n+76E73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x764FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76E73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76537 CENTRAL HEADER #291   02014B50 (33639248)\n-7653B Created Zip Spec      14 (20) '2.0'\n-7653C Created OS            03 (3) 'Unix'\n-7653D Extract Zip Spec      14 (20) '2.0'\n-7653E Extract OS            00 (0) 'MS-DOS'\n-7653F General Purpose Flag  0800 (2048)\n+76EAF CENTRAL HEADER #291   02014B50 (33639248)\n+76EB3 Created Zip Spec      14 (20) '2.0'\n+76EB4 Created OS            03 (3) 'Unix'\n+76EB5 Extract Zip Spec      14 (20) '2.0'\n+76EB6 Extract OS            00 (0) 'MS-DOS'\n+76EB7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76541 Compression Method    0008 (8) 'Deflated'\n-76543 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76547 CRC                   4DF6AB6E (1308011374)\n-7654B Compressed Size       000003FC (1020)\n-7654F Uncompressed Size     00000CBD (3261)\n-76553 Filename Length       0028 (40)\n-76555 Extra Length          0000 (0)\n-76557 Comment Length        0000 (0)\n-76559 Disk Start            0000 (0)\n-7655B Int File Attributes   0000 (0)\n+76EB9 Compression Method    0008 (8) 'Deflated'\n+76EBB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76EBF CRC                   D09B55F9 (3499841017)\n+76EC3 Compressed Size       00000407 (1031)\n+76EC7 Uncompressed Size     00000D4B (3403)\n+76ECB Filename Length       0028 (40)\n+76ECD Extra Length          0000 (0)\n+76ECF Comment Length        0000 (0)\n+76ED1 Disk Start            0000 (0)\n+76ED3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7655D Ext File Attributes   81A40000 (2175008768)\n+76ED5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76561 Local Header Offset   00051616 (333334)\n-76565 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76ED9 Local Header Offset   00051C24 (334884)\n+76EDD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76565: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76EDD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7658D CENTRAL HEADER #292   02014B50 (33639248)\n-76591 Created Zip Spec      14 (20) '2.0'\n-76592 Created OS            03 (3) 'Unix'\n-76593 Extract Zip Spec      14 (20) '2.0'\n-76594 Extract OS            00 (0) 'MS-DOS'\n-76595 General Purpose Flag  0800 (2048)\n+76F05 CENTRAL HEADER #292   02014B50 (33639248)\n+76F09 Created Zip Spec      14 (20) '2.0'\n+76F0A Created OS            03 (3) 'Unix'\n+76F0B Extract Zip Spec      14 (20) '2.0'\n+76F0C Extract OS            00 (0) 'MS-DOS'\n+76F0D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76597 Compression Method    0008 (8) 'Deflated'\n-76599 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7659D CRC                   E15897D6 (3780679638)\n-765A1 Compressed Size       000003D1 (977)\n-765A5 Uncompressed Size     00000A1C (2588)\n-765A9 Filename Length       0044 (68)\n-765AB Extra Length          0000 (0)\n-765AD Comment Length        0000 (0)\n-765AF Disk Start            0000 (0)\n-765B1 Int File Attributes   0000 (0)\n+76F0F Compression Method    0008 (8) 'Deflated'\n+76F11 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76F15 CRC                   F3B0BA28 (4088445480)\n+76F19 Compressed Size       000003D9 (985)\n+76F1D Uncompressed Size     00000A5F (2655)\n+76F21 Filename Length       0044 (68)\n+76F23 Extra Length          0000 (0)\n+76F25 Comment Length        0000 (0)\n+76F27 Disk Start            0000 (0)\n+76F29 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-765B3 Ext File Attributes   81A40000 (2175008768)\n+76F2B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-765B7 Local Header Offset   00051A58 (334424)\n-765BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76F2F Local Header Offset   00052071 (335985)\n+76F33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x765BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76F33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-765FF CENTRAL HEADER #293   02014B50 (33639248)\n-76603 Created Zip Spec      14 (20) '2.0'\n-76604 Created OS            03 (3) 'Unix'\n-76605 Extract Zip Spec      14 (20) '2.0'\n-76606 Extract OS            00 (0) 'MS-DOS'\n-76607 General Purpose Flag  0800 (2048)\n+76F77 CENTRAL HEADER #293   02014B50 (33639248)\n+76F7B Created Zip Spec      14 (20) '2.0'\n+76F7C Created OS            03 (3) 'Unix'\n+76F7D Extract Zip Spec      14 (20) '2.0'\n+76F7E Extract OS            00 (0) 'MS-DOS'\n+76F7F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76609 Compression Method    0008 (8) 'Deflated'\n-7660B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7660F CRC                   080CFD86 (135069062)\n-76613 Compressed Size       00001E9B (7835)\n-76617 Uncompressed Size     00009370 (37744)\n-7661B Filename Length       002E (46)\n-7661D Extra Length          0000 (0)\n-7661F Comment Length        0000 (0)\n-76621 Disk Start            0000 (0)\n-76623 Int File Attributes   0000 (0)\n+76F81 Compression Method    0008 (8) 'Deflated'\n+76F83 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76F87 CRC                   080CFD86 (135069062)\n+76F8B Compressed Size       00001E9B (7835)\n+76F8F Uncompressed Size     00009370 (37744)\n+76F93 Filename Length       002E (46)\n+76F95 Extra Length          0000 (0)\n+76F97 Comment Length        0000 (0)\n+76F99 Disk Start            0000 (0)\n+76F9B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76625 Ext File Attributes   81A40000 (2175008768)\n+76F9D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76629 Local Header Offset   00051E8B (335499)\n-7662D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76FA1 Local Header Offset   000524AC (337068)\n+76FA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7662D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76FA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7665B CENTRAL HEADER #294   02014B50 (33639248)\n-7665F Created Zip Spec      14 (20) '2.0'\n-76660 Created OS            03 (3) 'Unix'\n-76661 Extract Zip Spec      14 (20) '2.0'\n-76662 Extract OS            00 (0) 'MS-DOS'\n-76663 General Purpose Flag  0800 (2048)\n+76FD3 CENTRAL HEADER #294   02014B50 (33639248)\n+76FD7 Created Zip Spec      14 (20) '2.0'\n+76FD8 Created OS            03 (3) 'Unix'\n+76FD9 Extract Zip Spec      14 (20) '2.0'\n+76FDA Extract OS            00 (0) 'MS-DOS'\n+76FDB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76665 Compression Method    0008 (8) 'Deflated'\n-76667 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7666B CRC                   45127F53 (1158840147)\n-7666F Compressed Size       00000772 (1906)\n-76673 Uncompressed Size     000021F8 (8696)\n-76677 Filename Length       002C (44)\n-76679 Extra Length          0000 (0)\n-7667B Comment Length        0000 (0)\n-7667D Disk Start            0000 (0)\n-7667F Int File Attributes   0000 (0)\n+76FDD Compression Method    0008 (8) 'Deflated'\n+76FDF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76FE3 CRC                   70A970FE (1890152702)\n+76FE7 Compressed Size       0000077E (1918)\n+76FEB Uncompressed Size     000022D8 (8920)\n+76FEF Filename Length       002C (44)\n+76FF1 Extra Length          0000 (0)\n+76FF3 Comment Length        0000 (0)\n+76FF5 Disk Start            0000 (0)\n+76FF7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76681 Ext File Attributes   81A40000 (2175008768)\n+76FF9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76685 Local Header Offset   00053D72 (343410)\n-76689 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76FFD Local Header Offset   00054393 (344979)\n+77001 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76689: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77001: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-766B5 CENTRAL HEADER #295   02014B50 (33639248)\n-766B9 Created Zip Spec      14 (20) '2.0'\n-766BA Created OS            03 (3) 'Unix'\n-766BB Extract Zip Spec      14 (20) '2.0'\n-766BC Extract OS            00 (0) 'MS-DOS'\n-766BD General Purpose Flag  0800 (2048)\n+7702D CENTRAL HEADER #295   02014B50 (33639248)\n+77031 Created Zip Spec      14 (20) '2.0'\n+77032 Created OS            03 (3) 'Unix'\n+77033 Extract Zip Spec      14 (20) '2.0'\n+77034 Extract OS            00 (0) 'MS-DOS'\n+77035 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-766BF Compression Method    0008 (8) 'Deflated'\n-766C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-766C5 CRC                   BCEF5B37 (3169803063)\n-766C9 Compressed Size       0000118B (4491)\n-766CD Uncompressed Size     0000634F (25423)\n-766D1 Filename Length       002B (43)\n-766D3 Extra Length          0000 (0)\n-766D5 Comment Length        0000 (0)\n-766D7 Disk Start            0000 (0)\n-766D9 Int File Attributes   0000 (0)\n+77037 Compression Method    0008 (8) 'Deflated'\n+77039 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7703D CRC                   BCEF5B37 (3169803063)\n+77041 Compressed Size       0000118B (4491)\n+77045 Uncompressed Size     0000634F (25423)\n+77049 Filename Length       002B (43)\n+7704B Extra Length          0000 (0)\n+7704D Comment Length        0000 (0)\n+7704F Disk Start            0000 (0)\n+77051 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-766DB Ext File Attributes   81A40000 (2175008768)\n+77053 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-766DF Local Header Offset   0005452E (345390)\n-766E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77057 Local Header Offset   00054B5B (346971)\n+7705B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x766E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7705B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7670E CENTRAL HEADER #296   02014B50 (33639248)\n-76712 Created Zip Spec      14 (20) '2.0'\n-76713 Created OS            03 (3) 'Unix'\n-76714 Extract Zip Spec      14 (20) '2.0'\n-76715 Extract OS            00 (0) 'MS-DOS'\n-76716 General Purpose Flag  0800 (2048)\n+77086 CENTRAL HEADER #296   02014B50 (33639248)\n+7708A Created Zip Spec      14 (20) '2.0'\n+7708B Created OS            03 (3) 'Unix'\n+7708C Extract Zip Spec      14 (20) '2.0'\n+7708D Extract OS            00 (0) 'MS-DOS'\n+7708E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76718 Compression Method    0008 (8) 'Deflated'\n-7671A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7671E CRC                   E7AAF9A0 (3886741920)\n-76722 Compressed Size       00000AFB (2811)\n-76726 Uncompressed Size     000026C6 (9926)\n-7672A Filename Length       002C (44)\n-7672C Extra Length          0000 (0)\n-7672E Comment Length        0000 (0)\n-76730 Disk Start            0000 (0)\n-76732 Int File Attributes   0000 (0)\n+77090 Compression Method    0008 (8) 'Deflated'\n+77092 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77096 CRC                   DB02321D (3674354205)\n+7709A Compressed Size       00000B07 (2823)\n+7709E Uncompressed Size     000027AB (10155)\n+770A2 Filename Length       002C (44)\n+770A4 Extra Length          0000 (0)\n+770A6 Comment Length        0000 (0)\n+770A8 Disk Start            0000 (0)\n+770AA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76734 Ext File Attributes   81A40000 (2175008768)\n+770AC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76738 Local Header Offset   00055702 (349954)\n-7673C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+770B0 Local Header Offset   00055D2F (351535)\n+770B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7673C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x770B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76768 CENTRAL HEADER #297   02014B50 (33639248)\n-7676C Created Zip Spec      14 (20) '2.0'\n-7676D Created OS            03 (3) 'Unix'\n-7676E Extract Zip Spec      14 (20) '2.0'\n-7676F Extract OS            00 (0) 'MS-DOS'\n-76770 General Purpose Flag  0800 (2048)\n+770E0 CENTRAL HEADER #297   02014B50 (33639248)\n+770E4 Created Zip Spec      14 (20) '2.0'\n+770E5 Created OS            03 (3) 'Unix'\n+770E6 Extract Zip Spec      14 (20) '2.0'\n+770E7 Extract OS            00 (0) 'MS-DOS'\n+770E8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76772 Compression Method    0008 (8) 'Deflated'\n-76774 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76778 CRC                   4A1B9248 (1243320904)\n-7677C Compressed Size       000014E2 (5346)\n-76780 Uncompressed Size     0000642A (25642)\n-76784 Filename Length       002B (43)\n-76786 Extra Length          0000 (0)\n-76788 Comment Length        0000 (0)\n-7678A Disk Start            0000 (0)\n-7678C Int File Attributes   0000 (0)\n+770EA Compression Method    0008 (8) 'Deflated'\n+770EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+770F0 CRC                   DCD69CAC (3705052332)\n+770F4 Compressed Size       000014FD (5373)\n+770F8 Uncompressed Size     00006690 (26256)\n+770FC Filename Length       002B (43)\n+770FE Extra Length          0000 (0)\n+77100 Comment Length        0000 (0)\n+77102 Disk Start            0000 (0)\n+77104 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7678E Ext File Attributes   81A40000 (2175008768)\n+77106 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76792 Local Header Offset   00056247 (352839)\n-76796 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7710A Local Header Offset   00056880 (354432)\n+7710E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76796: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7710E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-767C1 CENTRAL HEADER #298   02014B50 (33639248)\n-767C5 Created Zip Spec      14 (20) '2.0'\n-767C6 Created OS            03 (3) 'Unix'\n-767C7 Extract Zip Spec      14 (20) '2.0'\n-767C8 Extract OS            00 (0) 'MS-DOS'\n-767C9 General Purpose Flag  0800 (2048)\n+77139 CENTRAL HEADER #298   02014B50 (33639248)\n+7713D Created Zip Spec      14 (20) '2.0'\n+7713E Created OS            03 (3) 'Unix'\n+7713F Extract Zip Spec      14 (20) '2.0'\n+77140 Extract OS            00 (0) 'MS-DOS'\n+77141 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-767CB Compression Method    0008 (8) 'Deflated'\n-767CD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-767D1 CRC                   4BCB8E78 (1271631480)\n-767D5 Compressed Size       00001440 (5184)\n-767D9 Uncompressed Size     00005EF7 (24311)\n-767DD Filename Length       0034 (52)\n-767DF Extra Length          0000 (0)\n-767E1 Comment Length        0000 (0)\n-767E3 Disk Start            0000 (0)\n-767E5 Int File Attributes   0000 (0)\n+77143 Compression Method    0008 (8) 'Deflated'\n+77145 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77149 CRC                   E3FDA003 (3825049603)\n+7714D Compressed Size       0000145F (5215)\n+77151 Uncompressed Size     000061ED (25069)\n+77155 Filename Length       0034 (52)\n+77157 Extra Length          0000 (0)\n+77159 Comment Length        0000 (0)\n+7715B Disk Start            0000 (0)\n+7715D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-767E7 Ext File Attributes   81A40000 (2175008768)\n+7715F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-767EB Local Header Offset   00057772 (358258)\n-767EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77163 Local Header Offset   00057DC6 (359878)\n+77167 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x767EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77167: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76823 CENTRAL HEADER #299   02014B50 (33639248)\n-76827 Created Zip Spec      14 (20) '2.0'\n-76828 Created OS            03 (3) 'Unix'\n-76829 Extract Zip Spec      14 (20) '2.0'\n-7682A Extract OS            00 (0) 'MS-DOS'\n-7682B General Purpose Flag  0800 (2048)\n+7719B CENTRAL HEADER #299   02014B50 (33639248)\n+7719F Created Zip Spec      14 (20) '2.0'\n+771A0 Created OS            03 (3) 'Unix'\n+771A1 Extract Zip Spec      14 (20) '2.0'\n+771A2 Extract OS            00 (0) 'MS-DOS'\n+771A3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7682D Compression Method    0008 (8) 'Deflated'\n-7682F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76833 CRC                   EBCB75D3 (3955979731)\n-76837 Compressed Size       00000605 (1541)\n-7683B Uncompressed Size     00001235 (4661)\n-7683F Filename Length       0031 (49)\n-76841 Extra Length          0000 (0)\n-76843 Comment Length        0000 (0)\n-76845 Disk Start            0000 (0)\n-76847 Int File Attributes   0000 (0)\n+771A5 Compression Method    0008 (8) 'Deflated'\n+771A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+771AB CRC                   9A747BAC (2591325100)\n+771AF Compressed Size       00000613 (1555)\n+771B3 Uncompressed Size     00001305 (4869)\n+771B7 Filename Length       0031 (49)\n+771B9 Extra Length          0000 (0)\n+771BB Comment Length        0000 (0)\n+771BD Disk Start            0000 (0)\n+771BF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76849 Ext File Attributes   81A40000 (2175008768)\n+771C1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7684D Local Header Offset   00058C04 (363524)\n-76851 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+771C5 Local Header Offset   00059277 (365175)\n+771C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76851: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x771C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76882 CENTRAL HEADER #300   02014B50 (33639248)\n-76886 Created Zip Spec      14 (20) '2.0'\n-76887 Created OS            03 (3) 'Unix'\n-76888 Extract Zip Spec      14 (20) '2.0'\n-76889 Extract OS            00 (0) 'MS-DOS'\n-7688A General Purpose Flag  0800 (2048)\n+771FA CENTRAL HEADER #300   02014B50 (33639248)\n+771FE Created Zip Spec      14 (20) '2.0'\n+771FF Created OS            03 (3) 'Unix'\n+77200 Extract Zip Spec      14 (20) '2.0'\n+77201 Extract OS            00 (0) 'MS-DOS'\n+77202 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7688C Compression Method    0008 (8) 'Deflated'\n-7688E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76892 CRC                   0D6CD567 (225236327)\n-76896 Compressed Size       000006D0 (1744)\n-7689A Uncompressed Size     000015F5 (5621)\n-7689E Filename Length       0034 (52)\n-768A0 Extra Length          0000 (0)\n-768A2 Comment Length        0000 (0)\n-768A4 Disk Start            0000 (0)\n-768A6 Int File Attributes   0000 (0)\n+77204 Compression Method    0008 (8) 'Deflated'\n+77206 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7720A CRC                   F1EB3E77 (4058726007)\n+7720E Compressed Size       000006E0 (1760)\n+77212 Uncompressed Size     000016D7 (5847)\n+77216 Filename Length       0034 (52)\n+77218 Extra Length          0000 (0)\n+7721A Comment Length        0000 (0)\n+7721C Disk Start            0000 (0)\n+7721E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-768A8 Ext File Attributes   81A40000 (2175008768)\n+77220 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-768AC Local Header Offset   00059258 (365144)\n-768B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77224 Local Header Offset   000598D9 (366809)\n+77228 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x768B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77228: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-768E4 CENTRAL HEADER #301   02014B50 (33639248)\n-768E8 Created Zip Spec      14 (20) '2.0'\n-768E9 Created OS            03 (3) 'Unix'\n-768EA Extract Zip Spec      14 (20) '2.0'\n-768EB Extract OS            00 (0) 'MS-DOS'\n-768EC General Purpose Flag  0800 (2048)\n+7725C CENTRAL HEADER #301   02014B50 (33639248)\n+77260 Created Zip Spec      14 (20) '2.0'\n+77261 Created OS            03 (3) 'Unix'\n+77262 Extract Zip Spec      14 (20) '2.0'\n+77263 Extract OS            00 (0) 'MS-DOS'\n+77264 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-768EE Compression Method    0008 (8) 'Deflated'\n-768F0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-768F4 CRC                   6E97D75C (1855444828)\n-768F8 Compressed Size       0000073D (1853)\n-768FC Uncompressed Size     00001A42 (6722)\n-76900 Filename Length       0032 (50)\n-76902 Extra Length          0000 (0)\n-76904 Comment Length        0000 (0)\n-76906 Disk Start            0000 (0)\n-76908 Int File Attributes   0000 (0)\n+77266 Compression Method    0008 (8) 'Deflated'\n+77268 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7726C CRC                   7F641F8A (2137268106)\n+77270 Compressed Size       0000074D (1869)\n+77274 Uncompressed Size     00001B65 (7013)\n+77278 Filename Length       0032 (50)\n+7727A Extra Length          0000 (0)\n+7727C Comment Length        0000 (0)\n+7727E Disk Start            0000 (0)\n+77280 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7690A Ext File Attributes   81A40000 (2175008768)\n+77282 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7690E Local Header Offset   0005997A (366970)\n-76912 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77286 Local Header Offset   0005A00B (368651)\n+7728A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76912: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7728A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76944 CENTRAL HEADER #302   02014B50 (33639248)\n-76948 Created Zip Spec      14 (20) '2.0'\n-76949 Created OS            03 (3) 'Unix'\n-7694A Extract Zip Spec      14 (20) '2.0'\n-7694B Extract OS            00 (0) 'MS-DOS'\n-7694C General Purpose Flag  0800 (2048)\n+772BC CENTRAL HEADER #302   02014B50 (33639248)\n+772C0 Created Zip Spec      14 (20) '2.0'\n+772C1 Created OS            03 (3) 'Unix'\n+772C2 Extract Zip Spec      14 (20) '2.0'\n+772C3 Extract OS            00 (0) 'MS-DOS'\n+772C4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7694E Compression Method    0008 (8) 'Deflated'\n-76950 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76954 CRC                   327F969A (847222426)\n-76958 Compressed Size       00000CAC (3244)\n-7695C Uncompressed Size     0000350F (13583)\n-76960 Filename Length       002E (46)\n-76962 Extra Length          0000 (0)\n-76964 Comment Length        0000 (0)\n-76966 Disk Start            0000 (0)\n-76968 Int File Attributes   0000 (0)\n+772C6 Compression Method    0008 (8) 'Deflated'\n+772C8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+772CC CRC                   6C21C4E0 (1814152416)\n+772D0 Compressed Size       00000CC1 (3265)\n+772D4 Uncompressed Size     00003707 (14087)\n+772D8 Filename Length       002E (46)\n+772DA Extra Length          0000 (0)\n+772DC Comment Length        0000 (0)\n+772DE Disk Start            0000 (0)\n+772E0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7696A Ext File Attributes   81A40000 (2175008768)\n+772E2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7696E Local Header Offset   0005A107 (368903)\n-76972 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+772E6 Local Header Offset   0005A7A8 (370600)\n+772EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76972: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x772EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-769A0 CENTRAL HEADER #303   02014B50 (33639248)\n-769A4 Created Zip Spec      14 (20) '2.0'\n-769A5 Created OS            03 (3) 'Unix'\n-769A6 Extract Zip Spec      14 (20) '2.0'\n-769A7 Extract OS            00 (0) 'MS-DOS'\n-769A8 General Purpose Flag  0800 (2048)\n+77318 CENTRAL HEADER #303   02014B50 (33639248)\n+7731C Created Zip Spec      14 (20) '2.0'\n+7731D Created OS            03 (3) 'Unix'\n+7731E Extract Zip Spec      14 (20) '2.0'\n+7731F Extract OS            00 (0) 'MS-DOS'\n+77320 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-769AA Compression Method    0008 (8) 'Deflated'\n-769AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-769B0 CRC                   C17F60B4 (3246350516)\n-769B4 Compressed Size       00000373 (883)\n-769B8 Uncompressed Size     0000084E (2126)\n-769BC Filename Length       002B (43)\n-769BE Extra Length          0000 (0)\n-769C0 Comment Length        0000 (0)\n-769C2 Disk Start            0000 (0)\n-769C4 Int File Attributes   0000 (0)\n+77322 Compression Method    0008 (8) 'Deflated'\n+77324 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77328 CRC                   F3BD8170 (4089282928)\n+7732C Compressed Size       0000037A (890)\n+77330 Uncompressed Size     000008A1 (2209)\n+77334 Filename Length       002B (43)\n+77336 Extra Length          0000 (0)\n+77338 Comment Length        0000 (0)\n+7733A Disk Start            0000 (0)\n+7733C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-769C6 Ext File Attributes   81A40000 (2175008768)\n+7733E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-769CA Local Header Offset   0005ADFF (372223)\n-769CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77342 Local Header Offset   0005B4B5 (373941)\n+77346 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x769CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77346: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-769F9 CENTRAL HEADER #304   02014B50 (33639248)\n-769FD Created Zip Spec      14 (20) '2.0'\n-769FE Created OS            03 (3) 'Unix'\n-769FF Extract Zip Spec      14 (20) '2.0'\n-76A00 Extract OS            00 (0) 'MS-DOS'\n-76A01 General Purpose Flag  0800 (2048)\n+77371 CENTRAL HEADER #304   02014B50 (33639248)\n+77375 Created Zip Spec      14 (20) '2.0'\n+77376 Created OS            03 (3) 'Unix'\n+77377 Extract Zip Spec      14 (20) '2.0'\n+77378 Extract OS            00 (0) 'MS-DOS'\n+77379 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76A03 Compression Method    0008 (8) 'Deflated'\n-76A05 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76A09 CRC                   60259860 (1613076576)\n-76A0D Compressed Size       0000098F (2447)\n-76A11 Uncompressed Size     0000229B (8859)\n-76A15 Filename Length       002F (47)\n-76A17 Extra Length          0000 (0)\n-76A19 Comment Length        0000 (0)\n-76A1B Disk Start            0000 (0)\n-76A1D Int File Attributes   0000 (0)\n+7737B Compression Method    0008 (8) 'Deflated'\n+7737D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77381 CRC                   56A68FB6 (1453756342)\n+77385 Compressed Size       000009A4 (2468)\n+77389 Uncompressed Size     000023BC (9148)\n+7738D Filename Length       002F (47)\n+7738F Extra Length          0000 (0)\n+77391 Comment Length        0000 (0)\n+77393 Disk Start            0000 (0)\n+77395 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76A1F Ext File Attributes   81A40000 (2175008768)\n+77397 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76A23 Local Header Offset   0005B1BB (373179)\n-76A27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7739B Local Header Offset   0005B878 (374904)\n+7739F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76A27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7739F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76A56 CENTRAL HEADER #305   02014B50 (33639248)\n-76A5A Created Zip Spec      14 (20) '2.0'\n-76A5B Created OS            03 (3) 'Unix'\n-76A5C Extract Zip Spec      14 (20) '2.0'\n-76A5D Extract OS            00 (0) 'MS-DOS'\n-76A5E General Purpose Flag  0800 (2048)\n+773CE CENTRAL HEADER #305   02014B50 (33639248)\n+773D2 Created Zip Spec      14 (20) '2.0'\n+773D3 Created OS            03 (3) 'Unix'\n+773D4 Extract Zip Spec      14 (20) '2.0'\n+773D5 Extract OS            00 (0) 'MS-DOS'\n+773D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76A60 Compression Method    0008 (8) 'Deflated'\n-76A62 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76A66 CRC                   CBED4405 (3421324293)\n-76A6A Compressed Size       0000047C (1148)\n-76A6E Uncompressed Size     00000B21 (2849)\n-76A72 Filename Length       0026 (38)\n-76A74 Extra Length          0000 (0)\n-76A76 Comment Length        0000 (0)\n-76A78 Disk Start            0000 (0)\n-76A7A Int File Attributes   0000 (0)\n+773D8 Compression Method    0008 (8) 'Deflated'\n+773DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+773DE CRC                   111FF296 (287306390)\n+773E2 Compressed Size       00000484 (1156)\n+773E6 Uncompressed Size     00000B99 (2969)\n+773EA Filename Length       0026 (38)\n+773EC Extra Length          0000 (0)\n+773EE Comment Length        0000 (0)\n+773F0 Disk Start            0000 (0)\n+773F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76A7C Ext File Attributes   81A40000 (2175008768)\n+773F4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76A80 Local Header Offset   0005BB97 (375703)\n-76A84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+773F8 Local Header Offset   0005C269 (377449)\n+773FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76A84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x773FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76AAA CENTRAL HEADER #306   02014B50 (33639248)\n-76AAE Created Zip Spec      14 (20) '2.0'\n-76AAF Created OS            03 (3) 'Unix'\n-76AB0 Extract Zip Spec      14 (20) '2.0'\n-76AB1 Extract OS            00 (0) 'MS-DOS'\n-76AB2 General Purpose Flag  0800 (2048)\n+77422 CENTRAL HEADER #306   02014B50 (33639248)\n+77426 Created Zip Spec      14 (20) '2.0'\n+77427 Created OS            03 (3) 'Unix'\n+77428 Extract Zip Spec      14 (20) '2.0'\n+77429 Extract OS            00 (0) 'MS-DOS'\n+7742A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76AB4 Compression Method    0008 (8) 'Deflated'\n-76AB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76ABA CRC                   4EECAFD1 (1324134353)\n-76ABE Compressed Size       000004DF (1247)\n-76AC2 Uncompressed Size     00000DF0 (3568)\n-76AC6 Filename Length       002B (43)\n-76AC8 Extra Length          0000 (0)\n-76ACA Comment Length        0000 (0)\n-76ACC Disk Start            0000 (0)\n-76ACE Int File Attributes   0000 (0)\n+7742C Compression Method    0008 (8) 'Deflated'\n+7742E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77432 CRC                   44CDA5D9 (1154328025)\n+77436 Compressed Size       000004EC (1260)\n+7743A Uncompressed Size     00000E77 (3703)\n+7743E Filename Length       002B (43)\n+77440 Extra Length          0000 (0)\n+77442 Comment Length        0000 (0)\n+77444 Disk Start            0000 (0)\n+77446 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76AD0 Ext File Attributes   81A40000 (2175008768)\n+77448 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76AD4 Local Header Offset   0005C057 (376919)\n-76AD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7744C Local Header Offset   0005C731 (378673)\n+77450 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76AD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77450: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76B03 CENTRAL HEADER #307   02014B50 (33639248)\n-76B07 Created Zip Spec      14 (20) '2.0'\n-76B08 Created OS            03 (3) 'Unix'\n-76B09 Extract Zip Spec      14 (20) '2.0'\n-76B0A Extract OS            00 (0) 'MS-DOS'\n-76B0B General Purpose Flag  0800 (2048)\n+7747B CENTRAL HEADER #307   02014B50 (33639248)\n+7747F Created Zip Spec      14 (20) '2.0'\n+77480 Created OS            03 (3) 'Unix'\n+77481 Extract Zip Spec      14 (20) '2.0'\n+77482 Extract OS            00 (0) 'MS-DOS'\n+77483 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76B0D Compression Method    0008 (8) 'Deflated'\n-76B0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76B13 CRC                   44E5E8ED (1155918061)\n-76B17 Compressed Size       00000733 (1843)\n-76B1B Uncompressed Size     00001786 (6022)\n-76B1F Filename Length       0031 (49)\n-76B21 Extra Length          0000 (0)\n-76B23 Comment Length        0000 (0)\n-76B25 Disk Start            0000 (0)\n-76B27 Int File Attributes   0000 (0)\n+77485 Compression Method    0008 (8) 'Deflated'\n+77487 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7748B CRC                   D584FEC4 (3582262980)\n+7748F Compressed Size       00000743 (1859)\n+77493 Uncompressed Size     00001869 (6249)\n+77497 Filename Length       0031 (49)\n+77499 Extra Length          0000 (0)\n+7749B Comment Length        0000 (0)\n+7749D Disk Start            0000 (0)\n+7749F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76B29 Ext File Attributes   81A40000 (2175008768)\n+774A1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76B2D Local Header Offset   0005C57F (378239)\n-76B31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+774A5 Local Header Offset   0005CC66 (380006)\n+774A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76B31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x774A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76B62 CENTRAL HEADER #308   02014B50 (33639248)\n-76B66 Created Zip Spec      14 (20) '2.0'\n-76B67 Created OS            03 (3) 'Unix'\n-76B68 Extract Zip Spec      14 (20) '2.0'\n-76B69 Extract OS            00 (0) 'MS-DOS'\n-76B6A General Purpose Flag  0800 (2048)\n+774DA CENTRAL HEADER #308   02014B50 (33639248)\n+774DE Created Zip Spec      14 (20) '2.0'\n+774DF Created OS            03 (3) 'Unix'\n+774E0 Extract Zip Spec      14 (20) '2.0'\n+774E1 Extract OS            00 (0) 'MS-DOS'\n+774E2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76B6C Compression Method    0008 (8) 'Deflated'\n-76B6E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76B72 CRC                   AEF897E4 (2935527396)\n-76B76 Compressed Size       00000853 (2131)\n-76B7A Uncompressed Size     00002174 (8564)\n-76B7E Filename Length       0029 (41)\n-76B80 Extra Length          0000 (0)\n-76B82 Comment Length        0000 (0)\n-76B84 Disk Start            0000 (0)\n-76B86 Int File Attributes   0000 (0)\n+774E4 Compression Method    0008 (8) 'Deflated'\n+774E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+774EA CRC                   6E2E32B0 (1848521392)\n+774EE Compressed Size       00000868 (2152)\n+774F2 Uncompressed Size     000022C0 (8896)\n+774F6 Filename Length       0029 (41)\n+774F8 Extra Length          0000 (0)\n+774FA Comment Length        0000 (0)\n+774FC Disk Start            0000 (0)\n+774FE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76B88 Ext File Attributes   81A40000 (2175008768)\n+77500 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76B8C Local Header Offset   0005CD01 (380161)\n-76B90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77504 Local Header Offset   0005D3F8 (381944)\n+77508 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76B90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77508: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76BB9 CENTRAL HEADER #309   02014B50 (33639248)\n-76BBD Created Zip Spec      14 (20) '2.0'\n-76BBE Created OS            03 (3) 'Unix'\n-76BBF Extract Zip Spec      14 (20) '2.0'\n-76BC0 Extract OS            00 (0) 'MS-DOS'\n-76BC1 General Purpose Flag  0800 (2048)\n+77531 CENTRAL HEADER #309   02014B50 (33639248)\n+77535 Created Zip Spec      14 (20) '2.0'\n+77536 Created OS            03 (3) 'Unix'\n+77537 Extract Zip Spec      14 (20) '2.0'\n+77538 Extract OS            00 (0) 'MS-DOS'\n+77539 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76BC3 Compression Method    0008 (8) 'Deflated'\n-76BC5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76BC9 CRC                   1F3B896F (523995503)\n-76BCD Compressed Size       000002E4 (740)\n-76BD1 Uncompressed Size     0000065A (1626)\n-76BD5 Filename Length       002A (42)\n-76BD7 Extra Length          0000 (0)\n-76BD9 Comment Length        0000 (0)\n-76BDB Disk Start            0000 (0)\n-76BDD Int File Attributes   0000 (0)\n+7753B Compression Method    0008 (8) 'Deflated'\n+7753D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77541 CRC                   C17F4D7C (3246345596)\n+77545 Compressed Size       000002EC (748)\n+77549 Uncompressed Size     0000068F (1679)\n+7754D Filename Length       002A (42)\n+7754F Extra Length          0000 (0)\n+77551 Comment Length        0000 (0)\n+77553 Disk Start            0000 (0)\n+77555 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76BDF Ext File Attributes   81A40000 (2175008768)\n+77557 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76BE3 Local Header Offset   0005D59B (382363)\n-76BE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7755B Local Header Offset   0005DCA7 (384167)\n+7755F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76BE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7755F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76C11 CENTRAL HEADER #310   02014B50 (33639248)\n-76C15 Created Zip Spec      14 (20) '2.0'\n-76C16 Created OS            03 (3) 'Unix'\n-76C17 Extract Zip Spec      14 (20) '2.0'\n-76C18 Extract OS            00 (0) 'MS-DOS'\n-76C19 General Purpose Flag  0800 (2048)\n+77589 CENTRAL HEADER #310   02014B50 (33639248)\n+7758D Created Zip Spec      14 (20) '2.0'\n+7758E Created OS            03 (3) 'Unix'\n+7758F Extract Zip Spec      14 (20) '2.0'\n+77590 Extract OS            00 (0) 'MS-DOS'\n+77591 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76C1B Compression Method    0008 (8) 'Deflated'\n-76C1D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76C21 CRC                   FE661D4B (4268105035)\n-76C25 Compressed Size       00000483 (1155)\n-76C29 Uncompressed Size     00000DF5 (3573)\n-76C2D Filename Length       0029 (41)\n-76C2F Extra Length          0000 (0)\n-76C31 Comment Length        0000 (0)\n-76C33 Disk Start            0000 (0)\n-76C35 Int File Attributes   0000 (0)\n+77593 Compression Method    0008 (8) 'Deflated'\n+77595 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77599 CRC                   0D00D936 (218159414)\n+7759D Compressed Size       00000492 (1170)\n+775A1 Uncompressed Size     00000E8E (3726)\n+775A5 Filename Length       0029 (41)\n+775A7 Extra Length          0000 (0)\n+775A9 Comment Length        0000 (0)\n+775AB Disk Start            0000 (0)\n+775AD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76C37 Ext File Attributes   81A40000 (2175008768)\n+775AF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76C3B Local Header Offset   0005D8C7 (383175)\n-76C3F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+775B3 Local Header Offset   0005DFDB (384987)\n+775B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76C3F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x775B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76C68 CENTRAL HEADER #311   02014B50 (33639248)\n-76C6C Created Zip Spec      14 (20) '2.0'\n-76C6D Created OS            03 (3) 'Unix'\n-76C6E Extract Zip Spec      14 (20) '2.0'\n-76C6F Extract OS            00 (0) 'MS-DOS'\n-76C70 General Purpose Flag  0800 (2048)\n+775E0 CENTRAL HEADER #311   02014B50 (33639248)\n+775E4 Created Zip Spec      14 (20) '2.0'\n+775E5 Created OS            03 (3) 'Unix'\n+775E6 Extract Zip Spec      14 (20) '2.0'\n+775E7 Extract OS            00 (0) 'MS-DOS'\n+775E8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76C72 Compression Method    0008 (8) 'Deflated'\n-76C74 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76C78 CRC                   32F83356 (855126870)\n-76C7C Compressed Size       000004A7 (1191)\n-76C80 Uncompressed Size     00000E80 (3712)\n-76C84 Filename Length       002A (42)\n-76C86 Extra Length          0000 (0)\n-76C88 Comment Length        0000 (0)\n-76C8A Disk Start            0000 (0)\n-76C8C Int File Attributes   0000 (0)\n+775EA Compression Method    0008 (8) 'Deflated'\n+775EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+775F0 CRC                   F4388FF8 (4097347576)\n+775F4 Compressed Size       000004B5 (1205)\n+775F8 Uncompressed Size     00000F20 (3872)\n+775FC Filename Length       002A (42)\n+775FE Extra Length          0000 (0)\n+77600 Comment Length        0000 (0)\n+77602 Disk Start            0000 (0)\n+77604 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76C8E Ext File Attributes   81A40000 (2175008768)\n+77606 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76C92 Local Header Offset   0005DD91 (384401)\n-76C96 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7760A Local Header Offset   0005E4B4 (386228)\n+7760E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76C96: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7760E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76CC0 CENTRAL HEADER #312   02014B50 (33639248)\n-76CC4 Created Zip Spec      14 (20) '2.0'\n-76CC5 Created OS            03 (3) 'Unix'\n-76CC6 Extract Zip Spec      14 (20) '2.0'\n-76CC7 Extract OS            00 (0) 'MS-DOS'\n-76CC8 General Purpose Flag  0800 (2048)\n+77638 CENTRAL HEADER #312   02014B50 (33639248)\n+7763C Created Zip Spec      14 (20) '2.0'\n+7763D Created OS            03 (3) 'Unix'\n+7763E Extract Zip Spec      14 (20) '2.0'\n+7763F Extract OS            00 (0) 'MS-DOS'\n+77640 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76CCA Compression Method    0008 (8) 'Deflated'\n-76CCC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76CD0 CRC                   5B6E7792 (1533966226)\n-76CD4 Compressed Size       00000B79 (2937)\n-76CD8 Uncompressed Size     000033BD (13245)\n-76CDC Filename Length       002B (43)\n-76CDE Extra Length          0000 (0)\n-76CE0 Comment Length        0000 (0)\n-76CE2 Disk Start            0000 (0)\n-76CE4 Int File Attributes   0000 (0)\n+77642 Compression Method    0008 (8) 'Deflated'\n+77644 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77648 CRC                   39FACF71 (972738417)\n+7764C Compressed Size       00000B93 (2963)\n+77650 Uncompressed Size     00003613 (13843)\n+77654 Filename Length       002B (43)\n+77656 Extra Length          0000 (0)\n+77658 Comment Length        0000 (0)\n+7765A Disk Start            0000 (0)\n+7765C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76CE6 Ext File Attributes   81A40000 (2175008768)\n+7765E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76CEA Local Header Offset   0005E280 (385664)\n-76CEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77662 Local Header Offset   0005E9B1 (387505)\n+77666 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76CEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77666: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76D19 CENTRAL HEADER #313   02014B50 (33639248)\n-76D1D Created Zip Spec      14 (20) '2.0'\n-76D1E Created OS            03 (3) 'Unix'\n-76D1F Extract Zip Spec      14 (20) '2.0'\n-76D20 Extract OS            00 (0) 'MS-DOS'\n-76D21 General Purpose Flag  0800 (2048)\n+77691 CENTRAL HEADER #313   02014B50 (33639248)\n+77695 Created Zip Spec      14 (20) '2.0'\n+77696 Created OS            03 (3) 'Unix'\n+77697 Extract Zip Spec      14 (20) '2.0'\n+77698 Extract OS            00 (0) 'MS-DOS'\n+77699 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76D23 Compression Method    0008 (8) 'Deflated'\n-76D25 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76D29 CRC                   321C1C15 (840702997)\n-76D2D Compressed Size       00000987 (2439)\n-76D31 Uncompressed Size     00002894 (10388)\n-76D35 Filename Length       002B (43)\n-76D37 Extra Length          0000 (0)\n-76D39 Comment Length        0000 (0)\n-76D3B Disk Start            0000 (0)\n-76D3D Int File Attributes   0000 (0)\n+7769B Compression Method    0008 (8) 'Deflated'\n+7769D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+776A1 CRC                   2FD52EF2 (802500338)\n+776A5 Compressed Size       0000099B (2459)\n+776A9 Uncompressed Size     00002A6C (10860)\n+776AD Filename Length       002B (43)\n+776AF Extra Length          0000 (0)\n+776B1 Comment Length        0000 (0)\n+776B3 Disk Start            0000 (0)\n+776B5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76D3F Ext File Attributes   81A40000 (2175008768)\n+776B7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76D43 Local Header Offset   0005EE42 (388674)\n-76D47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+776BB Local Header Offset   0005F58D (390541)\n+776BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76D47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x776BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76D72 CENTRAL HEADER #314   02014B50 (33639248)\n-76D76 Created Zip Spec      14 (20) '2.0'\n-76D77 Created OS            03 (3) 'Unix'\n-76D78 Extract Zip Spec      14 (20) '2.0'\n-76D79 Extract OS            00 (0) 'MS-DOS'\n-76D7A General Purpose Flag  0800 (2048)\n+776EA CENTRAL HEADER #314   02014B50 (33639248)\n+776EE Created Zip Spec      14 (20) '2.0'\n+776EF Created OS            03 (3) 'Unix'\n+776F0 Extract Zip Spec      14 (20) '2.0'\n+776F1 Extract OS            00 (0) 'MS-DOS'\n+776F2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76D7C Compression Method    0008 (8) 'Deflated'\n-76D7E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76D82 CRC                   52C8839A (1388872602)\n-76D86 Compressed Size       00000942 (2370)\n-76D8A Uncompressed Size     000020A7 (8359)\n-76D8E Filename Length       0030 (48)\n-76D90 Extra Length          0000 (0)\n-76D92 Comment Length        0000 (0)\n-76D94 Disk Start            0000 (0)\n-76D96 Int File Attributes   0000 (0)\n+776F4 Compression Method    0008 (8) 'Deflated'\n+776F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+776FA CRC                   42C7E3CE (1120396238)\n+776FE Compressed Size       00000952 (2386)\n+77702 Uncompressed Size     000021AF (8623)\n+77706 Filename Length       0030 (48)\n+77708 Extra Length          0000 (0)\n+7770A Comment Length        0000 (0)\n+7770C Disk Start            0000 (0)\n+7770E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76D98 Ext File Attributes   81A40000 (2175008768)\n+77710 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76D9C Local Header Offset   0005F812 (391186)\n-76DA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77714 Local Header Offset   0005FF71 (393073)\n+77718 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76DA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77718: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76DD0 CENTRAL HEADER #315   02014B50 (33639248)\n-76DD4 Created Zip Spec      14 (20) '2.0'\n-76DD5 Created OS            03 (3) 'Unix'\n-76DD6 Extract Zip Spec      14 (20) '2.0'\n-76DD7 Extract OS            00 (0) 'MS-DOS'\n-76DD8 General Purpose Flag  0800 (2048)\n+77748 CENTRAL HEADER #315   02014B50 (33639248)\n+7774C Created Zip Spec      14 (20) '2.0'\n+7774D Created OS            03 (3) 'Unix'\n+7774E Extract Zip Spec      14 (20) '2.0'\n+7774F Extract OS            00 (0) 'MS-DOS'\n+77750 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76DDA Compression Method    0008 (8) 'Deflated'\n-76DDC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76DE0 CRC                   838E36DD (2207135453)\n-76DE4 Compressed Size       00000C5F (3167)\n-76DE8 Uncompressed Size     00003312 (13074)\n-76DEC Filename Length       002B (43)\n-76DEE Extra Length          0000 (0)\n-76DF0 Comment Length        0000 (0)\n-76DF2 Disk Start            0000 (0)\n-76DF4 Int File Attributes   0000 (0)\n+77752 Compression Method    0008 (8) 'Deflated'\n+77754 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77758 CRC                   9B8BDB69 (2609634153)\n+7775C Compressed Size       00000C77 (3191)\n+77760 Uncompressed Size     00003527 (13607)\n+77764 Filename Length       002B (43)\n+77766 Extra Length          0000 (0)\n+77768 Comment Length        0000 (0)\n+7776A Disk Start            0000 (0)\n+7776C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76DF6 Ext File Attributes   81A40000 (2175008768)\n+7776E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76DFA Local Header Offset   000601A2 (393634)\n-76DFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77772 Local Header Offset   00060911 (395537)\n+77776 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76DFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77776: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76E29 CENTRAL HEADER #316   02014B50 (33639248)\n-76E2D Created Zip Spec      14 (20) '2.0'\n-76E2E Created OS            03 (3) 'Unix'\n-76E2F Extract Zip Spec      14 (20) '2.0'\n-76E30 Extract OS            00 (0) 'MS-DOS'\n-76E31 General Purpose Flag  0800 (2048)\n+777A1 CENTRAL HEADER #316   02014B50 (33639248)\n+777A5 Created Zip Spec      14 (20) '2.0'\n+777A6 Created OS            03 (3) 'Unix'\n+777A7 Extract Zip Spec      14 (20) '2.0'\n+777A8 Extract OS            00 (0) 'MS-DOS'\n+777A9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76E33 Compression Method    0008 (8) 'Deflated'\n-76E35 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76E39 CRC                   CB5B9E0C (3411779084)\n-76E3D Compressed Size       00000C72 (3186)\n-76E41 Uncompressed Size     00003489 (13449)\n-76E45 Filename Length       002E (46)\n-76E47 Extra Length          0000 (0)\n-76E49 Comment Length        0000 (0)\n-76E4B Disk Start            0000 (0)\n-76E4D Int File Attributes   0000 (0)\n+777AB Compression Method    0008 (8) 'Deflated'\n+777AD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+777B1 CRC                   2A6335AE (711144878)\n+777B5 Compressed Size       00000C83 (3203)\n+777B9 Uncompressed Size     00003628 (13864)\n+777BD Filename Length       002E (46)\n+777BF Extra Length          0000 (0)\n+777C1 Comment Length        0000 (0)\n+777C3 Disk Start            0000 (0)\n+777C5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76E4F Ext File Attributes   81A40000 (2175008768)\n+777C7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76E53 Local Header Offset   00060E4A (396874)\n-76E57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+777CB Local Header Offset   000615D1 (398801)\n+777CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76E57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x777CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76E85 CENTRAL HEADER #317   02014B50 (33639248)\n-76E89 Created Zip Spec      14 (20) '2.0'\n-76E8A Created OS            03 (3) 'Unix'\n-76E8B Extract Zip Spec      14 (20) '2.0'\n-76E8C Extract OS            00 (0) 'MS-DOS'\n-76E8D General Purpose Flag  0800 (2048)\n+777FD CENTRAL HEADER #317   02014B50 (33639248)\n+77801 Created Zip Spec      14 (20) '2.0'\n+77802 Created OS            03 (3) 'Unix'\n+77803 Extract Zip Spec      14 (20) '2.0'\n+77804 Extract OS            00 (0) 'MS-DOS'\n+77805 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76E8F Compression Method    0008 (8) 'Deflated'\n-76E91 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76E95 CRC                   5FCFA231 (1607442993)\n-76E99 Compressed Size       0000053D (1341)\n-76E9D Uncompressed Size     00001BE6 (7142)\n-76EA1 Filename Length       0026 (38)\n-76EA3 Extra Length          0000 (0)\n-76EA5 Comment Length        0000 (0)\n-76EA7 Disk Start            0000 (0)\n-76EA9 Int File Attributes   0000 (0)\n+77807 Compression Method    0008 (8) 'Deflated'\n+77809 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7780D CRC                   4DECBF7A (1307361146)\n+77811 Compressed Size       0000054A (1354)\n+77815 Uncompressed Size     00001CA2 (7330)\n+77819 Filename Length       0026 (38)\n+7781B Extra Length          0000 (0)\n+7781D Comment Length        0000 (0)\n+7781F Disk Start            0000 (0)\n+77821 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76EAB Ext File Attributes   81A40000 (2175008768)\n+77823 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76EAF Local Header Offset   00061B08 (400136)\n-76EB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77827 Local Header Offset   000622A0 (402080)\n+7782B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76EB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7782B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76ED9 CENTRAL HEADER #318   02014B50 (33639248)\n-76EDD Created Zip Spec      14 (20) '2.0'\n-76EDE Created OS            03 (3) 'Unix'\n-76EDF Extract Zip Spec      14 (20) '2.0'\n-76EE0 Extract OS            00 (0) 'MS-DOS'\n-76EE1 General Purpose Flag  0800 (2048)\n+77851 CENTRAL HEADER #318   02014B50 (33639248)\n+77855 Created Zip Spec      14 (20) '2.0'\n+77856 Created OS            03 (3) 'Unix'\n+77857 Extract Zip Spec      14 (20) '2.0'\n+77858 Extract OS            00 (0) 'MS-DOS'\n+77859 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76EE3 Compression Method    0008 (8) 'Deflated'\n-76EE5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76EE9 CRC                   53B2D875 (1404229749)\n-76EED Compressed Size       000002D2 (722)\n-76EF1 Uncompressed Size     000005A4 (1444)\n-76EF5 Filename Length       0030 (48)\n-76EF7 Extra Length          0000 (0)\n-76EF9 Comment Length        0000 (0)\n-76EFB Disk Start            0000 (0)\n-76EFD Int File Attributes   0000 (0)\n+7785B Compression Method    0008 (8) 'Deflated'\n+7785D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77861 CRC                   DF16DFCA (3742818250)\n+77865 Compressed Size       000002DA (730)\n+77869 Uncompressed Size     000005D0 (1488)\n+7786D Filename Length       0030 (48)\n+7786F Extra Length          0000 (0)\n+77871 Comment Length        0000 (0)\n+77873 Disk Start            0000 (0)\n+77875 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76EFF Ext File Attributes   81A40000 (2175008768)\n+77877 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76F03 Local Header Offset   00062089 (401545)\n-76F07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7787B Local Header Offset   0006282E (403502)\n+7787F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76F07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7787F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76F37 CENTRAL HEADER #319   02014B50 (33639248)\n-76F3B Created Zip Spec      14 (20) '2.0'\n-76F3C Created OS            03 (3) 'Unix'\n-76F3D Extract Zip Spec      14 (20) '2.0'\n-76F3E Extract OS            00 (0) 'MS-DOS'\n-76F3F General Purpose Flag  0800 (2048)\n+778AF CENTRAL HEADER #319   02014B50 (33639248)\n+778B3 Created Zip Spec      14 (20) '2.0'\n+778B4 Created OS            03 (3) 'Unix'\n+778B5 Extract Zip Spec      14 (20) '2.0'\n+778B6 Extract OS            00 (0) 'MS-DOS'\n+778B7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76F41 Compression Method    0008 (8) 'Deflated'\n-76F43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76F47 CRC                   07CF28F9 (131016953)\n-76F4B Compressed Size       000008BE (2238)\n-76F4F Uncompressed Size     00001D72 (7538)\n-76F53 Filename Length       0036 (54)\n-76F55 Extra Length          0000 (0)\n-76F57 Comment Length        0000 (0)\n-76F59 Disk Start            0000 (0)\n-76F5B Int File Attributes   0000 (0)\n+778B9 Compression Method    0008 (8) 'Deflated'\n+778BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+778BF CRC                   14F52AE5 (351611621)\n+778C3 Compressed Size       000008CE (2254)\n+778C7 Uncompressed Size     00001E9C (7836)\n+778CB Filename Length       0036 (54)\n+778CD Extra Length          0000 (0)\n+778CF Comment Length        0000 (0)\n+778D1 Disk Start            0000 (0)\n+778D3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76F5D Ext File Attributes   81A40000 (2175008768)\n+778D5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76F61 Local Header Offset   000623A9 (402345)\n-76F65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+778D9 Local Header Offset   00062B56 (404310)\n+778DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76F65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x778DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76F9B CENTRAL HEADER #320   02014B50 (33639248)\n-76F9F Created Zip Spec      14 (20) '2.0'\n-76FA0 Created OS            03 (3) 'Unix'\n-76FA1 Extract Zip Spec      14 (20) '2.0'\n-76FA2 Extract OS            00 (0) 'MS-DOS'\n-76FA3 General Purpose Flag  0800 (2048)\n+77913 CENTRAL HEADER #320   02014B50 (33639248)\n+77917 Created Zip Spec      14 (20) '2.0'\n+77918 Created OS            03 (3) 'Unix'\n+77919 Extract Zip Spec      14 (20) '2.0'\n+7791A Extract OS            00 (0) 'MS-DOS'\n+7791B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-76FA5 Compression Method    0008 (8) 'Deflated'\n-76FA7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76FAB CRC                   FF8666DF (4286998239)\n-76FAF Compressed Size       00000734 (1844)\n-76FB3 Uncompressed Size     00001A8A (6794)\n-76FB7 Filename Length       0034 (52)\n-76FB9 Extra Length          0000 (0)\n-76FBB Comment Length        0000 (0)\n-76FBD Disk Start            0000 (0)\n-76FBF Int File Attributes   0000 (0)\n+7791D Compression Method    0008 (8) 'Deflated'\n+7791F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77923 CRC                   455A049E (1163527326)\n+77927 Compressed Size       00000744 (1860)\n+7792B Uncompressed Size     00001BA0 (7072)\n+7792F Filename Length       0034 (52)\n+77931 Extra Length          0000 (0)\n+77933 Comment Length        0000 (0)\n+77935 Disk Start            0000 (0)\n+77937 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-76FC1 Ext File Attributes   81A40000 (2175008768)\n+77939 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-76FC5 Local Header Offset   00062CBB (404667)\n-76FC9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7793D Local Header Offset   00063478 (406648)\n+77941 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76FC9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77941: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76FFD CENTRAL HEADER #321   02014B50 (33639248)\n-77001 Created Zip Spec      14 (20) '2.0'\n-77002 Created OS            03 (3) 'Unix'\n-77003 Extract Zip Spec      14 (20) '2.0'\n-77004 Extract OS            00 (0) 'MS-DOS'\n-77005 General Purpose Flag  0800 (2048)\n+77975 CENTRAL HEADER #321   02014B50 (33639248)\n+77979 Created Zip Spec      14 (20) '2.0'\n+7797A Created OS            03 (3) 'Unix'\n+7797B Extract Zip Spec      14 (20) '2.0'\n+7797C Extract OS            00 (0) 'MS-DOS'\n+7797D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77007 Compression Method    0008 (8) 'Deflated'\n-77009 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7700D CRC                   C4C508F0 (3301247216)\n-77011 Compressed Size       00000333 (819)\n-77015 Uncompressed Size     00000751 (1873)\n-77019 Filename Length       002E (46)\n-7701B Extra Length          0000 (0)\n-7701D Comment Length        0000 (0)\n-7701F Disk Start            0000 (0)\n-77021 Int File Attributes   0000 (0)\n+7797F Compression Method    0008 (8) 'Deflated'\n+77981 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77985 CRC                   C852179E (3360823198)\n+77989 Compressed Size       0000033F (831)\n+7798D Uncompressed Size     00000798 (1944)\n+77991 Filename Length       002E (46)\n+77993 Extra Length          0000 (0)\n+77995 Comment Length        0000 (0)\n+77997 Disk Start            0000 (0)\n+77999 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77023 Ext File Attributes   81A40000 (2175008768)\n+7799B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77027 Local Header Offset   00063441 (406593)\n-7702B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7799F Local Header Offset   00063C0E (408590)\n+779A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7702B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x779A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77059 CENTRAL HEADER #322   02014B50 (33639248)\n-7705D Created Zip Spec      14 (20) '2.0'\n-7705E Created OS            03 (3) 'Unix'\n-7705F Extract Zip Spec      14 (20) '2.0'\n-77060 Extract OS            00 (0) 'MS-DOS'\n-77061 General Purpose Flag  0800 (2048)\n+779D1 CENTRAL HEADER #322   02014B50 (33639248)\n+779D5 Created Zip Spec      14 (20) '2.0'\n+779D6 Created OS            03 (3) 'Unix'\n+779D7 Extract Zip Spec      14 (20) '2.0'\n+779D8 Extract OS            00 (0) 'MS-DOS'\n+779D9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77063 Compression Method    0008 (8) 'Deflated'\n-77065 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77069 CRC                   55945694 (1435784852)\n-7706D Compressed Size       00000839 (2105)\n-77071 Uncompressed Size     00001B9B (7067)\n-77075 Filename Length       0031 (49)\n-77077 Extra Length          0000 (0)\n-77079 Comment Length        0000 (0)\n-7707B Disk Start            0000 (0)\n-7707D Int File Attributes   0000 (0)\n+779DB Compression Method    0008 (8) 'Deflated'\n+779DD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+779E1 CRC                   BD46272F (3175491375)\n+779E5 Compressed Size       00000845 (2117)\n+779E9 Uncompressed Size     00001CB5 (7349)\n+779ED Filename Length       0031 (49)\n+779EF Extra Length          0000 (0)\n+779F1 Comment Length        0000 (0)\n+779F3 Disk Start            0000 (0)\n+779F5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7707F Ext File Attributes   81A40000 (2175008768)\n+779F7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77083 Local Header Offset   000637C0 (407488)\n-77087 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+779FB Local Header Offset   00063F99 (409497)\n+779FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77087: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x779FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-770B8 CENTRAL HEADER #323   02014B50 (33639248)\n-770BC Created Zip Spec      14 (20) '2.0'\n-770BD Created OS            03 (3) 'Unix'\n-770BE Extract Zip Spec      14 (20) '2.0'\n-770BF Extract OS            00 (0) 'MS-DOS'\n-770C0 General Purpose Flag  0800 (2048)\n+77A30 CENTRAL HEADER #323   02014B50 (33639248)\n+77A34 Created Zip Spec      14 (20) '2.0'\n+77A35 Created OS            03 (3) 'Unix'\n+77A36 Extract Zip Spec      14 (20) '2.0'\n+77A37 Extract OS            00 (0) 'MS-DOS'\n+77A38 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-770C2 Compression Method    0008 (8) 'Deflated'\n-770C4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-770C8 CRC                   CEB8A43B (3468207163)\n-770CC Compressed Size       00000744 (1860)\n-770D0 Uncompressed Size     00001ABC (6844)\n-770D4 Filename Length       002F (47)\n-770D6 Extra Length          0000 (0)\n-770D8 Comment Length        0000 (0)\n-770DA Disk Start            0000 (0)\n-770DC Int File Attributes   0000 (0)\n+77A3A Compression Method    0008 (8) 'Deflated'\n+77A3C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77A40 CRC                   F51CAE43 (4112297539)\n+77A44 Compressed Size       00000755 (1877)\n+77A48 Uncompressed Size     00001BD5 (7125)\n+77A4C Filename Length       002F (47)\n+77A4E Extra Length          0000 (0)\n+77A50 Comment Length        0000 (0)\n+77A52 Disk Start            0000 (0)\n+77A54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-770DE Ext File Attributes   81A40000 (2175008768)\n+77A56 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-770E2 Local Header Offset   00064048 (409672)\n-770E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77A5A Local Header Offset   0006482D (411693)\n+77A5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x770E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77A5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77115 CENTRAL HEADER #324   02014B50 (33639248)\n-77119 Created Zip Spec      14 (20) '2.0'\n-7711A Created OS            03 (3) 'Unix'\n-7711B Extract Zip Spec      14 (20) '2.0'\n-7711C Extract OS            00 (0) 'MS-DOS'\n-7711D General Purpose Flag  0800 (2048)\n+77A8D CENTRAL HEADER #324   02014B50 (33639248)\n+77A91 Created Zip Spec      14 (20) '2.0'\n+77A92 Created OS            03 (3) 'Unix'\n+77A93 Extract Zip Spec      14 (20) '2.0'\n+77A94 Extract OS            00 (0) 'MS-DOS'\n+77A95 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7711F Compression Method    0008 (8) 'Deflated'\n-77121 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77125 CRC                   339D235A (865936218)\n-77129 Compressed Size       00000378 (888)\n-7712D Uncompressed Size     00000791 (1937)\n-77131 Filename Length       003F (63)\n-77133 Extra Length          0000 (0)\n-77135 Comment Length        0000 (0)\n-77137 Disk Start            0000 (0)\n-77139 Int File Attributes   0000 (0)\n+77A97 Compression Method    0008 (8) 'Deflated'\n+77A99 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77A9D CRC                   DB5A6031 (3680133169)\n+77AA1 Compressed Size       00000382 (898)\n+77AA5 Uncompressed Size     000007C1 (1985)\n+77AA9 Filename Length       003F (63)\n+77AAB Extra Length          0000 (0)\n+77AAD Comment Length        0000 (0)\n+77AAF Disk Start            0000 (0)\n+77AB1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7713B Ext File Attributes   81A40000 (2175008768)\n+77AB3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7713F Local Header Offset   000647D9 (411609)\n-77143 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77AB7 Local Header Offset   00064FCF (413647)\n+77ABB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77143: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77ABB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77182 CENTRAL HEADER #325   02014B50 (33639248)\n-77186 Created Zip Spec      14 (20) '2.0'\n-77187 Created OS            03 (3) 'Unix'\n-77188 Extract Zip Spec      14 (20) '2.0'\n-77189 Extract OS            00 (0) 'MS-DOS'\n-7718A General Purpose Flag  0800 (2048)\n+77AFA CENTRAL HEADER #325   02014B50 (33639248)\n+77AFE Created Zip Spec      14 (20) '2.0'\n+77AFF Created OS            03 (3) 'Unix'\n+77B00 Extract Zip Spec      14 (20) '2.0'\n+77B01 Extract OS            00 (0) 'MS-DOS'\n+77B02 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7718C Compression Method    0008 (8) 'Deflated'\n-7718E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77192 CRC                   F30DAB50 (4077759312)\n-77196 Compressed Size       00000F25 (3877)\n-7719A Uncompressed Size     000047F4 (18420)\n-7719E Filename Length       0032 (50)\n-771A0 Extra Length          0000 (0)\n-771A2 Comment Length        0000 (0)\n-771A4 Disk Start            0000 (0)\n-771A6 Int File Attributes   0000 (0)\n+77B04 Compression Method    0008 (8) 'Deflated'\n+77B06 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77B0A CRC                   695EFF74 (1767833460)\n+77B0E Compressed Size       00000F43 (3907)\n+77B12 Uncompressed Size     00004A07 (18951)\n+77B16 Filename Length       0032 (50)\n+77B18 Extra Length          0000 (0)\n+77B1A Comment Length        0000 (0)\n+77B1C Disk Start            0000 (0)\n+77B1E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-771A8 Ext File Attributes   81A40000 (2175008768)\n+77B20 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-771AC Local Header Offset   00064BAE (412590)\n-771B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77B24 Local Header Offset   000653AE (414638)\n+77B28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x771B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77B28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-771E2 CENTRAL HEADER #326   02014B50 (33639248)\n-771E6 Created Zip Spec      14 (20) '2.0'\n-771E7 Created OS            03 (3) 'Unix'\n-771E8 Extract Zip Spec      14 (20) '2.0'\n-771E9 Extract OS            00 (0) 'MS-DOS'\n-771EA General Purpose Flag  0800 (2048)\n+77B5A CENTRAL HEADER #326   02014B50 (33639248)\n+77B5E Created Zip Spec      14 (20) '2.0'\n+77B5F Created OS            03 (3) 'Unix'\n+77B60 Extract Zip Spec      14 (20) '2.0'\n+77B61 Extract OS            00 (0) 'MS-DOS'\n+77B62 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-771EC Compression Method    0008 (8) 'Deflated'\n-771EE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-771F2 CRC                   9409E400 (2483676160)\n-771F6 Compressed Size       000003A7 (935)\n-771FA Uncompressed Size     000007F6 (2038)\n-771FE Filename Length       002E (46)\n-77200 Extra Length          0000 (0)\n-77202 Comment Length        0000 (0)\n-77204 Disk Start            0000 (0)\n-77206 Int File Attributes   0000 (0)\n+77B64 Compression Method    0008 (8) 'Deflated'\n+77B66 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77B6A CRC                   FB06EFC4 (4211535812)\n+77B6E Compressed Size       000003AF (943)\n+77B72 Uncompressed Size     00000833 (2099)\n+77B76 Filename Length       002E (46)\n+77B78 Extra Length          0000 (0)\n+77B7A Comment Length        0000 (0)\n+77B7C Disk Start            0000 (0)\n+77B7E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77208 Ext File Attributes   81A40000 (2175008768)\n+77B80 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7720C Local Header Offset   00065B23 (416547)\n-77210 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77B84 Local Header Offset   00066341 (418625)\n+77B88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77210: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77B88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7723E CENTRAL HEADER #327   02014B50 (33639248)\n-77242 Created Zip Spec      14 (20) '2.0'\n-77243 Created OS            03 (3) 'Unix'\n-77244 Extract Zip Spec      14 (20) '2.0'\n-77245 Extract OS            00 (0) 'MS-DOS'\n-77246 General Purpose Flag  0800 (2048)\n+77BB6 CENTRAL HEADER #327   02014B50 (33639248)\n+77BBA Created Zip Spec      14 (20) '2.0'\n+77BBB Created OS            03 (3) 'Unix'\n+77BBC Extract Zip Spec      14 (20) '2.0'\n+77BBD Extract OS            00 (0) 'MS-DOS'\n+77BBE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77248 Compression Method    0008 (8) 'Deflated'\n-7724A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7724E CRC                   0896EC5C (144108636)\n-77252 Compressed Size       0000070E (1806)\n-77256 Uncompressed Size     000016D6 (5846)\n-7725A Filename Length       0033 (51)\n-7725C Extra Length          0000 (0)\n-7725E Comment Length        0000 (0)\n-77260 Disk Start            0000 (0)\n-77262 Int File Attributes   0000 (0)\n+77BC0 Compression Method    0008 (8) 'Deflated'\n+77BC2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77BC6 CRC                   18AD9BF8 (414030840)\n+77BCA Compressed Size       0000071D (1821)\n+77BCE Uncompressed Size     0000177E (6014)\n+77BD2 Filename Length       0033 (51)\n+77BD4 Extra Length          0000 (0)\n+77BD6 Comment Length        0000 (0)\n+77BD8 Disk Start            0000 (0)\n+77BDA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77264 Ext File Attributes   81A40000 (2175008768)\n+77BDC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77268 Local Header Offset   00065F16 (417558)\n-7726C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77BE0 Local Header Offset   0006673C (419644)\n+77BE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7726C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77BE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7729F CENTRAL HEADER #328   02014B50 (33639248)\n-772A3 Created Zip Spec      14 (20) '2.0'\n-772A4 Created OS            03 (3) 'Unix'\n-772A5 Extract Zip Spec      14 (20) '2.0'\n-772A6 Extract OS            00 (0) 'MS-DOS'\n-772A7 General Purpose Flag  0800 (2048)\n+77C17 CENTRAL HEADER #328   02014B50 (33639248)\n+77C1B Created Zip Spec      14 (20) '2.0'\n+77C1C Created OS            03 (3) 'Unix'\n+77C1D Extract Zip Spec      14 (20) '2.0'\n+77C1E Extract OS            00 (0) 'MS-DOS'\n+77C1F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-772A9 Compression Method    0008 (8) 'Deflated'\n-772AB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-772AF CRC                   7DBCFDD1 (2109537745)\n-772B3 Compressed Size       000002B9 (697)\n-772B7 Uncompressed Size     0000055B (1371)\n-772BB Filename Length       0034 (52)\n-772BD Extra Length          0000 (0)\n-772BF Comment Length        0000 (0)\n-772C1 Disk Start            0000 (0)\n-772C3 Int File Attributes   0000 (0)\n+77C21 Compression Method    0008 (8) 'Deflated'\n+77C23 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77C27 CRC                   1BB78BFC (465013756)\n+77C2B Compressed Size       000002C1 (705)\n+77C2F Uncompressed Size     0000057E (1406)\n+77C33 Filename Length       0034 (52)\n+77C35 Extra Length          0000 (0)\n+77C37 Comment Length        0000 (0)\n+77C39 Disk Start            0000 (0)\n+77C3B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-772C5 Ext File Attributes   81A40000 (2175008768)\n+77C3D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-772C9 Local Header Offset   00066675 (419445)\n-772CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77C41 Local Header Offset   00066EAA (421546)\n+77C45 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x772CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77C45: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77301 CENTRAL HEADER #329   02014B50 (33639248)\n-77305 Created Zip Spec      14 (20) '2.0'\n-77306 Created OS            03 (3) 'Unix'\n-77307 Extract Zip Spec      14 (20) '2.0'\n-77308 Extract OS            00 (0) 'MS-DOS'\n-77309 General Purpose Flag  0800 (2048)\n+77C79 CENTRAL HEADER #329   02014B50 (33639248)\n+77C7D Created Zip Spec      14 (20) '2.0'\n+77C7E Created OS            03 (3) 'Unix'\n+77C7F Extract Zip Spec      14 (20) '2.0'\n+77C80 Extract OS            00 (0) 'MS-DOS'\n+77C81 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7730B Compression Method    0008 (8) 'Deflated'\n-7730D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77311 CRC                   3AC92564 (986260836)\n-77315 Compressed Size       0000026A (618)\n-77319 Uncompressed Size     00000464 (1124)\n-7731D Filename Length       0031 (49)\n-7731F Extra Length          0000 (0)\n-77321 Comment Length        0000 (0)\n-77323 Disk Start            0000 (0)\n-77325 Int File Attributes   0000 (0)\n+77C83 Compression Method    0008 (8) 'Deflated'\n+77C85 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77C89 CRC                   163DDCF2 (373153010)\n+77C8D Compressed Size       00000272 (626)\n+77C91 Uncompressed Size     00000482 (1154)\n+77C95 Filename Length       0031 (49)\n+77C97 Extra Length          0000 (0)\n+77C99 Comment Length        0000 (0)\n+77C9B Disk Start            0000 (0)\n+77C9D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77327 Ext File Attributes   81A40000 (2175008768)\n+77C9F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7732B Local Header Offset   00066980 (420224)\n-7732F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77CA3 Local Header Offset   000671BD (422333)\n+77CA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7732F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77CA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77360 CENTRAL HEADER #330   02014B50 (33639248)\n-77364 Created Zip Spec      14 (20) '2.0'\n-77365 Created OS            03 (3) 'Unix'\n-77366 Extract Zip Spec      14 (20) '2.0'\n-77367 Extract OS            00 (0) 'MS-DOS'\n-77368 General Purpose Flag  0800 (2048)\n+77CD8 CENTRAL HEADER #330   02014B50 (33639248)\n+77CDC Created Zip Spec      14 (20) '2.0'\n+77CDD Created OS            03 (3) 'Unix'\n+77CDE Extract Zip Spec      14 (20) '2.0'\n+77CDF Extract OS            00 (0) 'MS-DOS'\n+77CE0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7736A Compression Method    0008 (8) 'Deflated'\n-7736C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77370 CRC                   0EB290DE (246583518)\n-77374 Compressed Size       00000339 (825)\n-77378 Uncompressed Size     0000061E (1566)\n-7737C Filename Length       0021 (33)\n-7737E Extra Length          0000 (0)\n-77380 Comment Length        0000 (0)\n-77382 Disk Start            0000 (0)\n-77384 Int File Attributes   0000 (0)\n+77CE2 Compression Method    0008 (8) 'Deflated'\n+77CE4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77CE8 CRC                   6F7884D3 (1870169299)\n+77CEC Compressed Size       00000341 (833)\n+77CF0 Uncompressed Size     0000064F (1615)\n+77CF4 Filename Length       0021 (33)\n+77CF6 Extra Length          0000 (0)\n+77CF8 Comment Length        0000 (0)\n+77CFA Disk Start            0000 (0)\n+77CFC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77386 Ext File Attributes   81A40000 (2175008768)\n+77CFE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7738A Local Header Offset   00066C39 (420921)\n-7738E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77D02 Local Header Offset   0006747E (423038)\n+77D06 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7738E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77D06: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-773AF CENTRAL HEADER #331   02014B50 (33639248)\n-773B3 Created Zip Spec      14 (20) '2.0'\n-773B4 Created OS            03 (3) 'Unix'\n-773B5 Extract Zip Spec      14 (20) '2.0'\n-773B6 Extract OS            00 (0) 'MS-DOS'\n-773B7 General Purpose Flag  0800 (2048)\n+77D27 CENTRAL HEADER #331   02014B50 (33639248)\n+77D2B Created Zip Spec      14 (20) '2.0'\n+77D2C Created OS            03 (3) 'Unix'\n+77D2D Extract Zip Spec      14 (20) '2.0'\n+77D2E Extract OS            00 (0) 'MS-DOS'\n+77D2F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-773B9 Compression Method    0008 (8) 'Deflated'\n-773BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-773BF CRC                   2A1C7A3B (706509371)\n-773C3 Compressed Size       000003DE (990)\n-773C7 Uncompressed Size     000008DC (2268)\n-773CB Filename Length       002B (43)\n-773CD Extra Length          0000 (0)\n-773CF Comment Length        0000 (0)\n-773D1 Disk Start            0000 (0)\n-773D3 Int File Attributes   0000 (0)\n+77D31 Compression Method    0008 (8) 'Deflated'\n+77D33 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77D37 CRC                   7837B4D1 (2016916689)\n+77D3B Compressed Size       000003EA (1002)\n+77D3F Uncompressed Size     0000091E (2334)\n+77D43 Filename Length       002B (43)\n+77D45 Extra Length          0000 (0)\n+77D47 Comment Length        0000 (0)\n+77D49 Disk Start            0000 (0)\n+77D4B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-773D5 Ext File Attributes   81A40000 (2175008768)\n+77D4D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-773D9 Local Header Offset   00066FB1 (421809)\n-773DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77D51 Local Header Offset   000677FE (423934)\n+77D55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x773DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77D55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77408 CENTRAL HEADER #332   02014B50 (33639248)\n-7740C Created Zip Spec      14 (20) '2.0'\n-7740D Created OS            03 (3) 'Unix'\n-7740E Extract Zip Spec      14 (20) '2.0'\n-7740F Extract OS            00 (0) 'MS-DOS'\n-77410 General Purpose Flag  0800 (2048)\n+77D80 CENTRAL HEADER #332   02014B50 (33639248)\n+77D84 Created Zip Spec      14 (20) '2.0'\n+77D85 Created OS            03 (3) 'Unix'\n+77D86 Extract Zip Spec      14 (20) '2.0'\n+77D87 Extract OS            00 (0) 'MS-DOS'\n+77D88 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77412 Compression Method    0008 (8) 'Deflated'\n-77414 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77418 CRC                   3A57EAC8 (978840264)\n-7741C Compressed Size       000005CE (1486)\n-77420 Uncompressed Size     0000126A (4714)\n-77424 Filename Length       0029 (41)\n-77426 Extra Length          0000 (0)\n-77428 Comment Length        0000 (0)\n-7742A Disk Start            0000 (0)\n-7742C Int File Attributes   0000 (0)\n+77D8A Compression Method    0008 (8) 'Deflated'\n+77D8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77D90 CRC                   1FC70E2E (533138990)\n+77D94 Compressed Size       000005DC (1500)\n+77D98 Uncompressed Size     000012E0 (4832)\n+77D9C Filename Length       0029 (41)\n+77D9E Extra Length          0000 (0)\n+77DA0 Comment Length        0000 (0)\n+77DA2 Disk Start            0000 (0)\n+77DA4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7742E Ext File Attributes   81A40000 (2175008768)\n+77DA6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77432 Local Header Offset   000673D8 (422872)\n-77436 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77DAA Local Header Offset   00067C31 (425009)\n+77DAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77436: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77DAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7745F CENTRAL HEADER #333   02014B50 (33639248)\n-77463 Created Zip Spec      14 (20) '2.0'\n-77464 Created OS            03 (3) 'Unix'\n-77465 Extract Zip Spec      14 (20) '2.0'\n-77466 Extract OS            00 (0) 'MS-DOS'\n-77467 General Purpose Flag  0800 (2048)\n+77DD7 CENTRAL HEADER #333   02014B50 (33639248)\n+77DDB Created Zip Spec      14 (20) '2.0'\n+77DDC Created OS            03 (3) 'Unix'\n+77DDD Extract Zip Spec      14 (20) '2.0'\n+77DDE Extract OS            00 (0) 'MS-DOS'\n+77DDF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77469 Compression Method    0008 (8) 'Deflated'\n-7746B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7746F CRC                   B1AAD78E (2980763534)\n-77473 Compressed Size       00000262 (610)\n-77477 Uncompressed Size     00000463 (1123)\n-7747B Filename Length       0028 (40)\n-7747D Extra Length          0000 (0)\n-7747F Comment Length        0000 (0)\n-77481 Disk Start            0000 (0)\n-77483 Int File Attributes   0000 (0)\n+77DE1 Compression Method    0008 (8) 'Deflated'\n+77DE3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77DE7 CRC                   34F679E6 (888568294)\n+77DEB Compressed Size       0000026B (619)\n+77DEF Uncompressed Size     00000485 (1157)\n+77DF3 Filename Length       0028 (40)\n+77DF5 Extra Length          0000 (0)\n+77DF7 Comment Length        0000 (0)\n+77DF9 Disk Start            0000 (0)\n+77DFB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77485 Ext File Attributes   81A40000 (2175008768)\n+77DFD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77489 Local Header Offset   000679ED (424429)\n-7748D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77E01 Local Header Offset   00068254 (426580)\n+77E05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7748D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77E05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-774B5 CENTRAL HEADER #334   02014B50 (33639248)\n-774B9 Created Zip Spec      14 (20) '2.0'\n-774BA Created OS            03 (3) 'Unix'\n-774BB Extract Zip Spec      14 (20) '2.0'\n-774BC Extract OS            00 (0) 'MS-DOS'\n-774BD General Purpose Flag  0800 (2048)\n+77E2D CENTRAL HEADER #334   02014B50 (33639248)\n+77E31 Created Zip Spec      14 (20) '2.0'\n+77E32 Created OS            03 (3) 'Unix'\n+77E33 Extract Zip Spec      14 (20) '2.0'\n+77E34 Extract OS            00 (0) 'MS-DOS'\n+77E35 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-774BF Compression Method    0008 (8) 'Deflated'\n-774C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-774C5 CRC                   903888C3 (2419624131)\n-774C9 Compressed Size       00000621 (1569)\n-774CD Uncompressed Size     0000120D (4621)\n-774D1 Filename Length       0030 (48)\n-774D3 Extra Length          0000 (0)\n-774D5 Comment Length        0000 (0)\n-774D7 Disk Start            0000 (0)\n-774D9 Int File Attributes   0000 (0)\n+77E37 Compression Method    0008 (8) 'Deflated'\n+77E39 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77E3D CRC                   A2725211 (2725401105)\n+77E41 Compressed Size       0000062D (1581)\n+77E45 Uncompressed Size     0000128F (4751)\n+77E49 Filename Length       0030 (48)\n+77E4B Extra Length          0000 (0)\n+77E4D Comment Length        0000 (0)\n+77E4F Disk Start            0000 (0)\n+77E51 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-774DB Ext File Attributes   81A40000 (2175008768)\n+77E53 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-774DF Local Header Offset   00067C95 (425109)\n-774E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77E57 Local Header Offset   00068505 (427269)\n+77E5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x774E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77E5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77513 CENTRAL HEADER #335   02014B50 (33639248)\n-77517 Created Zip Spec      14 (20) '2.0'\n-77518 Created OS            03 (3) 'Unix'\n-77519 Extract Zip Spec      14 (20) '2.0'\n-7751A Extract OS            00 (0) 'MS-DOS'\n-7751B General Purpose Flag  0800 (2048)\n+77E8B CENTRAL HEADER #335   02014B50 (33639248)\n+77E8F Created Zip Spec      14 (20) '2.0'\n+77E90 Created OS            03 (3) 'Unix'\n+77E91 Extract Zip Spec      14 (20) '2.0'\n+77E92 Extract OS            00 (0) 'MS-DOS'\n+77E93 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7751D Compression Method    0008 (8) 'Deflated'\n-7751F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77523 CRC                   98A61B9D (2561022877)\n-77527 Compressed Size       00000555 (1365)\n-7752B Uncompressed Size     000014BA (5306)\n-7752F Filename Length       0026 (38)\n-77531 Extra Length          0000 (0)\n-77533 Comment Length        0000 (0)\n-77535 Disk Start            0000 (0)\n-77537 Int File Attributes   0000 (0)\n+77E95 Compression Method    0008 (8) 'Deflated'\n+77E97 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77E9B CRC                   646CD426 (1684853798)\n+77E9F Compressed Size       0000055F (1375)\n+77EA3 Uncompressed Size     0000153D (5437)\n+77EA7 Filename Length       0026 (38)\n+77EA9 Extra Length          0000 (0)\n+77EAB Comment Length        0000 (0)\n+77EAD Disk Start            0000 (0)\n+77EAF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77539 Ext File Attributes   81A40000 (2175008768)\n+77EB1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7753D Local Header Offset   00068304 (426756)\n-77541 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77EB5 Local Header Offset   00068B80 (428928)\n+77EB9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77541: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77EB9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77567 CENTRAL HEADER #336   02014B50 (33639248)\n-7756B Created Zip Spec      14 (20) '2.0'\n-7756C Created OS            03 (3) 'Unix'\n-7756D Extract Zip Spec      14 (20) '2.0'\n-7756E Extract OS            00 (0) 'MS-DOS'\n-7756F General Purpose Flag  0800 (2048)\n+77EDF CENTRAL HEADER #336   02014B50 (33639248)\n+77EE3 Created Zip Spec      14 (20) '2.0'\n+77EE4 Created OS            03 (3) 'Unix'\n+77EE5 Extract Zip Spec      14 (20) '2.0'\n+77EE6 Extract OS            00 (0) 'MS-DOS'\n+77EE7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77571 Compression Method    0008 (8) 'Deflated'\n-77573 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77577 CRC                   1AE780F7 (451379447)\n-7757B Compressed Size       00000287 (647)\n-7757F Uncompressed Size     000004BD (1213)\n-77583 Filename Length       0033 (51)\n-77585 Extra Length          0000 (0)\n-77587 Comment Length        0000 (0)\n-77589 Disk Start            0000 (0)\n-7758B Int File Attributes   0000 (0)\n+77EE9 Compression Method    0008 (8) 'Deflated'\n+77EEB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77EEF CRC                   D4D0313F (3570413887)\n+77EF3 Compressed Size       0000028E (654)\n+77EF7 Uncompressed Size     000004DD (1245)\n+77EFB Filename Length       0033 (51)\n+77EFD Extra Length          0000 (0)\n+77EFF Comment Length        0000 (0)\n+77F01 Disk Start            0000 (0)\n+77F03 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7758D Ext File Attributes   81A40000 (2175008768)\n+77F05 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77591 Local Header Offset   0006889D (428189)\n-77595 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77F09 Local Header Offset   00069123 (430371)\n+77F0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77595: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77F0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-775C8 CENTRAL HEADER #337   02014B50 (33639248)\n-775CC Created Zip Spec      14 (20) '2.0'\n-775CD Created OS            03 (3) 'Unix'\n-775CE Extract Zip Spec      14 (20) '2.0'\n-775CF Extract OS            00 (0) 'MS-DOS'\n-775D0 General Purpose Flag  0800 (2048)\n+77F40 CENTRAL HEADER #337   02014B50 (33639248)\n+77F44 Created Zip Spec      14 (20) '2.0'\n+77F45 Created OS            03 (3) 'Unix'\n+77F46 Extract Zip Spec      14 (20) '2.0'\n+77F47 Extract OS            00 (0) 'MS-DOS'\n+77F48 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-775D2 Compression Method    0008 (8) 'Deflated'\n-775D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-775D8 CRC                   86E81518 (2263356696)\n-775DC Compressed Size       0000022E (558)\n-775E0 Uncompressed Size     000003E4 (996)\n-775E4 Filename Length       0037 (55)\n-775E6 Extra Length          0000 (0)\n-775E8 Comment Length        0000 (0)\n-775EA Disk Start            0000 (0)\n-775EC Int File Attributes   0000 (0)\n+77F4A Compression Method    0008 (8) 'Deflated'\n+77F4C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77F50 CRC                   63368ED1 (1664519889)\n+77F54 Compressed Size       00000234 (564)\n+77F58 Uncompressed Size     000003FE (1022)\n+77F5C Filename Length       0037 (55)\n+77F5E Extra Length          0000 (0)\n+77F60 Comment Length        0000 (0)\n+77F62 Disk Start            0000 (0)\n+77F64 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-775EE Ext File Attributes   81A40000 (2175008768)\n+77F66 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-775F2 Local Header Offset   00068B75 (428917)\n-775F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77F6A Local Header Offset   00069402 (431106)\n+77F6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x775F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77F6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7762D CENTRAL HEADER #338   02014B50 (33639248)\n-77631 Created Zip Spec      14 (20) '2.0'\n-77632 Created OS            03 (3) 'Unix'\n-77633 Extract Zip Spec      14 (20) '2.0'\n-77634 Extract OS            00 (0) 'MS-DOS'\n-77635 General Purpose Flag  0800 (2048)\n+77FA5 CENTRAL HEADER #338   02014B50 (33639248)\n+77FA9 Created Zip Spec      14 (20) '2.0'\n+77FAA Created OS            03 (3) 'Unix'\n+77FAB Extract Zip Spec      14 (20) '2.0'\n+77FAC Extract OS            00 (0) 'MS-DOS'\n+77FAD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77637 Compression Method    0008 (8) 'Deflated'\n-77639 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7763D CRC                   201D5BFC (538795004)\n-77641 Compressed Size       00000621 (1569)\n-77645 Uncompressed Size     000012A8 (4776)\n-77649 Filename Length       0030 (48)\n-7764B Extra Length          0000 (0)\n-7764D Comment Length        0000 (0)\n-7764F Disk Start            0000 (0)\n-77651 Int File Attributes   0000 (0)\n+77FAF Compression Method    0008 (8) 'Deflated'\n+77FB1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77FB5 CRC                   876E0335 (2272133941)\n+77FB9 Compressed Size       00000630 (1584)\n+77FBD Uncompressed Size     00001328 (4904)\n+77FC1 Filename Length       0030 (48)\n+77FC3 Extra Length          0000 (0)\n+77FC5 Comment Length        0000 (0)\n+77FC7 Disk Start            0000 (0)\n+77FC9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77653 Ext File Attributes   81A40000 (2175008768)\n+77FCB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77657 Local Header Offset   00068DF8 (429560)\n-7765B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77FCF Local Header Offset   0006968B (431755)\n+77FD3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7765B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77FD3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7768B CENTRAL HEADER #339   02014B50 (33639248)\n-7768F Created Zip Spec      14 (20) '2.0'\n-77690 Created OS            03 (3) 'Unix'\n-77691 Extract Zip Spec      14 (20) '2.0'\n-77692 Extract OS            00 (0) 'MS-DOS'\n-77693 General Purpose Flag  0800 (2048)\n+78003 CENTRAL HEADER #339   02014B50 (33639248)\n+78007 Created Zip Spec      14 (20) '2.0'\n+78008 Created OS            03 (3) 'Unix'\n+78009 Extract Zip Spec      14 (20) '2.0'\n+7800A Extract OS            00 (0) 'MS-DOS'\n+7800B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77695 Compression Method    0008 (8) 'Deflated'\n-77697 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7769B CRC                   E946A330 (3913720624)\n-7769F Compressed Size       0000031F (799)\n-776A3 Uncompressed Size     00000A39 (2617)\n-776A7 Filename Length       002F (47)\n-776A9 Extra Length          0000 (0)\n-776AB Comment Length        0000 (0)\n-776AD Disk Start            0000 (0)\n-776AF Int File Attributes   0000 (0)\n+7800D Compression Method    0008 (8) 'Deflated'\n+7800F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78013 CRC                   1E67CB82 (510118786)\n+78017 Compressed Size       00000327 (807)\n+7801B Uncompressed Size     00000A90 (2704)\n+7801F Filename Length       002F (47)\n+78021 Extra Length          0000 (0)\n+78023 Comment Length        0000 (0)\n+78025 Disk Start            0000 (0)\n+78027 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-776B1 Ext File Attributes   81A40000 (2175008768)\n+78029 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-776B5 Local Header Offset   00069467 (431207)\n-776B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7802D Local Header Offset   00069D09 (433417)\n+78031 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x776B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78031: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-776E8 CENTRAL HEADER #340   02014B50 (33639248)\n-776EC Created Zip Spec      14 (20) '2.0'\n-776ED Created OS            03 (3) 'Unix'\n-776EE Extract Zip Spec      14 (20) '2.0'\n-776EF Extract OS            00 (0) 'MS-DOS'\n-776F0 General Purpose Flag  0800 (2048)\n+78060 CENTRAL HEADER #340   02014B50 (33639248)\n+78064 Created Zip Spec      14 (20) '2.0'\n+78065 Created OS            03 (3) 'Unix'\n+78066 Extract Zip Spec      14 (20) '2.0'\n+78067 Extract OS            00 (0) 'MS-DOS'\n+78068 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-776F2 Compression Method    0008 (8) 'Deflated'\n-776F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-776F8 CRC                   FBAECD89 (4222537097)\n-776FC Compressed Size       00000228 (552)\n-77700 Uncompressed Size     000003C4 (964)\n-77704 Filename Length       0036 (54)\n-77706 Extra Length          0000 (0)\n-77708 Comment Length        0000 (0)\n-7770A Disk Start            0000 (0)\n-7770C Int File Attributes   0000 (0)\n+7806A Compression Method    0008 (8) 'Deflated'\n+7806C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78070 CRC                   61CAA47B (1640670331)\n+78074 Compressed Size       00000232 (562)\n+78078 Uncompressed Size     000003DE (990)\n+7807C Filename Length       0036 (54)\n+7807E Extra Length          0000 (0)\n+78080 Comment Length        0000 (0)\n+78082 Disk Start            0000 (0)\n+78084 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7770E Ext File Attributes   81A40000 (2175008768)\n+78086 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77712 Local Header Offset   000697D3 (432083)\n-77716 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7808A Local Header Offset   0006A07D (434301)\n+7808E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77716: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7808E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7774C CENTRAL HEADER #341   02014B50 (33639248)\n-77750 Created Zip Spec      14 (20) '2.0'\n-77751 Created OS            03 (3) 'Unix'\n-77752 Extract Zip Spec      14 (20) '2.0'\n-77753 Extract OS            00 (0) 'MS-DOS'\n-77754 General Purpose Flag  0800 (2048)\n+780C4 CENTRAL HEADER #341   02014B50 (33639248)\n+780C8 Created Zip Spec      14 (20) '2.0'\n+780C9 Created OS            03 (3) 'Unix'\n+780CA Extract Zip Spec      14 (20) '2.0'\n+780CB Extract OS            00 (0) 'MS-DOS'\n+780CC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77756 Compression Method    0008 (8) 'Deflated'\n-77758 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7775C CRC                   E22DB581 (3794646401)\n-77760 Compressed Size       00000472 (1138)\n-77764 Uncompressed Size     00000BEE (3054)\n-77768 Filename Length       0033 (51)\n-7776A Extra Length          0000 (0)\n-7776C Comment Length        0000 (0)\n-7776E Disk Start            0000 (0)\n-77770 Int File Attributes   0000 (0)\n+780CE Compression Method    0008 (8) 'Deflated'\n+780D0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+780D4 CRC                   607FF27E (1618997886)\n+780D8 Compressed Size       0000047D (1149)\n+780DC Uncompressed Size     00000C53 (3155)\n+780E0 Filename Length       0033 (51)\n+780E2 Extra Length          0000 (0)\n+780E4 Comment Length        0000 (0)\n+780E6 Disk Start            0000 (0)\n+780E8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77772 Ext File Attributes   81A40000 (2175008768)\n+780EA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77776 Local Header Offset   00069A4F (432719)\n-7777A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+780EE Local Header Offset   0006A303 (434947)\n+780F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7777A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x780F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-777AD CENTRAL HEADER #342   02014B50 (33639248)\n-777B1 Created Zip Spec      14 (20) '2.0'\n-777B2 Created OS            03 (3) 'Unix'\n-777B3 Extract Zip Spec      14 (20) '2.0'\n-777B4 Extract OS            00 (0) 'MS-DOS'\n-777B5 General Purpose Flag  0800 (2048)\n+78125 CENTRAL HEADER #342   02014B50 (33639248)\n+78129 Created Zip Spec      14 (20) '2.0'\n+7812A Created OS            03 (3) 'Unix'\n+7812B Extract Zip Spec      14 (20) '2.0'\n+7812C Extract OS            00 (0) 'MS-DOS'\n+7812D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-777B7 Compression Method    0008 (8) 'Deflated'\n-777B9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-777BD CRC                   02426CD5 (37907669)\n-777C1 Compressed Size       0000079A (1946)\n-777C5 Uncompressed Size     00001B9D (7069)\n-777C9 Filename Length       002D (45)\n-777CB Extra Length          0000 (0)\n-777CD Comment Length        0000 (0)\n-777CF Disk Start            0000 (0)\n-777D1 Int File Attributes   0000 (0)\n+7812F Compression Method    0008 (8) 'Deflated'\n+78131 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78135 CRC                   7B7924E9 (2071536873)\n+78139 Compressed Size       000007AC (1964)\n+7813D Uncompressed Size     00001C78 (7288)\n+78141 Filename Length       002D (45)\n+78143 Extra Length          0000 (0)\n+78145 Comment Length        0000 (0)\n+78147 Disk Start            0000 (0)\n+78149 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-777D3 Ext File Attributes   81A40000 (2175008768)\n+7814B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-777D7 Local Header Offset   00069F12 (433938)\n-777DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7814F Local Header Offset   0006A7D1 (436177)\n+78153 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x777DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78153: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77808 CENTRAL HEADER #343   02014B50 (33639248)\n-7780C Created Zip Spec      14 (20) '2.0'\n-7780D Created OS            03 (3) 'Unix'\n-7780E Extract Zip Spec      14 (20) '2.0'\n-7780F Extract OS            00 (0) 'MS-DOS'\n-77810 General Purpose Flag  0800 (2048)\n+78180 CENTRAL HEADER #343   02014B50 (33639248)\n+78184 Created Zip Spec      14 (20) '2.0'\n+78185 Created OS            03 (3) 'Unix'\n+78186 Extract Zip Spec      14 (20) '2.0'\n+78187 Extract OS            00 (0) 'MS-DOS'\n+78188 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77812 Compression Method    0008 (8) 'Deflated'\n-77814 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77818 CRC                   641CBA7B (1679604347)\n-7781C Compressed Size       00000430 (1072)\n-77820 Uncompressed Size     00000BB0 (2992)\n-77824 Filename Length       0030 (48)\n-77826 Extra Length          0000 (0)\n-77828 Comment Length        0000 (0)\n-7782A Disk Start            0000 (0)\n-7782C Int File Attributes   0000 (0)\n+7818A Compression Method    0008 (8) 'Deflated'\n+7818C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78190 CRC                   707F9167 (1887408487)\n+78194 Compressed Size       00000439 (1081)\n+78198 Uncompressed Size     00000C0D (3085)\n+7819C Filename Length       0030 (48)\n+7819E Extra Length          0000 (0)\n+781A0 Comment Length        0000 (0)\n+781A2 Disk Start            0000 (0)\n+781A4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7782E Ext File Attributes   81A40000 (2175008768)\n+781A6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77832 Local Header Offset   0006A6F7 (435959)\n-77836 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+781AA Local Header Offset   0006AFC8 (438216)\n+781AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77836: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x781AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77866 CENTRAL HEADER #344   02014B50 (33639248)\n-7786A Created Zip Spec      14 (20) '2.0'\n-7786B Created OS            03 (3) 'Unix'\n-7786C Extract Zip Spec      14 (20) '2.0'\n-7786D Extract OS            00 (0) 'MS-DOS'\n-7786E General Purpose Flag  0800 (2048)\n+781DE CENTRAL HEADER #344   02014B50 (33639248)\n+781E2 Created Zip Spec      14 (20) '2.0'\n+781E3 Created OS            03 (3) 'Unix'\n+781E4 Extract Zip Spec      14 (20) '2.0'\n+781E5 Extract OS            00 (0) 'MS-DOS'\n+781E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77870 Compression Method    0008 (8) 'Deflated'\n-77872 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77876 CRC                   C652D326 (3327316774)\n-7787A Compressed Size       000003C2 (962)\n-7787E Uncompressed Size     00000A71 (2673)\n-77882 Filename Length       0033 (51)\n-77884 Extra Length          0000 (0)\n-77886 Comment Length        0000 (0)\n-77888 Disk Start            0000 (0)\n-7788A Int File Attributes   0000 (0)\n+781E8 Compression Method    0008 (8) 'Deflated'\n+781EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+781EE CRC                   FDA638C9 (4255529161)\n+781F2 Compressed Size       000003CC (972)\n+781F6 Uncompressed Size     00000AC1 (2753)\n+781FA Filename Length       0033 (51)\n+781FC Extra Length          0000 (0)\n+781FE Comment Length        0000 (0)\n+78200 Disk Start            0000 (0)\n+78202 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7788C Ext File Attributes   81A40000 (2175008768)\n+78204 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77890 Local Header Offset   0006AB75 (437109)\n-77894 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78208 Local Header Offset   0006B44F (439375)\n+7820C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77894: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7820C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-778C7 CENTRAL HEADER #345   02014B50 (33639248)\n-778CB Created Zip Spec      14 (20) '2.0'\n-778CC Created OS            03 (3) 'Unix'\n-778CD Extract Zip Spec      14 (20) '2.0'\n-778CE Extract OS            00 (0) 'MS-DOS'\n-778CF General Purpose Flag  0800 (2048)\n+7823F CENTRAL HEADER #345   02014B50 (33639248)\n+78243 Created Zip Spec      14 (20) '2.0'\n+78244 Created OS            03 (3) 'Unix'\n+78245 Extract Zip Spec      14 (20) '2.0'\n+78246 Extract OS            00 (0) 'MS-DOS'\n+78247 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-778D1 Compression Method    0008 (8) 'Deflated'\n-778D3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-778D7 CRC                   DE4FB79A (3729766298)\n-778DB Compressed Size       000006C2 (1730)\n-778DF Uncompressed Size     00001A0D (6669)\n-778E3 Filename Length       002D (45)\n-778E5 Extra Length          0000 (0)\n-778E7 Comment Length        0000 (0)\n-778E9 Disk Start            0000 (0)\n-778EB Int File Attributes   0000 (0)\n+78249 Compression Method    0008 (8) 'Deflated'\n+7824B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7824F CRC                   5FA42AEE (1604594414)\n+78253 Compressed Size       000006D0 (1744)\n+78257 Uncompressed Size     00001ADA (6874)\n+7825B Filename Length       002D (45)\n+7825D Extra Length          0000 (0)\n+7825F Comment Length        0000 (0)\n+78261 Disk Start            0000 (0)\n+78263 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-778ED Ext File Attributes   81A40000 (2175008768)\n+78265 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-778F1 Local Header Offset   0006AF88 (438152)\n-778F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78269 Local Header Offset   0006B86C (440428)\n+7826D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x778F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7826D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77922 CENTRAL HEADER #346   02014B50 (33639248)\n-77926 Created Zip Spec      14 (20) '2.0'\n-77927 Created OS            03 (3) 'Unix'\n-77928 Extract Zip Spec      14 (20) '2.0'\n-77929 Extract OS            00 (0) 'MS-DOS'\n-7792A General Purpose Flag  0800 (2048)\n+7829A CENTRAL HEADER #346   02014B50 (33639248)\n+7829E Created Zip Spec      14 (20) '2.0'\n+7829F Created OS            03 (3) 'Unix'\n+782A0 Extract Zip Spec      14 (20) '2.0'\n+782A1 Extract OS            00 (0) 'MS-DOS'\n+782A2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7792C Compression Method    0008 (8) 'Deflated'\n-7792E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77932 CRC                   C6C2FD7D (3334667645)\n-77936 Compressed Size       0000056D (1389)\n-7793A Uncompressed Size     0000110A (4362)\n-7793E Filename Length       0031 (49)\n-77940 Extra Length          0000 (0)\n-77942 Comment Length        0000 (0)\n-77944 Disk Start            0000 (0)\n-77946 Int File Attributes   0000 (0)\n+782A4 Compression Method    0008 (8) 'Deflated'\n+782A6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+782AA CRC                   619FED81 (1637870977)\n+782AE Compressed Size       0000057C (1404)\n+782B2 Uncompressed Size     00001181 (4481)\n+782B6 Filename Length       0031 (49)\n+782B8 Extra Length          0000 (0)\n+782BA Comment Length        0000 (0)\n+782BC Disk Start            0000 (0)\n+782BE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77948 Ext File Attributes   81A40000 (2175008768)\n+782C0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7794C Local Header Offset   0006B695 (439957)\n-77950 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+782C4 Local Header Offset   0006BF87 (442247)\n+782C8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77950: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x782C8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77981 CENTRAL HEADER #347   02014B50 (33639248)\n-77985 Created Zip Spec      14 (20) '2.0'\n-77986 Created OS            03 (3) 'Unix'\n-77987 Extract Zip Spec      14 (20) '2.0'\n-77988 Extract OS            00 (0) 'MS-DOS'\n-77989 General Purpose Flag  0800 (2048)\n+782F9 CENTRAL HEADER #347   02014B50 (33639248)\n+782FD Created Zip Spec      14 (20) '2.0'\n+782FE Created OS            03 (3) 'Unix'\n+782FF Extract Zip Spec      14 (20) '2.0'\n+78300 Extract OS            00 (0) 'MS-DOS'\n+78301 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7798B Compression Method    0008 (8) 'Deflated'\n-7798D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77991 CRC                   92839F02 (2458099458)\n-77995 Compressed Size       00000434 (1076)\n-77999 Uncompressed Size     00000C1C (3100)\n-7799D Filename Length       002F (47)\n-7799F Extra Length          0000 (0)\n-779A1 Comment Length        0000 (0)\n-779A3 Disk Start            0000 (0)\n-779A5 Int File Attributes   0000 (0)\n+78303 Compression Method    0008 (8) 'Deflated'\n+78305 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78309 CRC                   E8166721 (3893782305)\n+7830D Compressed Size       0000043F (1087)\n+78311 Uncompressed Size     00000C82 (3202)\n+78315 Filename Length       002F (47)\n+78317 Extra Length          0000 (0)\n+78319 Comment Length        0000 (0)\n+7831B Disk Start            0000 (0)\n+7831D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-779A7 Ext File Attributes   81A40000 (2175008768)\n+7831F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-779AB Local Header Offset   0006BC51 (441425)\n-779AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78323 Local Header Offset   0006C552 (443730)\n+78327 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x779AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78327: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-779DE CENTRAL HEADER #348   02014B50 (33639248)\n-779E2 Created Zip Spec      14 (20) '2.0'\n-779E3 Created OS            03 (3) 'Unix'\n-779E4 Extract Zip Spec      14 (20) '2.0'\n-779E5 Extract OS            00 (0) 'MS-DOS'\n-779E6 General Purpose Flag  0800 (2048)\n+78356 CENTRAL HEADER #348   02014B50 (33639248)\n+7835A Created Zip Spec      14 (20) '2.0'\n+7835B Created OS            03 (3) 'Unix'\n+7835C Extract Zip Spec      14 (20) '2.0'\n+7835D Extract OS            00 (0) 'MS-DOS'\n+7835E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-779E8 Compression Method    0008 (8) 'Deflated'\n-779EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-779EE CRC                   ED067114 (3976622356)\n-779F2 Compressed Size       00000790 (1936)\n-779F6 Uncompressed Size     00001C7D (7293)\n-779FA Filename Length       0031 (49)\n-779FC Extra Length          0000 (0)\n-779FE Comment Length        0000 (0)\n-77A00 Disk Start            0000 (0)\n-77A02 Int File Attributes   0000 (0)\n+78360 Compression Method    0008 (8) 'Deflated'\n+78362 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78366 CRC                   363316B0 (909317808)\n+7836A Compressed Size       000007A1 (1953)\n+7836E Uncompressed Size     00001D36 (7478)\n+78372 Filename Length       0031 (49)\n+78374 Extra Length          0000 (0)\n+78376 Comment Length        0000 (0)\n+78378 Disk Start            0000 (0)\n+7837A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77A04 Ext File Attributes   81A40000 (2175008768)\n+7837C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77A08 Local Header Offset   0006C0D2 (442578)\n-77A0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78380 Local Header Offset   0006C9DE (444894)\n+78384 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77A0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78384: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77A3D CENTRAL HEADER #349   02014B50 (33639248)\n-77A41 Created Zip Spec      14 (20) '2.0'\n-77A42 Created OS            03 (3) 'Unix'\n-77A43 Extract Zip Spec      14 (20) '2.0'\n-77A44 Extract OS            00 (0) 'MS-DOS'\n-77A45 General Purpose Flag  0800 (2048)\n+783B5 CENTRAL HEADER #349   02014B50 (33639248)\n+783B9 Created Zip Spec      14 (20) '2.0'\n+783BA Created OS            03 (3) 'Unix'\n+783BB Extract Zip Spec      14 (20) '2.0'\n+783BC Extract OS            00 (0) 'MS-DOS'\n+783BD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77A47 Compression Method    0008 (8) 'Deflated'\n-77A49 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77A4D CRC                   D7F884E9 (3623388393)\n-77A51 Compressed Size       00000204 (516)\n-77A55 Uncompressed Size     00000381 (897)\n-77A59 Filename Length       002D (45)\n-77A5B Extra Length          0000 (0)\n-77A5D Comment Length        0000 (0)\n-77A5F Disk Start            0000 (0)\n-77A61 Int File Attributes   0000 (0)\n+783BF Compression Method    0008 (8) 'Deflated'\n+783C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+783C5 CRC                   8C6F354A (2356098378)\n+783C9 Compressed Size       0000020C (524)\n+783CD Uncompressed Size     00000398 (920)\n+783D1 Filename Length       002D (45)\n+783D3 Extra Length          0000 (0)\n+783D5 Comment Length        0000 (0)\n+783D7 Disk Start            0000 (0)\n+783D9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77A63 Ext File Attributes   81A40000 (2175008768)\n+783DB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77A67 Local Header Offset   0006C8B1 (444593)\n-77A6B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+783DF Local Header Offset   0006D1CE (446926)\n+783E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77A6B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x783E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77A98 CENTRAL HEADER #350   02014B50 (33639248)\n-77A9C Created Zip Spec      14 (20) '2.0'\n-77A9D Created OS            03 (3) 'Unix'\n-77A9E Extract Zip Spec      14 (20) '2.0'\n-77A9F Extract OS            00 (0) 'MS-DOS'\n-77AA0 General Purpose Flag  0800 (2048)\n+78410 CENTRAL HEADER #350   02014B50 (33639248)\n+78414 Created Zip Spec      14 (20) '2.0'\n+78415 Created OS            03 (3) 'Unix'\n+78416 Extract Zip Spec      14 (20) '2.0'\n+78417 Extract OS            00 (0) 'MS-DOS'\n+78418 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77AA2 Compression Method    0008 (8) 'Deflated'\n-77AA4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77AA8 CRC                   28AB9AE3 (682334947)\n-77AAC Compressed Size       0000023B (571)\n-77AB0 Uncompressed Size     00000411 (1041)\n-77AB4 Filename Length       002D (45)\n-77AB6 Extra Length          0000 (0)\n-77AB8 Comment Length        0000 (0)\n-77ABA Disk Start            0000 (0)\n-77ABC Int File Attributes   0000 (0)\n+7841A Compression Method    0008 (8) 'Deflated'\n+7841C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78420 CRC                   4B31CC84 (1261554820)\n+78424 Compressed Size       00000242 (578)\n+78428 Uncompressed Size     00000431 (1073)\n+7842C Filename Length       002D (45)\n+7842E Extra Length          0000 (0)\n+78430 Comment Length        0000 (0)\n+78432 Disk Start            0000 (0)\n+78434 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77ABE Ext File Attributes   81A40000 (2175008768)\n+78436 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77AC2 Local Header Offset   0006CB00 (445184)\n-77AC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7843A Local Header Offset   0006D425 (447525)\n+7843E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77AC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7843E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77AF3 CENTRAL HEADER #351   02014B50 (33639248)\n-77AF7 Created Zip Spec      14 (20) '2.0'\n-77AF8 Created OS            03 (3) 'Unix'\n-77AF9 Extract Zip Spec      14 (20) '2.0'\n-77AFA Extract OS            00 (0) 'MS-DOS'\n-77AFB General Purpose Flag  0800 (2048)\n+7846B CENTRAL HEADER #351   02014B50 (33639248)\n+7846F Created Zip Spec      14 (20) '2.0'\n+78470 Created OS            03 (3) 'Unix'\n+78471 Extract Zip Spec      14 (20) '2.0'\n+78472 Extract OS            00 (0) 'MS-DOS'\n+78473 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77AFD Compression Method    0008 (8) 'Deflated'\n-77AFF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77B03 CRC                   9CAA7033 (2628415539)\n-77B07 Compressed Size       0000023E (574)\n-77B0B Uncompressed Size     00000426 (1062)\n-77B0F Filename Length       0035 (53)\n-77B11 Extra Length          0000 (0)\n-77B13 Comment Length        0000 (0)\n-77B15 Disk Start            0000 (0)\n-77B17 Int File Attributes   0000 (0)\n+78475 Compression Method    0008 (8) 'Deflated'\n+78477 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7847B CRC                   66AD4132 (1722630450)\n+7847F Compressed Size       00000246 (582)\n+78483 Uncompressed Size     00000442 (1090)\n+78487 Filename Length       0035 (53)\n+78489 Extra Length          0000 (0)\n+7848B Comment Length        0000 (0)\n+7848D Disk Start            0000 (0)\n+7848F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77B19 Ext File Attributes   81A40000 (2175008768)\n+78491 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77B1D Local Header Offset   0006CD86 (445830)\n-77B21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78495 Local Header Offset   0006D6B2 (448178)\n+78499 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77B21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78499: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77B56 CENTRAL HEADER #352   02014B50 (33639248)\n-77B5A Created Zip Spec      14 (20) '2.0'\n-77B5B Created OS            03 (3) 'Unix'\n-77B5C Extract Zip Spec      14 (20) '2.0'\n-77B5D Extract OS            00 (0) 'MS-DOS'\n-77B5E General Purpose Flag  0800 (2048)\n+784CE CENTRAL HEADER #352   02014B50 (33639248)\n+784D2 Created Zip Spec      14 (20) '2.0'\n+784D3 Created OS            03 (3) 'Unix'\n+784D4 Extract Zip Spec      14 (20) '2.0'\n+784D5 Extract OS            00 (0) 'MS-DOS'\n+784D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77B60 Compression Method    0008 (8) 'Deflated'\n-77B62 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77B66 CRC                   C2B7ABEC (3266817004)\n-77B6A Compressed Size       0000030F (783)\n-77B6E Uncompressed Size     000007C9 (1993)\n-77B72 Filename Length       0032 (50)\n-77B74 Extra Length          0000 (0)\n-77B76 Comment Length        0000 (0)\n-77B78 Disk Start            0000 (0)\n-77B7A Int File Attributes   0000 (0)\n+784D8 Compression Method    0008 (8) 'Deflated'\n+784DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+784DE CRC                   49B9FF79 (1236926329)\n+784E2 Compressed Size       00000319 (793)\n+784E6 Uncompressed Size     00000809 (2057)\n+784EA Filename Length       0032 (50)\n+784EC Extra Length          0000 (0)\n+784EE Comment Length        0000 (0)\n+784F0 Disk Start            0000 (0)\n+784F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77B7C Ext File Attributes   81A40000 (2175008768)\n+784F4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77B80 Local Header Offset   0006D017 (446487)\n-77B84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+784F8 Local Header Offset   0006D94B (448843)\n+784FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77B84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x784FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77BB6 CENTRAL HEADER #353   02014B50 (33639248)\n-77BBA Created Zip Spec      14 (20) '2.0'\n-77BBB Created OS            03 (3) 'Unix'\n-77BBC Extract Zip Spec      14 (20) '2.0'\n-77BBD Extract OS            00 (0) 'MS-DOS'\n-77BBE General Purpose Flag  0800 (2048)\n+7852E CENTRAL HEADER #353   02014B50 (33639248)\n+78532 Created Zip Spec      14 (20) '2.0'\n+78533 Created OS            03 (3) 'Unix'\n+78534 Extract Zip Spec      14 (20) '2.0'\n+78535 Extract OS            00 (0) 'MS-DOS'\n+78536 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77BC0 Compression Method    0008 (8) 'Deflated'\n-77BC2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77BC6 CRC                   2C4FF5E6 (743437798)\n-77BCA Compressed Size       00000351 (849)\n-77BCE Uncompressed Size     0000075E (1886)\n-77BD2 Filename Length       0030 (48)\n-77BD4 Extra Length          0000 (0)\n-77BD6 Comment Length        0000 (0)\n-77BD8 Disk Start            0000 (0)\n-77BDA Int File Attributes   0000 (0)\n+78538 Compression Method    0008 (8) 'Deflated'\n+7853A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7853E CRC                   D07DEF14 (3497914132)\n+78542 Compressed Size       0000035A (858)\n+78546 Uncompressed Size     0000078D (1933)\n+7854A Filename Length       0030 (48)\n+7854C Extra Length          0000 (0)\n+7854E Comment Length        0000 (0)\n+78550 Disk Start            0000 (0)\n+78552 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77BDC Ext File Attributes   81A40000 (2175008768)\n+78554 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77BE0 Local Header Offset   0006D376 (447350)\n-77BE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78558 Local Header Offset   0006DCB4 (449716)\n+7855C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77BE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7855C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77C14 CENTRAL HEADER #354   02014B50 (33639248)\n-77C18 Created Zip Spec      14 (20) '2.0'\n-77C19 Created OS            03 (3) 'Unix'\n-77C1A Extract Zip Spec      14 (20) '2.0'\n-77C1B Extract OS            00 (0) 'MS-DOS'\n-77C1C General Purpose Flag  0800 (2048)\n+7858C CENTRAL HEADER #354   02014B50 (33639248)\n+78590 Created Zip Spec      14 (20) '2.0'\n+78591 Created OS            03 (3) 'Unix'\n+78592 Extract Zip Spec      14 (20) '2.0'\n+78593 Extract OS            00 (0) 'MS-DOS'\n+78594 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77C1E Compression Method    0008 (8) 'Deflated'\n-77C20 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77C24 CRC                   420D2C18 (1108159512)\n-77C28 Compressed Size       00000240 (576)\n-77C2C Uncompressed Size     0000042C (1068)\n-77C30 Filename Length       0038 (56)\n-77C32 Extra Length          0000 (0)\n-77C34 Comment Length        0000 (0)\n-77C36 Disk Start            0000 (0)\n-77C38 Int File Attributes   0000 (0)\n+78596 Compression Method    0008 (8) 'Deflated'\n+78598 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7859C CRC                   4AFAB67E (1257944702)\n+785A0 Compressed Size       00000247 (583)\n+785A4 Uncompressed Size     00000448 (1096)\n+785A8 Filename Length       0038 (56)\n+785AA Extra Length          0000 (0)\n+785AC Comment Length        0000 (0)\n+785AE Disk Start            0000 (0)\n+785B0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77C3A Ext File Attributes   81A40000 (2175008768)\n+785B2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77C3E Local Header Offset   0006D715 (448277)\n-77C42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+785B6 Local Header Offset   0006E05C (450652)\n+785BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77C42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x785BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77C7A CENTRAL HEADER #355   02014B50 (33639248)\n-77C7E Created Zip Spec      14 (20) '2.0'\n-77C7F Created OS            03 (3) 'Unix'\n-77C80 Extract Zip Spec      14 (20) '2.0'\n-77C81 Extract OS            00 (0) 'MS-DOS'\n-77C82 General Purpose Flag  0800 (2048)\n+785F2 CENTRAL HEADER #355   02014B50 (33639248)\n+785F6 Created Zip Spec      14 (20) '2.0'\n+785F7 Created OS            03 (3) 'Unix'\n+785F8 Extract Zip Spec      14 (20) '2.0'\n+785F9 Extract OS            00 (0) 'MS-DOS'\n+785FA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77C84 Compression Method    0008 (8) 'Deflated'\n-77C86 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77C8A CRC                   40BAC24E (1085981262)\n-77C8E Compressed Size       000003D7 (983)\n-77C92 Uncompressed Size     00000B49 (2889)\n-77C96 Filename Length       0036 (54)\n-77C98 Extra Length          0000 (0)\n-77C9A Comment Length        0000 (0)\n-77C9C Disk Start            0000 (0)\n-77C9E Int File Attributes   0000 (0)\n+785FC Compression Method    0008 (8) 'Deflated'\n+785FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78602 CRC                   C563319A (3311612314)\n+78606 Compressed Size       000003DF (991)\n+7860A Uncompressed Size     00000B90 (2960)\n+7860E Filename Length       0036 (54)\n+78610 Extra Length          0000 (0)\n+78612 Comment Length        0000 (0)\n+78614 Disk Start            0000 (0)\n+78616 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77CA0 Ext File Attributes   81A40000 (2175008768)\n+78618 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77CA4 Local Header Offset   0006D9AB (448939)\n-77CA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7861C Local Header Offset   0006E2F9 (451321)\n+78620 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77CA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78620: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77CDE CENTRAL HEADER #356   02014B50 (33639248)\n-77CE2 Created Zip Spec      14 (20) '2.0'\n-77CE3 Created OS            03 (3) 'Unix'\n-77CE4 Extract Zip Spec      14 (20) '2.0'\n-77CE5 Extract OS            00 (0) 'MS-DOS'\n-77CE6 General Purpose Flag  0800 (2048)\n+78656 CENTRAL HEADER #356   02014B50 (33639248)\n+7865A Created Zip Spec      14 (20) '2.0'\n+7865B Created OS            03 (3) 'Unix'\n+7865C Extract Zip Spec      14 (20) '2.0'\n+7865D Extract OS            00 (0) 'MS-DOS'\n+7865E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77CE8 Compression Method    0008 (8) 'Deflated'\n-77CEA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77CEE CRC                   CC5CA724 (3428624164)\n-77CF2 Compressed Size       0000048C (1164)\n-77CF6 Uncompressed Size     0000105D (4189)\n-77CFA Filename Length       002F (47)\n-77CFC Extra Length          0000 (0)\n-77CFE Comment Length        0000 (0)\n-77D00 Disk Start            0000 (0)\n-77D02 Int File Attributes   0000 (0)\n+78660 Compression Method    0008 (8) 'Deflated'\n+78662 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78666 CRC                   1187A07F (294101119)\n+7866A Compressed Size       00000499 (1177)\n+7866E Uncompressed Size     000010B8 (4280)\n+78672 Filename Length       002F (47)\n+78674 Extra Length          0000 (0)\n+78676 Comment Length        0000 (0)\n+78678 Disk Start            0000 (0)\n+7867A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77D04 Ext File Attributes   81A40000 (2175008768)\n+7867C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77D08 Local Header Offset   0006DDD6 (450006)\n-77D0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78680 Local Header Offset   0006E72C (452396)\n+78684 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77D0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78684: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77D3B CENTRAL HEADER #357   02014B50 (33639248)\n-77D3F Created Zip Spec      14 (20) '2.0'\n-77D40 Created OS            03 (3) 'Unix'\n-77D41 Extract Zip Spec      14 (20) '2.0'\n-77D42 Extract OS            00 (0) 'MS-DOS'\n-77D43 General Purpose Flag  0800 (2048)\n+786B3 CENTRAL HEADER #357   02014B50 (33639248)\n+786B7 Created Zip Spec      14 (20) '2.0'\n+786B8 Created OS            03 (3) 'Unix'\n+786B9 Extract Zip Spec      14 (20) '2.0'\n+786BA Extract OS            00 (0) 'MS-DOS'\n+786BB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77D45 Compression Method    0008 (8) 'Deflated'\n-77D47 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77D4B CRC                   BC0369E6 (3154340326)\n-77D4F Compressed Size       00000052 (82)\n-77D53 Uncompressed Size     000000C2 (194)\n-77D57 Filename Length       0041 (65)\n-77D59 Extra Length          0000 (0)\n-77D5B Comment Length        0000 (0)\n-77D5D Disk Start            0000 (0)\n-77D5F Int File Attributes   0000 (0)\n+786BD Compression Method    0008 (8) 'Deflated'\n+786BF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+786C3 CRC                   BC0369E6 (3154340326)\n+786C7 Compressed Size       00000052 (82)\n+786CB Uncompressed Size     000000C2 (194)\n+786CF Filename Length       0041 (65)\n+786D1 Extra Length          0000 (0)\n+786D3 Comment Length        0000 (0)\n+786D5 Disk Start            0000 (0)\n+786D7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77D61 Ext File Attributes   81A40000 (2175008768)\n+786D9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77D65 Local Header Offset   0006E2AF (451247)\n-77D69 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+786DD Local Header Offset   0006EC12 (453650)\n+786E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77D69: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x786E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77DAA CENTRAL HEADER #358   02014B50 (33639248)\n-77DAE Created Zip Spec      14 (20) '2.0'\n-77DAF Created OS            03 (3) 'Unix'\n-77DB0 Extract Zip Spec      14 (20) '2.0'\n-77DB1 Extract OS            00 (0) 'MS-DOS'\n-77DB2 General Purpose Flag  0800 (2048)\n+78722 CENTRAL HEADER #358   02014B50 (33639248)\n+78726 Created Zip Spec      14 (20) '2.0'\n+78727 Created OS            03 (3) 'Unix'\n+78728 Extract Zip Spec      14 (20) '2.0'\n+78729 Extract OS            00 (0) 'MS-DOS'\n+7872A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77DB4 Compression Method    0008 (8) 'Deflated'\n-77DB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77DBA CRC                   193ACDA3 (423284131)\n-77DBE Compressed Size       0000005D (93)\n-77DC2 Uncompressed Size     000000AE (174)\n-77DC6 Filename Length       005F (95)\n-77DC8 Extra Length          0000 (0)\n-77DCA Comment Length        0000 (0)\n-77DCC Disk Start            0000 (0)\n-77DCE Int File Attributes   0000 (0)\n+7872C Compression Method    0008 (8) 'Deflated'\n+7872E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78732 CRC                   C7151CD7 (3340049623)\n+78736 Compressed Size       0000005F (95)\n+7873A Uncompressed Size     000000AF (175)\n+7873E Filename Length       005F (95)\n+78740 Extra Length          0000 (0)\n+78742 Comment Length        0000 (0)\n+78744 Disk Start            0000 (0)\n+78746 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77DD0 Ext File Attributes   81A40000 (2175008768)\n+78748 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77DD4 Local Header Offset   0006E360 (451424)\n-77DD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7874C Local Header Offset   0006ECC3 (453827)\n+78750 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77DD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78750: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77E37 CENTRAL HEADER #359   02014B50 (33639248)\n-77E3B Created Zip Spec      14 (20) '2.0'\n-77E3C Created OS            03 (3) 'Unix'\n-77E3D Extract Zip Spec      14 (20) '2.0'\n-77E3E Extract OS            00 (0) 'MS-DOS'\n-77E3F General Purpose Flag  0800 (2048)\n+787AF CENTRAL HEADER #359   02014B50 (33639248)\n+787B3 Created Zip Spec      14 (20) '2.0'\n+787B4 Created OS            03 (3) 'Unix'\n+787B5 Extract Zip Spec      14 (20) '2.0'\n+787B6 Extract OS            00 (0) 'MS-DOS'\n+787B7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77E41 Compression Method    0008 (8) 'Deflated'\n-77E43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77E47 CRC                   DA7850A4 (3665318052)\n-77E4B Compressed Size       00000064 (100)\n-77E4F Uncompressed Size     000000A3 (163)\n-77E53 Filename Length       0044 (68)\n-77E55 Extra Length          0000 (0)\n-77E57 Comment Length        0000 (0)\n-77E59 Disk Start            0000 (0)\n-77E5B Int File Attributes   0000 (0)\n+787B9 Compression Method    0008 (8) 'Deflated'\n+787BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+787BF CRC                   FD9DED40 (4254985536)\n+787C3 Compressed Size       00000067 (103)\n+787C7 Uncompressed Size     000000A5 (165)\n+787CB Filename Length       0044 (68)\n+787CD Extra Length          0000 (0)\n+787CF Comment Length        0000 (0)\n+787D1 Disk Start            0000 (0)\n+787D3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77E5D Ext File Attributes   81A40000 (2175008768)\n+787D5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77E61 Local Header Offset   0006E43A (451642)\n-77E65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+787D9 Local Header Offset   0006ED9F (454047)\n+787DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77E65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x787DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77EA9 CENTRAL HEADER #360   02014B50 (33639248)\n-77EAD Created Zip Spec      14 (20) '2.0'\n-77EAE Created OS            03 (3) 'Unix'\n-77EAF Extract Zip Spec      14 (20) '2.0'\n-77EB0 Extract OS            00 (0) 'MS-DOS'\n-77EB1 General Purpose Flag  0800 (2048)\n+78821 CENTRAL HEADER #360   02014B50 (33639248)\n+78825 Created Zip Spec      14 (20) '2.0'\n+78826 Created OS            03 (3) 'Unix'\n+78827 Extract Zip Spec      14 (20) '2.0'\n+78828 Extract OS            00 (0) 'MS-DOS'\n+78829 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77EB3 Compression Method    0008 (8) 'Deflated'\n-77EB5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77EB9 CRC                   99161436 (2568361014)\n-77EBD Compressed Size       000000AD (173)\n-77EC1 Uncompressed Size     00000312 (786)\n-77EC5 Filename Length       0041 (65)\n-77EC7 Extra Length          0000 (0)\n-77EC9 Comment Length        0000 (0)\n-77ECB Disk Start            0000 (0)\n-77ECD Int File Attributes   0000 (0)\n+7882B Compression Method    0008 (8) 'Deflated'\n+7882D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78831 CRC                   6F27839F (1864860575)\n+78835 Compressed Size       000000AF (175)\n+78839 Uncompressed Size     0000031C (796)\n+7883D Filename Length       0041 (65)\n+7883F Extra Length          0000 (0)\n+78841 Comment Length        0000 (0)\n+78843 Disk Start            0000 (0)\n+78845 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77ECF Ext File Attributes   81A40000 (2175008768)\n+78847 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77ED3 Local Header Offset   0006E500 (451840)\n-77ED7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7884B Local Header Offset   0006EE68 (454248)\n+7884F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77ED7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7884F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77F18 CENTRAL HEADER #361   02014B50 (33639248)\n-77F1C Created Zip Spec      14 (20) '2.0'\n-77F1D Created OS            03 (3) 'Unix'\n-77F1E Extract Zip Spec      14 (20) '2.0'\n-77F1F Extract OS            00 (0) 'MS-DOS'\n-77F20 General Purpose Flag  0800 (2048)\n+78890 CENTRAL HEADER #361   02014B50 (33639248)\n+78894 Created Zip Spec      14 (20) '2.0'\n+78895 Created OS            03 (3) 'Unix'\n+78896 Extract Zip Spec      14 (20) '2.0'\n+78897 Extract OS            00 (0) 'MS-DOS'\n+78898 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77F22 Compression Method    0008 (8) 'Deflated'\n-77F24 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77F28 CRC                   81B9C79B (2176436123)\n-77F2C Compressed Size       000000C5 (197)\n-77F30 Uncompressed Size     000003FE (1022)\n-77F34 Filename Length       0054 (84)\n-77F36 Extra Length          0000 (0)\n-77F38 Comment Length        0000 (0)\n-77F3A Disk Start            0000 (0)\n-77F3C Int File Attributes   0000 (0)\n+7889A Compression Method    0008 (8) 'Deflated'\n+7889C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+788A0 CRC                   0A4E0AA7 (172886695)\n+788A4 Compressed Size       000000C8 (200)\n+788A8 Uncompressed Size     0000040A (1034)\n+788AC Filename Length       0054 (84)\n+788AE Extra Length          0000 (0)\n+788B0 Comment Length        0000 (0)\n+788B2 Disk Start            0000 (0)\n+788B4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77F3E Ext File Attributes   81A40000 (2175008768)\n+788B6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77F42 Local Header Offset   0006E60C (452108)\n-77F46 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+788BA Local Header Offset   0006EF76 (454518)\n+788BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77F46: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x788BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-77F9A CENTRAL HEADER #362   02014B50 (33639248)\n-77F9E Created Zip Spec      14 (20) '2.0'\n-77F9F Created OS            03 (3) 'Unix'\n-77FA0 Extract Zip Spec      14 (20) '2.0'\n-77FA1 Extract OS            00 (0) 'MS-DOS'\n-77FA2 General Purpose Flag  0800 (2048)\n+78912 CENTRAL HEADER #362   02014B50 (33639248)\n+78916 Created Zip Spec      14 (20) '2.0'\n+78917 Created OS            03 (3) 'Unix'\n+78918 Extract Zip Spec      14 (20) '2.0'\n+78919 Extract OS            00 (0) 'MS-DOS'\n+7891A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-77FA4 Compression Method    0008 (8) 'Deflated'\n-77FA6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-77FAA CRC                   0FF999F7 (268016119)\n-77FAE Compressed Size       00000049 (73)\n-77FB2 Uncompressed Size     0000008E (142)\n-77FB6 Filename Length       004A (74)\n-77FB8 Extra Length          0000 (0)\n-77FBA Comment Length        0000 (0)\n-77FBC Disk Start            0000 (0)\n-77FBE Int File Attributes   0000 (0)\n+7891C Compression Method    0008 (8) 'Deflated'\n+7891E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78922 CRC                   0FF999F7 (268016119)\n+78926 Compressed Size       00000049 (73)\n+7892A Uncompressed Size     0000008E (142)\n+7892E Filename Length       004A (74)\n+78930 Extra Length          0000 (0)\n+78932 Comment Length        0000 (0)\n+78934 Disk Start            0000 (0)\n+78936 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-77FC0 Ext File Attributes   81A40000 (2175008768)\n+78938 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-77FC4 Local Header Offset   0006E743 (452419)\n-77FC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7893C Local Header Offset   0006F0B0 (454832)\n+78940 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x77FC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78940: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78012 CENTRAL HEADER #363   02014B50 (33639248)\n-78016 Created Zip Spec      14 (20) '2.0'\n-78017 Created OS            03 (3) 'Unix'\n-78018 Extract Zip Spec      14 (20) '2.0'\n-78019 Extract OS            00 (0) 'MS-DOS'\n-7801A General Purpose Flag  0800 (2048)\n+7898A CENTRAL HEADER #363   02014B50 (33639248)\n+7898E Created Zip Spec      14 (20) '2.0'\n+7898F Created OS            03 (3) 'Unix'\n+78990 Extract Zip Spec      14 (20) '2.0'\n+78991 Extract OS            00 (0) 'MS-DOS'\n+78992 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7801C Compression Method    0008 (8) 'Deflated'\n-7801E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78022 CRC                   9C0450EC (2617528556)\n-78026 Compressed Size       0000003C (60)\n-7802A Uncompressed Size     00000044 (68)\n-7802E Filename Length       0042 (66)\n-78030 Extra Length          0000 (0)\n-78032 Comment Length        0000 (0)\n-78034 Disk Start            0000 (0)\n-78036 Int File Attributes   0000 (0)\n+78994 Compression Method    0008 (8) 'Deflated'\n+78996 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7899A CRC                   9C0450EC (2617528556)\n+7899E Compressed Size       0000003C (60)\n+789A2 Uncompressed Size     00000044 (68)\n+789A6 Filename Length       0042 (66)\n+789A8 Extra Length          0000 (0)\n+789AA Comment Length        0000 (0)\n+789AC Disk Start            0000 (0)\n+789AE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-78038 Ext File Attributes   81A40000 (2175008768)\n+789B0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7803C Local Header Offset   0006E7F4 (452596)\n-78040 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+789B4 Local Header Offset   0006F161 (455009)\n+789B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78040: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x789B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78082 CENTRAL HEADER #364   02014B50 (33639248)\n-78086 Created Zip Spec      14 (20) '2.0'\n-78087 Created OS            03 (3) 'Unix'\n-78088 Extract Zip Spec      14 (20) '2.0'\n-78089 Extract OS            00 (0) 'MS-DOS'\n-7808A General Purpose Flag  0800 (2048)\n+789FA CENTRAL HEADER #364   02014B50 (33639248)\n+789FE Created Zip Spec      14 (20) '2.0'\n+789FF Created OS            03 (3) 'Unix'\n+78A00 Extract Zip Spec      14 (20) '2.0'\n+78A01 Extract OS            00 (0) 'MS-DOS'\n+78A02 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7808C Compression Method    0008 (8) 'Deflated'\n-7808E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78092 CRC                   56E1501D (1457606685)\n-78096 Compressed Size       00000069 (105)\n-7809A Uncompressed Size     00000132 (306)\n-7809E Filename Length       0044 (68)\n-780A0 Extra Length          0000 (0)\n-780A2 Comment Length        0000 (0)\n-780A4 Disk Start            0000 (0)\n-780A6 Int File Attributes   0000 (0)\n+78A04 Compression Method    0008 (8) 'Deflated'\n+78A06 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78A0A CRC                   56E1501D (1457606685)\n+78A0E Compressed Size       00000069 (105)\n+78A12 Uncompressed Size     00000132 (306)\n+78A16 Filename Length       0044 (68)\n+78A18 Extra Length          0000 (0)\n+78A1A Comment Length        0000 (0)\n+78A1C Disk Start            0000 (0)\n+78A1E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-780A8 Ext File Attributes   81A40000 (2175008768)\n+78A20 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-780AC Local Header Offset   0006E890 (452752)\n-780B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78A24 Local Header Offset   0006F1FD (455165)\n+78A28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x780B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78A28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-780F4 CENTRAL HEADER #365   02014B50 (33639248)\n-780F8 Created Zip Spec      14 (20) '2.0'\n-780F9 Created OS            03 (3) 'Unix'\n-780FA Extract Zip Spec      14 (20) '2.0'\n-780FB Extract OS            00 (0) 'MS-DOS'\n-780FC General Purpose Flag  0800 (2048)\n+78A6C CENTRAL HEADER #365   02014B50 (33639248)\n+78A70 Created Zip Spec      14 (20) '2.0'\n+78A71 Created OS            03 (3) 'Unix'\n+78A72 Extract Zip Spec      14 (20) '2.0'\n+78A73 Extract OS            00 (0) 'MS-DOS'\n+78A74 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-780FE Compression Method    0008 (8) 'Deflated'\n-78100 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78104 CRC                   F0F60C18 (4042656792)\n-78108 Compressed Size       0000004A (74)\n-7810C Uncompressed Size     00000080 (128)\n-78110 Filename Length       0044 (68)\n-78112 Extra Length          0000 (0)\n-78114 Comment Length        0000 (0)\n-78116 Disk Start            0000 (0)\n-78118 Int File Attributes   0000 (0)\n+78A76 Compression Method    0008 (8) 'Deflated'\n+78A78 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78A7C CRC                   F0F60C18 (4042656792)\n+78A80 Compressed Size       0000004A (74)\n+78A84 Uncompressed Size     00000080 (128)\n+78A88 Filename Length       0044 (68)\n+78A8A Extra Length          0000 (0)\n+78A8C Comment Length        0000 (0)\n+78A8E Disk Start            0000 (0)\n+78A90 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7811A Ext File Attributes   81A40000 (2175008768)\n+78A92 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7811E Local Header Offset   0006E95B (452955)\n-78122 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78A96 Local Header Offset   0006F2C8 (455368)\n+78A9A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78122: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78A9A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78166 CENTRAL HEADER #366   02014B50 (33639248)\n-7816A Created Zip Spec      14 (20) '2.0'\n-7816B Created OS            03 (3) 'Unix'\n-7816C Extract Zip Spec      14 (20) '2.0'\n-7816D Extract OS            00 (0) 'MS-DOS'\n-7816E General Purpose Flag  0800 (2048)\n+78ADE CENTRAL HEADER #366   02014B50 (33639248)\n+78AE2 Created Zip Spec      14 (20) '2.0'\n+78AE3 Created OS            03 (3) 'Unix'\n+78AE4 Extract Zip Spec      14 (20) '2.0'\n+78AE5 Extract OS            00 (0) 'MS-DOS'\n+78AE6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-78170 Compression Method    0008 (8) 'Deflated'\n-78172 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78176 CRC                   5CED5836 (1559058486)\n-7817A Compressed Size       00000039 (57)\n-7817E Uncompressed Size     0000003C (60)\n-78182 Filename Length       003F (63)\n-78184 Extra Length          0000 (0)\n-78186 Comment Length        0000 (0)\n-78188 Disk Start            0000 (0)\n-7818A Int File Attributes   0000 (0)\n+78AE8 Compression Method    0008 (8) 'Deflated'\n+78AEA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78AEE CRC                   5CED5836 (1559058486)\n+78AF2 Compressed Size       00000039 (57)\n+78AF6 Uncompressed Size     0000003C (60)\n+78AFA Filename Length       003F (63)\n+78AFC Extra Length          0000 (0)\n+78AFE Comment Length        0000 (0)\n+78B00 Disk Start            0000 (0)\n+78B02 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7818C Ext File Attributes   81A40000 (2175008768)\n+78B04 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-78190 Local Header Offset   0006EA07 (453127)\n-78194 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78B08 Local Header Offset   0006F374 (455540)\n+78B0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78194: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78B0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-781D3 CENTRAL HEADER #367   02014B50 (33639248)\n-781D7 Created Zip Spec      14 (20) '2.0'\n-781D8 Created OS            03 (3) 'Unix'\n-781D9 Extract Zip Spec      14 (20) '2.0'\n-781DA Extract OS            00 (0) 'MS-DOS'\n-781DB General Purpose Flag  0800 (2048)\n+78B4B CENTRAL HEADER #367   02014B50 (33639248)\n+78B4F Created Zip Spec      14 (20) '2.0'\n+78B50 Created OS            03 (3) 'Unix'\n+78B51 Extract Zip Spec      14 (20) '2.0'\n+78B52 Extract OS            00 (0) 'MS-DOS'\n+78B53 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-781DD Compression Method    0008 (8) 'Deflated'\n-781DF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-781E3 CRC                   9C4BEDD5 (2622221781)\n-781E7 Compressed Size       0000006A (106)\n-781EB Uncompressed Size     00000129 (297)\n-781EF Filename Length       0045 (69)\n-781F1 Extra Length          0000 (0)\n-781F3 Comment Length        0000 (0)\n-781F5 Disk Start            0000 (0)\n-781F7 Int File Attributes   0000 (0)\n+78B55 Compression Method    0008 (8) 'Deflated'\n+78B57 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78B5B CRC                   9C4BEDD5 (2622221781)\n+78B5F Compressed Size       0000006A (106)\n+78B63 Uncompressed Size     00000129 (297)\n+78B67 Filename Length       0045 (69)\n+78B69 Extra Length          0000 (0)\n+78B6B Comment Length        0000 (0)\n+78B6D Disk Start            0000 (0)\n+78B6F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-781F9 Ext File Attributes   81A40000 (2175008768)\n+78B71 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-781FD Local Header Offset   0006EA9D (453277)\n-78201 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78B75 Local Header Offset   0006F40A (455690)\n+78B79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78201: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78B79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78246 CENTRAL HEADER #368   02014B50 (33639248)\n-7824A Created Zip Spec      14 (20) '2.0'\n-7824B Created OS            03 (3) 'Unix'\n-7824C Extract Zip Spec      14 (20) '2.0'\n-7824D Extract OS            00 (0) 'MS-DOS'\n-7824E General Purpose Flag  0800 (2048)\n+78BBE CENTRAL HEADER #368   02014B50 (33639248)\n+78BC2 Created Zip Spec      14 (20) '2.0'\n+78BC3 Created OS            03 (3) 'Unix'\n+78BC4 Extract Zip Spec      14 (20) '2.0'\n+78BC5 Extract OS            00 (0) 'MS-DOS'\n+78BC6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-78250 Compression Method    0008 (8) 'Deflated'\n-78252 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78256 CRC                   BF790872 (3212380274)\n-7825A Compressed Size       00000047 (71)\n-7825E Uncompressed Size     0000004C (76)\n-78262 Filename Length       0055 (85)\n-78264 Extra Length          0000 (0)\n-78266 Comment Length        0000 (0)\n-78268 Disk Start            0000 (0)\n-7826A Int File Attributes   0000 (0)\n+78BC8 Compression Method    0008 (8) 'Deflated'\n+78BCA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78BCE CRC                   BF790872 (3212380274)\n+78BD2 Compressed Size       00000047 (71)\n+78BD6 Uncompressed Size     0000004C (76)\n+78BDA Filename Length       0055 (85)\n+78BDC Extra Length          0000 (0)\n+78BDE Comment Length        0000 (0)\n+78BE0 Disk Start            0000 (0)\n+78BE2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7826C Ext File Attributes   81A40000 (2175008768)\n+78BE4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-78270 Local Header Offset   0006EB6A (453482)\n-78274 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78BE8 Local Header Offset   0006F4D7 (455895)\n+78BEC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78274: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78BEC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-782C9 CENTRAL HEADER #369   02014B50 (33639248)\n-782CD Created Zip Spec      14 (20) '2.0'\n-782CE Created OS            03 (3) 'Unix'\n-782CF Extract Zip Spec      14 (20) '2.0'\n-782D0 Extract OS            00 (0) 'MS-DOS'\n-782D1 General Purpose Flag  0800 (2048)\n+78C41 CENTRAL HEADER #369   02014B50 (33639248)\n+78C45 Created Zip Spec      14 (20) '2.0'\n+78C46 Created OS            03 (3) 'Unix'\n+78C47 Extract Zip Spec      14 (20) '2.0'\n+78C48 Extract OS            00 (0) 'MS-DOS'\n+78C49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-782D3 Compression Method    0008 (8) 'Deflated'\n-782D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-782D9 CRC                   58896C3D (1485401149)\n-782DD Compressed Size       0000003F (63)\n-782E1 Uncompressed Size     0000006C (108)\n-782E5 Filename Length       003E (62)\n-782E7 Extra Length          0000 (0)\n-782E9 Comment Length        0000 (0)\n-782EB Disk Start            0000 (0)\n-782ED Int File Attributes   0000 (0)\n+78C4B Compression Method    0008 (8) 'Deflated'\n+78C4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78C51 CRC                   CEEAECDB (3471502555)\n+78C55 Compressed Size       00000040 (64)\n+78C59 Uncompressed Size     0000006E (110)\n+78C5D Filename Length       003E (62)\n+78C5F Extra Length          0000 (0)\n+78C61 Comment Length        0000 (0)\n+78C63 Disk Start            0000 (0)\n+78C65 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-782EF Ext File Attributes   81A40000 (2175008768)\n+78C67 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-782F3 Local Header Offset   0006EC24 (453668)\n-782F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78C6B Local Header Offset   0006F591 (456081)\n+78C6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x782F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78C6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78335 CENTRAL HEADER #370   02014B50 (33639248)\n-78339 Created Zip Spec      14 (20) '2.0'\n-7833A Created OS            03 (3) 'Unix'\n-7833B Extract Zip Spec      14 (20) '2.0'\n-7833C Extract OS            00 (0) 'MS-DOS'\n-7833D General Purpose Flag  0800 (2048)\n+78CAD CENTRAL HEADER #370   02014B50 (33639248)\n+78CB1 Created Zip Spec      14 (20) '2.0'\n+78CB2 Created OS            03 (3) 'Unix'\n+78CB3 Extract Zip Spec      14 (20) '2.0'\n+78CB4 Extract OS            00 (0) 'MS-DOS'\n+78CB5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-7833F Compression Method    0008 (8) 'Deflated'\n-78341 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78345 CRC                   BA3A525C (3124384348)\n-78349 Compressed Size       00000041 (65)\n-7834D Uncompressed Size     00000071 (113)\n-78351 Filename Length       0049 (73)\n-78353 Extra Length          0000 (0)\n-78355 Comment Length        0000 (0)\n-78357 Disk Start            0000 (0)\n-78359 Int File Attributes   0000 (0)\n+78CB7 Compression Method    0008 (8) 'Deflated'\n+78CB9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78CBD CRC                   F822DEA4 (4163034788)\n+78CC1 Compressed Size       00000042 (66)\n+78CC5 Uncompressed Size     00000072 (114)\n+78CC9 Filename Length       0049 (73)\n+78CCB Extra Length          0000 (0)\n+78CCD Comment Length        0000 (0)\n+78CCF Disk Start            0000 (0)\n+78CD1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7835B Ext File Attributes   81A40000 (2175008768)\n+78CD3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-7835F Local Header Offset   0006ECBF (453823)\n-78363 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78CD7 Local Header Offset   0006F62D (456237)\n+78CDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78363: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78CDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-783AC CENTRAL HEADER #371   02014B50 (33639248)\n-783B0 Created Zip Spec      14 (20) '2.0'\n-783B1 Created OS            03 (3) 'Unix'\n-783B2 Extract Zip Spec      14 (20) '2.0'\n-783B3 Extract OS            00 (0) 'MS-DOS'\n-783B4 General Purpose Flag  0800 (2048)\n+78D24 CENTRAL HEADER #371   02014B50 (33639248)\n+78D28 Created Zip Spec      14 (20) '2.0'\n+78D29 Created OS            03 (3) 'Unix'\n+78D2A Extract Zip Spec      14 (20) '2.0'\n+78D2B Extract OS            00 (0) 'MS-DOS'\n+78D2C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-783B6 Compression Method    0008 (8) 'Deflated'\n-783B8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-783BC CRC                   7CA8E715 (2091443989)\n-783C0 Compressed Size       0000004D (77)\n-783C4 Uncompressed Size     000000AF (175)\n-783C8 Filename Length       0043 (67)\n-783CA Extra Length          0000 (0)\n-783CC Comment Length        0000 (0)\n-783CE Disk Start            0000 (0)\n-783D0 Int File Attributes   0000 (0)\n+78D2E Compression Method    0008 (8) 'Deflated'\n+78D30 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78D34 CRC                   40B03A55 (1085291093)\n+78D38 Compressed Size       0000004E (78)\n+78D3C Uncompressed Size     000000B1 (177)\n+78D40 Filename Length       0043 (67)\n+78D42 Extra Length          0000 (0)\n+78D44 Comment Length        0000 (0)\n+78D46 Disk Start            0000 (0)\n+78D48 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-783D2 Ext File Attributes   81A40000 (2175008768)\n+78D4A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-783D6 Local Header Offset   0006ED67 (453991)\n-783DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78D4E Local Header Offset   0006F6D6 (456406)\n+78D52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x783DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78D52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7841D CENTRAL HEADER #372   02014B50 (33639248)\n-78421 Created Zip Spec      14 (20) '2.0'\n-78422 Created OS            03 (3) 'Unix'\n-78423 Extract Zip Spec      14 (20) '2.0'\n-78424 Extract OS            00 (0) 'MS-DOS'\n-78425 General Purpose Flag  0800 (2048)\n+78D95 CENTRAL HEADER #372   02014B50 (33639248)\n+78D99 Created Zip Spec      14 (20) '2.0'\n+78D9A Created OS            03 (3) 'Unix'\n+78D9B Extract Zip Spec      14 (20) '2.0'\n+78D9C Extract OS            00 (0) 'MS-DOS'\n+78D9D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-78427 Compression Method    0008 (8) 'Deflated'\n-78429 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7842D CRC                   94CE4031 (2496544817)\n-78431 Compressed Size       000006D2 (1746)\n-78435 Uncompressed Size     000011A8 (4520)\n-78439 Filename Length       001E (30)\n-7843B Extra Length          0000 (0)\n-7843D Comment Length        0000 (0)\n-7843F Disk Start            0000 (0)\n-78441 Int File Attributes   0000 (0)\n+78D9F Compression Method    0008 (8) 'Deflated'\n+78DA1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78DA5 CRC                   1096B4BF (278312127)\n+78DA9 Compressed Size       000006E2 (1762)\n+78DAD Uncompressed Size     0000124E (4686)\n+78DB1 Filename Length       001E (30)\n+78DB3 Extra Length          0000 (0)\n+78DB5 Comment Length        0000 (0)\n+78DB7 Disk Start            0000 (0)\n+78DB9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-78443 Ext File Attributes   81A40000 (2175008768)\n+78DBB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-78447 Local Header Offset   0006EE15 (454165)\n-7844B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78DBF Local Header Offset   0006F785 (456581)\n+78DC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7844B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78DC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78469 CENTRAL HEADER #373   02014B50 (33639248)\n-7846D Created Zip Spec      14 (20) '2.0'\n-7846E Created OS            03 (3) 'Unix'\n-7846F Extract Zip Spec      14 (20) '2.0'\n-78470 Extract OS            00 (0) 'MS-DOS'\n-78471 General Purpose Flag  0800 (2048)\n+78DE1 CENTRAL HEADER #373   02014B50 (33639248)\n+78DE5 Created Zip Spec      14 (20) '2.0'\n+78DE6 Created OS            03 (3) 'Unix'\n+78DE7 Extract Zip Spec      14 (20) '2.0'\n+78DE8 Extract OS            00 (0) 'MS-DOS'\n+78DE9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-78473 Compression Method    0008 (8) 'Deflated'\n-78475 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-78479 CRC                   4D73DC93 (1299438739)\n-7847D Compressed Size       000003DA (986)\n-78481 Uncompressed Size     00000BA2 (2978)\n-78485 Filename Length       0034 (52)\n-78487 Extra Length          0000 (0)\n-78489 Comment Length        0000 (0)\n-7848B Disk Start            0000 (0)\n-7848D Int File Attributes   0000 (0)\n+78DEB Compression Method    0008 (8) 'Deflated'\n+78DED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78DF1 CRC                   CDE8C563 (3454584163)\n+78DF5 Compressed Size       000003D2 (978)\n+78DF9 Uncompressed Size     00000B50 (2896)\n+78DFD Filename Length       0034 (52)\n+78DFF Extra Length          0000 (0)\n+78E01 Comment Length        0000 (0)\n+78E03 Disk Start            0000 (0)\n+78E05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-7848F Ext File Attributes   81A40000 (2175008768)\n+78E07 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-78493 Local Header Offset   0006F523 (455971)\n-78497 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78E0B Local Header Offset   0006FEA3 (458403)\n+78E0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x78497: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78E0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-784CB CENTRAL HEADER #374   02014B50 (33639248)\n-784CF Created Zip Spec      14 (20) '2.0'\n-784D0 Created OS            03 (3) 'Unix'\n-784D1 Extract Zip Spec      14 (20) '2.0'\n-784D2 Extract OS            00 (0) 'MS-DOS'\n-784D3 General Purpose Flag  0800 (2048)\n+78E43 CENTRAL HEADER #374   02014B50 (33639248)\n+78E47 Created Zip Spec      14 (20) '2.0'\n+78E48 Created OS            03 (3) 'Unix'\n+78E49 Extract Zip Spec      14 (20) '2.0'\n+78E4A Extract OS            00 (0) 'MS-DOS'\n+78E4B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-784D5 Compression Method    0008 (8) 'Deflated'\n-784D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-784DB CRC                   295DB5AA (694007210)\n-784DF Compressed Size       00000041 (65)\n-784E3 Uncompressed Size     00000043 (67)\n-784E7 Filename Length       003B (59)\n-784E9 Extra Length          0000 (0)\n-784EB Comment Length        0000 (0)\n-784ED Disk Start            0000 (0)\n-784EF Int File Attributes   0000 (0)\n+78E4D Compression Method    0008 (8) 'Deflated'\n+78E4F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78E53 CRC                   295DB5AA (694007210)\n+78E57 Compressed Size       00000041 (65)\n+78E5B Uncompressed Size     00000043 (67)\n+78E5F Filename Length       003B (59)\n+78E61 Extra Length          0000 (0)\n+78E63 Comment Length        0000 (0)\n+78E65 Disk Start            0000 (0)\n+78E67 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-784F1 Ext File Attributes   81A40000 (2175008768)\n+78E69 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-784F5 Local Header Offset   0006F94F (457039)\n-784F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+78E6D Local Header Offset   000702C7 (459463)\n+78E71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x784F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78E71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78534 END CENTRAL HEADER    06054B50 (101010256)\n-78538 Number of this disk   0000 (0)\n-7853A Central Dir Disk no   0000 (0)\n-7853C Entries in this disk  0176 (374)\n-7853E Total Entries         0176 (374)\n-78540 Size of Central Dir   00008B4B (35659)\n-78544 Offset to Central Dir 0006F9E9 (457193)\n-78548 Comment Length        0000 (0)\n+78EAC END CENTRAL HEADER    06054B50 (101010256)\n+78EB0 Number of this disk   0000 (0)\n+78EB2 Central Dir Disk no   0000 (0)\n+78EB4 Entries in this disk  0176 (374)\n+78EB6 Total Entries         0176 (374)\n+78EB8 Size of Central Dir   00008B4B (35659)\n+78EBC Offset to Central Dir 00070361 (459617)\n+78EC0 Comment Length        0000 (0)\n #\n # Error Count: 73\n # Warning Count: 821\n #\n # Done\n"}, {"source1": "com/alibaba/dubbo/config/annotation/Reference.java", "source2": "com/alibaba/dubbo/config/annotation/Reference.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,113 +1,113 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package com.alibaba.dubbo.config.annotation;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-@Deprecated\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\n-public @interface Reference {\n-\n-    Class<?> interfaceClass() default void.class;\n-\n-    String interfaceName() default \"\";\n-\n-    String version() default \"\";\n-\n-    String group() default \"\";\n-\n-    String url() default \"\";\n-\n-    String client() default \"\";\n-\n-    boolean generic() default false;\n-\n-    boolean injvm() default true;\n-\n-    boolean check() default true;\n-\n-    boolean init() default false;\n-\n-    boolean lazy() default false;\n-\n-    boolean stubevent() default false;\n-\n-    String reconnect() default \"\";\n-\n-    boolean sticky() default false;\n-\n-    String proxy() default \"\";\n-\n-    String stub() default \"\";\n-\n-    String cluster() default \"\";\n-\n-    int connections() default 0;\n-\n-    int callbacks() default 0;\n-\n-    String onconnect() default \"\";\n-\n-    String ondisconnect() default \"\";\n-\n-    String owner() default \"\";\n-\n-    String layer() default \"\";\n-\n-    int retries() default 2;\n-\n-    String loadbalance() default \"\";\n-\n-    boolean async() default false;\n-\n-    int actives() default 0;\n-\n-    boolean sent() default false;\n-\n-    String mock() default \"\";\n-\n-    String validation() default \"\";\n-\n-    int timeout() default 0;\n-\n-    String cache() default \"\";\n-\n-    String[] filter() default {};\n-\n-    String[] listener() default {};\n-\n-    String[] parameters() default {};\n-\n-    String application() default \"\";\n-\n-    String module() default \"\";\n-\n-    String consumer() default \"\";\n-\n-    String monitor() default \"\";\n-\n-    String[] registry() default {};\n-\n-}\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package com.alibaba.dubbo.config.annotation;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+@Deprecated\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\r\n+public @interface Reference {\r\n+\r\n+    Class<?> interfaceClass() default void.class;\r\n+\r\n+    String interfaceName() default \"\";\r\n+\r\n+    String version() default \"\";\r\n+\r\n+    String group() default \"\";\r\n+\r\n+    String url() default \"\";\r\n+\r\n+    String client() default \"\";\r\n+\r\n+    boolean generic() default false;\r\n+\r\n+    boolean injvm() default true;\r\n+\r\n+    boolean check() default true;\r\n+\r\n+    boolean init() default false;\r\n+\r\n+    boolean lazy() default false;\r\n+\r\n+    boolean stubevent() default false;\r\n+\r\n+    String reconnect() default \"\";\r\n+\r\n+    boolean sticky() default false;\r\n+\r\n+    String proxy() default \"\";\r\n+\r\n+    String stub() default \"\";\r\n+\r\n+    String cluster() default \"\";\r\n+\r\n+    int connections() default 0;\r\n+\r\n+    int callbacks() default 0;\r\n+\r\n+    String onconnect() default \"\";\r\n+\r\n+    String ondisconnect() default \"\";\r\n+\r\n+    String owner() default \"\";\r\n+\r\n+    String layer() default \"\";\r\n+\r\n+    int retries() default 2;\r\n+\r\n+    String loadbalance() default \"\";\r\n+\r\n+    boolean async() default false;\r\n+\r\n+    int actives() default 0;\r\n+\r\n+    boolean sent() default false;\r\n+\r\n+    String mock() default \"\";\r\n+\r\n+    String validation() default \"\";\r\n+\r\n+    int timeout() default 0;\r\n+\r\n+    String cache() default \"\";\r\n+\r\n+    String[] filter() default {};\r\n+\r\n+    String[] listener() default {};\r\n+\r\n+    String[] parameters() default {};\r\n+\r\n+    String application() default \"\";\r\n+\r\n+    String module() default \"\";\r\n+\r\n+    String consumer() default \"\";\r\n+\r\n+    String monitor() default \"\";\r\n+\r\n+    String[] registry() default {};\r\n+\r\n+}\r\n+\r\n"}, {"source1": "com/alibaba/dubbo/config/annotation/Service.java", "source2": "com/alibaba/dubbo/config/annotation/Service.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,120 +1,120 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package com.alibaba.dubbo.config.annotation;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Inherited;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-@Deprecated\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.TYPE})\n-@Inherited\n-public @interface Service {\n-\n-    Class<?> interfaceClass() default void.class;\n-\n-    String interfaceName() default \"\";\n-\n-    String version() default \"\";\n-\n-    String group() default \"\";\n-\n-    String path() default \"\";\n-\n-    boolean export() default false;\n-\n-    String token() default \"\";\n-\n-    boolean deprecated() default false;\n-\n-    boolean dynamic() default true;\n-\n-    String accesslog() default \"\";\n-\n-    int executes() default 0;\n-\n-    boolean register() default false;\n-\n-    int weight() default 0;\n-\n-    String document() default \"\";\n-\n-    int delay() default 0;\n-\n-    String local() default \"\";\n-\n-    String stub() default \"\";\n-\n-    String cluster() default \"\";\n-\n-    String proxy() default \"\";\n-\n-    int connections() default 0;\n-\n-    int callbacks() default 0;\n-\n-    String onconnect() default \"\";\n-\n-    String ondisconnect() default \"\";\n-\n-    String owner() default \"\";\n-\n-    String layer() default \"\";\n-\n-    int retries() default 0;\n-\n-    String loadbalance() default \"\";\n-\n-    boolean async() default false;\n-\n-    int actives() default 0;\n-\n-    boolean sent() default false;\n-\n-    String mock() default \"\";\n-\n-    String validation() default \"\";\n-\n-    int timeout() default 0;\n-\n-    String cache() default \"\";\n-\n-    String[] filter() default {};\n-\n-    String[] listener() default {};\n-\n-    String[] parameters() default {};\n-\n-    String application() default \"\";\n-\n-    String module() default \"\";\n-\n-    String provider() default \"\";\n-\n-    String[] protocol() default {};\n-\n-    String monitor() default \"\";\n-\n-    String[] registry() default {};\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package com.alibaba.dubbo.config.annotation;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Inherited;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+@Deprecated\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.TYPE})\r\n+@Inherited\r\n+public @interface Service {\r\n+\r\n+    Class<?> interfaceClass() default void.class;\r\n+\r\n+    String interfaceName() default \"\";\r\n+\r\n+    String version() default \"\";\r\n+\r\n+    String group() default \"\";\r\n+\r\n+    String path() default \"\";\r\n+\r\n+    boolean export() default false;\r\n+\r\n+    String token() default \"\";\r\n+\r\n+    boolean deprecated() default false;\r\n+\r\n+    boolean dynamic() default true;\r\n+\r\n+    String accesslog() default \"\";\r\n+\r\n+    int executes() default 0;\r\n+\r\n+    boolean register() default false;\r\n+\r\n+    int weight() default 0;\r\n+\r\n+    String document() default \"\";\r\n+\r\n+    int delay() default 0;\r\n+\r\n+    String local() default \"\";\r\n+\r\n+    String stub() default \"\";\r\n+\r\n+    String cluster() default \"\";\r\n+\r\n+    String proxy() default \"\";\r\n+\r\n+    int connections() default 0;\r\n+\r\n+    int callbacks() default 0;\r\n+\r\n+    String onconnect() default \"\";\r\n+\r\n+    String ondisconnect() default \"\";\r\n+\r\n+    String owner() default \"\";\r\n+\r\n+    String layer() default \"\";\r\n+\r\n+    int retries() default 0;\r\n+\r\n+    String loadbalance() default \"\";\r\n+\r\n+    boolean async() default false;\r\n+\r\n+    int actives() default 0;\r\n+\r\n+    boolean sent() default false;\r\n+\r\n+    String mock() default \"\";\r\n+\r\n+    String validation() default \"\";\r\n+\r\n+    int timeout() default 0;\r\n+\r\n+    String cache() default \"\";\r\n+\r\n+    String[] filter() default {};\r\n+\r\n+    String[] listener() default {};\r\n+\r\n+    String[] parameters() default {};\r\n+\r\n+    String application() default \"\";\r\n+\r\n+    String module() default \"\";\r\n+\r\n+    String provider() default \"\";\r\n+\r\n+    String[] protocol() default {};\r\n+\r\n+    String monitor() default \"\";\r\n+\r\n+    String[] registry() default {};\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/BaseServiceMetadata.java", "source2": "org/apache/dubbo/common/BaseServiceMetadata.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,137 +1,137 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_VERSION;\n-\n-/**\n- * 2019-10-10\n- */\n-public class BaseServiceMetadata {\n-    public static final char COLON_SEPARATOR = ':';\n-\n-    protected String serviceKey;\n-    protected String serviceInterfaceName;\n-    protected String version;\n-    protected volatile String group;\n-\n-    public static String buildServiceKey(String path, String group, String version) {\n-        StringBuilder buf = new StringBuilder();\n-        if (group != null && group.length() > 0) {\n-            buf.append(group).append(\"/\");\n-        }\n-        buf.append(path);\n-        if (version != null && version.length() > 0) {\n-            buf.append(\":\").append(version);\n-        }\n-        return buf.toString();\n-    }\n-\n-    public static String versionFromServiceKey(String serviceKey) {\n-        int index = serviceKey.indexOf(\":\");\n-        if (index == -1) {\n-            return DEFAULT_VERSION;\n-        }\n-        return serviceKey.substring(index + 1);\n-    }\n-\n-    public static String groupFromServiceKey(String serviceKey) {\n-        int index = serviceKey.indexOf(\"/\");\n-        if (index == -1) {\n-            return null;\n-        }\n-        return serviceKey.substring(0, index);\n-    }\n-\n-    public static String interfaceFromServiceKey(String serviceKey) {\n-        int groupIndex = serviceKey.indexOf(\"/\");\n-        int versionIndex = serviceKey.indexOf(\":\");\n-        groupIndex = (groupIndex == -1) ? 0 : groupIndex + 1;\n-        versionIndex = (versionIndex == -1) ? serviceKey.length() : versionIndex;\n-        return serviceKey.substring(groupIndex, versionIndex);\n-    }\n-\n-    /**\n-     * Format : interface:version\n-     *\n-     * @return\n-     */\n-    public String getDisplayServiceKey() {\n-        StringBuilder serviceNameBuilder = new StringBuilder();\n-        serviceNameBuilder.append(serviceInterfaceName);\n-        serviceNameBuilder.append(COLON_SEPARATOR).append(version);\n-        return serviceNameBuilder.toString();\n-    }\n-\n-    /**\n-     * revert of org.apache.dubbo.common.ServiceDescriptor#getDisplayServiceKey()\n-     *\n-     * @param displayKey\n-     * @return\n-     */\n-    public static BaseServiceMetadata revertDisplayServiceKey(String displayKey) {\n-        String[] eles = StringUtils.split(displayKey, COLON_SEPARATOR);\n-        if (eles == null || eles.length < 1 || eles.length > 2) {\n-            return new BaseServiceMetadata();\n-        }\n-        BaseServiceMetadata serviceDescriptor = new BaseServiceMetadata();\n-        serviceDescriptor.setServiceInterfaceName(eles[0]);\n-        if (eles.length == 2) {\n-            serviceDescriptor.setVersion(eles[1]);\n-        }\n-        return serviceDescriptor;\n-    }\n-\n-    public String getServiceKey() {\n-        return serviceKey;\n-    }\n-\n-    public void generateServiceKey() {\n-        this.serviceKey = buildServiceKey(serviceInterfaceName, group, version);\n-    }\n-\n-    public void setServiceKey(String serviceKey) {\n-        this.serviceKey = serviceKey;\n-    }\n-\n-    public String getServiceInterfaceName() {\n-        return serviceInterfaceName;\n-    }\n-\n-    public void setServiceInterfaceName(String serviceInterfaceName) {\n-        this.serviceInterfaceName = serviceInterfaceName;\n-    }\n-\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_VERSION;\r\n+\r\n+/**\r\n+ * 2019-10-10\r\n+ */\r\n+public class BaseServiceMetadata {\r\n+    public static final char COLON_SEPARATOR = ':';\r\n+\r\n+    protected String serviceKey;\r\n+    protected String serviceInterfaceName;\r\n+    protected String version;\r\n+    protected volatile String group;\r\n+\r\n+    public static String buildServiceKey(String path, String group, String version) {\r\n+        StringBuilder buf = new StringBuilder();\r\n+        if (group != null && group.length() > 0) {\r\n+            buf.append(group).append(\"/\");\r\n+        }\r\n+        buf.append(path);\r\n+        if (version != null && version.length() > 0) {\r\n+            buf.append(\":\").append(version);\r\n+        }\r\n+        return buf.toString();\r\n+    }\r\n+\r\n+    public static String versionFromServiceKey(String serviceKey) {\r\n+        int index = serviceKey.indexOf(\":\");\r\n+        if (index == -1) {\r\n+            return DEFAULT_VERSION;\r\n+        }\r\n+        return serviceKey.substring(index + 1);\r\n+    }\r\n+\r\n+    public static String groupFromServiceKey(String serviceKey) {\r\n+        int index = serviceKey.indexOf(\"/\");\r\n+        if (index == -1) {\r\n+            return null;\r\n+        }\r\n+        return serviceKey.substring(0, index);\r\n+    }\r\n+\r\n+    public static String interfaceFromServiceKey(String serviceKey) {\r\n+        int groupIndex = serviceKey.indexOf(\"/\");\r\n+        int versionIndex = serviceKey.indexOf(\":\");\r\n+        groupIndex = (groupIndex == -1) ? 0 : groupIndex + 1;\r\n+        versionIndex = (versionIndex == -1) ? serviceKey.length() : versionIndex;\r\n+        return serviceKey.substring(groupIndex, versionIndex);\r\n+    }\r\n+\r\n+    /**\r\n+     * Format : interface:version\r\n+     *\r\n+     * @return\r\n+     */\r\n+    public String getDisplayServiceKey() {\r\n+        StringBuilder serviceNameBuilder = new StringBuilder();\r\n+        serviceNameBuilder.append(serviceInterfaceName);\r\n+        serviceNameBuilder.append(COLON_SEPARATOR).append(version);\r\n+        return serviceNameBuilder.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * revert of org.apache.dubbo.common.ServiceDescriptor#getDisplayServiceKey()\r\n+     *\r\n+     * @param displayKey\r\n+     * @return\r\n+     */\r\n+    public static BaseServiceMetadata revertDisplayServiceKey(String displayKey) {\r\n+        String[] eles = StringUtils.split(displayKey, COLON_SEPARATOR);\r\n+        if (eles == null || eles.length < 1 || eles.length > 2) {\r\n+            return new BaseServiceMetadata();\r\n+        }\r\n+        BaseServiceMetadata serviceDescriptor = new BaseServiceMetadata();\r\n+        serviceDescriptor.setServiceInterfaceName(eles[0]);\r\n+        if (eles.length == 2) {\r\n+            serviceDescriptor.setVersion(eles[1]);\r\n+        }\r\n+        return serviceDescriptor;\r\n+    }\r\n+\r\n+    public String getServiceKey() {\r\n+        return serviceKey;\r\n+    }\r\n+\r\n+    public void generateServiceKey() {\r\n+        this.serviceKey = buildServiceKey(serviceInterfaceName, group, version);\r\n+    }\r\n+\r\n+    public void setServiceKey(String serviceKey) {\r\n+        this.serviceKey = serviceKey;\r\n+    }\r\n+\r\n+    public String getServiceInterfaceName() {\r\n+        return serviceInterfaceName;\r\n+    }\r\n+\r\n+    public void setServiceInterfaceName(String serviceInterfaceName) {\r\n+        this.serviceInterfaceName = serviceInterfaceName;\r\n+    }\r\n+\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/Experimental.java", "source2": "org/apache/dubbo/common/Experimental.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,37 +1,37 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common;\n-\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * Indicating unstable API, may get removed or changed in the next release.\n- */\n-@Retention(RetentionPolicy.CLASS)\n-@Target({\n-        ElementType.ANNOTATION_TYPE,\n-        ElementType.CONSTRUCTOR,\n-        ElementType.FIELD,\n-        ElementType.METHOD,\n-        ElementType.PACKAGE,\n-        ElementType.TYPE})\n-public @interface Experimental {\n-    String value();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common;\r\n+\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * Indicating unstable API, may get removed or changed in the next release.\r\n+ */\r\n+@Retention(RetentionPolicy.CLASS)\r\n+@Target({\r\n+        ElementType.ANNOTATION_TYPE,\r\n+        ElementType.CONSTRUCTOR,\r\n+        ElementType.FIELD,\r\n+        ElementType.METHOD,\r\n+        ElementType.PACKAGE,\r\n+        ElementType.TYPE})\r\n+public @interface Experimental {\r\n+    String value();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/URLStrParser.java", "source2": "org/apache/dubbo/common/URLStrParser.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,367 +1,367 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common;\n-\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY_PREFIX;\n-import static org.apache.dubbo.common.utils.StringUtils.EMPTY_STRING;\n-import static org.apache.dubbo.common.utils.StringUtils.decodeHexByte;\n-import static org.apache.dubbo.common.utils.Utf8Utils.decodeUtf8;\n-\n-public final class URLStrParser {\n-\n-    private static final char SPACE = 0x20;\n-\n-    private static final ThreadLocal<TempBuf> DECODE_TEMP_BUF = ThreadLocal.withInitial(() -> new TempBuf(1024));\n-\n-    private URLStrParser() {\n-        //empty\n-    }\n-\n-    /**\n-     * @param decodedURLStr : after {@link URL#decode} string\n-     *                      decodedURLStr format: protocol://username:password@host:port/path?k1=v1&k2=v2\n-     *                      [protocol://][username:password@][host:port]/[path][?k1=v1&k2=v2]\n-     */\n-    public static URL parseDecodedStr(String decodedURLStr) {\n-        Map<String, String> parameters = null;\n-        int pathEndIdx = decodedURLStr.indexOf('?');\n-        if (pathEndIdx >= 0) {\n-            parameters = parseDecodedParams(decodedURLStr, pathEndIdx + 1);\n-        } else {\n-            pathEndIdx = decodedURLStr.length();\n-        }\n-\n-        String decodedBody = decodedURLStr.substring(0, pathEndIdx);\n-        return parseURLBody(decodedURLStr, decodedBody, parameters);\n-    }\n-\n-    private static Map<String, String> parseDecodedParams(String str, int from) {\n-        int len = str.length();\n-        if (from >= len) {\n-            return Collections.emptyMap();\n-        }\n-\n-        TempBuf tempBuf = DECODE_TEMP_BUF.get();\n-        Map<String, String> params = new HashMap<>();\n-        int nameStart = from;\n-        int valueStart = -1;\n-        int i;\n-        for (i = from; i < len; i++) {\n-            char ch = str.charAt(i);\n-            switch (ch) {\n-                case '=':\n-                    if (nameStart == i) {\n-                        nameStart = i + 1;\n-                    } else if (valueStart < nameStart) {\n-                        valueStart = i + 1;\n-                    }\n-                    break;\n-                case ';':\n-                case '&':\n-                    addParam(str, false, nameStart, valueStart, i, params, tempBuf);\n-                    nameStart = i + 1;\n-                    break;\n-                default:\n-                    // continue\n-            }\n-        }\n-        addParam(str, false, nameStart, valueStart, i, params, tempBuf);\n-        return params;\n-    }\n-\n-    /**\n-     * @param fullURLStr  : fullURLString\n-     * @param decodedBody : format: [protocol://][username:password@][host:port]/[path]\n-     * @param parameters  :\n-     * @return URL\n-     */\n-    private static URL parseURLBody(String fullURLStr, String decodedBody, Map<String, String> parameters) {\n-        int starIdx = 0, endIdx = decodedBody.length();\n-        String protocol = null;\n-        int protoEndIdx = decodedBody.indexOf(\"://\");\n-        if (protoEndIdx >= 0) {\n-            if (protoEndIdx == 0) {\n-                throw new IllegalStateException(\"url missing protocol: \\\"\" + fullURLStr + \"\\\"\");\n-            }\n-            protocol = decodedBody.substring(0, protoEndIdx);\n-            starIdx = protoEndIdx + 3;\n-        } else {\n-            // case: file:/path/to/file.txt\n-            protoEndIdx = decodedBody.indexOf(\":/\");\n-            if (protoEndIdx >= 0) {\n-                if (protoEndIdx == 0) {\n-                    throw new IllegalStateException(\"url missing protocol: \\\"\" + fullURLStr + \"\\\"\");\n-                }\n-                protocol = decodedBody.substring(0, protoEndIdx);\n-                starIdx = protoEndIdx + 1;\n-            }\n-        }\n-\n-        String path = null;\n-        int pathStartIdx = indexOf(decodedBody, '/', starIdx, endIdx);\n-        if (pathStartIdx >= 0) {\n-            path = decodedBody.substring(pathStartIdx + 1);\n-            endIdx = pathStartIdx;\n-        }\n-\n-        String username = null;\n-        String password = null;\n-        int pwdEndIdx = lastIndexOf(decodedBody, '@', starIdx, endIdx);\n-        if (pwdEndIdx > 0) {\n-            int userNameEndIdx = indexOf(decodedBody, ':', starIdx, pwdEndIdx);\n-            username = decodedBody.substring(starIdx, userNameEndIdx);\n-            password = decodedBody.substring(userNameEndIdx + 1, pwdEndIdx);\n-            starIdx = pwdEndIdx + 1;\n-        }\n-\n-        String host = null;\n-        int port = 0;\n-        int hostEndIdx = lastIndexOf(decodedBody, ':', starIdx, endIdx);\n-        if (hostEndIdx > 0 && hostEndIdx < decodedBody.length() - 1) {\n-            if (lastIndexOf(decodedBody, '%', starIdx, endIdx) > hostEndIdx) {\n-                // ipv6 address with scope id\n-                // e.g. fe80:0:0:0:894:aeec:f37d:23e1%en0\n-                // see https://howdoesinternetwork.com/2013/ipv6-zone-id\n-                // ignore\n-            } else {\n-                port = Integer.parseInt(decodedBody.substring(hostEndIdx + 1, endIdx));\n-                endIdx = hostEndIdx;\n-            }\n-        }\n-\n-        if (endIdx > starIdx) {\n-            host = decodedBody.substring(starIdx, endIdx);\n-        }\n-        return new URL(protocol, username, password, host, port, path, parameters);\n-    }\n-\n-    /**\n-     * @param encodedURLStr : after {@link URL#encode(String)} string\n-     *                      encodedURLStr after decode format: protocol://username:password@host:port/path?k1=v1&k2=v2\n-     *                      [protocol://][username:password@][host:port]/[path][?k1=v1&k2=v2]\n-     */\n-    public static URL parseEncodedStr(String encodedURLStr) {\n-        Map<String, String> parameters = null;\n-        int pathEndIdx = encodedURLStr.toUpperCase().indexOf(\"%3F\");// '?'\n-        if (pathEndIdx >= 0) {\n-            parameters = parseEncodedParams(encodedURLStr, pathEndIdx + 3);\n-        } else {\n-            pathEndIdx = encodedURLStr.length();\n-        }\n-\n-        //decodedBody format: [protocol://][username:password@][host:port]/[path]\n-        String decodedBody = decodeComponent(encodedURLStr, 0, pathEndIdx, false, DECODE_TEMP_BUF.get());\n-        return parseURLBody(encodedURLStr, decodedBody, parameters);\n-    }\n-\n-    private static Map<String, String> parseEncodedParams(String str, int from) {\n-        int len = str.length();\n-        if (from >= len) {\n-            return Collections.emptyMap();\n-        }\n-\n-        TempBuf tempBuf = DECODE_TEMP_BUF.get();\n-        Map<String, String> params = new HashMap<>();\n-        int nameStart = from;\n-        int valueStart = -1;\n-        int i;\n-        for (i = from; i < len; i++) {\n-            char ch = str.charAt(i);\n-            if (ch == '%') {\n-                if (i + 3 > len) {\n-                    throw new IllegalArgumentException(\"unterminated escape sequence at index \" + i + \" of: \" + str);\n-                }\n-                ch = (char) decodeHexByte(str, i + 1);\n-                i += 2;\n-            }\n-\n-            switch (ch) {\n-                case '=':\n-                    if (nameStart == i) {\n-                        nameStart = i + 1;\n-                    } else if (valueStart < nameStart) {\n-                        valueStart = i + 1;\n-                    }\n-                    break;\n-                case ';':\n-                case '&':\n-                    addParam(str, true, nameStart, valueStart, i - 2, params, tempBuf);\n-                    nameStart = i + 1;\n-                    break;\n-                default:\n-                    // continue\n-            }\n-        }\n-        addParam(str, true, nameStart, valueStart, i, params, tempBuf);\n-        return params;\n-    }\n-\n-    private static boolean addParam(String str, boolean isEncoded, int nameStart, int valueStart, int valueEnd, Map<String, String> params,\n-                                    TempBuf tempBuf) {\n-        if (nameStart >= valueEnd) {\n-            return false;\n-        }\n-\n-        if (valueStart <= nameStart) {\n-            valueStart = valueEnd + 1;\n-        }\n-\n-        if (isEncoded) {\n-            String name = decodeComponent(str, nameStart, valueStart - 3, false, tempBuf);\n-            String value = decodeComponent(str, valueStart, valueEnd, false, tempBuf);\n-            if (valueStart == valueEnd) {\n-                value = name;\n-            } else {\n-                value = decodeComponent(str, valueStart, valueEnd, false, tempBuf);\n-            }\n-            params.put(name, value);\n-            // compatible with lower versions registering \"default.\" keys\n-            if (name.startsWith(DEFAULT_KEY_PREFIX)) {\n-                params.putIfAbsent(name.substring(DEFAULT_KEY_PREFIX.length()), value);\n-            }\n-        } else {\n-            String name = str.substring(nameStart, valueStart - 1);\n-            String value = str.substring(valueStart, valueEnd);\n-            if (valueStart == valueEnd) {\n-                value = name;\n-            } else {\n-                value = str.substring(valueStart, valueEnd);\n-            }\n-            params.put(name, value);\n-            // compatible with lower versions registering \"default.\" keys\n-            if (name.startsWith(DEFAULT_KEY_PREFIX)) {\n-                params.putIfAbsent(name.substring(DEFAULT_KEY_PREFIX.length()), value);\n-            }\n-        }\n-        return true;\n-    }\n-\n-    private static String decodeComponent(String s, int from, int toExcluded, boolean isPath, TempBuf tempBuf) {\n-        int len = toExcluded - from;\n-        if (len <= 0) {\n-            return EMPTY_STRING;\n-        }\n-\n-        int firstEscaped = -1;\n-        for (int i = from; i < toExcluded; i++) {\n-            char c = s.charAt(i);\n-            if (c == '%' || c == '+' && !isPath) {\n-                firstEscaped = i;\n-                break;\n-            }\n-        }\n-        if (firstEscaped == -1) {\n-            return s.substring(from, toExcluded);\n-        }\n-\n-        // Each encoded byte takes 3 characters (e.g. \"%20\")\n-        int decodedCapacity = (toExcluded - firstEscaped) / 3;\n-        byte[] buf = tempBuf.byteBuf(decodedCapacity);\n-        char[] charBuf = tempBuf.charBuf(len);\n-        s.getChars(from, firstEscaped, charBuf, 0);\n-\n-        int charBufIdx = firstEscaped - from;\n-        return decodeUtf8Component(s, firstEscaped, toExcluded, isPath, buf, charBuf, charBufIdx);\n-    }\n-\n-    private static String decodeUtf8Component(String str, int firstEscaped, int toExcluded, boolean isPath, byte[] buf,\n-                                              char[] charBuf, int charBufIdx) {\n-        int bufIdx;\n-        for (int i = firstEscaped; i < toExcluded; i++) {\n-            char c = str.charAt(i);\n-            if (c != '%') {\n-                charBuf[charBufIdx++] = c != '+' || isPath ? c : SPACE;\n-                continue;\n-            }\n-\n-            bufIdx = 0;\n-            do {\n-                if (i + 3 > toExcluded) {\n-                    throw new IllegalArgumentException(\"unterminated escape sequence at index \" + i + \" of: \" + str);\n-                }\n-                buf[bufIdx++] = decodeHexByte(str, i + 1);\n-                i += 3;\n-            } while (i < toExcluded && str.charAt(i) == '%');\n-            i--;\n-\n-            charBufIdx += decodeUtf8(buf, 0, bufIdx, charBuf, charBufIdx);\n-        }\n-        return new String(charBuf, 0, charBufIdx);\n-    }\n-\n-    private static int indexOf(String str, char ch, int from, int toExclude) {\n-        from = Math.max(from, 0);\n-        toExclude = Math.min(toExclude, str.length());\n-        if (from > toExclude) {\n-            return -1;\n-        }\n-\n-        for (int i = from; i < toExclude; i++) {\n-            if (str.charAt(i) == ch) {\n-                return i;\n-            }\n-        }\n-        return -1;\n-    }\n-\n-    private static int lastIndexOf(String str, char ch, int from, int toExclude) {\n-        from = Math.max(from, 0);\n-        toExclude = Math.min(toExclude, str.length() - 1);\n-        if (from > toExclude) {\n-            return -1;\n-        }\n-\n-        for (int i = toExclude; i >= from; i--) {\n-            if (str.charAt(i) == ch) {\n-                return i;\n-            }\n-        }\n-        return -1;\n-    }\n-\n-    private static final class TempBuf {\n-\n-        private final char[] chars;\n-\n-        private final byte[] bytes;\n-\n-        TempBuf(int bufSize) {\n-            this.chars = new char[bufSize];\n-            this.bytes = new byte[bufSize];\n-        }\n-\n-        public char[] charBuf(int size) {\n-            char[] chars = this.chars;\n-            if (size <= chars.length) {\n-                return chars;\n-            }\n-            return new char[size];\n-        }\n-\n-        public byte[] byteBuf(int size) {\n-            byte[] bytes = this.bytes;\n-            if (size <= bytes.length) {\n-                return bytes;\n-            }\n-            return new byte[size];\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY_PREFIX;\r\n+import static org.apache.dubbo.common.utils.StringUtils.EMPTY_STRING;\r\n+import static org.apache.dubbo.common.utils.StringUtils.decodeHexByte;\r\n+import static org.apache.dubbo.common.utils.Utf8Utils.decodeUtf8;\r\n+\r\n+public final class URLStrParser {\r\n+\r\n+    private static final char SPACE = 0x20;\r\n+\r\n+    private static final ThreadLocal<TempBuf> DECODE_TEMP_BUF = ThreadLocal.withInitial(() -> new TempBuf(1024));\r\n+\r\n+    private URLStrParser() {\r\n+        //empty\r\n+    }\r\n+\r\n+    /**\r\n+     * @param decodedURLStr : after {@link URL#decode} string\r\n+     *                      decodedURLStr format: protocol://username:password@host:port/path?k1=v1&k2=v2\r\n+     *                      [protocol://][username:password@][host:port]/[path][?k1=v1&k2=v2]\r\n+     */\r\n+    public static URL parseDecodedStr(String decodedURLStr) {\r\n+        Map<String, String> parameters = null;\r\n+        int pathEndIdx = decodedURLStr.indexOf('?');\r\n+        if (pathEndIdx >= 0) {\r\n+            parameters = parseDecodedParams(decodedURLStr, pathEndIdx + 1);\r\n+        } else {\r\n+            pathEndIdx = decodedURLStr.length();\r\n+        }\r\n+\r\n+        String decodedBody = decodedURLStr.substring(0, pathEndIdx);\r\n+        return parseURLBody(decodedURLStr, decodedBody, parameters);\r\n+    }\r\n+\r\n+    private static Map<String, String> parseDecodedParams(String str, int from) {\r\n+        int len = str.length();\r\n+        if (from >= len) {\r\n+            return Collections.emptyMap();\r\n+        }\r\n+\r\n+        TempBuf tempBuf = DECODE_TEMP_BUF.get();\r\n+        Map<String, String> params = new HashMap<>();\r\n+        int nameStart = from;\r\n+        int valueStart = -1;\r\n+        int i;\r\n+        for (i = from; i < len; i++) {\r\n+            char ch = str.charAt(i);\r\n+            switch (ch) {\r\n+                case '=':\r\n+                    if (nameStart == i) {\r\n+                        nameStart = i + 1;\r\n+                    } else if (valueStart < nameStart) {\r\n+                        valueStart = i + 1;\r\n+                    }\r\n+                    break;\r\n+                case ';':\r\n+                case '&':\r\n+                    addParam(str, false, nameStart, valueStart, i, params, tempBuf);\r\n+                    nameStart = i + 1;\r\n+                    break;\r\n+                default:\r\n+                    // continue\r\n+            }\r\n+        }\r\n+        addParam(str, false, nameStart, valueStart, i, params, tempBuf);\r\n+        return params;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param fullURLStr  : fullURLString\r\n+     * @param decodedBody : format: [protocol://][username:password@][host:port]/[path]\r\n+     * @param parameters  :\r\n+     * @return URL\r\n+     */\r\n+    private static URL parseURLBody(String fullURLStr, String decodedBody, Map<String, String> parameters) {\r\n+        int starIdx = 0, endIdx = decodedBody.length();\r\n+        String protocol = null;\r\n+        int protoEndIdx = decodedBody.indexOf(\"://\");\r\n+        if (protoEndIdx >= 0) {\r\n+            if (protoEndIdx == 0) {\r\n+                throw new IllegalStateException(\"url missing protocol: \\\"\" + fullURLStr + \"\\\"\");\r\n+            }\r\n+            protocol = decodedBody.substring(0, protoEndIdx);\r\n+            starIdx = protoEndIdx + 3;\r\n+        } else {\r\n+            // case: file:/path/to/file.txt\r\n+            protoEndIdx = decodedBody.indexOf(\":/\");\r\n+            if (protoEndIdx >= 0) {\r\n+                if (protoEndIdx == 0) {\r\n+                    throw new IllegalStateException(\"url missing protocol: \\\"\" + fullURLStr + \"\\\"\");\r\n+                }\r\n+                protocol = decodedBody.substring(0, protoEndIdx);\r\n+                starIdx = protoEndIdx + 1;\r\n+            }\r\n+        }\r\n+\r\n+        String path = null;\r\n+        int pathStartIdx = indexOf(decodedBody, '/', starIdx, endIdx);\r\n+        if (pathStartIdx >= 0) {\r\n+            path = decodedBody.substring(pathStartIdx + 1);\r\n+            endIdx = pathStartIdx;\r\n+        }\r\n+\r\n+        String username = null;\r\n+        String password = null;\r\n+        int pwdEndIdx = lastIndexOf(decodedBody, '@', starIdx, endIdx);\r\n+        if (pwdEndIdx > 0) {\r\n+            int userNameEndIdx = indexOf(decodedBody, ':', starIdx, pwdEndIdx);\r\n+            username = decodedBody.substring(starIdx, userNameEndIdx);\r\n+            password = decodedBody.substring(userNameEndIdx + 1, pwdEndIdx);\r\n+            starIdx = pwdEndIdx + 1;\r\n+        }\r\n+\r\n+        String host = null;\r\n+        int port = 0;\r\n+        int hostEndIdx = lastIndexOf(decodedBody, ':', starIdx, endIdx);\r\n+        if (hostEndIdx > 0 && hostEndIdx < decodedBody.length() - 1) {\r\n+            if (lastIndexOf(decodedBody, '%', starIdx, endIdx) > hostEndIdx) {\r\n+                // ipv6 address with scope id\r\n+                // e.g. fe80:0:0:0:894:aeec:f37d:23e1%en0\r\n+                // see https://howdoesinternetwork.com/2013/ipv6-zone-id\r\n+                // ignore\r\n+            } else {\r\n+                port = Integer.parseInt(decodedBody.substring(hostEndIdx + 1, endIdx));\r\n+                endIdx = hostEndIdx;\r\n+            }\r\n+        }\r\n+\r\n+        if (endIdx > starIdx) {\r\n+            host = decodedBody.substring(starIdx, endIdx);\r\n+        }\r\n+        return new URL(protocol, username, password, host, port, path, parameters);\r\n+    }\r\n+\r\n+    /**\r\n+     * @param encodedURLStr : after {@link URL#encode(String)} string\r\n+     *                      encodedURLStr after decode format: protocol://username:password@host:port/path?k1=v1&k2=v2\r\n+     *                      [protocol://][username:password@][host:port]/[path][?k1=v1&k2=v2]\r\n+     */\r\n+    public static URL parseEncodedStr(String encodedURLStr) {\r\n+        Map<String, String> parameters = null;\r\n+        int pathEndIdx = encodedURLStr.toUpperCase().indexOf(\"%3F\");// '?'\r\n+        if (pathEndIdx >= 0) {\r\n+            parameters = parseEncodedParams(encodedURLStr, pathEndIdx + 3);\r\n+        } else {\r\n+            pathEndIdx = encodedURLStr.length();\r\n+        }\r\n+\r\n+        //decodedBody format: [protocol://][username:password@][host:port]/[path]\r\n+        String decodedBody = decodeComponent(encodedURLStr, 0, pathEndIdx, false, DECODE_TEMP_BUF.get());\r\n+        return parseURLBody(encodedURLStr, decodedBody, parameters);\r\n+    }\r\n+\r\n+    private static Map<String, String> parseEncodedParams(String str, int from) {\r\n+        int len = str.length();\r\n+        if (from >= len) {\r\n+            return Collections.emptyMap();\r\n+        }\r\n+\r\n+        TempBuf tempBuf = DECODE_TEMP_BUF.get();\r\n+        Map<String, String> params = new HashMap<>();\r\n+        int nameStart = from;\r\n+        int valueStart = -1;\r\n+        int i;\r\n+        for (i = from; i < len; i++) {\r\n+            char ch = str.charAt(i);\r\n+            if (ch == '%') {\r\n+                if (i + 3 > len) {\r\n+                    throw new IllegalArgumentException(\"unterminated escape sequence at index \" + i + \" of: \" + str);\r\n+                }\r\n+                ch = (char) decodeHexByte(str, i + 1);\r\n+                i += 2;\r\n+            }\r\n+\r\n+            switch (ch) {\r\n+                case '=':\r\n+                    if (nameStart == i) {\r\n+                        nameStart = i + 1;\r\n+                    } else if (valueStart < nameStart) {\r\n+                        valueStart = i + 1;\r\n+                    }\r\n+                    break;\r\n+                case ';':\r\n+                case '&':\r\n+                    addParam(str, true, nameStart, valueStart, i - 2, params, tempBuf);\r\n+                    nameStart = i + 1;\r\n+                    break;\r\n+                default:\r\n+                    // continue\r\n+            }\r\n+        }\r\n+        addParam(str, true, nameStart, valueStart, i, params, tempBuf);\r\n+        return params;\r\n+    }\r\n+\r\n+    private static boolean addParam(String str, boolean isEncoded, int nameStart, int valueStart, int valueEnd, Map<String, String> params,\r\n+                                    TempBuf tempBuf) {\r\n+        if (nameStart >= valueEnd) {\r\n+            return false;\r\n+        }\r\n+\r\n+        if (valueStart <= nameStart) {\r\n+            valueStart = valueEnd + 1;\r\n+        }\r\n+\r\n+        if (isEncoded) {\r\n+            String name = decodeComponent(str, nameStart, valueStart - 3, false, tempBuf);\r\n+            String value = decodeComponent(str, valueStart, valueEnd, false, tempBuf);\r\n+            if (valueStart == valueEnd) {\r\n+                value = name;\r\n+            } else {\r\n+                value = decodeComponent(str, valueStart, valueEnd, false, tempBuf);\r\n+            }\r\n+            params.put(name, value);\r\n+            // compatible with lower versions registering \"default.\" keys\r\n+            if (name.startsWith(DEFAULT_KEY_PREFIX)) {\r\n+                params.putIfAbsent(name.substring(DEFAULT_KEY_PREFIX.length()), value);\r\n+            }\r\n+        } else {\r\n+            String name = str.substring(nameStart, valueStart - 1);\r\n+            String value = str.substring(valueStart, valueEnd);\r\n+            if (valueStart == valueEnd) {\r\n+                value = name;\r\n+            } else {\r\n+                value = str.substring(valueStart, valueEnd);\r\n+            }\r\n+            params.put(name, value);\r\n+            // compatible with lower versions registering \"default.\" keys\r\n+            if (name.startsWith(DEFAULT_KEY_PREFIX)) {\r\n+                params.putIfAbsent(name.substring(DEFAULT_KEY_PREFIX.length()), value);\r\n+            }\r\n+        }\r\n+        return true;\r\n+    }\r\n+\r\n+    private static String decodeComponent(String s, int from, int toExcluded, boolean isPath, TempBuf tempBuf) {\r\n+        int len = toExcluded - from;\r\n+        if (len <= 0) {\r\n+            return EMPTY_STRING;\r\n+        }\r\n+\r\n+        int firstEscaped = -1;\r\n+        for (int i = from; i < toExcluded; i++) {\r\n+            char c = s.charAt(i);\r\n+            if (c == '%' || c == '+' && !isPath) {\r\n+                firstEscaped = i;\r\n+                break;\r\n+            }\r\n+        }\r\n+        if (firstEscaped == -1) {\r\n+            return s.substring(from, toExcluded);\r\n+        }\r\n+\r\n+        // Each encoded byte takes 3 characters (e.g. \"%20\")\r\n+        int decodedCapacity = (toExcluded - firstEscaped) / 3;\r\n+        byte[] buf = tempBuf.byteBuf(decodedCapacity);\r\n+        char[] charBuf = tempBuf.charBuf(len);\r\n+        s.getChars(from, firstEscaped, charBuf, 0);\r\n+\r\n+        int charBufIdx = firstEscaped - from;\r\n+        return decodeUtf8Component(s, firstEscaped, toExcluded, isPath, buf, charBuf, charBufIdx);\r\n+    }\r\n+\r\n+    private static String decodeUtf8Component(String str, int firstEscaped, int toExcluded, boolean isPath, byte[] buf,\r\n+                                              char[] charBuf, int charBufIdx) {\r\n+        int bufIdx;\r\n+        for (int i = firstEscaped; i < toExcluded; i++) {\r\n+            char c = str.charAt(i);\r\n+            if (c != '%') {\r\n+                charBuf[charBufIdx++] = c != '+' || isPath ? c : SPACE;\r\n+                continue;\r\n+            }\r\n+\r\n+            bufIdx = 0;\r\n+            do {\r\n+                if (i + 3 > toExcluded) {\r\n+                    throw new IllegalArgumentException(\"unterminated escape sequence at index \" + i + \" of: \" + str);\r\n+                }\r\n+                buf[bufIdx++] = decodeHexByte(str, i + 1);\r\n+                i += 3;\r\n+            } while (i < toExcluded && str.charAt(i) == '%');\r\n+            i--;\r\n+\r\n+            charBufIdx += decodeUtf8(buf, 0, bufIdx, charBuf, charBufIdx);\r\n+        }\r\n+        return new String(charBuf, 0, charBufIdx);\r\n+    }\r\n+\r\n+    private static int indexOf(String str, char ch, int from, int toExclude) {\r\n+        from = Math.max(from, 0);\r\n+        toExclude = Math.min(toExclude, str.length());\r\n+        if (from > toExclude) {\r\n+            return -1;\r\n+        }\r\n+\r\n+        for (int i = from; i < toExclude; i++) {\r\n+            if (str.charAt(i) == ch) {\r\n+                return i;\r\n+            }\r\n+        }\r\n+        return -1;\r\n+    }\r\n+\r\n+    private static int lastIndexOf(String str, char ch, int from, int toExclude) {\r\n+        from = Math.max(from, 0);\r\n+        toExclude = Math.min(toExclude, str.length() - 1);\r\n+        if (from > toExclude) {\r\n+            return -1;\r\n+        }\r\n+\r\n+        for (int i = toExclude; i >= from; i--) {\r\n+            if (str.charAt(i) == ch) {\r\n+                return i;\r\n+            }\r\n+        }\r\n+        return -1;\r\n+    }\r\n+\r\n+    private static final class TempBuf {\r\n+\r\n+        private final char[] chars;\r\n+\r\n+        private final byte[] bytes;\r\n+\r\n+        TempBuf(int bufSize) {\r\n+            this.chars = new char[bufSize];\r\n+            this.bytes = new byte[bufSize];\r\n+        }\r\n+\r\n+        public char[] charBuf(int size) {\r\n+            char[] chars = this.chars;\r\n+            if (size <= chars.length) {\r\n+                return chars;\r\n+            }\r\n+            return new char[size];\r\n+        }\r\n+\r\n+        public byte[] byteBuf(int size) {\r\n+            byte[] bytes = this.bytes;\r\n+            if (size <= bytes.length) {\r\n+                return bytes;\r\n+            }\r\n+            return new byte[size];\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/Version.java", "source2": "org/apache/dubbo/common/Version.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,278 +1,278 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.io.IOException;\n-import java.net.URL;\n-import java.security.CodeSource;\n-import java.util.Enumeration;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.regex.Matcher;\n-import java.util.regex.Pattern;\n-\n-/**\n- * Version\n- */\n-public final class Version {\n-    private static final Logger logger = LoggerFactory.getLogger(Version.class);\n-\n-    private static final Pattern PREFIX_DIGITS_PATTERN = Pattern.compile(\"^([0-9]*).*\");\n-\n-    // Dubbo RPC protocol version, for compatibility, it must not be between 2.0.10 ~ 2.6.2\n-    public static final String DEFAULT_DUBBO_PROTOCOL_VERSION = \"2.0.2\";\n-    // version 1.0.0 represents Dubbo rpc protocol before v2.6.2\n-    public static final int LEGACY_DUBBO_PROTOCOL_VERSION = 10000; // 1.0.0\n-    // Dubbo implementation version, usually is jar version.\n-    private static final String VERSION = getVersion(Version.class, \"\");\n-\n-    /**\n-     * For protocol compatibility purpose.\n-     * Because {@link #isSupportResponseAttachment} is checked for every call, int compare expect to has higher\n-     * performance than string.\n-     */\n-    public static final int LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT = 2000200; // 2.0.2\n-    public static final int HIGHEST_PROTOCOL_VERSION = 2009900; // 2.0.99\n-    private static final Map<String, Integer> VERSION2INT = new HashMap<String, Integer>();\n-\n-    static {\n-        // check if there's duplicated jar\n-        Version.checkDuplicate(Version.class);\n-    }\n-\n-    private Version() {\n-    }\n-\n-    public static String getProtocolVersion() {\n-        return DEFAULT_DUBBO_PROTOCOL_VERSION;\n-    }\n-\n-    public static String getVersion() {\n-        return VERSION;\n-    }\n-\n-    /**\n-     * Check the framework release version number to decide if it's 2.7.0 or higher\n-     */\n-    public static boolean isRelease270OrHigher(String version) {\n-        if (StringUtils.isEmpty(version)) {\n-            return false;\n-        }\n-        if (getIntVersion(version) >= 2070000) {\n-            return true;\n-        }\n-        return false;\n-    }\n-\n-    /**\n-     * Check the framework release version number to decide if it's 2.6.3 or higher\n-     *\n-     * @param version, the sdk version\n-     */\n-    public static boolean isRelease263OrHigher(String version) {\n-        return getIntVersion(version) >= 2060300;\n-    }\n-\n-    /**\n-     * Dubbo 2.x protocol version numbers are limited to 2.0.2/2000200 ~ 2.0.99/2009900, other versions are consider as\n-     * invalid or not from official release.\n-     *\n-     * @param version, the protocol version.\n-     * @return\n-     */\n-    public static boolean isSupportResponseAttachment(String version) {\n-        if (StringUtils.isEmpty(version)) {\n-            return false;\n-        }\n-        int iVersion = getIntVersion(version);\n-        if (iVersion >= LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT && iVersion <= HIGHEST_PROTOCOL_VERSION) {\n-            return true;\n-        }\n-\n-        return false;\n-    }\n-\n-    public static int getIntVersion(String version) {\n-        Integer v = VERSION2INT.get(version);\n-        if (v == null) {\n-            try {\n-                v = parseInt(version);\n-                // e.g., version number 2.6.3 will convert to 2060300\n-                if (version.split(\"\\\\.\").length == 3) {\n-                    v = v * 100;\n-                }\n-            } catch (Exception e) {\n-                logger.warn(\"Please make sure your version value has the right format: \" +\n-                        \"\\n 1. only contains digital number: 2.0.0; \\n 2. with string suffix: 2.6.7-stable. \" +\n-                        \"\\nIf you are using Dubbo before v2.6.2, the version value is the same with the jar version.\");\n-                v = LEGACY_DUBBO_PROTOCOL_VERSION;\n-            }\n-            VERSION2INT.put(version, v);\n-        }\n-        return v;\n-    }\n-\n-    private static int parseInt(String version) {\n-        int v = 0;\n-        String[] vArr = version.split(\"\\\\.\");\n-        int len = vArr.length;\n-        for (int i = 0; i < len; i++) {\n-            String subV = getPrefixDigits(vArr[i]);\n-            if (StringUtils.isNotEmpty(subV)) {\n-                v += Integer.parseInt(subV) * Math.pow(10, (len - i - 1) * 2);\n-            }\n-        }\n-        return v;\n-    }\n-\n-    /**\n-     * get prefix digits from given version string\n-     */\n-    private static String getPrefixDigits(String v) {\n-        Matcher matcher = PREFIX_DIGITS_PATTERN.matcher(v);\n-        if (matcher.find()) {\n-            return matcher.group(1);\n-        }\n-        return \"\";\n-    }\n-\n-    public static String getVersion(Class<?> cls, String defaultVersion) {\n-        try {\n-            // find version info from MANIFEST.MF first\n-            Package pkg = cls.getPackage();\n-            String version = null;\n-            if (pkg != null) {\n-                version = pkg.getImplementationVersion();\n-                if (StringUtils.isNotEmpty(version)) {\n-                    return version;\n-                }\n-\n-                version = pkg.getSpecificationVersion();\n-                if (StringUtils.isNotEmpty(version)) {\n-                    return version;\n-                }\n-            }\n-\n-            // guess version from jar file name if nothing's found from MANIFEST.MF\n-            CodeSource codeSource = cls.getProtectionDomain().getCodeSource();\n-            if (codeSource == null) {\n-                logger.info(\"No codeSource for class \" + cls.getName() + \" when getVersion, use default version \" + defaultVersion);\n-                return defaultVersion;\n-            }\n-\n-            URL location = codeSource.getLocation();\n-            if (location == null){\n-                logger.info(\"No location for class \" + cls.getName() + \" when getVersion, use default version \" + defaultVersion);\n-                return defaultVersion;\n-            }\n-            String file =  location.getFile();\n-            if (!StringUtils.isEmpty(file) && file.endsWith(\".jar\")) {\n-                version = getFromFile(file);\n-            }\n-\n-            // return default version if no version info is found\n-            return StringUtils.isEmpty(version) ? defaultVersion : version;\n-        } catch (Throwable e) {\n-            // return default version when any exception is thrown\n-            logger.error(\"return default version, ignore exception \" + e.getMessage(), e);\n-            return defaultVersion;\n-        }\n-    }\n-\n-    /**\n-     * get version from file: path/to/group-module-x.y.z.jar, returns x.y.z\n-     */\n-    private static String getFromFile(String file) {\n-        // remove suffix \".jar\": \"path/to/group-module-x.y.z\"\n-        file = file.substring(0, file.length() - 4);\n-\n-        // remove path: \"group-module-x.y.z\"\n-        int i = file.lastIndexOf('/');\n-        if (i >= 0) {\n-            file = file.substring(i + 1);\n-        }\n-\n-        // remove group: \"module-x.y.z\"\n-        i = file.indexOf(\"-\");\n-        if (i >= 0) {\n-            file = file.substring(i + 1);\n-        }\n-\n-        // remove module: \"x.y.z\"\n-        while (file.length() > 0 && !Character.isDigit(file.charAt(0))) {\n-            i = file.indexOf(\"-\");\n-            if (i >= 0) {\n-                file = file.substring(i + 1);\n-            } else {\n-                break;\n-            }\n-        }\n-        return file;\n-    }\n-\n-    public static void checkDuplicate(Class<?> cls, boolean failOnError) {\n-        checkDuplicate(cls.getName().replace('.', '/') + \".class\", failOnError);\n-    }\n-\n-    public static void checkDuplicate(Class<?> cls) {\n-        checkDuplicate(cls, false);\n-    }\n-\n-    public static void checkDuplicate(String path, boolean failOnError) {\n-        try {\n-            // search in caller's classloader\n-            Set<String> files = getResources(path);\n-            // duplicated jar is found\n-            if (files.size() > 1) {\n-                String error = \"Duplicate class \" + path + \" in \" + files.size() + \" jar \" + files;\n-                if (failOnError) {\n-                    throw new IllegalStateException(error);\n-                } else {\n-                    logger.error(error);\n-                }\n-            }\n-        } catch (Throwable e) {\n-            logger.error(e.getMessage(), e);\n-        }\n-    }\n-\n-    /**\n-     * search resources in caller's classloader\n-     */\n-    private static Set<String> getResources(String path) throws IOException {\n-        Enumeration<URL> urls = ClassUtils.getCallerClassLoader(Version.class).getResources(path);\n-        Set<String> files = new HashSet<String>();\n-        while (urls.hasMoreElements()) {\n-            URL url = urls.nextElement();\n-            if (url != null) {\n-                String file = url.getFile();\n-                if (StringUtils.isNotEmpty(file)) {\n-                    files.add(file);\n-                }\n-            }\n-        }\n-        return files;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.io.IOException;\r\n+import java.net.URL;\r\n+import java.security.CodeSource;\r\n+import java.util.Enumeration;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.regex.Matcher;\r\n+import java.util.regex.Pattern;\r\n+\r\n+/**\r\n+ * Version\r\n+ */\r\n+public final class Version {\r\n+    private static final Logger logger = LoggerFactory.getLogger(Version.class);\r\n+\r\n+    private static final Pattern PREFIX_DIGITS_PATTERN = Pattern.compile(\"^([0-9]*).*\");\r\n+\r\n+    // Dubbo RPC protocol version, for compatibility, it must not be between 2.0.10 ~ 2.6.2\r\n+    public static final String DEFAULT_DUBBO_PROTOCOL_VERSION = \"2.0.2\";\r\n+    // version 1.0.0 represents Dubbo rpc protocol before v2.6.2\r\n+    public static final int LEGACY_DUBBO_PROTOCOL_VERSION = 10000; // 1.0.0\r\n+    // Dubbo implementation version, usually is jar version.\r\n+    private static final String VERSION = getVersion(Version.class, \"\");\r\n+\r\n+    /**\r\n+     * For protocol compatibility purpose.\r\n+     * Because {@link #isSupportResponseAttachment} is checked for every call, int compare expect to has higher\r\n+     * performance than string.\r\n+     */\r\n+    public static final int LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT = 2000200; // 2.0.2\r\n+    public static final int HIGHEST_PROTOCOL_VERSION = 2009900; // 2.0.99\r\n+    private static final Map<String, Integer> VERSION2INT = new HashMap<String, Integer>();\r\n+\r\n+    static {\r\n+        // check if there's duplicated jar\r\n+        Version.checkDuplicate(Version.class);\r\n+    }\r\n+\r\n+    private Version() {\r\n+    }\r\n+\r\n+    public static String getProtocolVersion() {\r\n+        return DEFAULT_DUBBO_PROTOCOL_VERSION;\r\n+    }\r\n+\r\n+    public static String getVersion() {\r\n+        return VERSION;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check the framework release version number to decide if it's 2.7.0 or higher\r\n+     */\r\n+    public static boolean isRelease270OrHigher(String version) {\r\n+        if (StringUtils.isEmpty(version)) {\r\n+            return false;\r\n+        }\r\n+        if (getIntVersion(version) >= 2070000) {\r\n+            return true;\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check the framework release version number to decide if it's 2.6.3 or higher\r\n+     *\r\n+     * @param version, the sdk version\r\n+     */\r\n+    public static boolean isRelease263OrHigher(String version) {\r\n+        return getIntVersion(version) >= 2060300;\r\n+    }\r\n+\r\n+    /**\r\n+     * Dubbo 2.x protocol version numbers are limited to 2.0.2/2000200 ~ 2.0.99/2009900, other versions are consider as\r\n+     * invalid or not from official release.\r\n+     *\r\n+     * @param version, the protocol version.\r\n+     * @return\r\n+     */\r\n+    public static boolean isSupportResponseAttachment(String version) {\r\n+        if (StringUtils.isEmpty(version)) {\r\n+            return false;\r\n+        }\r\n+        int iVersion = getIntVersion(version);\r\n+        if (iVersion >= LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT && iVersion <= HIGHEST_PROTOCOL_VERSION) {\r\n+            return true;\r\n+        }\r\n+\r\n+        return false;\r\n+    }\r\n+\r\n+    public static int getIntVersion(String version) {\r\n+        Integer v = VERSION2INT.get(version);\r\n+        if (v == null) {\r\n+            try {\r\n+                v = parseInt(version);\r\n+                // e.g., version number 2.6.3 will convert to 2060300\r\n+                if (version.split(\"\\\\.\").length == 3) {\r\n+                    v = v * 100;\r\n+                }\r\n+            } catch (Exception e) {\r\n+                logger.warn(\"Please make sure your version value has the right format: \" +\r\n+                        \"\\n 1. only contains digital number: 2.0.0; \\n 2. with string suffix: 2.6.7-stable. \" +\r\n+                        \"\\nIf you are using Dubbo before v2.6.2, the version value is the same with the jar version.\");\r\n+                v = LEGACY_DUBBO_PROTOCOL_VERSION;\r\n+            }\r\n+            VERSION2INT.put(version, v);\r\n+        }\r\n+        return v;\r\n+    }\r\n+\r\n+    private static int parseInt(String version) {\r\n+        int v = 0;\r\n+        String[] vArr = version.split(\"\\\\.\");\r\n+        int len = vArr.length;\r\n+        for (int i = 0; i < len; i++) {\r\n+            String subV = getPrefixDigits(vArr[i]);\r\n+            if (StringUtils.isNotEmpty(subV)) {\r\n+                v += Integer.parseInt(subV) * Math.pow(10, (len - i - 1) * 2);\r\n+            }\r\n+        }\r\n+        return v;\r\n+    }\r\n+\r\n+    /**\r\n+     * get prefix digits from given version string\r\n+     */\r\n+    private static String getPrefixDigits(String v) {\r\n+        Matcher matcher = PREFIX_DIGITS_PATTERN.matcher(v);\r\n+        if (matcher.find()) {\r\n+            return matcher.group(1);\r\n+        }\r\n+        return \"\";\r\n+    }\r\n+\r\n+    public static String getVersion(Class<?> cls, String defaultVersion) {\r\n+        try {\r\n+            // find version info from MANIFEST.MF first\r\n+            Package pkg = cls.getPackage();\r\n+            String version = null;\r\n+            if (pkg != null) {\r\n+                version = pkg.getImplementationVersion();\r\n+                if (StringUtils.isNotEmpty(version)) {\r\n+                    return version;\r\n+                }\r\n+\r\n+                version = pkg.getSpecificationVersion();\r\n+                if (StringUtils.isNotEmpty(version)) {\r\n+                    return version;\r\n+                }\r\n+            }\r\n+\r\n+            // guess version from jar file name if nothing's found from MANIFEST.MF\r\n+            CodeSource codeSource = cls.getProtectionDomain().getCodeSource();\r\n+            if (codeSource == null) {\r\n+                logger.info(\"No codeSource for class \" + cls.getName() + \" when getVersion, use default version \" + defaultVersion);\r\n+                return defaultVersion;\r\n+            }\r\n+\r\n+            URL location = codeSource.getLocation();\r\n+            if (location == null){\r\n+                logger.info(\"No location for class \" + cls.getName() + \" when getVersion, use default version \" + defaultVersion);\r\n+                return defaultVersion;\r\n+            }\r\n+            String file =  location.getFile();\r\n+            if (!StringUtils.isEmpty(file) && file.endsWith(\".jar\")) {\r\n+                version = getFromFile(file);\r\n+            }\r\n+\r\n+            // return default version if no version info is found\r\n+            return StringUtils.isEmpty(version) ? defaultVersion : version;\r\n+        } catch (Throwable e) {\r\n+            // return default version when any exception is thrown\r\n+            logger.error(\"return default version, ignore exception \" + e.getMessage(), e);\r\n+            return defaultVersion;\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * get version from file: path/to/group-module-x.y.z.jar, returns x.y.z\r\n+     */\r\n+    private static String getFromFile(String file) {\r\n+        // remove suffix \".jar\": \"path/to/group-module-x.y.z\"\r\n+        file = file.substring(0, file.length() - 4);\r\n+\r\n+        // remove path: \"group-module-x.y.z\"\r\n+        int i = file.lastIndexOf('/');\r\n+        if (i >= 0) {\r\n+            file = file.substring(i + 1);\r\n+        }\r\n+\r\n+        // remove group: \"module-x.y.z\"\r\n+        i = file.indexOf(\"-\");\r\n+        if (i >= 0) {\r\n+            file = file.substring(i + 1);\r\n+        }\r\n+\r\n+        // remove module: \"x.y.z\"\r\n+        while (file.length() > 0 && !Character.isDigit(file.charAt(0))) {\r\n+            i = file.indexOf(\"-\");\r\n+            if (i >= 0) {\r\n+                file = file.substring(i + 1);\r\n+            } else {\r\n+                break;\r\n+            }\r\n+        }\r\n+        return file;\r\n+    }\r\n+\r\n+    public static void checkDuplicate(Class<?> cls, boolean failOnError) {\r\n+        checkDuplicate(cls.getName().replace('.', '/') + \".class\", failOnError);\r\n+    }\r\n+\r\n+    public static void checkDuplicate(Class<?> cls) {\r\n+        checkDuplicate(cls, false);\r\n+    }\r\n+\r\n+    public static void checkDuplicate(String path, boolean failOnError) {\r\n+        try {\r\n+            // search in caller's classloader\r\n+            Set<String> files = getResources(path);\r\n+            // duplicated jar is found\r\n+            if (files.size() > 1) {\r\n+                String error = \"Duplicate class \" + path + \" in \" + files.size() + \" jar \" + files;\r\n+                if (failOnError) {\r\n+                    throw new IllegalStateException(error);\r\n+                } else {\r\n+                    logger.error(error);\r\n+                }\r\n+            }\r\n+        } catch (Throwable e) {\r\n+            logger.error(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * search resources in caller's classloader\r\n+     */\r\n+    private static Set<String> getResources(String path) throws IOException {\r\n+        Enumeration<URL> urls = ClassUtils.getCallerClassLoader(Version.class).getResources(path);\r\n+        Set<String> files = new HashSet<String>();\r\n+        while (urls.hasMoreElements()) {\r\n+            URL url = urls.nextElement();\r\n+            if (url != null) {\r\n+                String file = url.getFile();\r\n+                if (StringUtils.isNotEmpty(file)) {\r\n+                    files.add(file);\r\n+                }\r\n+            }\r\n+        }\r\n+        return files;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/beanutil/JavaBeanDescriptor.java", "source2": "org/apache/dubbo/common/beanutil/JavaBeanDescriptor.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,207 +1,207 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.beanutil;\n-\n-import java.io.Serializable;\n-import java.util.Iterator;\n-import java.util.LinkedHashMap;\n-import java.util.Map;\n-\n-public final class JavaBeanDescriptor implements Serializable, Iterable<Map.Entry<Object, Object>> {\n-\n-    private static final long serialVersionUID = -8505586483570518029L;\n-\n-    public static final int TYPE_CLASS = 1;\n-    public static final int TYPE_ENUM = 2;\n-    public static final int TYPE_COLLECTION = 3;\n-    public static final int TYPE_MAP = 4;\n-    public static final int TYPE_ARRAY = 5;\n-    /**\n-     * @see org.apache.dubbo.common.utils.ReflectUtils#isPrimitive(Class)\n-     */\n-    public static final int TYPE_PRIMITIVE = 6;\n-    public static final int TYPE_BEAN = 7;\n-\n-    private static final String ENUM_PROPERTY_NAME = \"name\";\n-    private static final String CLASS_PROPERTY_NAME = \"name\";\n-    private static final String PRIMITIVE_PROPERTY_VALUE = \"value\";\n-\n-    /**\n-     * Used to define a type is valid.\n-     *\n-     * @see #isValidType(int)\n-     */\n-    private static final int TYPE_MAX = TYPE_BEAN;\n-    /**\n-     * Used to define a type is valid.\n-     *\n-     * @see #isValidType(int)\n-     */\n-    private static final int TYPE_MIN = TYPE_CLASS;\n-\n-    private String className;\n-    private int type;\n-\n-    private Map<Object, Object> properties = new LinkedHashMap<>();\n-\n-    public JavaBeanDescriptor() {}\n-\n-    public JavaBeanDescriptor(String className, int type) {\n-        notEmpty(className, \"class name is empty\");\n-        if (!isValidType(type)) {\n-            throw new IllegalArgumentException(\"type [ \" + type + \" ] is unsupported\");\n-        }\n-\n-        this.className = className;\n-        this.type = type;\n-    }\n-\n-    public boolean isClassType() {\n-        return TYPE_CLASS == type;\n-    }\n-\n-    public boolean isEnumType() {\n-        return TYPE_ENUM == type;\n-    }\n-\n-    public boolean isCollectionType() {\n-        return TYPE_COLLECTION == type;\n-    }\n-\n-    public boolean isMapType() {\n-        return TYPE_MAP == type;\n-    }\n-\n-    public boolean isArrayType() {\n-        return TYPE_ARRAY == type;\n-    }\n-\n-    public boolean isPrimitiveType() {\n-        return TYPE_PRIMITIVE == type;\n-    }\n-\n-    public boolean isBeanType() {\n-        return TYPE_BEAN == type;\n-    }\n-\n-    public int getType() {\n-        return type;\n-    }\n-\n-    public void setType(int type) {\n-        this.type = type;\n-    }\n-\n-    public String getClassName() {\n-        return className;\n-    }\n-\n-    public void setClassName(String className) {\n-        this.className = className;\n-    }\n-\n-    public Object setProperty(Object propertyName, Object propertyValue) {\n-        notNull(propertyName, \"Property name is null\");\n-        return properties.put(propertyName, propertyValue);\n-    }\n-\n-    public String setEnumNameProperty(String name) {\n-        if (isEnumType()) {\n-            Object result = setProperty(ENUM_PROPERTY_NAME, name);\n-            return result == null ? null : result.toString();\n-        }\n-        throw new IllegalStateException(\"The instance is not a enum wrapper\");\n-    }\n-\n-    public String getEnumPropertyName() {\n-        if (isEnumType()) {\n-            Object result = getProperty(ENUM_PROPERTY_NAME);\n-            return result == null ? null : result.toString();\n-        }\n-        throw new IllegalStateException(\"The instance is not a enum wrapper\");\n-    }\n-\n-    public String setClassNameProperty(String name) {\n-        if (isClassType()) {\n-            Object result = setProperty(CLASS_PROPERTY_NAME, name);\n-            return result == null ? null : result.toString();\n-        }\n-        throw new IllegalStateException(\"The instance is not a class wrapper\");\n-    }\n-\n-    public String getClassNameProperty() {\n-        if (isClassType()) {\n-            Object result = getProperty(CLASS_PROPERTY_NAME);\n-            return result == null ? null : result.toString();\n-        }\n-        throw new IllegalStateException(\"The instance is not a class wrapper\");\n-    }\n-\n-    public Object setPrimitiveProperty(Object primitiveValue) {\n-        if (isPrimitiveType()) {\n-            return setProperty(PRIMITIVE_PROPERTY_VALUE, primitiveValue);\n-        }\n-        throw new IllegalStateException(\"The instance is not a primitive type wrapper\");\n-    }\n-\n-    public Object getPrimitiveProperty() {\n-        if (isPrimitiveType()) {\n-            return getProperty(PRIMITIVE_PROPERTY_VALUE);\n-        }\n-        throw new IllegalStateException(\"The instance is not a primitive type wrapper\");\n-    }\n-\n-    public Object getProperty(Object propertyName) {\n-        notNull(propertyName, \"Property name is null\");\n-        return properties.get(propertyName);\n-    }\n-\n-    public boolean containsProperty(Object propertyName) {\n-        notNull(propertyName, \"Property name is null\");\n-        return properties.containsKey(propertyName);\n-    }\n-\n-    @Override\n-    public Iterator<Map.Entry<Object, Object>> iterator() {\n-        return properties.entrySet().iterator();\n-    }\n-\n-    public int propertySize() {\n-        return properties.size();\n-    }\n-\n-    private boolean isValidType(int type) {\n-        return TYPE_MIN <= type && type <= TYPE_MAX;\n-    }\n-\n-    private void notNull(Object obj, String message) {\n-        if (obj == null) {\n-            throw new IllegalArgumentException(message);\n-        }\n-    }\n-\n-    private void notEmpty(String string, String message) {\n-        if (isEmpty(string)) {\n-            throw new IllegalArgumentException(message);\n-        }\n-    }\n-\n-    private boolean isEmpty(String string) {\n-        return string == null || \"\".equals(string.trim());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.beanutil;\r\n+\r\n+import java.io.Serializable;\r\n+import java.util.Iterator;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.Map;\r\n+\r\n+public final class JavaBeanDescriptor implements Serializable, Iterable<Map.Entry<Object, Object>> {\r\n+\r\n+    private static final long serialVersionUID = -8505586483570518029L;\r\n+\r\n+    public static final int TYPE_CLASS = 1;\r\n+    public static final int TYPE_ENUM = 2;\r\n+    public static final int TYPE_COLLECTION = 3;\r\n+    public static final int TYPE_MAP = 4;\r\n+    public static final int TYPE_ARRAY = 5;\r\n+    /**\r\n+     * @see org.apache.dubbo.common.utils.ReflectUtils#isPrimitive(Class)\r\n+     */\r\n+    public static final int TYPE_PRIMITIVE = 6;\r\n+    public static final int TYPE_BEAN = 7;\r\n+\r\n+    private static final String ENUM_PROPERTY_NAME = \"name\";\r\n+    private static final String CLASS_PROPERTY_NAME = \"name\";\r\n+    private static final String PRIMITIVE_PROPERTY_VALUE = \"value\";\r\n+\r\n+    /**\r\n+     * Used to define a type is valid.\r\n+     *\r\n+     * @see #isValidType(int)\r\n+     */\r\n+    private static final int TYPE_MAX = TYPE_BEAN;\r\n+    /**\r\n+     * Used to define a type is valid.\r\n+     *\r\n+     * @see #isValidType(int)\r\n+     */\r\n+    private static final int TYPE_MIN = TYPE_CLASS;\r\n+\r\n+    private String className;\r\n+    private int type;\r\n+\r\n+    private Map<Object, Object> properties = new LinkedHashMap<>();\r\n+\r\n+    public JavaBeanDescriptor() {}\r\n+\r\n+    public JavaBeanDescriptor(String className, int type) {\r\n+        notEmpty(className, \"class name is empty\");\r\n+        if (!isValidType(type)) {\r\n+            throw new IllegalArgumentException(\"type [ \" + type + \" ] is unsupported\");\r\n+        }\r\n+\r\n+        this.className = className;\r\n+        this.type = type;\r\n+    }\r\n+\r\n+    public boolean isClassType() {\r\n+        return TYPE_CLASS == type;\r\n+    }\r\n+\r\n+    public boolean isEnumType() {\r\n+        return TYPE_ENUM == type;\r\n+    }\r\n+\r\n+    public boolean isCollectionType() {\r\n+        return TYPE_COLLECTION == type;\r\n+    }\r\n+\r\n+    public boolean isMapType() {\r\n+        return TYPE_MAP == type;\r\n+    }\r\n+\r\n+    public boolean isArrayType() {\r\n+        return TYPE_ARRAY == type;\r\n+    }\r\n+\r\n+    public boolean isPrimitiveType() {\r\n+        return TYPE_PRIMITIVE == type;\r\n+    }\r\n+\r\n+    public boolean isBeanType() {\r\n+        return TYPE_BEAN == type;\r\n+    }\r\n+\r\n+    public int getType() {\r\n+        return type;\r\n+    }\r\n+\r\n+    public void setType(int type) {\r\n+        this.type = type;\r\n+    }\r\n+\r\n+    public String getClassName() {\r\n+        return className;\r\n+    }\r\n+\r\n+    public void setClassName(String className) {\r\n+        this.className = className;\r\n+    }\r\n+\r\n+    public Object setProperty(Object propertyName, Object propertyValue) {\r\n+        notNull(propertyName, \"Property name is null\");\r\n+        return properties.put(propertyName, propertyValue);\r\n+    }\r\n+\r\n+    public String setEnumNameProperty(String name) {\r\n+        if (isEnumType()) {\r\n+            Object result = setProperty(ENUM_PROPERTY_NAME, name);\r\n+            return result == null ? null : result.toString();\r\n+        }\r\n+        throw new IllegalStateException(\"The instance is not a enum wrapper\");\r\n+    }\r\n+\r\n+    public String getEnumPropertyName() {\r\n+        if (isEnumType()) {\r\n+            Object result = getProperty(ENUM_PROPERTY_NAME);\r\n+            return result == null ? null : result.toString();\r\n+        }\r\n+        throw new IllegalStateException(\"The instance is not a enum wrapper\");\r\n+    }\r\n+\r\n+    public String setClassNameProperty(String name) {\r\n+        if (isClassType()) {\r\n+            Object result = setProperty(CLASS_PROPERTY_NAME, name);\r\n+            return result == null ? null : result.toString();\r\n+        }\r\n+        throw new IllegalStateException(\"The instance is not a class wrapper\");\r\n+    }\r\n+\r\n+    public String getClassNameProperty() {\r\n+        if (isClassType()) {\r\n+            Object result = getProperty(CLASS_PROPERTY_NAME);\r\n+            return result == null ? null : result.toString();\r\n+        }\r\n+        throw new IllegalStateException(\"The instance is not a class wrapper\");\r\n+    }\r\n+\r\n+    public Object setPrimitiveProperty(Object primitiveValue) {\r\n+        if (isPrimitiveType()) {\r\n+            return setProperty(PRIMITIVE_PROPERTY_VALUE, primitiveValue);\r\n+        }\r\n+        throw new IllegalStateException(\"The instance is not a primitive type wrapper\");\r\n+    }\r\n+\r\n+    public Object getPrimitiveProperty() {\r\n+        if (isPrimitiveType()) {\r\n+            return getProperty(PRIMITIVE_PROPERTY_VALUE);\r\n+        }\r\n+        throw new IllegalStateException(\"The instance is not a primitive type wrapper\");\r\n+    }\r\n+\r\n+    public Object getProperty(Object propertyName) {\r\n+        notNull(propertyName, \"Property name is null\");\r\n+        return properties.get(propertyName);\r\n+    }\r\n+\r\n+    public boolean containsProperty(Object propertyName) {\r\n+        notNull(propertyName, \"Property name is null\");\r\n+        return properties.containsKey(propertyName);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Iterator<Map.Entry<Object, Object>> iterator() {\r\n+        return properties.entrySet().iterator();\r\n+    }\r\n+\r\n+    public int propertySize() {\r\n+        return properties.size();\r\n+    }\r\n+\r\n+    private boolean isValidType(int type) {\r\n+        return TYPE_MIN <= type && type <= TYPE_MAX;\r\n+    }\r\n+\r\n+    private void notNull(Object obj, String message) {\r\n+        if (obj == null) {\r\n+            throw new IllegalArgumentException(message);\r\n+        }\r\n+    }\r\n+\r\n+    private void notEmpty(String string, String message) {\r\n+        if (isEmpty(string)) {\r\n+            throw new IllegalArgumentException(message);\r\n+        }\r\n+    }\r\n+\r\n+    private boolean isEmpty(String string) {\r\n+        return string == null || \"\".equals(string.trim());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/beanutil/JavaBeanSerializeUtil.java", "source2": "org/apache/dubbo/common/beanutil/JavaBeanSerializeUtil.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,486 +1,486 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.beanutil;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.LogHelper;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.SerializeClassChecker;\n-\n-import java.lang.reflect.Array;\n-import java.lang.reflect.Constructor;\n-import java.lang.reflect.Field;\n-import java.lang.reflect.InvocationTargetException;\n-import java.lang.reflect.Method;\n-import java.util.Collection;\n-import java.util.HashMap;\n-import java.util.IdentityHashMap;\n-import java.util.Map;\n-\n-public final class JavaBeanSerializeUtil {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(JavaBeanSerializeUtil.class);\n-    private static final Map<String, Class<?>> TYPES = new HashMap<String, Class<?>>();\n-    private static final String ARRAY_PREFIX = \"[\";\n-    private static final String REFERENCE_TYPE_PREFIX = \"L\";\n-    private static final String REFERENCE_TYPE_SUFFIX = \";\";\n-\n-    static {\n-        TYPES.put(boolean.class.getName(), boolean.class);\n-        TYPES.put(byte.class.getName(), byte.class);\n-        TYPES.put(short.class.getName(), short.class);\n-        TYPES.put(int.class.getName(), int.class);\n-        TYPES.put(long.class.getName(), long.class);\n-        TYPES.put(float.class.getName(), float.class);\n-        TYPES.put(double.class.getName(), double.class);\n-        TYPES.put(void.class.getName(), void.class);\n-        TYPES.put(\"Z\", boolean.class);\n-        TYPES.put(\"B\", byte.class);\n-        TYPES.put(\"C\", char.class);\n-        TYPES.put(\"D\", double.class);\n-        TYPES.put(\"F\", float.class);\n-        TYPES.put(\"I\", int.class);\n-        TYPES.put(\"J\", long.class);\n-        TYPES.put(\"S\", short.class);\n-    }\n-\n-    private JavaBeanSerializeUtil() {\n-    }\n-\n-    public static JavaBeanDescriptor serialize(Object obj) {\n-        return serialize(obj, JavaBeanAccessor.FIELD);\n-    }\n-\n-    public static JavaBeanDescriptor serialize(Object obj, JavaBeanAccessor accessor) {\n-        if (obj == null) {\n-            return null;\n-        }\n-        if (obj instanceof JavaBeanDescriptor) {\n-            return (JavaBeanDescriptor) obj;\n-        }\n-        IdentityHashMap<Object, JavaBeanDescriptor> cache = new IdentityHashMap<Object, JavaBeanDescriptor>();\n-        return createDescriptorIfAbsent(obj, accessor, cache);\n-    }\n-\n-    private static JavaBeanDescriptor createDescriptorForSerialize(Class<?> cl) {\n-        if (cl.isEnum()) {\n-            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_ENUM);\n-        }\n-\n-        if (cl.isArray()) {\n-            return new JavaBeanDescriptor(cl.getComponentType().getName(), JavaBeanDescriptor.TYPE_ARRAY);\n-        }\n-\n-        if (ReflectUtils.isPrimitive(cl)) {\n-            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_PRIMITIVE);\n-        }\n-\n-        if (Class.class.equals(cl)) {\n-            return new JavaBeanDescriptor(Class.class.getName(), JavaBeanDescriptor.TYPE_CLASS);\n-        }\n-\n-        if (Collection.class.isAssignableFrom(cl)) {\n-            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_COLLECTION);\n-        }\n-\n-        if (Map.class.isAssignableFrom(cl)) {\n-            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_MAP);\n-        }\n-\n-        return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_BEAN);\n-    }\n-\n-    private static JavaBeanDescriptor createDescriptorIfAbsent(Object obj, JavaBeanAccessor accessor,\n-                                                               IdentityHashMap<Object, JavaBeanDescriptor> cache) {\n-        if (cache.containsKey(obj)) {\n-            return cache.get(obj);\n-        }\n-\n-        if (obj instanceof JavaBeanDescriptor) {\n-            return (JavaBeanDescriptor) obj;\n-        }\n-\n-        JavaBeanDescriptor result = createDescriptorForSerialize(obj.getClass());\n-        cache.put(obj, result);\n-        serializeInternal(result, obj, accessor, cache);\n-        return result;\n-    }\n-\n-    private static void serializeInternal(JavaBeanDescriptor descriptor, Object obj, JavaBeanAccessor accessor,\n-                                          IdentityHashMap<Object, JavaBeanDescriptor> cache) {\n-        if (obj == null || descriptor == null) {\n-            return;\n-        }\n-\n-        if (obj.getClass().isEnum()) {\n-            descriptor.setEnumNameProperty(((Enum<?>) obj).name());\n-        } else if (ReflectUtils.isPrimitive(obj.getClass())) {\n-            descriptor.setPrimitiveProperty(obj);\n-        } else if (Class.class.equals(obj.getClass())) {\n-            descriptor.setClassNameProperty(((Class<?>) obj).getName());\n-        } else if (obj.getClass().isArray()) {\n-            int len = Array.getLength(obj);\n-            for (int i = 0; i < len; i++) {\n-                Object item = Array.get(obj, i);\n-                if (item == null) {\n-                    descriptor.setProperty(i, null);\n-                } else {\n-                    JavaBeanDescriptor itemDescriptor = createDescriptorIfAbsent(item, accessor, cache);\n-                    descriptor.setProperty(i, itemDescriptor);\n-                }\n-            }\n-        } else if (obj instanceof Collection) {\n-            Collection collection = (Collection) obj;\n-            int index = 0;\n-            for (Object item : collection) {\n-                if (item == null) {\n-                    descriptor.setProperty(index++, null);\n-                } else {\n-                    JavaBeanDescriptor itemDescriptor = createDescriptorIfAbsent(item, accessor, cache);\n-                    descriptor.setProperty(index++, itemDescriptor);\n-                }\n-            }\n-        } else if (obj instanceof Map) {\n-            Map map = (Map) obj;\n-            map.forEach((key, value) -> {\n-                Object keyDescriptor = key == null ? null : createDescriptorIfAbsent(key, accessor, cache);\n-                Object valueDescriptor = value == null ? null : createDescriptorIfAbsent(value, accessor, cache);\n-                descriptor.setProperty(keyDescriptor, valueDescriptor);\n-            });// ~ end of loop map\n-        } else {\n-            if (JavaBeanAccessor.isAccessByMethod(accessor)) {\n-                Map<String, Method> methods = ReflectUtils.getBeanPropertyReadMethods(obj.getClass());\n-                for (Map.Entry<String, Method> entry : methods.entrySet()) {\n-                    try {\n-                        Object value = entry.getValue().invoke(obj);\n-                        if (value == null) {\n-                            continue;\n-                        }\n-                        JavaBeanDescriptor valueDescriptor = createDescriptorIfAbsent(value, accessor, cache);\n-                        descriptor.setProperty(entry.getKey(), valueDescriptor);\n-                    } catch (Exception e) {\n-                        throw new RuntimeException(e.getMessage(), e);\n-                    }\n-                } // ~ end of loop method map\n-            } // ~ end of if (JavaBeanAccessor.isAccessByMethod(accessor))\n-\n-            if (JavaBeanAccessor.isAccessByField(accessor)) {\n-                Map<String, Field> fields = ReflectUtils.getBeanPropertyFields(obj.getClass());\n-                for (Map.Entry<String, Field> entry : fields.entrySet()) {\n-                    if (!descriptor.containsProperty(entry.getKey())) {\n-                        try {\n-                            Object value = entry.getValue().get(obj);\n-                            if (value == null) {\n-                                continue;\n-                            }\n-                            JavaBeanDescriptor valueDescriptor = createDescriptorIfAbsent(value, accessor, cache);\n-                            descriptor.setProperty(entry.getKey(), valueDescriptor);\n-                        } catch (Exception e) {\n-                            throw new RuntimeException(e.getMessage(), e);\n-                        }\n-                    }\n-                } // ~ end of loop field map\n-            } // ~ end of if (JavaBeanAccessor.isAccessByField(accessor))\n-\n-        } // ~ end of else\n-\n-    } // ~ end of method serializeInternal\n-\n-    public static Object deserialize(JavaBeanDescriptor beanDescriptor) {\n-        return deserialize(\n-                beanDescriptor,\n-                Thread.currentThread().getContextClassLoader());\n-    }\n-\n-    public static Object deserialize(JavaBeanDescriptor beanDescriptor, ClassLoader loader) {\n-        if (beanDescriptor == null) {\n-            return null;\n-        }\n-        IdentityHashMap<JavaBeanDescriptor, Object> cache = new IdentityHashMap<JavaBeanDescriptor, Object>();\n-        Object result = instantiateForDeserialize(beanDescriptor, loader, cache);\n-        deserializeInternal(result, beanDescriptor, loader, cache);\n-        return result;\n-    }\n-\n-    private static void deserializeInternal(Object result, JavaBeanDescriptor beanDescriptor, ClassLoader loader,\n-                                            IdentityHashMap<JavaBeanDescriptor, Object> cache) {\n-        if (beanDescriptor.isEnumType() || beanDescriptor.isClassType() || beanDescriptor.isPrimitiveType()) {\n-            return;\n-        }\n-\n-        if (beanDescriptor.isArrayType()) {\n-            int index = 0;\n-            for (Map.Entry<Object, Object> entry : beanDescriptor) {\n-                Object item = entry.getValue();\n-                if (item instanceof JavaBeanDescriptor) {\n-                    JavaBeanDescriptor itemDescriptor = (JavaBeanDescriptor) entry.getValue();\n-                    item = instantiateForDeserialize(itemDescriptor, loader, cache);\n-                    deserializeInternal(item, itemDescriptor, loader, cache);\n-                }\n-                Array.set(result, index++, item);\n-            }\n-        } else if (beanDescriptor.isCollectionType()) {\n-            Collection collection = (Collection) result;\n-            for (Map.Entry<Object, Object> entry : beanDescriptor) {\n-                Object item = entry.getValue();\n-                if (item instanceof JavaBeanDescriptor) {\n-                    JavaBeanDescriptor itemDescriptor = (JavaBeanDescriptor) entry.getValue();\n-                    item = instantiateForDeserialize(itemDescriptor, loader, cache);\n-                    deserializeInternal(item, itemDescriptor, loader, cache);\n-                }\n-                collection.add(item);\n-            }\n-        } else if (beanDescriptor.isMapType()) {\n-            Map map = (Map) result;\n-            for (Map.Entry<Object, Object> entry : beanDescriptor) {\n-                Object key = entry.getKey();\n-                Object value = entry.getValue();\n-                if (key instanceof JavaBeanDescriptor) {\n-                    JavaBeanDescriptor keyDescriptor = (JavaBeanDescriptor) entry.getKey();\n-                    key = instantiateForDeserialize(keyDescriptor, loader, cache);\n-                    deserializeInternal(key, keyDescriptor, loader, cache);\n-                }\n-                if (value instanceof JavaBeanDescriptor) {\n-                    JavaBeanDescriptor valueDescriptor = (JavaBeanDescriptor) entry.getValue();\n-                    value = instantiateForDeserialize(valueDescriptor, loader, cache);\n-                    deserializeInternal(value, valueDescriptor, loader, cache);\n-                }\n-                map.put(key, value);\n-            }\n-        } else if (beanDescriptor.isBeanType()) {\n-            for (Map.Entry<Object, Object> entry : beanDescriptor) {\n-                String property = entry.getKey().toString();\n-                Object value = entry.getValue();\n-                if (value == null) {\n-                    continue;\n-                }\n-\n-                if (value instanceof JavaBeanDescriptor) {\n-                    JavaBeanDescriptor valueDescriptor = (JavaBeanDescriptor) entry.getValue();\n-                    value = instantiateForDeserialize(valueDescriptor, loader, cache);\n-                    deserializeInternal(value, valueDescriptor, loader, cache);\n-                }\n-\n-                Method method = getSetterMethod(result.getClass(), property, value.getClass());\n-                boolean setByMethod = false;\n-                try {\n-                    if (method != null) {\n-                        method.invoke(result, value);\n-                        setByMethod = true;\n-                    }\n-                } catch (Exception e) {\n-                    LogHelper.warn(logger, \"Failed to set property through method \" + method, e);\n-                }\n-\n-                if (!setByMethod) {\n-                    try {\n-                        Field field = result.getClass().getField(property);\n-                        if (field != null) {\n-                            field.set(result, value);\n-                        }\n-                    } catch (NoSuchFieldException | IllegalAccessException e1) {\n-                        LogHelper.warn(logger, \"Failed to set field value\", e1);\n-                    }\n-                }\n-            }\n-        } else {\n-            throw new IllegalArgumentException(\"Unsupported type \" +\n-                    beanDescriptor.getClassName() +\n-                    \":\" + beanDescriptor.getType());\n-        }\n-    }\n-\n-    private static Method getSetterMethod(Class<?> cls, String property, Class<?> valueCls) {\n-        String name = \"set\" + property.substring(0, 1).toUpperCase() + property.substring(1);\n-        Method method = null;\n-        try {\n-            method = cls.getMethod(name, valueCls);\n-        } catch (NoSuchMethodException e) {\n-            for (Method m : cls.getMethods()) {\n-                if (ReflectUtils.isBeanPropertyWriteMethod(m)\n-                        && m.getName().equals(name)) {\n-                    method = m;\n-                }\n-            }\n-        }\n-        if (method != null) {\n-            ReflectUtils.makeAccessible(method);\n-        }\n-        return method;\n-    }\n-\n-    private static Object instantiate(Class<?> cl) throws Exception {\n-        Constructor<?>[] constructors = cl.getDeclaredConstructors();\n-        Constructor<?> constructor = null;\n-        int argc = Integer.MAX_VALUE;\n-        for (Constructor<?> c : constructors) {\n-            if (c.getParameterTypes().length < argc) {\n-                argc = c.getParameterTypes().length;\n-                constructor = c;\n-            }\n-        }\n-\n-        if (constructor != null) {\n-            Class<?>[] paramTypes = constructor.getParameterTypes();\n-            Object[] constructorArgs = new Object[paramTypes.length];\n-            for (int i = 0; i < constructorArgs.length; i++) {\n-                constructorArgs[i] = getConstructorArg(paramTypes[i]);\n-            }\n-            try {\n-                ReflectUtils.makeAccessible(constructor);\n-                return constructor.newInstance(constructorArgs);\n-            } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {\n-                LogHelper.warn(logger, e.getMessage(), e);\n-            }\n-        }\n-\n-        return cl.getDeclaredConstructor().newInstance();\n-    }\n-\n-    public static Object getConstructorArg(Class<?> cl) {\n-        if (boolean.class.equals(cl) || Boolean.class.equals(cl)) {\n-            return Boolean.FALSE;\n-        }\n-\n-        if (byte.class.equals(cl) || Byte.class.equals(cl)) {\n-            return (byte) 0;\n-        }\n-\n-        if (short.class.equals(cl) || Short.class.equals(cl)) {\n-            return (short) 0;\n-        }\n-\n-        if (int.class.equals(cl) || Integer.class.equals(cl)) {\n-            return 0;\n-        }\n-\n-        if (long.class.equals(cl) || Long.class.equals(cl)) {\n-            return 0L;\n-        }\n-\n-        if (float.class.equals(cl) || Float.class.equals(cl)) {\n-            return (float) 0;\n-        }\n-\n-        if (double.class.equals(cl) || Double.class.equals(cl)) {\n-            return (double) 0;\n-        }\n-\n-        if (char.class.equals(cl) || Character.class.equals(cl)) {\n-            return (char) 0;\n-        }\n-        return null;\n-    }\n-\n-    private static Object instantiateForDeserialize(JavaBeanDescriptor beanDescriptor, ClassLoader loader,\n-                                                    IdentityHashMap<JavaBeanDescriptor, Object> cache) {\n-        if (cache.containsKey(beanDescriptor)) {\n-            return cache.get(beanDescriptor);\n-        }\n-\n-        if (beanDescriptor.isClassType()) {\n-            try {\n-                return name2Class(loader, beanDescriptor.getClassNameProperty());\n-            } catch (ClassNotFoundException e) {\n-                throw new RuntimeException(e.getMessage(), e);\n-            }\n-        }\n-\n-        if (beanDescriptor.isEnumType()) {\n-            try {\n-                Class<?> enumType = name2Class(loader, beanDescriptor.getClassName());\n-                Method method = getEnumValueOfMethod(enumType);\n-                return method.invoke(null, enumType, beanDescriptor.getEnumPropertyName());\n-            } catch (Exception e) {\n-                throw new RuntimeException(e.getMessage(), e);\n-            }\n-        }\n-\n-        if (beanDescriptor.isPrimitiveType()) {\n-            return beanDescriptor.getPrimitiveProperty();\n-        }\n-\n-        Object result;\n-        if (beanDescriptor.isArrayType()) {\n-            Class<?> componentType;\n-            try {\n-                componentType = name2Class(loader, beanDescriptor.getClassName());\n-            } catch (ClassNotFoundException e) {\n-                throw new RuntimeException(e.getMessage(), e);\n-            }\n-            result = Array.newInstance(componentType, beanDescriptor.propertySize());\n-            cache.put(beanDescriptor, result);\n-        } else {\n-            try {\n-                Class<?> cl = name2Class(loader, beanDescriptor.getClassName());\n-                result = instantiate(cl);\n-                cache.put(beanDescriptor, result);\n-            } catch (Exception e) {\n-                throw new RuntimeException(e.getMessage(), e);\n-            }\n-        }\n-\n-        return result;\n-    }\n-\n-    /**\n-     * Transform the Class.forName String to Class Object.\n-     *\n-     * @param name Class.getName()\n-     * @return Class\n-     * @throws ClassNotFoundException Class.forName\n-     */\n-    public static Class<?> name2Class(ClassLoader loader, String name) throws ClassNotFoundException {\n-        if (TYPES.containsKey(name)) {\n-            return TYPES.get(name);\n-        }\n-        if (isArray(name)) {\n-            int dimension = 0;\n-            while (isArray(name)) {\n-                ++dimension;\n-                name = name.substring(1);\n-            }\n-            Class type = name2Class(loader, name);\n-            int[] dimensions = new int[dimension];\n-            for (int i = 0; i < dimension; i++) {\n-                dimensions[i] = 0;\n-            }\n-            return Array.newInstance(type, dimensions).getClass();\n-        }\n-        if (isReferenceType(name)) {\n-            name = name.substring(1, name.length() - 1);\n-        }\n-        SerializeClassChecker.getInstance().validateClass(name);\n-        return Class.forName(name, false, loader);\n-    }\n-\n-    private static boolean isArray(String type) {\n-        return type != null && type.startsWith(ARRAY_PREFIX);\n-    }\n-\n-    private static boolean isReferenceType(String type) {\n-        return type != null\n-                && type.startsWith(REFERENCE_TYPE_PREFIX)\n-                && type.endsWith(REFERENCE_TYPE_SUFFIX);\n-    }\n-\n-    private static Method getEnumValueOfMethod(Class cl) throws NoSuchMethodException {\n-        return cl.getMethod(\"valueOf\", Class.class, String.class);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.beanutil;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.LogHelper;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.SerializeClassChecker;\r\n+\r\n+import java.lang.reflect.Array;\r\n+import java.lang.reflect.Constructor;\r\n+import java.lang.reflect.Field;\r\n+import java.lang.reflect.InvocationTargetException;\r\n+import java.lang.reflect.Method;\r\n+import java.util.Collection;\r\n+import java.util.HashMap;\r\n+import java.util.IdentityHashMap;\r\n+import java.util.Map;\r\n+\r\n+public final class JavaBeanSerializeUtil {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(JavaBeanSerializeUtil.class);\r\n+    private static final Map<String, Class<?>> TYPES = new HashMap<String, Class<?>>();\r\n+    private static final String ARRAY_PREFIX = \"[\";\r\n+    private static final String REFERENCE_TYPE_PREFIX = \"L\";\r\n+    private static final String REFERENCE_TYPE_SUFFIX = \";\";\r\n+\r\n+    static {\r\n+        TYPES.put(boolean.class.getName(), boolean.class);\r\n+        TYPES.put(byte.class.getName(), byte.class);\r\n+        TYPES.put(short.class.getName(), short.class);\r\n+        TYPES.put(int.class.getName(), int.class);\r\n+        TYPES.put(long.class.getName(), long.class);\r\n+        TYPES.put(float.class.getName(), float.class);\r\n+        TYPES.put(double.class.getName(), double.class);\r\n+        TYPES.put(void.class.getName(), void.class);\r\n+        TYPES.put(\"Z\", boolean.class);\r\n+        TYPES.put(\"B\", byte.class);\r\n+        TYPES.put(\"C\", char.class);\r\n+        TYPES.put(\"D\", double.class);\r\n+        TYPES.put(\"F\", float.class);\r\n+        TYPES.put(\"I\", int.class);\r\n+        TYPES.put(\"J\", long.class);\r\n+        TYPES.put(\"S\", short.class);\r\n+    }\r\n+\r\n+    private JavaBeanSerializeUtil() {\r\n+    }\r\n+\r\n+    public static JavaBeanDescriptor serialize(Object obj) {\r\n+        return serialize(obj, JavaBeanAccessor.FIELD);\r\n+    }\r\n+\r\n+    public static JavaBeanDescriptor serialize(Object obj, JavaBeanAccessor accessor) {\r\n+        if (obj == null) {\r\n+            return null;\r\n+        }\r\n+        if (obj instanceof JavaBeanDescriptor) {\r\n+            return (JavaBeanDescriptor) obj;\r\n+        }\r\n+        IdentityHashMap<Object, JavaBeanDescriptor> cache = new IdentityHashMap<Object, JavaBeanDescriptor>();\r\n+        return createDescriptorIfAbsent(obj, accessor, cache);\r\n+    }\r\n+\r\n+    private static JavaBeanDescriptor createDescriptorForSerialize(Class<?> cl) {\r\n+        if (cl.isEnum()) {\r\n+            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_ENUM);\r\n+        }\r\n+\r\n+        if (cl.isArray()) {\r\n+            return new JavaBeanDescriptor(cl.getComponentType().getName(), JavaBeanDescriptor.TYPE_ARRAY);\r\n+        }\r\n+\r\n+        if (ReflectUtils.isPrimitive(cl)) {\r\n+            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_PRIMITIVE);\r\n+        }\r\n+\r\n+        if (Class.class.equals(cl)) {\r\n+            return new JavaBeanDescriptor(Class.class.getName(), JavaBeanDescriptor.TYPE_CLASS);\r\n+        }\r\n+\r\n+        if (Collection.class.isAssignableFrom(cl)) {\r\n+            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_COLLECTION);\r\n+        }\r\n+\r\n+        if (Map.class.isAssignableFrom(cl)) {\r\n+            return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_MAP);\r\n+        }\r\n+\r\n+        return new JavaBeanDescriptor(cl.getName(), JavaBeanDescriptor.TYPE_BEAN);\r\n+    }\r\n+\r\n+    private static JavaBeanDescriptor createDescriptorIfAbsent(Object obj, JavaBeanAccessor accessor,\r\n+                                                               IdentityHashMap<Object, JavaBeanDescriptor> cache) {\r\n+        if (cache.containsKey(obj)) {\r\n+            return cache.get(obj);\r\n+        }\r\n+\r\n+        if (obj instanceof JavaBeanDescriptor) {\r\n+            return (JavaBeanDescriptor) obj;\r\n+        }\r\n+\r\n+        JavaBeanDescriptor result = createDescriptorForSerialize(obj.getClass());\r\n+        cache.put(obj, result);\r\n+        serializeInternal(result, obj, accessor, cache);\r\n+        return result;\r\n+    }\r\n+\r\n+    private static void serializeInternal(JavaBeanDescriptor descriptor, Object obj, JavaBeanAccessor accessor,\r\n+                                          IdentityHashMap<Object, JavaBeanDescriptor> cache) {\r\n+        if (obj == null || descriptor == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (obj.getClass().isEnum()) {\r\n+            descriptor.setEnumNameProperty(((Enum<?>) obj).name());\r\n+        } else if (ReflectUtils.isPrimitive(obj.getClass())) {\r\n+            descriptor.setPrimitiveProperty(obj);\r\n+        } else if (Class.class.equals(obj.getClass())) {\r\n+            descriptor.setClassNameProperty(((Class<?>) obj).getName());\r\n+        } else if (obj.getClass().isArray()) {\r\n+            int len = Array.getLength(obj);\r\n+            for (int i = 0; i < len; i++) {\r\n+                Object item = Array.get(obj, i);\r\n+                if (item == null) {\r\n+                    descriptor.setProperty(i, null);\r\n+                } else {\r\n+                    JavaBeanDescriptor itemDescriptor = createDescriptorIfAbsent(item, accessor, cache);\r\n+                    descriptor.setProperty(i, itemDescriptor);\r\n+                }\r\n+            }\r\n+        } else if (obj instanceof Collection) {\r\n+            Collection collection = (Collection) obj;\r\n+            int index = 0;\r\n+            for (Object item : collection) {\r\n+                if (item == null) {\r\n+                    descriptor.setProperty(index++, null);\r\n+                } else {\r\n+                    JavaBeanDescriptor itemDescriptor = createDescriptorIfAbsent(item, accessor, cache);\r\n+                    descriptor.setProperty(index++, itemDescriptor);\r\n+                }\r\n+            }\r\n+        } else if (obj instanceof Map) {\r\n+            Map map = (Map) obj;\r\n+            map.forEach((key, value) -> {\r\n+                Object keyDescriptor = key == null ? null : createDescriptorIfAbsent(key, accessor, cache);\r\n+                Object valueDescriptor = value == null ? null : createDescriptorIfAbsent(value, accessor, cache);\r\n+                descriptor.setProperty(keyDescriptor, valueDescriptor);\r\n+            });// ~ end of loop map\r\n+        } else {\r\n+            if (JavaBeanAccessor.isAccessByMethod(accessor)) {\r\n+                Map<String, Method> methods = ReflectUtils.getBeanPropertyReadMethods(obj.getClass());\r\n+                for (Map.Entry<String, Method> entry : methods.entrySet()) {\r\n+                    try {\r\n+                        Object value = entry.getValue().invoke(obj);\r\n+                        if (value == null) {\r\n+                            continue;\r\n+                        }\r\n+                        JavaBeanDescriptor valueDescriptor = createDescriptorIfAbsent(value, accessor, cache);\r\n+                        descriptor.setProperty(entry.getKey(), valueDescriptor);\r\n+                    } catch (Exception e) {\r\n+                        throw new RuntimeException(e.getMessage(), e);\r\n+                    }\r\n+                } // ~ end of loop method map\r\n+            } // ~ end of if (JavaBeanAccessor.isAccessByMethod(accessor))\r\n+\r\n+            if (JavaBeanAccessor.isAccessByField(accessor)) {\r\n+                Map<String, Field> fields = ReflectUtils.getBeanPropertyFields(obj.getClass());\r\n+                for (Map.Entry<String, Field> entry : fields.entrySet()) {\r\n+                    if (!descriptor.containsProperty(entry.getKey())) {\r\n+                        try {\r\n+                            Object value = entry.getValue().get(obj);\r\n+                            if (value == null) {\r\n+                                continue;\r\n+                            }\r\n+                            JavaBeanDescriptor valueDescriptor = createDescriptorIfAbsent(value, accessor, cache);\r\n+                            descriptor.setProperty(entry.getKey(), valueDescriptor);\r\n+                        } catch (Exception e) {\r\n+                            throw new RuntimeException(e.getMessage(), e);\r\n+                        }\r\n+                    }\r\n+                } // ~ end of loop field map\r\n+            } // ~ end of if (JavaBeanAccessor.isAccessByField(accessor))\r\n+\r\n+        } // ~ end of else\r\n+\r\n+    } // ~ end of method serializeInternal\r\n+\r\n+    public static Object deserialize(JavaBeanDescriptor beanDescriptor) {\r\n+        return deserialize(\r\n+                beanDescriptor,\r\n+                Thread.currentThread().getContextClassLoader());\r\n+    }\r\n+\r\n+    public static Object deserialize(JavaBeanDescriptor beanDescriptor, ClassLoader loader) {\r\n+        if (beanDescriptor == null) {\r\n+            return null;\r\n+        }\r\n+        IdentityHashMap<JavaBeanDescriptor, Object> cache = new IdentityHashMap<JavaBeanDescriptor, Object>();\r\n+        Object result = instantiateForDeserialize(beanDescriptor, loader, cache);\r\n+        deserializeInternal(result, beanDescriptor, loader, cache);\r\n+        return result;\r\n+    }\r\n+\r\n+    private static void deserializeInternal(Object result, JavaBeanDescriptor beanDescriptor, ClassLoader loader,\r\n+                                            IdentityHashMap<JavaBeanDescriptor, Object> cache) {\r\n+        if (beanDescriptor.isEnumType() || beanDescriptor.isClassType() || beanDescriptor.isPrimitiveType()) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (beanDescriptor.isArrayType()) {\r\n+            int index = 0;\r\n+            for (Map.Entry<Object, Object> entry : beanDescriptor) {\r\n+                Object item = entry.getValue();\r\n+                if (item instanceof JavaBeanDescriptor) {\r\n+                    JavaBeanDescriptor itemDescriptor = (JavaBeanDescriptor) entry.getValue();\r\n+                    item = instantiateForDeserialize(itemDescriptor, loader, cache);\r\n+                    deserializeInternal(item, itemDescriptor, loader, cache);\r\n+                }\r\n+                Array.set(result, index++, item);\r\n+            }\r\n+        } else if (beanDescriptor.isCollectionType()) {\r\n+            Collection collection = (Collection) result;\r\n+            for (Map.Entry<Object, Object> entry : beanDescriptor) {\r\n+                Object item = entry.getValue();\r\n+                if (item instanceof JavaBeanDescriptor) {\r\n+                    JavaBeanDescriptor itemDescriptor = (JavaBeanDescriptor) entry.getValue();\r\n+                    item = instantiateForDeserialize(itemDescriptor, loader, cache);\r\n+                    deserializeInternal(item, itemDescriptor, loader, cache);\r\n+                }\r\n+                collection.add(item);\r\n+            }\r\n+        } else if (beanDescriptor.isMapType()) {\r\n+            Map map = (Map) result;\r\n+            for (Map.Entry<Object, Object> entry : beanDescriptor) {\r\n+                Object key = entry.getKey();\r\n+                Object value = entry.getValue();\r\n+                if (key instanceof JavaBeanDescriptor) {\r\n+                    JavaBeanDescriptor keyDescriptor = (JavaBeanDescriptor) entry.getKey();\r\n+                    key = instantiateForDeserialize(keyDescriptor, loader, cache);\r\n+                    deserializeInternal(key, keyDescriptor, loader, cache);\r\n+                }\r\n+                if (value instanceof JavaBeanDescriptor) {\r\n+                    JavaBeanDescriptor valueDescriptor = (JavaBeanDescriptor) entry.getValue();\r\n+                    value = instantiateForDeserialize(valueDescriptor, loader, cache);\r\n+                    deserializeInternal(value, valueDescriptor, loader, cache);\r\n+                }\r\n+                map.put(key, value);\r\n+            }\r\n+        } else if (beanDescriptor.isBeanType()) {\r\n+            for (Map.Entry<Object, Object> entry : beanDescriptor) {\r\n+                String property = entry.getKey().toString();\r\n+                Object value = entry.getValue();\r\n+                if (value == null) {\r\n+                    continue;\r\n+                }\r\n+\r\n+                if (value instanceof JavaBeanDescriptor) {\r\n+                    JavaBeanDescriptor valueDescriptor = (JavaBeanDescriptor) entry.getValue();\r\n+                    value = instantiateForDeserialize(valueDescriptor, loader, cache);\r\n+                    deserializeInternal(value, valueDescriptor, loader, cache);\r\n+                }\r\n+\r\n+                Method method = getSetterMethod(result.getClass(), property, value.getClass());\r\n+                boolean setByMethod = false;\r\n+                try {\r\n+                    if (method != null) {\r\n+                        method.invoke(result, value);\r\n+                        setByMethod = true;\r\n+                    }\r\n+                } catch (Exception e) {\r\n+                    LogHelper.warn(logger, \"Failed to set property through method \" + method, e);\r\n+                }\r\n+\r\n+                if (!setByMethod) {\r\n+                    try {\r\n+                        Field field = result.getClass().getField(property);\r\n+                        if (field != null) {\r\n+                            field.set(result, value);\r\n+                        }\r\n+                    } catch (NoSuchFieldException | IllegalAccessException e1) {\r\n+                        LogHelper.warn(logger, \"Failed to set field value\", e1);\r\n+                    }\r\n+                }\r\n+            }\r\n+        } else {\r\n+            throw new IllegalArgumentException(\"Unsupported type \" +\r\n+                    beanDescriptor.getClassName() +\r\n+                    \":\" + beanDescriptor.getType());\r\n+        }\r\n+    }\r\n+\r\n+    private static Method getSetterMethod(Class<?> cls, String property, Class<?> valueCls) {\r\n+        String name = \"set\" + property.substring(0, 1).toUpperCase() + property.substring(1);\r\n+        Method method = null;\r\n+        try {\r\n+            method = cls.getMethod(name, valueCls);\r\n+        } catch (NoSuchMethodException e) {\r\n+            for (Method m : cls.getMethods()) {\r\n+                if (ReflectUtils.isBeanPropertyWriteMethod(m)\r\n+                        && m.getName().equals(name)) {\r\n+                    method = m;\r\n+                }\r\n+            }\r\n+        }\r\n+        if (method != null) {\r\n+            ReflectUtils.makeAccessible(method);\r\n+        }\r\n+        return method;\r\n+    }\r\n+\r\n+    private static Object instantiate(Class<?> cl) throws Exception {\r\n+        Constructor<?>[] constructors = cl.getDeclaredConstructors();\r\n+        Constructor<?> constructor = null;\r\n+        int argc = Integer.MAX_VALUE;\r\n+        for (Constructor<?> c : constructors) {\r\n+            if (c.getParameterTypes().length < argc) {\r\n+                argc = c.getParameterTypes().length;\r\n+                constructor = c;\r\n+            }\r\n+        }\r\n+\r\n+        if (constructor != null) {\r\n+            Class<?>[] paramTypes = constructor.getParameterTypes();\r\n+            Object[] constructorArgs = new Object[paramTypes.length];\r\n+            for (int i = 0; i < constructorArgs.length; i++) {\r\n+                constructorArgs[i] = getConstructorArg(paramTypes[i]);\r\n+            }\r\n+            try {\r\n+                ReflectUtils.makeAccessible(constructor);\r\n+                return constructor.newInstance(constructorArgs);\r\n+            } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {\r\n+                LogHelper.warn(logger, e.getMessage(), e);\r\n+            }\r\n+        }\r\n+\r\n+        return cl.getDeclaredConstructor().newInstance();\r\n+    }\r\n+\r\n+    public static Object getConstructorArg(Class<?> cl) {\r\n+        if (boolean.class.equals(cl) || Boolean.class.equals(cl)) {\r\n+            return Boolean.FALSE;\r\n+        }\r\n+\r\n+        if (byte.class.equals(cl) || Byte.class.equals(cl)) {\r\n+            return (byte) 0;\r\n+        }\r\n+\r\n+        if (short.class.equals(cl) || Short.class.equals(cl)) {\r\n+            return (short) 0;\r\n+        }\r\n+\r\n+        if (int.class.equals(cl) || Integer.class.equals(cl)) {\r\n+            return 0;\r\n+        }\r\n+\r\n+        if (long.class.equals(cl) || Long.class.equals(cl)) {\r\n+            return 0L;\r\n+        }\r\n+\r\n+        if (float.class.equals(cl) || Float.class.equals(cl)) {\r\n+            return (float) 0;\r\n+        }\r\n+\r\n+        if (double.class.equals(cl) || Double.class.equals(cl)) {\r\n+            return (double) 0;\r\n+        }\r\n+\r\n+        if (char.class.equals(cl) || Character.class.equals(cl)) {\r\n+            return (char) 0;\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    private static Object instantiateForDeserialize(JavaBeanDescriptor beanDescriptor, ClassLoader loader,\r\n+                                                    IdentityHashMap<JavaBeanDescriptor, Object> cache) {\r\n+        if (cache.containsKey(beanDescriptor)) {\r\n+            return cache.get(beanDescriptor);\r\n+        }\r\n+\r\n+        if (beanDescriptor.isClassType()) {\r\n+            try {\r\n+                return name2Class(loader, beanDescriptor.getClassNameProperty());\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new RuntimeException(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+\r\n+        if (beanDescriptor.isEnumType()) {\r\n+            try {\r\n+                Class<?> enumType = name2Class(loader, beanDescriptor.getClassName());\r\n+                Method method = getEnumValueOfMethod(enumType);\r\n+                return method.invoke(null, enumType, beanDescriptor.getEnumPropertyName());\r\n+            } catch (Exception e) {\r\n+                throw new RuntimeException(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+\r\n+        if (beanDescriptor.isPrimitiveType()) {\r\n+            return beanDescriptor.getPrimitiveProperty();\r\n+        }\r\n+\r\n+        Object result;\r\n+        if (beanDescriptor.isArrayType()) {\r\n+            Class<?> componentType;\r\n+            try {\r\n+                componentType = name2Class(loader, beanDescriptor.getClassName());\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new RuntimeException(e.getMessage(), e);\r\n+            }\r\n+            result = Array.newInstance(componentType, beanDescriptor.propertySize());\r\n+            cache.put(beanDescriptor, result);\r\n+        } else {\r\n+            try {\r\n+                Class<?> cl = name2Class(loader, beanDescriptor.getClassName());\r\n+                result = instantiate(cl);\r\n+                cache.put(beanDescriptor, result);\r\n+            } catch (Exception e) {\r\n+                throw new RuntimeException(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+\r\n+        return result;\r\n+    }\r\n+\r\n+    /**\r\n+     * Transform the Class.forName String to Class Object.\r\n+     *\r\n+     * @param name Class.getName()\r\n+     * @return Class\r\n+     * @throws ClassNotFoundException Class.forName\r\n+     */\r\n+    public static Class<?> name2Class(ClassLoader loader, String name) throws ClassNotFoundException {\r\n+        if (TYPES.containsKey(name)) {\r\n+            return TYPES.get(name);\r\n+        }\r\n+        if (isArray(name)) {\r\n+            int dimension = 0;\r\n+            while (isArray(name)) {\r\n+                ++dimension;\r\n+                name = name.substring(1);\r\n+            }\r\n+            Class type = name2Class(loader, name);\r\n+            int[] dimensions = new int[dimension];\r\n+            for (int i = 0; i < dimension; i++) {\r\n+                dimensions[i] = 0;\r\n+            }\r\n+            return Array.newInstance(type, dimensions).getClass();\r\n+        }\r\n+        if (isReferenceType(name)) {\r\n+            name = name.substring(1, name.length() - 1);\r\n+        }\r\n+        SerializeClassChecker.getInstance().validateClass(name);\r\n+        return Class.forName(name, false, loader);\r\n+    }\r\n+\r\n+    private static boolean isArray(String type) {\r\n+        return type != null && type.startsWith(ARRAY_PREFIX);\r\n+    }\r\n+\r\n+    private static boolean isReferenceType(String type) {\r\n+        return type != null\r\n+                && type.startsWith(REFERENCE_TYPE_PREFIX)\r\n+                && type.endsWith(REFERENCE_TYPE_SUFFIX);\r\n+    }\r\n+\r\n+    private static Method getEnumValueOfMethod(Class cl) throws NoSuchMethodException {\r\n+        return cl.getMethod(\"valueOf\", Class.class, String.class);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/bytecode/ClassGenerator.java", "source2": "org/apache/dubbo/common/bytecode/ClassGenerator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,388 +1,388 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.bytecode;\n-\n-import org.apache.dubbo.common.utils.ArrayUtils;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import javassist.CannotCompileException;\n-import javassist.ClassPool;\n-import javassist.CtClass;\n-import javassist.CtConstructor;\n-import javassist.CtField;\n-import javassist.CtMethod;\n-import javassist.CtNewConstructor;\n-import javassist.CtNewMethod;\n-import javassist.NotFoundException;\n-\n-import java.lang.reflect.Constructor;\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.security.ProtectionDomain;\n-import java.util.ArrayList;\n-import java.util.HashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.atomic.AtomicLong;\n-\n-/**\n- * ClassGenerator\n- */\n-public final class ClassGenerator {\n-\n-    private static final AtomicLong CLASS_NAME_COUNTER = new AtomicLong(0);\n-    private static final String SIMPLE_NAME_TAG = \"<init>\";\n-    private static final Map<ClassLoader, ClassPool> POOL_MAP = new ConcurrentHashMap<ClassLoader, ClassPool>(); //ClassLoader - ClassPool\n-    private ClassPool mPool;\n-    private CtClass mCtc;\n-    private String mClassName;\n-    private String mSuperClass;\n-    private Set<String> mInterfaces;\n-    private List<String> mFields;\n-    private List<String> mConstructors;\n-    private List<String> mMethods;\n-    private Map<String, Method> mCopyMethods; // <method desc,method instance>\n-    private Map<String, Constructor<?>> mCopyConstructors; // <constructor desc,constructor instance>\n-    private boolean mDefaultConstructor = false;\n-\n-    private ClassGenerator() {\n-    }\n-\n-    private ClassGenerator(ClassPool pool) {\n-        mPool = pool;\n-    }\n-\n-    public static ClassGenerator newInstance() {\n-        return new ClassGenerator(getClassPool(Thread.currentThread().getContextClassLoader()));\n-    }\n-\n-    public static ClassGenerator newInstance(ClassLoader loader) {\n-        return new ClassGenerator(getClassPool(loader));\n-    }\n-\n-    public static boolean isDynamicClass(Class<?> cl) {\n-        return ClassGenerator.DC.class.isAssignableFrom(cl);\n-    }\n-\n-    public static ClassPool getClassPool(ClassLoader loader) {\n-        if (loader == null) {\n-            return ClassPool.getDefault();\n-        }\n-\n-        ClassPool pool = POOL_MAP.get(loader);\n-        if (pool == null) {\n-            pool = new ClassPool(true);\n-            pool.appendClassPath(new CustomizedLoaderClassPath(loader));\n-            POOL_MAP.put(loader, pool);\n-        }\n-        return pool;\n-    }\n-\n-    private static String modifier(int mod) {\n-        StringBuilder modifier = new StringBuilder();\n-        if (Modifier.isPublic(mod)) {\n-            modifier.append(\"public\");\n-        } else if (Modifier.isProtected(mod)) {\n-            modifier.append(\"protected\");\n-        } else if (Modifier.isPrivate(mod)) {\n-            modifier.append(\"private\");\n-        }\n-\n-        if (Modifier.isStatic(mod)) {\n-            modifier.append(\" static\");\n-        }\n-        if (Modifier.isVolatile(mod)) {\n-            modifier.append(\" volatile\");\n-        }\n-\n-        return modifier.toString();\n-    }\n-\n-    public String getClassName() {\n-        return mClassName;\n-    }\n-\n-    public ClassGenerator setClassName(String name) {\n-        mClassName = name;\n-        return this;\n-    }\n-\n-    public ClassGenerator addInterface(String cn) {\n-        if (mInterfaces == null) {\n-            mInterfaces = new HashSet<String>();\n-        }\n-        mInterfaces.add(cn);\n-        return this;\n-    }\n-\n-    public ClassGenerator addInterface(Class<?> cl) {\n-        return addInterface(cl.getName());\n-    }\n-\n-    public ClassGenerator setSuperClass(String cn) {\n-        mSuperClass = cn;\n-        return this;\n-    }\n-\n-    public ClassGenerator setSuperClass(Class<?> cl) {\n-        mSuperClass = cl.getName();\n-        return this;\n-    }\n-\n-    public ClassGenerator addField(String code) {\n-        if (mFields == null) {\n-            mFields = new ArrayList<String>();\n-        }\n-        mFields.add(code);\n-        return this;\n-    }\n-\n-    public ClassGenerator addField(String name, int mod, Class<?> type) {\n-        return addField(name, mod, type, null);\n-    }\n-\n-    public ClassGenerator addField(String name, int mod, Class<?> type, String def) {\n-        StringBuilder sb = new StringBuilder();\n-        sb.append(modifier(mod)).append(' ').append(ReflectUtils.getName(type)).append(' ');\n-        sb.append(name);\n-        if (StringUtils.isNotEmpty(def)) {\n-            sb.append('=');\n-            sb.append(def);\n-        }\n-        sb.append(';');\n-        return addField(sb.toString());\n-    }\n-\n-    public ClassGenerator addMethod(String code) {\n-        if (mMethods == null) {\n-            mMethods = new ArrayList<String>();\n-        }\n-        mMethods.add(code);\n-        return this;\n-    }\n-\n-    public ClassGenerator addMethod(String name, int mod, Class<?> rt, Class<?>[] pts, String body) {\n-        return addMethod(name, mod, rt, pts, null, body);\n-    }\n-\n-    public ClassGenerator addMethod(String name, int mod, Class<?> rt, Class<?>[] pts, Class<?>[] ets,\n-                                    String body) {\n-        StringBuilder sb = new StringBuilder();\n-        sb.append(modifier(mod)).append(' ').append(ReflectUtils.getName(rt)).append(' ').append(name);\n-        sb.append('(');\n-        for (int i = 0; i < pts.length; i++) {\n-            if (i > 0) {\n-                sb.append(',');\n-            }\n-            sb.append(ReflectUtils.getName(pts[i]));\n-            sb.append(\" arg\").append(i);\n-        }\n-        sb.append(')');\n-        if (ArrayUtils.isNotEmpty(ets)) {\n-            sb.append(\" throws \");\n-            for (int i = 0; i < ets.length; i++) {\n-                if (i > 0) {\n-                    sb.append(',');\n-                }\n-                sb.append(ReflectUtils.getName(ets[i]));\n-            }\n-        }\n-        sb.append('{').append(body).append('}');\n-        return addMethod(sb.toString());\n-    }\n-\n-    public ClassGenerator addMethod(Method m) {\n-        addMethod(m.getName(), m);\n-        return this;\n-    }\n-\n-    public ClassGenerator addMethod(String name, Method m) {\n-        String desc = name + ReflectUtils.getDescWithoutMethodName(m);\n-        addMethod(':' + desc);\n-        if (mCopyMethods == null) {\n-            mCopyMethods = new ConcurrentHashMap<String, Method>(8);\n-        }\n-        mCopyMethods.put(desc, m);\n-        return this;\n-    }\n-\n-    public ClassGenerator addConstructor(String code) {\n-        if (mConstructors == null) {\n-            mConstructors = new LinkedList<String>();\n-        }\n-        mConstructors.add(code);\n-        return this;\n-    }\n-\n-    public ClassGenerator addConstructor(int mod, Class<?>[] pts, String body) {\n-        return addConstructor(mod, pts, null, body);\n-    }\n-\n-    public ClassGenerator addConstructor(int mod, Class<?>[] pts, Class<?>[] ets, String body) {\n-        StringBuilder sb = new StringBuilder();\n-        sb.append(modifier(mod)).append(' ').append(SIMPLE_NAME_TAG);\n-        sb.append('(');\n-        for (int i = 0; i < pts.length; i++) {\n-            if (i > 0) {\n-                sb.append(',');\n-            }\n-            sb.append(ReflectUtils.getName(pts[i]));\n-            sb.append(\" arg\").append(i);\n-        }\n-        sb.append(')');\n-        if (ArrayUtils.isNotEmpty(ets)) {\n-            sb.append(\" throws \");\n-            for (int i = 0; i < ets.length; i++) {\n-                if (i > 0) {\n-                    sb.append(',');\n-                }\n-                sb.append(ReflectUtils.getName(ets[i]));\n-            }\n-        }\n-        sb.append('{').append(body).append('}');\n-        return addConstructor(sb.toString());\n-    }\n-\n-    public ClassGenerator addConstructor(Constructor<?> c) {\n-        String desc = ReflectUtils.getDesc(c);\n-        addConstructor(\":\" + desc);\n-        if (mCopyConstructors == null) {\n-            mCopyConstructors = new ConcurrentHashMap<String, Constructor<?>>(4);\n-        }\n-        mCopyConstructors.put(desc, c);\n-        return this;\n-    }\n-\n-    public ClassGenerator addDefaultConstructor() {\n-        mDefaultConstructor = true;\n-        return this;\n-    }\n-\n-    public ClassPool getClassPool() {\n-        return mPool;\n-    }\n-\n-    public Class<?> toClass() {\n-        return toClass(ClassUtils.getClassLoader(ClassGenerator.class),\n-                getClass().getProtectionDomain());\n-    }\n-\n-    public Class<?> toClass(ClassLoader loader, ProtectionDomain pd) {\n-        if (mCtc != null) {\n-            mCtc.detach();\n-        }\n-        long id = CLASS_NAME_COUNTER.getAndIncrement();\n-        try {\n-            CtClass ctcs = mSuperClass == null ? null : mPool.get(mSuperClass);\n-            if (mClassName == null) {\n-                mClassName = (mSuperClass == null || javassist.Modifier.isPublic(ctcs.getModifiers())\n-                        ? ClassGenerator.class.getName() : mSuperClass + \"$sc\") + id;\n-            }\n-            mCtc = mPool.makeClass(mClassName);\n-            if (mSuperClass != null) {\n-                mCtc.setSuperclass(ctcs);\n-            }\n-            mCtc.addInterface(mPool.get(DC.class.getName())); // add dynamic class tag.\n-            if (mInterfaces != null) {\n-                for (String cl : mInterfaces) {\n-                    mCtc.addInterface(mPool.get(cl));\n-                }\n-            }\n-            if (mFields != null) {\n-                for (String code : mFields) {\n-                    mCtc.addField(CtField.make(code, mCtc));\n-                }\n-            }\n-            if (mMethods != null) {\n-                for (String code : mMethods) {\n-                    if (code.charAt(0) == ':') {\n-                        mCtc.addMethod(CtNewMethod.copy(getCtMethod(mCopyMethods.get(code.substring(1))),\n-                                code.substring(1, code.indexOf('(')), mCtc, null));\n-                    } else {\n-                        mCtc.addMethod(CtNewMethod.make(code, mCtc));\n-                    }\n-                }\n-            }\n-            if (mDefaultConstructor) {\n-                mCtc.addConstructor(CtNewConstructor.defaultConstructor(mCtc));\n-            }\n-            if (mConstructors != null) {\n-                for (String code : mConstructors) {\n-                    if (code.charAt(0) == ':') {\n-                        mCtc.addConstructor(CtNewConstructor\n-                                .copy(getCtConstructor(mCopyConstructors.get(code.substring(1))), mCtc, null));\n-                    } else {\n-                        String[] sn = mCtc.getSimpleName().split(\"\\\\$+\"); // inner class name include $.\n-                        mCtc.addConstructor(\n-                                CtNewConstructor.make(code.replaceFirst(SIMPLE_NAME_TAG, sn[sn.length - 1]), mCtc));\n-                    }\n-                }\n-            }\n-            return mCtc.toClass(loader, pd);\n-        } catch (RuntimeException e) {\n-            throw e;\n-        } catch (NotFoundException | CannotCompileException e) {\n-            throw new RuntimeException(e.getMessage(), e);\n-        }\n-    }\n-\n-    public void release() {\n-        if (mCtc != null) {\n-            mCtc.detach();\n-        }\n-        if (mInterfaces != null) {\n-            mInterfaces.clear();\n-        }\n-        if (mFields != null) {\n-            mFields.clear();\n-        }\n-        if (mMethods != null) {\n-            mMethods.clear();\n-        }\n-        if (mConstructors != null) {\n-            mConstructors.clear();\n-        }\n-        if (mCopyMethods != null) {\n-            mCopyMethods.clear();\n-        }\n-        if (mCopyConstructors != null) {\n-            mCopyConstructors.clear();\n-        }\n-    }\n-\n-    private CtClass getCtClass(Class<?> c) throws NotFoundException {\n-        return mPool.get(c.getName());\n-    }\n-\n-    private CtMethod getCtMethod(Method m) throws NotFoundException {\n-        return getCtClass(m.getDeclaringClass())\n-                .getMethod(m.getName(), ReflectUtils.getDescWithoutMethodName(m));\n-    }\n-\n-    private CtConstructor getCtConstructor(Constructor<?> c) throws NotFoundException {\n-        return getCtClass(c.getDeclaringClass()).getConstructor(ReflectUtils.getDesc(c));\n-    }\n-\n-    public static interface DC {\n-\n-    } // dynamic class tag interface.\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.bytecode;\r\n+\r\n+import org.apache.dubbo.common.utils.ArrayUtils;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import javassist.CannotCompileException;\r\n+import javassist.ClassPool;\r\n+import javassist.CtClass;\r\n+import javassist.CtConstructor;\r\n+import javassist.CtField;\r\n+import javassist.CtMethod;\r\n+import javassist.CtNewConstructor;\r\n+import javassist.CtNewMethod;\r\n+import javassist.NotFoundException;\r\n+\r\n+import java.lang.reflect.Constructor;\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.security.ProtectionDomain;\r\n+import java.util.ArrayList;\r\n+import java.util.HashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.atomic.AtomicLong;\r\n+\r\n+/**\r\n+ * ClassGenerator\r\n+ */\r\n+public final class ClassGenerator {\r\n+\r\n+    private static final AtomicLong CLASS_NAME_COUNTER = new AtomicLong(0);\r\n+    private static final String SIMPLE_NAME_TAG = \"<init>\";\r\n+    private static final Map<ClassLoader, ClassPool> POOL_MAP = new ConcurrentHashMap<ClassLoader, ClassPool>(); //ClassLoader - ClassPool\r\n+    private ClassPool mPool;\r\n+    private CtClass mCtc;\r\n+    private String mClassName;\r\n+    private String mSuperClass;\r\n+    private Set<String> mInterfaces;\r\n+    private List<String> mFields;\r\n+    private List<String> mConstructors;\r\n+    private List<String> mMethods;\r\n+    private Map<String, Method> mCopyMethods; // <method desc,method instance>\r\n+    private Map<String, Constructor<?>> mCopyConstructors; // <constructor desc,constructor instance>\r\n+    private boolean mDefaultConstructor = false;\r\n+\r\n+    private ClassGenerator() {\r\n+    }\r\n+\r\n+    private ClassGenerator(ClassPool pool) {\r\n+        mPool = pool;\r\n+    }\r\n+\r\n+    public static ClassGenerator newInstance() {\r\n+        return new ClassGenerator(getClassPool(Thread.currentThread().getContextClassLoader()));\r\n+    }\r\n+\r\n+    public static ClassGenerator newInstance(ClassLoader loader) {\r\n+        return new ClassGenerator(getClassPool(loader));\r\n+    }\r\n+\r\n+    public static boolean isDynamicClass(Class<?> cl) {\r\n+        return ClassGenerator.DC.class.isAssignableFrom(cl);\r\n+    }\r\n+\r\n+    public static ClassPool getClassPool(ClassLoader loader) {\r\n+        if (loader == null) {\r\n+            return ClassPool.getDefault();\r\n+        }\r\n+\r\n+        ClassPool pool = POOL_MAP.get(loader);\r\n+        if (pool == null) {\r\n+            pool = new ClassPool(true);\r\n+            pool.appendClassPath(new CustomizedLoaderClassPath(loader));\r\n+            POOL_MAP.put(loader, pool);\r\n+        }\r\n+        return pool;\r\n+    }\r\n+\r\n+    private static String modifier(int mod) {\r\n+        StringBuilder modifier = new StringBuilder();\r\n+        if (Modifier.isPublic(mod)) {\r\n+            modifier.append(\"public\");\r\n+        } else if (Modifier.isProtected(mod)) {\r\n+            modifier.append(\"protected\");\r\n+        } else if (Modifier.isPrivate(mod)) {\r\n+            modifier.append(\"private\");\r\n+        }\r\n+\r\n+        if (Modifier.isStatic(mod)) {\r\n+            modifier.append(\" static\");\r\n+        }\r\n+        if (Modifier.isVolatile(mod)) {\r\n+            modifier.append(\" volatile\");\r\n+        }\r\n+\r\n+        return modifier.toString();\r\n+    }\r\n+\r\n+    public String getClassName() {\r\n+        return mClassName;\r\n+    }\r\n+\r\n+    public ClassGenerator setClassName(String name) {\r\n+        mClassName = name;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addInterface(String cn) {\r\n+        if (mInterfaces == null) {\r\n+            mInterfaces = new HashSet<String>();\r\n+        }\r\n+        mInterfaces.add(cn);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addInterface(Class<?> cl) {\r\n+        return addInterface(cl.getName());\r\n+    }\r\n+\r\n+    public ClassGenerator setSuperClass(String cn) {\r\n+        mSuperClass = cn;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator setSuperClass(Class<?> cl) {\r\n+        mSuperClass = cl.getName();\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addField(String code) {\r\n+        if (mFields == null) {\r\n+            mFields = new ArrayList<String>();\r\n+        }\r\n+        mFields.add(code);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addField(String name, int mod, Class<?> type) {\r\n+        return addField(name, mod, type, null);\r\n+    }\r\n+\r\n+    public ClassGenerator addField(String name, int mod, Class<?> type, String def) {\r\n+        StringBuilder sb = new StringBuilder();\r\n+        sb.append(modifier(mod)).append(' ').append(ReflectUtils.getName(type)).append(' ');\r\n+        sb.append(name);\r\n+        if (StringUtils.isNotEmpty(def)) {\r\n+            sb.append('=');\r\n+            sb.append(def);\r\n+        }\r\n+        sb.append(';');\r\n+        return addField(sb.toString());\r\n+    }\r\n+\r\n+    public ClassGenerator addMethod(String code) {\r\n+        if (mMethods == null) {\r\n+            mMethods = new ArrayList<String>();\r\n+        }\r\n+        mMethods.add(code);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addMethod(String name, int mod, Class<?> rt, Class<?>[] pts, String body) {\r\n+        return addMethod(name, mod, rt, pts, null, body);\r\n+    }\r\n+\r\n+    public ClassGenerator addMethod(String name, int mod, Class<?> rt, Class<?>[] pts, Class<?>[] ets,\r\n+                                    String body) {\r\n+        StringBuilder sb = new StringBuilder();\r\n+        sb.append(modifier(mod)).append(' ').append(ReflectUtils.getName(rt)).append(' ').append(name);\r\n+        sb.append('(');\r\n+        for (int i = 0; i < pts.length; i++) {\r\n+            if (i > 0) {\r\n+                sb.append(',');\r\n+            }\r\n+            sb.append(ReflectUtils.getName(pts[i]));\r\n+            sb.append(\" arg\").append(i);\r\n+        }\r\n+        sb.append(')');\r\n+        if (ArrayUtils.isNotEmpty(ets)) {\r\n+            sb.append(\" throws \");\r\n+            for (int i = 0; i < ets.length; i++) {\r\n+                if (i > 0) {\r\n+                    sb.append(',');\r\n+                }\r\n+                sb.append(ReflectUtils.getName(ets[i]));\r\n+            }\r\n+        }\r\n+        sb.append('{').append(body).append('}');\r\n+        return addMethod(sb.toString());\r\n+    }\r\n+\r\n+    public ClassGenerator addMethod(Method m) {\r\n+        addMethod(m.getName(), m);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addMethod(String name, Method m) {\r\n+        String desc = name + ReflectUtils.getDescWithoutMethodName(m);\r\n+        addMethod(':' + desc);\r\n+        if (mCopyMethods == null) {\r\n+            mCopyMethods = new ConcurrentHashMap<String, Method>(8);\r\n+        }\r\n+        mCopyMethods.put(desc, m);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addConstructor(String code) {\r\n+        if (mConstructors == null) {\r\n+            mConstructors = new LinkedList<String>();\r\n+        }\r\n+        mConstructors.add(code);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addConstructor(int mod, Class<?>[] pts, String body) {\r\n+        return addConstructor(mod, pts, null, body);\r\n+    }\r\n+\r\n+    public ClassGenerator addConstructor(int mod, Class<?>[] pts, Class<?>[] ets, String body) {\r\n+        StringBuilder sb = new StringBuilder();\r\n+        sb.append(modifier(mod)).append(' ').append(SIMPLE_NAME_TAG);\r\n+        sb.append('(');\r\n+        for (int i = 0; i < pts.length; i++) {\r\n+            if (i > 0) {\r\n+                sb.append(',');\r\n+            }\r\n+            sb.append(ReflectUtils.getName(pts[i]));\r\n+            sb.append(\" arg\").append(i);\r\n+        }\r\n+        sb.append(')');\r\n+        if (ArrayUtils.isNotEmpty(ets)) {\r\n+            sb.append(\" throws \");\r\n+            for (int i = 0; i < ets.length; i++) {\r\n+                if (i > 0) {\r\n+                    sb.append(',');\r\n+                }\r\n+                sb.append(ReflectUtils.getName(ets[i]));\r\n+            }\r\n+        }\r\n+        sb.append('{').append(body).append('}');\r\n+        return addConstructor(sb.toString());\r\n+    }\r\n+\r\n+    public ClassGenerator addConstructor(Constructor<?> c) {\r\n+        String desc = ReflectUtils.getDesc(c);\r\n+        addConstructor(\":\" + desc);\r\n+        if (mCopyConstructors == null) {\r\n+            mCopyConstructors = new ConcurrentHashMap<String, Constructor<?>>(4);\r\n+        }\r\n+        mCopyConstructors.put(desc, c);\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassGenerator addDefaultConstructor() {\r\n+        mDefaultConstructor = true;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ClassPool getClassPool() {\r\n+        return mPool;\r\n+    }\r\n+\r\n+    public Class<?> toClass() {\r\n+        return toClass(ClassUtils.getClassLoader(ClassGenerator.class),\r\n+                getClass().getProtectionDomain());\r\n+    }\r\n+\r\n+    public Class<?> toClass(ClassLoader loader, ProtectionDomain pd) {\r\n+        if (mCtc != null) {\r\n+            mCtc.detach();\r\n+        }\r\n+        long id = CLASS_NAME_COUNTER.getAndIncrement();\r\n+        try {\r\n+            CtClass ctcs = mSuperClass == null ? null : mPool.get(mSuperClass);\r\n+            if (mClassName == null) {\r\n+                mClassName = (mSuperClass == null || javassist.Modifier.isPublic(ctcs.getModifiers())\r\n+                        ? ClassGenerator.class.getName() : mSuperClass + \"$sc\") + id;\r\n+            }\r\n+            mCtc = mPool.makeClass(mClassName);\r\n+            if (mSuperClass != null) {\r\n+                mCtc.setSuperclass(ctcs);\r\n+            }\r\n+            mCtc.addInterface(mPool.get(DC.class.getName())); // add dynamic class tag.\r\n+            if (mInterfaces != null) {\r\n+                for (String cl : mInterfaces) {\r\n+                    mCtc.addInterface(mPool.get(cl));\r\n+                }\r\n+            }\r\n+            if (mFields != null) {\r\n+                for (String code : mFields) {\r\n+                    mCtc.addField(CtField.make(code, mCtc));\r\n+                }\r\n+            }\r\n+            if (mMethods != null) {\r\n+                for (String code : mMethods) {\r\n+                    if (code.charAt(0) == ':') {\r\n+                        mCtc.addMethod(CtNewMethod.copy(getCtMethod(mCopyMethods.get(code.substring(1))),\r\n+                                code.substring(1, code.indexOf('(')), mCtc, null));\r\n+                    } else {\r\n+                        mCtc.addMethod(CtNewMethod.make(code, mCtc));\r\n+                    }\r\n+                }\r\n+            }\r\n+            if (mDefaultConstructor) {\r\n+                mCtc.addConstructor(CtNewConstructor.defaultConstructor(mCtc));\r\n+            }\r\n+            if (mConstructors != null) {\r\n+                for (String code : mConstructors) {\r\n+                    if (code.charAt(0) == ':') {\r\n+                        mCtc.addConstructor(CtNewConstructor\r\n+                                .copy(getCtConstructor(mCopyConstructors.get(code.substring(1))), mCtc, null));\r\n+                    } else {\r\n+                        String[] sn = mCtc.getSimpleName().split(\"\\\\$+\"); // inner class name include $.\r\n+                        mCtc.addConstructor(\r\n+                                CtNewConstructor.make(code.replaceFirst(SIMPLE_NAME_TAG, sn[sn.length - 1]), mCtc));\r\n+                    }\r\n+                }\r\n+            }\r\n+            return mCtc.toClass(loader, pd);\r\n+        } catch (RuntimeException e) {\r\n+            throw e;\r\n+        } catch (NotFoundException | CannotCompileException e) {\r\n+            throw new RuntimeException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public void release() {\r\n+        if (mCtc != null) {\r\n+            mCtc.detach();\r\n+        }\r\n+        if (mInterfaces != null) {\r\n+            mInterfaces.clear();\r\n+        }\r\n+        if (mFields != null) {\r\n+            mFields.clear();\r\n+        }\r\n+        if (mMethods != null) {\r\n+            mMethods.clear();\r\n+        }\r\n+        if (mConstructors != null) {\r\n+            mConstructors.clear();\r\n+        }\r\n+        if (mCopyMethods != null) {\r\n+            mCopyMethods.clear();\r\n+        }\r\n+        if (mCopyConstructors != null) {\r\n+            mCopyConstructors.clear();\r\n+        }\r\n+    }\r\n+\r\n+    private CtClass getCtClass(Class<?> c) throws NotFoundException {\r\n+        return mPool.get(c.getName());\r\n+    }\r\n+\r\n+    private CtMethod getCtMethod(Method m) throws NotFoundException {\r\n+        return getCtClass(m.getDeclaringClass())\r\n+                .getMethod(m.getName(), ReflectUtils.getDescWithoutMethodName(m));\r\n+    }\r\n+\r\n+    private CtConstructor getCtConstructor(Constructor<?> c) throws NotFoundException {\r\n+        return getCtClass(c.getDeclaringClass()).getConstructor(ReflectUtils.getDesc(c));\r\n+    }\r\n+\r\n+    public static interface DC {\r\n+\r\n+    } // dynamic class tag interface.\r\n }\n"}, {"source1": "org/apache/dubbo/common/bytecode/CustomizedLoaderClassPath.java", "source2": "org/apache/dubbo/common/bytecode/CustomizedLoaderClassPath.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,105 +1,105 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.bytecode;\n-\n-import javassist.ClassPath;\n-\n-import java.io.InputStream;\n-import java.lang.ref.WeakReference;\n-import java.net.URL;\n-\n-/**\n- * A class search-path representing a class loader.\n- *\n- * <p>It is used for obtaining a class file from the given\n- * class loader by <code>getResourceAsStream()</code>.\n- * The <code>LoaderClassPath</code> refers to the class loader through\n- * <code>WeakReference</code>.  If the class loader is garbage collected,\n- * the other search pathes are examined.\n- *\n- * <p>The given class loader must have both <code>getResourceAsStream()</code>\n- * and <code>getResource()</code>.\n- *\n- * @author <a href=\"mailto:bill@jboss.org\">Bill Burke</a>\n- * @author Shigeru Chiba\n- */\n-public class CustomizedLoaderClassPath implements ClassPath {\n-    private WeakReference clref;\n-\n-    /**\n-     * Creates a search path representing a class loader.\n-     */\n-    public CustomizedLoaderClassPath(ClassLoader cl) {\n-        clref = new WeakReference(cl);\n-    }\n-\n-    public String toString() {\n-        Object cl = null;\n-        if (clref != null) {\n-            cl = clref.get();\n-        }\n-\n-        return cl == null ? \"<null>\" : cl.toString();\n-    }\n-\n-    /**\n-     * Obtains a class file from the class loader.\n-     * This method calls <code>getResourceAsStream(String)</code>\n-     * on the class loader.\n-     */\n-    public InputStream openClassfile(String classname) {\n-        String cname = classname.replace('.', '/') + \".class\";\n-        ClassLoader cl = (ClassLoader) clref.get();\n-        if (cl == null) {\n-            return null;        // not found\n-        } else {\n-            InputStream result = cl.getResourceAsStream(cname);\n-            if (result == null && (cl != this.getClass().getClassLoader())) {\n-                return this.getClass().getClassLoader().getResourceAsStream(cname);\n-            }\n-            return result;\n-        }\n-    }\n-\n-    /**\n-     * Obtains the URL of the specified class file.\n-     * This method calls <code>getResource(String)</code>\n-     * on the class loader.\n-     *\n-     * @return null if the class file could not be found.\n-     */\n-    public URL find(String classname) {\n-        String cname = classname.replace('.', '/') + \".class\";\n-        ClassLoader cl = (ClassLoader) clref.get();\n-        if (cl == null) {\n-            return null;        // not found\n-        } else {\n-            URL url = cl.getResource(cname);\n-            if (url == null && (cl != this.getClass().getClassLoader())) {\n-                return this.getClass().getClassLoader().getResource(cname);\n-            }\n-            return url;\n-        }\n-    }\n-\n-    /**\n-     * Closes this class path.\n-     */\n-    public void close() {\n-        clref = null;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.bytecode;\r\n+\r\n+import javassist.ClassPath;\r\n+\r\n+import java.io.InputStream;\r\n+import java.lang.ref.WeakReference;\r\n+import java.net.URL;\r\n+\r\n+/**\r\n+ * A class search-path representing a class loader.\r\n+ *\r\n+ * <p>It is used for obtaining a class file from the given\r\n+ * class loader by <code>getResourceAsStream()</code>.\r\n+ * The <code>LoaderClassPath</code> refers to the class loader through\r\n+ * <code>WeakReference</code>.  If the class loader is garbage collected,\r\n+ * the other search pathes are examined.\r\n+ *\r\n+ * <p>The given class loader must have both <code>getResourceAsStream()</code>\r\n+ * and <code>getResource()</code>.\r\n+ *\r\n+ * @author <a href=\"mailto:bill@jboss.org\">Bill Burke</a>\r\n+ * @author Shigeru Chiba\r\n+ */\r\n+public class CustomizedLoaderClassPath implements ClassPath {\r\n+    private WeakReference clref;\r\n+\r\n+    /**\r\n+     * Creates a search path representing a class loader.\r\n+     */\r\n+    public CustomizedLoaderClassPath(ClassLoader cl) {\r\n+        clref = new WeakReference(cl);\r\n+    }\r\n+\r\n+    public String toString() {\r\n+        Object cl = null;\r\n+        if (clref != null) {\r\n+            cl = clref.get();\r\n+        }\r\n+\r\n+        return cl == null ? \"<null>\" : cl.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * Obtains a class file from the class loader.\r\n+     * This method calls <code>getResourceAsStream(String)</code>\r\n+     * on the class loader.\r\n+     */\r\n+    public InputStream openClassfile(String classname) {\r\n+        String cname = classname.replace('.', '/') + \".class\";\r\n+        ClassLoader cl = (ClassLoader) clref.get();\r\n+        if (cl == null) {\r\n+            return null;        // not found\r\n+        } else {\r\n+            InputStream result = cl.getResourceAsStream(cname);\r\n+            if (result == null && (cl != this.getClass().getClassLoader())) {\r\n+                return this.getClass().getClassLoader().getResourceAsStream(cname);\r\n+            }\r\n+            return result;\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Obtains the URL of the specified class file.\r\n+     * This method calls <code>getResource(String)</code>\r\n+     * on the class loader.\r\n+     *\r\n+     * @return null if the class file could not be found.\r\n+     */\r\n+    public URL find(String classname) {\r\n+        String cname = classname.replace('.', '/') + \".class\";\r\n+        ClassLoader cl = (ClassLoader) clref.get();\r\n+        if (cl == null) {\r\n+            return null;        // not found\r\n+        } else {\r\n+            URL url = cl.getResource(cname);\r\n+            if (url == null && (cl != this.getClass().getClassLoader())) {\r\n+                return this.getClass().getClassLoader().getResource(cname);\r\n+            }\r\n+            return url;\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Closes this class path.\r\n+     */\r\n+    public void close() {\r\n+        clref = null;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/CompositeConfiguration.java", "source2": "org/apache/dubbo/common/config/CompositeConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,128 +1,128 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.Arrays;\n-import java.util.LinkedList;\n-import java.util.List;\n-\n-/**\n- * This is an abstraction specially customized for the sequence Dubbo retrieves properties.\n- */\n-public class CompositeConfiguration implements Configuration {\n-    private Logger logger = LoggerFactory.getLogger(CompositeConfiguration.class);\n-\n-    private String id;\n-    private String prefix;\n-\n-    /**\n-     * List holding all the configuration\n-     */\n-    private List<Configuration> configList = new LinkedList<Configuration>();\n-\n-    //FIXME, consider change configList to SortedMap to replace this boolean status.\n-    private boolean dynamicIncluded;\n-\n-    public CompositeConfiguration() {\n-        this(null, null);\n-    }\n-\n-    public CompositeConfiguration(String prefix, String id) {\n-        if (StringUtils.isNotEmpty(prefix) && !prefix.endsWith(\".\")) {\n-            this.prefix = prefix + \".\";\n-        } else {\n-            this.prefix = prefix;\n-        }\n-        this.id = id;\n-    }\n-\n-    public CompositeConfiguration(Configuration... configurations) {\n-        this();\n-        if (configurations != null && configurations.length > 0) {\n-            Arrays.stream(configurations).filter(config -> !configList.contains(config)).forEach(configList::add);\n-        }\n-    }\n-\n-    public void setDynamicIncluded(boolean dynamicIncluded) {\n-        this.dynamicIncluded = dynamicIncluded;\n-    }\n-\n-    //FIXME, consider change configList to SortedMap to replace this boolean status.\n-    public boolean isDynamicIncluded() {\n-        return dynamicIncluded;\n-    }\n-\n-    public void addConfiguration(Configuration configuration) {\n-        if (configList.contains(configuration)) {\n-            return;\n-        }\n-        this.configList.add(configuration);\n-    }\n-\n-    public void addConfigurationFirst(Configuration configuration) {\n-        this.addConfiguration(0, configuration);\n-    }\n-\n-    public void addConfiguration(int pos, Configuration configuration) {\n-        this.configList.add(pos, configuration);\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        Configuration firstMatchingConfiguration = null;\n-        for (Configuration config : configList) {\n-            try {\n-                if (config.containsKey(key)) {\n-                    firstMatchingConfiguration = config;\n-                    break;\n-                }\n-            } catch (Exception e) {\n-                logger.error(\"Error when trying to get value for key \" + key + \" from \" + config + \", will continue to try the next one.\");\n-            }\n-        }\n-        if (firstMatchingConfiguration != null) {\n-            return firstMatchingConfiguration.getProperty(key);\n-        } else {\n-            return null;\n-        }\n-    }\n-\n-    @Override\n-    public boolean containsKey(String key) {\n-        return configList.stream().anyMatch(c -> c.containsKey(key));\n-    }\n-\n-    @Override\n-    public Object getProperty(String key, Object defaultValue) {\n-        Object value = null;\n-        if (StringUtils.isNotEmpty(prefix)) {\n-            if (StringUtils.isNotEmpty(id)) {\n-                value = getInternalProperty(prefix + id + \".\" + key);\n-            }\n-            if (value == null) {\n-                value = getInternalProperty(prefix + key);\n-            }\n-        } else {\n-            value = getInternalProperty(key);\n-        }\n-        return value != null ? value : defaultValue;\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.Arrays;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is an abstraction specially customized for the sequence Dubbo retrieves properties.\r\n+ */\r\n+public class CompositeConfiguration implements Configuration {\r\n+    private Logger logger = LoggerFactory.getLogger(CompositeConfiguration.class);\r\n+\r\n+    private String id;\r\n+    private String prefix;\r\n+\r\n+    /**\r\n+     * List holding all the configuration\r\n+     */\r\n+    private List<Configuration> configList = new LinkedList<Configuration>();\r\n+\r\n+    //FIXME, consider change configList to SortedMap to replace this boolean status.\r\n+    private boolean dynamicIncluded;\r\n+\r\n+    public CompositeConfiguration() {\r\n+        this(null, null);\r\n+    }\r\n+\r\n+    public CompositeConfiguration(String prefix, String id) {\r\n+        if (StringUtils.isNotEmpty(prefix) && !prefix.endsWith(\".\")) {\r\n+            this.prefix = prefix + \".\";\r\n+        } else {\r\n+            this.prefix = prefix;\r\n+        }\r\n+        this.id = id;\r\n+    }\r\n+\r\n+    public CompositeConfiguration(Configuration... configurations) {\r\n+        this();\r\n+        if (configurations != null && configurations.length > 0) {\r\n+            Arrays.stream(configurations).filter(config -> !configList.contains(config)).forEach(configList::add);\r\n+        }\r\n+    }\r\n+\r\n+    public void setDynamicIncluded(boolean dynamicIncluded) {\r\n+        this.dynamicIncluded = dynamicIncluded;\r\n+    }\r\n+\r\n+    //FIXME, consider change configList to SortedMap to replace this boolean status.\r\n+    public boolean isDynamicIncluded() {\r\n+        return dynamicIncluded;\r\n+    }\r\n+\r\n+    public void addConfiguration(Configuration configuration) {\r\n+        if (configList.contains(configuration)) {\r\n+            return;\r\n+        }\r\n+        this.configList.add(configuration);\r\n+    }\r\n+\r\n+    public void addConfigurationFirst(Configuration configuration) {\r\n+        this.addConfiguration(0, configuration);\r\n+    }\r\n+\r\n+    public void addConfiguration(int pos, Configuration configuration) {\r\n+        this.configList.add(pos, configuration);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        Configuration firstMatchingConfiguration = null;\r\n+        for (Configuration config : configList) {\r\n+            try {\r\n+                if (config.containsKey(key)) {\r\n+                    firstMatchingConfiguration = config;\r\n+                    break;\r\n+                }\r\n+            } catch (Exception e) {\r\n+                logger.error(\"Error when trying to get value for key \" + key + \" from \" + config + \", will continue to try the next one.\");\r\n+            }\r\n+        }\r\n+        if (firstMatchingConfiguration != null) {\r\n+            return firstMatchingConfiguration.getProperty(key);\r\n+        } else {\r\n+            return null;\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean containsKey(String key) {\r\n+        return configList.stream().anyMatch(c -> c.containsKey(key));\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getProperty(String key, Object defaultValue) {\r\n+        Object value = null;\r\n+        if (StringUtils.isNotEmpty(prefix)) {\r\n+            if (StringUtils.isNotEmpty(id)) {\r\n+                value = getInternalProperty(prefix + id + \".\" + key);\r\n+            }\r\n+            if (value == null) {\r\n+                value = getInternalProperty(prefix + key);\r\n+            }\r\n+        } else {\r\n+            value = getInternalProperty(key);\r\n+        }\r\n+        return value != null ? value : defaultValue;\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/config/Configuration.java", "source2": "org/apache/dubbo/common/config/Configuration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,179 +1,179 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import java.util.NoSuchElementException;\n-\n-/**\n- * Configuration interface, to fetch the value for the specified key.\n- */\n-public interface Configuration {\n-    /**\n-     * Get a string associated with the given configuration key.\n-     *\n-     * @param key The configuration key.\n-     * @return The associated string.\n-     */\n-    default String getString(String key) {\n-        return convert(String.class, key, null);\n-    }\n-\n-    /**\n-     * Get a string associated with the given configuration key.\n-     * If the key doesn't map to an existing object, the default value\n-     * is returned.\n-     *\n-     * @param key          The configuration key.\n-     * @param defaultValue The default value.\n-     * @return The associated string if key is found and has valid\n-     * format, default value otherwise.\n-     */\n-    default String getString(String key, String defaultValue) {\n-        return convert(String.class, key, defaultValue);\n-    }\n-\n-    default int getInt(String key) {\n-        Integer i = this.getInteger(key, (Integer) null);\n-        if (i != null) {\n-            return i;\n-        } else {\n-            throw new NoSuchElementException('\\'' + key + \"' doesn't map to an existing object\");\n-        }\n-    }\n-\n-    default int getInt(String key, int defaultValue) {\n-        Integer i = this.getInteger(key, (Integer) null);\n-        return i == null ? defaultValue : i;\n-    }\n-\n-    default Integer getInteger(String key, Integer defaultValue) {\n-        try {\n-            return convert(Integer.class, key, defaultValue);\n-        } catch (NumberFormatException e) {\n-            throw new IllegalStateException('\\'' + key + \"' doesn't map to a Integer object\", e);\n-        }\n-    }\n-\n-    default boolean getBoolean(String key) {\n-        Boolean b = this.getBoolean(key, null);\n-        if (b != null) {\n-            return b;\n-        } else {\n-            throw new NoSuchElementException('\\'' + key + \"' doesn't map to an existing object\");\n-        }\n-    }\n-\n-    default boolean getBoolean(String key, boolean defaultValue) {\n-        return this.getBoolean(key, toBooleanObject(defaultValue));\n-    }\n-\n-    default Boolean getBoolean(String key, Boolean defaultValue) {\n-        try {\n-            return convert(Boolean.class, key, defaultValue);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(\"Try to get \" + '\\'' + key + \"' failed, maybe because this key doesn't map to a Boolean object\", e);\n-        }\n-    }\n-\n-    /**\n-     * Gets a property from the configuration. This is the most basic get\n-     * method for retrieving values of properties. In a typical implementation\n-     * of the {@code Configuration} interface the other get methods (that\n-     * return specific data types) will internally make use of this method. On\n-     * this level variable substitution is not yet performed. The returned\n-     * object is an internal representation of the property value for the passed\n-     * in key. It is owned by the {@code Configuration} object. So a caller\n-     * should not modify this object. It cannot be guaranteed that this object\n-     * will stay constant over time (i.e. further update operations on the\n-     * configuration may change its internal state).\n-     *\n-     * @param key property to retrieve\n-     * @return the value to which this configuration maps the specified key, or\n-     * null if the configuration contains no mapping for this key.\n-     */\n-    default Object getProperty(String key) {\n-        return getProperty(key, null);\n-    }\n-\n-    /**\n-     * Gets a property from the configuration. The default value will return if the configuration doesn't contain\n-     * the mapping for the specified key.\n-     *\n-     * @param key property to retrieve\n-     * @param defaultValue default value\n-     * @return the value to which this configuration maps the specified key, or default value if the configuration\n-     * contains no mapping for this key.\n-     */\n-    default Object getProperty(String key, Object defaultValue) {\n-        Object value = getInternalProperty(key);\n-        return value != null ? value : defaultValue;\n-    }\n-\n-    Object getInternalProperty(String key);\n-\n-    /**\n-     * Check if the configuration contains the specified key.\n-     *\n-     * @param key the key whose presence in this configuration is to be tested\n-     * @return {@code true} if the configuration contains a value for this\n-     * key, {@code false} otherwise\n-     */\n-    default boolean containsKey(String key) {\n-        return getProperty(key) != null;\n-    }\n-\n-\n-    default <T> T convert(Class<T> cls, String key, T defaultValue) {\n-        // we only process String properties for now\n-        String value = (String) getProperty(key);\n-\n-        if (value == null) {\n-            return defaultValue;\n-        }\n-\n-        Object obj = value;\n-        if (cls.isInstance(value)) {\n-            return cls.cast(value);\n-        }\n-\n-        if (Boolean.class.equals(cls) || Boolean.TYPE.equals(cls)) {\n-            obj = Boolean.valueOf(value);\n-        } else if (Number.class.isAssignableFrom(cls) || cls.isPrimitive()) {\n-            if (Integer.class.equals(cls) || Integer.TYPE.equals(cls)) {\n-                obj = Integer.valueOf(value);\n-            } else if (Long.class.equals(cls) || Long.TYPE.equals(cls)) {\n-                obj = Long.valueOf(value);\n-            } else if (Byte.class.equals(cls) || Byte.TYPE.equals(cls)) {\n-                obj = Byte.valueOf(value);\n-            } else if (Short.class.equals(cls) || Short.TYPE.equals(cls)) {\n-                obj = Short.valueOf(value);\n-            } else if (Float.class.equals(cls) || Float.TYPE.equals(cls)) {\n-                obj = Float.valueOf(value);\n-            } else if (Double.class.equals(cls) || Double.TYPE.equals(cls)) {\n-                obj = Double.valueOf(value);\n-            }\n-        } else if (cls.isEnum()) {\n-            obj = Enum.valueOf(cls.asSubclass(Enum.class), value);\n-        }\n-\n-        return cls.cast(obj);\n-    }\n-\n-    static Boolean toBooleanObject(boolean bool) {\n-        return bool ? Boolean.TRUE : Boolean.FALSE;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import java.util.NoSuchElementException;\r\n+\r\n+/**\r\n+ * Configuration interface, to fetch the value for the specified key.\r\n+ */\r\n+public interface Configuration {\r\n+    /**\r\n+     * Get a string associated with the given configuration key.\r\n+     *\r\n+     * @param key The configuration key.\r\n+     * @return The associated string.\r\n+     */\r\n+    default String getString(String key) {\r\n+        return convert(String.class, key, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get a string associated with the given configuration key.\r\n+     * If the key doesn't map to an existing object, the default value\r\n+     * is returned.\r\n+     *\r\n+     * @param key          The configuration key.\r\n+     * @param defaultValue The default value.\r\n+     * @return The associated string if key is found and has valid\r\n+     * format, default value otherwise.\r\n+     */\r\n+    default String getString(String key, String defaultValue) {\r\n+        return convert(String.class, key, defaultValue);\r\n+    }\r\n+\r\n+    default int getInt(String key) {\r\n+        Integer i = this.getInteger(key, (Integer) null);\r\n+        if (i != null) {\r\n+            return i;\r\n+        } else {\r\n+            throw new NoSuchElementException('\\'' + key + \"' doesn't map to an existing object\");\r\n+        }\r\n+    }\r\n+\r\n+    default int getInt(String key, int defaultValue) {\r\n+        Integer i = this.getInteger(key, (Integer) null);\r\n+        return i == null ? defaultValue : i;\r\n+    }\r\n+\r\n+    default Integer getInteger(String key, Integer defaultValue) {\r\n+        try {\r\n+            return convert(Integer.class, key, defaultValue);\r\n+        } catch (NumberFormatException e) {\r\n+            throw new IllegalStateException('\\'' + key + \"' doesn't map to a Integer object\", e);\r\n+        }\r\n+    }\r\n+\r\n+    default boolean getBoolean(String key) {\r\n+        Boolean b = this.getBoolean(key, null);\r\n+        if (b != null) {\r\n+            return b;\r\n+        } else {\r\n+            throw new NoSuchElementException('\\'' + key + \"' doesn't map to an existing object\");\r\n+        }\r\n+    }\r\n+\r\n+    default boolean getBoolean(String key, boolean defaultValue) {\r\n+        return this.getBoolean(key, toBooleanObject(defaultValue));\r\n+    }\r\n+\r\n+    default Boolean getBoolean(String key, Boolean defaultValue) {\r\n+        try {\r\n+            return convert(Boolean.class, key, defaultValue);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(\"Try to get \" + '\\'' + key + \"' failed, maybe because this key doesn't map to a Boolean object\", e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Gets a property from the configuration. This is the most basic get\r\n+     * method for retrieving values of properties. In a typical implementation\r\n+     * of the {@code Configuration} interface the other get methods (that\r\n+     * return specific data types) will internally make use of this method. On\r\n+     * this level variable substitution is not yet performed. The returned\r\n+     * object is an internal representation of the property value for the passed\r\n+     * in key. It is owned by the {@code Configuration} object. So a caller\r\n+     * should not modify this object. It cannot be guaranteed that this object\r\n+     * will stay constant over time (i.e. further update operations on the\r\n+     * configuration may change its internal state).\r\n+     *\r\n+     * @param key property to retrieve\r\n+     * @return the value to which this configuration maps the specified key, or\r\n+     * null if the configuration contains no mapping for this key.\r\n+     */\r\n+    default Object getProperty(String key) {\r\n+        return getProperty(key, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Gets a property from the configuration. The default value will return if the configuration doesn't contain\r\n+     * the mapping for the specified key.\r\n+     *\r\n+     * @param key property to retrieve\r\n+     * @param defaultValue default value\r\n+     * @return the value to which this configuration maps the specified key, or default value if the configuration\r\n+     * contains no mapping for this key.\r\n+     */\r\n+    default Object getProperty(String key, Object defaultValue) {\r\n+        Object value = getInternalProperty(key);\r\n+        return value != null ? value : defaultValue;\r\n+    }\r\n+\r\n+    Object getInternalProperty(String key);\r\n+\r\n+    /**\r\n+     * Check if the configuration contains the specified key.\r\n+     *\r\n+     * @param key the key whose presence in this configuration is to be tested\r\n+     * @return {@code true} if the configuration contains a value for this\r\n+     * key, {@code false} otherwise\r\n+     */\r\n+    default boolean containsKey(String key) {\r\n+        return getProperty(key) != null;\r\n+    }\r\n+\r\n+\r\n+    default <T> T convert(Class<T> cls, String key, T defaultValue) {\r\n+        // we only process String properties for now\r\n+        String value = (String) getProperty(key);\r\n+\r\n+        if (value == null) {\r\n+            return defaultValue;\r\n+        }\r\n+\r\n+        Object obj = value;\r\n+        if (cls.isInstance(value)) {\r\n+            return cls.cast(value);\r\n+        }\r\n+\r\n+        if (Boolean.class.equals(cls) || Boolean.TYPE.equals(cls)) {\r\n+            obj = Boolean.valueOf(value);\r\n+        } else if (Number.class.isAssignableFrom(cls) || cls.isPrimitive()) {\r\n+            if (Integer.class.equals(cls) || Integer.TYPE.equals(cls)) {\r\n+                obj = Integer.valueOf(value);\r\n+            } else if (Long.class.equals(cls) || Long.TYPE.equals(cls)) {\r\n+                obj = Long.valueOf(value);\r\n+            } else if (Byte.class.equals(cls) || Byte.TYPE.equals(cls)) {\r\n+                obj = Byte.valueOf(value);\r\n+            } else if (Short.class.equals(cls) || Short.TYPE.equals(cls)) {\r\n+                obj = Short.valueOf(value);\r\n+            } else if (Float.class.equals(cls) || Float.TYPE.equals(cls)) {\r\n+                obj = Float.valueOf(value);\r\n+            } else if (Double.class.equals(cls) || Double.TYPE.equals(cls)) {\r\n+                obj = Double.valueOf(value);\r\n+            }\r\n+        } else if (cls.isEnum()) {\r\n+            obj = Enum.valueOf(cls.asSubclass(Enum.class), value);\r\n+        }\r\n+\r\n+        return cls.cast(obj);\r\n+    }\r\n+\r\n+    static Boolean toBooleanObject(boolean bool) {\r\n+        return bool ? Boolean.TRUE : Boolean.FALSE;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/ConfigurationUtils.java", "source2": "org/apache/dubbo/common/config/ConfigurationUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,133 +1,133 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.io.IOException;\n-import java.io.StringReader;\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Properties;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT;\n-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;\n-\n-/**\n- * Utilities for manipulating configurations from different sources\n- */\n-public class ConfigurationUtils {\n-    private static final Logger logger = LoggerFactory.getLogger(ConfigurationUtils.class);\n-\n-    /**\n-     * Used to get properties from the jvm\n-     *\n-     * @return\n-     */\n-    public static Configuration getSystemConfiguration() {\n-        return ApplicationModel.getEnvironment().getSystemConfiguration();\n-    }\n-\n-    /**\n-     * Used to get properties from the os environment\n-     *\n-     * @return\n-     */\n-    public static Configuration getEnvConfiguration() {\n-        return ApplicationModel.getEnvironment().getEnvironmentConfiguration();\n-    }\n-\n-    /**\n-     * Used to get an composite property value.\n-     * <p>\n-     * Also see {@link Environment#getConfiguration()}\n-     *\n-     * @return\n-     */\n-    public static Configuration getGlobalConfiguration() {\n-        return ApplicationModel.getEnvironment().getConfiguration();\n-    }\n-\n-    public static Configuration getDynamicGlobalConfiguration() {\n-        return ApplicationModel.getEnvironment().getDynamicGlobalConfiguration();\n-    }\n-\n-    // FIXME\n-    @SuppressWarnings(\"deprecation\")\n-    public static int getServerShutdownTimeout() {\n-        int timeout = DEFAULT_SERVER_SHUTDOWN_TIMEOUT;\n-        Configuration configuration = getGlobalConfiguration();\n-        String value = StringUtils.trim(configuration.getString(SHUTDOWN_WAIT_KEY));\n-\n-        if (value != null && value.length() > 0) {\n-            try {\n-                timeout = Integer.parseInt(value);\n-            } catch (Exception e) {\n-                // ignore\n-            }\n-        } else {\n-            value = StringUtils.trim(configuration.getString(SHUTDOWN_WAIT_SECONDS_KEY));\n-            if (value != null && value.length() > 0) {\n-                try {\n-                    timeout = Integer.parseInt(value) * 1000;\n-                } catch (Exception e) {\n-                    // ignore\n-                }\n-            }\n-        }\n-        return timeout;\n-    }\n-\n-    public static String getDynamicProperty(String property) {\n-        return getDynamicProperty(property, null);\n-    }\n-\n-    public static String getDynamicProperty(String property, String defaultValue) {\n-        return StringUtils.trim(getDynamicGlobalConfiguration().getString(property, defaultValue));\n-    }\n-\n-    public static String getProperty(String property) {\n-        return getProperty(property, null);\n-    }\n-\n-    public static String getProperty(String property, String defaultValue) {\n-        return StringUtils.trim(getGlobalConfiguration().getString(property, defaultValue));\n-    }\n-\n-    public static int get(String property, int defaultValue) {\n-        return getGlobalConfiguration().getInt(property, defaultValue);\n-    }\n-\n-    public static Map<String, String> parseProperties(String content) throws IOException {\n-        Map<String, String> map = new HashMap<>();\n-        if (StringUtils.isEmpty(content)) {\n-            logger.warn(\"You specified the config center, but there's not even one single config item in it.\");\n-        } else {\n-            Properties properties = new Properties();\n-            properties.load(new StringReader(content));\n-            properties.stringPropertyNames().forEach(\n-                    k -> map.put(k, properties.getProperty(k))\n-            );\n-        }\n-        return map;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.StringReader;\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Properties;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;\r\n+\r\n+/**\r\n+ * Utilities for manipulating configurations from different sources\r\n+ */\r\n+public class ConfigurationUtils {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ConfigurationUtils.class);\r\n+\r\n+    /**\r\n+     * Used to get properties from the jvm\r\n+     *\r\n+     * @return\r\n+     */\r\n+    public static Configuration getSystemConfiguration() {\r\n+        return ApplicationModel.getEnvironment().getSystemConfiguration();\r\n+    }\r\n+\r\n+    /**\r\n+     * Used to get properties from the os environment\r\n+     *\r\n+     * @return\r\n+     */\r\n+    public static Configuration getEnvConfiguration() {\r\n+        return ApplicationModel.getEnvironment().getEnvironmentConfiguration();\r\n+    }\r\n+\r\n+    /**\r\n+     * Used to get an composite property value.\r\n+     * <p>\r\n+     * Also see {@link Environment#getConfiguration()}\r\n+     *\r\n+     * @return\r\n+     */\r\n+    public static Configuration getGlobalConfiguration() {\r\n+        return ApplicationModel.getEnvironment().getConfiguration();\r\n+    }\r\n+\r\n+    public static Configuration getDynamicGlobalConfiguration() {\r\n+        return ApplicationModel.getEnvironment().getDynamicGlobalConfiguration();\r\n+    }\r\n+\r\n+    // FIXME\r\n+    @SuppressWarnings(\"deprecation\")\r\n+    public static int getServerShutdownTimeout() {\r\n+        int timeout = DEFAULT_SERVER_SHUTDOWN_TIMEOUT;\r\n+        Configuration configuration = getGlobalConfiguration();\r\n+        String value = StringUtils.trim(configuration.getString(SHUTDOWN_WAIT_KEY));\r\n+\r\n+        if (value != null && value.length() > 0) {\r\n+            try {\r\n+                timeout = Integer.parseInt(value);\r\n+            } catch (Exception e) {\r\n+                // ignore\r\n+            }\r\n+        } else {\r\n+            value = StringUtils.trim(configuration.getString(SHUTDOWN_WAIT_SECONDS_KEY));\r\n+            if (value != null && value.length() > 0) {\r\n+                try {\r\n+                    timeout = Integer.parseInt(value) * 1000;\r\n+                } catch (Exception e) {\r\n+                    // ignore\r\n+                }\r\n+            }\r\n+        }\r\n+        return timeout;\r\n+    }\r\n+\r\n+    public static String getDynamicProperty(String property) {\r\n+        return getDynamicProperty(property, null);\r\n+    }\r\n+\r\n+    public static String getDynamicProperty(String property, String defaultValue) {\r\n+        return StringUtils.trim(getDynamicGlobalConfiguration().getString(property, defaultValue));\r\n+    }\r\n+\r\n+    public static String getProperty(String property) {\r\n+        return getProperty(property, null);\r\n+    }\r\n+\r\n+    public static String getProperty(String property, String defaultValue) {\r\n+        return StringUtils.trim(getGlobalConfiguration().getString(property, defaultValue));\r\n+    }\r\n+\r\n+    public static int get(String property, int defaultValue) {\r\n+        return getGlobalConfiguration().getInt(property, defaultValue);\r\n+    }\r\n+\r\n+    public static Map<String, String> parseProperties(String content) throws IOException {\r\n+        Map<String, String> map = new HashMap<>();\r\n+        if (StringUtils.isEmpty(content)) {\r\n+            logger.warn(\"You specified the config center, but there's not even one single config item in it.\");\r\n+        } else {\r\n+            Properties properties = new Properties();\r\n+            properties.load(new StringReader(content));\r\n+            properties.stringPropertyNames().forEach(\r\n+                    k -> map.put(k, properties.getProperty(k))\r\n+            );\r\n+        }\r\n+        return map;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/Environment.java", "source2": "org/apache/dubbo/common/config/Environment.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,233 +1,233 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.context.FrameworkExt;\n-import org.apache.dubbo.common.context.LifecycleAdapter;\n-import org.apache.dubbo.common.extension.DisableInject;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.AbstractConfig;\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-import org.apache.dubbo.config.context.ConfigConfigurationAdapter;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Collection;\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Optional;\n-\n-public class Environment extends LifecycleAdapter implements FrameworkExt {\n-    private static final Logger logger = LoggerFactory.getLogger(Environment.class);\n-    public static final String NAME = \"environment\";\n-\n-    private final PropertiesConfiguration propertiesConfiguration;\n-    private final SystemConfiguration systemConfiguration;\n-    private final EnvironmentConfiguration environmentConfiguration;\n-    private final InmemoryConfiguration externalConfiguration;\n-    private final InmemoryConfiguration appExternalConfiguration;\n-\n-    private CompositeConfiguration globalConfiguration;\n-    private CompositeConfiguration dynamicGlobalConfiguration;\n-\n-\n-    private Map<String, String> externalConfigurationMap = new HashMap<>();\n-    private Map<String, String> appExternalConfigurationMap = new HashMap<>();\n-\n-    private boolean configCenterFirst = true;\n-\n-    private DynamicConfiguration dynamicConfiguration;\n-\n-    public Environment() {\n-        this.propertiesConfiguration = new PropertiesConfiguration();\n-        this.systemConfiguration = new SystemConfiguration();\n-        this.environmentConfiguration = new EnvironmentConfiguration();\n-        this.externalConfiguration = new InmemoryConfiguration();\n-        this.appExternalConfiguration = new InmemoryConfiguration();\n-    }\n-\n-    @Override\n-    public void initialize() throws IllegalStateException {\n-        ConfigManager configManager = ApplicationModel.getConfigManager();\n-        Optional<Collection<ConfigCenterConfig>> defaultConfigs = configManager.getDefaultConfigCenter();\n-        defaultConfigs.ifPresent(configs -> {\n-            for (ConfigCenterConfig config : configs) {\n-                this.setExternalConfigMap(config.getExternalConfiguration());\n-                this.setAppExternalConfigMap(config.getAppExternalConfiguration());\n-            }\n-        });\n-\n-        this.externalConfiguration.setProperties(externalConfigurationMap);\n-        this.appExternalConfiguration.setProperties(appExternalConfigurationMap);\n-    }\n-\n-    @DisableInject\n-    public void setExternalConfigMap(Map<String, String> externalConfiguration) {\n-        if (externalConfiguration != null) {\n-            this.externalConfigurationMap = externalConfiguration;\n-        }\n-    }\n-\n-    @DisableInject\n-    public void setAppExternalConfigMap(Map<String, String> appExternalConfiguration) {\n-        if (appExternalConfiguration != null) {\n-            this.appExternalConfigurationMap = appExternalConfiguration;\n-        }\n-    }\n-\n-    public Map<String, String> getExternalConfigurationMap() {\n-        return externalConfigurationMap;\n-    }\n-\n-    public Map<String, String> getAppExternalConfigurationMap() {\n-        return appExternalConfigurationMap;\n-    }\n-\n-    public void updateExternalConfigurationMap(Map<String, String> externalMap) {\n-        this.externalConfigurationMap.putAll(externalMap);\n-    }\n-\n-    public void updateAppExternalConfigurationMap(Map<String, String> externalMap) {\n-        this.appExternalConfigurationMap.putAll(externalMap);\n-    }\n-\n-    /**\n-     * At start-up, Dubbo is driven by various configuration, such as Application, Registry, Protocol, etc.\n-     * All configurations will be converged into a data bus - URL, and then drive the subsequent process.\n-     * <p>\n-     * At present, there are many configuration sources, including AbstractConfig (API, XML, annotation), - D, config center, etc.\n-     * This method helps us to filter out the most priority values from various configuration sources.\n-     *\n-     * @param config\n-     * @return\n-     */\n-    public synchronized CompositeConfiguration getPrefixedConfiguration(AbstractConfig config) {\n-        CompositeConfiguration prefixedConfiguration = new CompositeConfiguration(config.getPrefix(), config.getId());\n-        Configuration configuration = new ConfigConfigurationAdapter(config);\n-        if (this.isConfigCenterFirst()) {\n-            // The sequence would be: SystemConfiguration -> AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> PropertiesConfiguration\n-            // Config center has the highest priority\n-            prefixedConfiguration.addConfiguration(systemConfiguration);\n-            prefixedConfiguration.addConfiguration(environmentConfiguration);\n-            prefixedConfiguration.addConfiguration(appExternalConfiguration);\n-            prefixedConfiguration.addConfiguration(externalConfiguration);\n-            prefixedConfiguration.addConfiguration(configuration);\n-            prefixedConfiguration.addConfiguration(propertiesConfiguration);\n-        } else {\n-            // The sequence would be: SystemConfiguration -> AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> PropertiesConfiguration\n-            // Config center has the highest priority\n-            prefixedConfiguration.addConfiguration(systemConfiguration);\n-            prefixedConfiguration.addConfiguration(environmentConfiguration);\n-            prefixedConfiguration.addConfiguration(configuration);\n-            prefixedConfiguration.addConfiguration(appExternalConfiguration);\n-            prefixedConfiguration.addConfiguration(externalConfiguration);\n-            prefixedConfiguration.addConfiguration(propertiesConfiguration);\n-        }\n-        return prefixedConfiguration;\n-    }\n-\n-    /**\n-     * There are two ways to get configuration during exposure / reference or at runtime:\n-     * 1. URL, The value in the URL is relatively fixed. we can get value directly.\n-     * 2. The configuration exposed in this method is convenient for us to query the latest values from multiple\n-     * prioritized sources, it also guarantees that configs changed dynamically can take effect on the fly.\n-     */\n-    public Configuration getConfiguration() {\n-        if (globalConfiguration == null) {\n-            globalConfiguration = new CompositeConfiguration();\n-            globalConfiguration.addConfiguration(systemConfiguration);\n-            globalConfiguration.addConfiguration(environmentConfiguration);\n-            globalConfiguration.addConfiguration(appExternalConfiguration);\n-            globalConfiguration.addConfiguration(externalConfiguration);\n-            globalConfiguration.addConfiguration(propertiesConfiguration);\n-        }\n-        return globalConfiguration;\n-    }\n-\n-    public Configuration getDynamicGlobalConfiguration() {\n-        if (dynamicGlobalConfiguration == null) {\n-            if (dynamicConfiguration == null) {\n-                if (logger.isWarnEnabled()) {\n-                    logger.warn(\"dynamicConfiguration is null , return globalConfiguration.\");\n-                }\n-                return globalConfiguration;\n-            }\n-            dynamicGlobalConfiguration = new CompositeConfiguration();\n-            dynamicGlobalConfiguration.addConfiguration(dynamicConfiguration);\n-            dynamicGlobalConfiguration.addConfiguration(getConfiguration());\n-        }\n-        return dynamicGlobalConfiguration;\n-    }\n-\n-    public boolean isConfigCenterFirst() {\n-        return configCenterFirst;\n-    }\n-\n-    @DisableInject\n-    public void setConfigCenterFirst(boolean configCenterFirst) {\n-        this.configCenterFirst = configCenterFirst;\n-    }\n-\n-    public Optional<DynamicConfiguration> getDynamicConfiguration() {\n-        return Optional.ofNullable(dynamicConfiguration);\n-    }\n-\n-    @DisableInject\n-    public void setDynamicConfiguration(DynamicConfiguration dynamicConfiguration) {\n-        this.dynamicConfiguration = dynamicConfiguration;\n-    }\n-\n-    @Override\n-    public void destroy() throws IllegalStateException {\n-        clearExternalConfigs();\n-        clearAppExternalConfigs();\n-    }\n-\n-    public PropertiesConfiguration getPropertiesConfiguration() {\n-        return propertiesConfiguration;\n-    }\n-\n-    public SystemConfiguration getSystemConfiguration() {\n-        return systemConfiguration;\n-    }\n-\n-    public EnvironmentConfiguration getEnvironmentConfiguration() {\n-        return environmentConfiguration;\n-    }\n-\n-    public InmemoryConfiguration getExternalConfiguration() {\n-        return externalConfiguration;\n-    }\n-\n-    public InmemoryConfiguration getAppExternalConfiguration() {\n-        return appExternalConfiguration;\n-    }\n-\n-    // For test\n-    public void clearExternalConfigs() {\n-        this.externalConfiguration.clear();\n-        this.externalConfigurationMap.clear();\n-    }\n-\n-    // For test\n-    public void clearAppExternalConfigs() {\n-        this.appExternalConfiguration.clear();\n-        this.appExternalConfigurationMap.clear();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.context.FrameworkExt;\r\n+import org.apache.dubbo.common.context.LifecycleAdapter;\r\n+import org.apache.dubbo.common.extension.DisableInject;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.config.AbstractConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.context.ConfigConfigurationAdapter;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+\r\n+public class Environment extends LifecycleAdapter implements FrameworkExt {\r\n+    private static final Logger logger = LoggerFactory.getLogger(Environment.class);\r\n+    public static final String NAME = \"environment\";\r\n+\r\n+    private final PropertiesConfiguration propertiesConfiguration;\r\n+    private final SystemConfiguration systemConfiguration;\r\n+    private final EnvironmentConfiguration environmentConfiguration;\r\n+    private final InmemoryConfiguration externalConfiguration;\r\n+    private final InmemoryConfiguration appExternalConfiguration;\r\n+\r\n+    private CompositeConfiguration globalConfiguration;\r\n+    private CompositeConfiguration dynamicGlobalConfiguration;\r\n+\r\n+\r\n+    private Map<String, String> externalConfigurationMap = new HashMap<>();\r\n+    private Map<String, String> appExternalConfigurationMap = new HashMap<>();\r\n+\r\n+    private boolean configCenterFirst = true;\r\n+\r\n+    private DynamicConfiguration dynamicConfiguration;\r\n+\r\n+    public Environment() {\r\n+        this.propertiesConfiguration = new PropertiesConfiguration();\r\n+        this.systemConfiguration = new SystemConfiguration();\r\n+        this.environmentConfiguration = new EnvironmentConfiguration();\r\n+        this.externalConfiguration = new InmemoryConfiguration();\r\n+        this.appExternalConfiguration = new InmemoryConfiguration();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize() throws IllegalStateException {\r\n+        ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+        Optional<Collection<ConfigCenterConfig>> defaultConfigs = configManager.getDefaultConfigCenter();\r\n+        defaultConfigs.ifPresent(configs -> {\r\n+            for (ConfigCenterConfig config : configs) {\r\n+                this.setExternalConfigMap(config.getExternalConfiguration());\r\n+                this.setAppExternalConfigMap(config.getAppExternalConfiguration());\r\n+            }\r\n+        });\r\n+\r\n+        this.externalConfiguration.setProperties(externalConfigurationMap);\r\n+        this.appExternalConfiguration.setProperties(appExternalConfigurationMap);\r\n+    }\r\n+\r\n+    @DisableInject\r\n+    public void setExternalConfigMap(Map<String, String> externalConfiguration) {\r\n+        if (externalConfiguration != null) {\r\n+            this.externalConfigurationMap = externalConfiguration;\r\n+        }\r\n+    }\r\n+\r\n+    @DisableInject\r\n+    public void setAppExternalConfigMap(Map<String, String> appExternalConfiguration) {\r\n+        if (appExternalConfiguration != null) {\r\n+            this.appExternalConfigurationMap = appExternalConfiguration;\r\n+        }\r\n+    }\r\n+\r\n+    public Map<String, String> getExternalConfigurationMap() {\r\n+        return externalConfigurationMap;\r\n+    }\r\n+\r\n+    public Map<String, String> getAppExternalConfigurationMap() {\r\n+        return appExternalConfigurationMap;\r\n+    }\r\n+\r\n+    public void updateExternalConfigurationMap(Map<String, String> externalMap) {\r\n+        this.externalConfigurationMap.putAll(externalMap);\r\n+    }\r\n+\r\n+    public void updateAppExternalConfigurationMap(Map<String, String> externalMap) {\r\n+        this.appExternalConfigurationMap.putAll(externalMap);\r\n+    }\r\n+\r\n+    /**\r\n+     * At start-up, Dubbo is driven by various configuration, such as Application, Registry, Protocol, etc.\r\n+     * All configurations will be converged into a data bus - URL, and then drive the subsequent process.\r\n+     * <p>\r\n+     * At present, there are many configuration sources, including AbstractConfig (API, XML, annotation), - D, config center, etc.\r\n+     * This method helps us to filter out the most priority values from various configuration sources.\r\n+     *\r\n+     * @param config\r\n+     * @return\r\n+     */\r\n+    public synchronized CompositeConfiguration getPrefixedConfiguration(AbstractConfig config) {\r\n+        CompositeConfiguration prefixedConfiguration = new CompositeConfiguration(config.getPrefix(), config.getId());\r\n+        Configuration configuration = new ConfigConfigurationAdapter(config);\r\n+        if (this.isConfigCenterFirst()) {\r\n+            // The sequence would be: SystemConfiguration -> AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> PropertiesConfiguration\r\n+            // Config center has the highest priority\r\n+            prefixedConfiguration.addConfiguration(systemConfiguration);\r\n+            prefixedConfiguration.addConfiguration(environmentConfiguration);\r\n+            prefixedConfiguration.addConfiguration(appExternalConfiguration);\r\n+            prefixedConfiguration.addConfiguration(externalConfiguration);\r\n+            prefixedConfiguration.addConfiguration(configuration);\r\n+            prefixedConfiguration.addConfiguration(propertiesConfiguration);\r\n+        } else {\r\n+            // The sequence would be: SystemConfiguration -> AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> PropertiesConfiguration\r\n+            // Config center has the highest priority\r\n+            prefixedConfiguration.addConfiguration(systemConfiguration);\r\n+            prefixedConfiguration.addConfiguration(environmentConfiguration);\r\n+            prefixedConfiguration.addConfiguration(configuration);\r\n+            prefixedConfiguration.addConfiguration(appExternalConfiguration);\r\n+            prefixedConfiguration.addConfiguration(externalConfiguration);\r\n+            prefixedConfiguration.addConfiguration(propertiesConfiguration);\r\n+        }\r\n+        return prefixedConfiguration;\r\n+    }\r\n+\r\n+    /**\r\n+     * There are two ways to get configuration during exposure / reference or at runtime:\r\n+     * 1. URL, The value in the URL is relatively fixed. we can get value directly.\r\n+     * 2. The configuration exposed in this method is convenient for us to query the latest values from multiple\r\n+     * prioritized sources, it also guarantees that configs changed dynamically can take effect on the fly.\r\n+     */\r\n+    public Configuration getConfiguration() {\r\n+        if (globalConfiguration == null) {\r\n+            globalConfiguration = new CompositeConfiguration();\r\n+            globalConfiguration.addConfiguration(systemConfiguration);\r\n+            globalConfiguration.addConfiguration(environmentConfiguration);\r\n+            globalConfiguration.addConfiguration(appExternalConfiguration);\r\n+            globalConfiguration.addConfiguration(externalConfiguration);\r\n+            globalConfiguration.addConfiguration(propertiesConfiguration);\r\n+        }\r\n+        return globalConfiguration;\r\n+    }\r\n+\r\n+    public Configuration getDynamicGlobalConfiguration() {\r\n+        if (dynamicGlobalConfiguration == null) {\r\n+            if (dynamicConfiguration == null) {\r\n+                if (logger.isWarnEnabled()) {\r\n+                    logger.warn(\"dynamicConfiguration is null , return globalConfiguration.\");\r\n+                }\r\n+                return globalConfiguration;\r\n+            }\r\n+            dynamicGlobalConfiguration = new CompositeConfiguration();\r\n+            dynamicGlobalConfiguration.addConfiguration(dynamicConfiguration);\r\n+            dynamicGlobalConfiguration.addConfiguration(getConfiguration());\r\n+        }\r\n+        return dynamicGlobalConfiguration;\r\n+    }\r\n+\r\n+    public boolean isConfigCenterFirst() {\r\n+        return configCenterFirst;\r\n+    }\r\n+\r\n+    @DisableInject\r\n+    public void setConfigCenterFirst(boolean configCenterFirst) {\r\n+        this.configCenterFirst = configCenterFirst;\r\n+    }\r\n+\r\n+    public Optional<DynamicConfiguration> getDynamicConfiguration() {\r\n+        return Optional.ofNullable(dynamicConfiguration);\r\n+    }\r\n+\r\n+    @DisableInject\r\n+    public void setDynamicConfiguration(DynamicConfiguration dynamicConfiguration) {\r\n+        this.dynamicConfiguration = dynamicConfiguration;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws IllegalStateException {\r\n+        clearExternalConfigs();\r\n+        clearAppExternalConfigs();\r\n+    }\r\n+\r\n+    public PropertiesConfiguration getPropertiesConfiguration() {\r\n+        return propertiesConfiguration;\r\n+    }\r\n+\r\n+    public SystemConfiguration getSystemConfiguration() {\r\n+        return systemConfiguration;\r\n+    }\r\n+\r\n+    public EnvironmentConfiguration getEnvironmentConfiguration() {\r\n+        return environmentConfiguration;\r\n+    }\r\n+\r\n+    public InmemoryConfiguration getExternalConfiguration() {\r\n+        return externalConfiguration;\r\n+    }\r\n+\r\n+    public InmemoryConfiguration getAppExternalConfiguration() {\r\n+        return appExternalConfiguration;\r\n+    }\r\n+\r\n+    // For test\r\n+    public void clearExternalConfigs() {\r\n+        this.externalConfiguration.clear();\r\n+        this.externalConfigurationMap.clear();\r\n+    }\r\n+\r\n+    // For test\r\n+    public void clearAppExternalConfigs() {\r\n+        this.appExternalConfiguration.clear();\r\n+        this.appExternalConfigurationMap.clear();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/EnvironmentConfiguration.java", "source2": "org/apache/dubbo/common/config/EnvironmentConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-/**\n- * Configuration from system environment\n- */\n-public class EnvironmentConfiguration implements Configuration {\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        String value = System.getenv(key);\n-        if (StringUtils.isEmpty(value)) {\n-            value = System.getenv(StringUtils.toOSStyleKey(key));\n-        }\n-        return value;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+/**\r\n+ * Configuration from system environment\r\n+ */\r\n+public class EnvironmentConfiguration implements Configuration {\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        String value = System.getenv(key);\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            value = System.getenv(StringUtils.toOSStyleKey(key));\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/InmemoryConfiguration.java", "source2": "org/apache/dubbo/common/config/InmemoryConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,64 +1,64 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import java.util.LinkedHashMap;\n-import java.util.Map;\n-\n-/**\n- * In-memory configuration\n- */\n-public class InmemoryConfiguration implements Configuration {\n-\n-    // stores the configuration key-value pairs\n-    private Map<String, String> store = new LinkedHashMap<>();\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return store.get(key);\n-    }\n-\n-    /**\n-     * Add one property into the store, the previous value will be replaced if the key exists\n-     */\n-    public void addProperty(String key, String value) {\n-        store.put(key, value);\n-    }\n-\n-    /**\n-     * Add a set of properties into the store\n-     */\n-    public void addProperties(Map<String, String> properties) {\n-        if (properties != null) {\n-            this.store.putAll(properties);\n-        }\n-    }\n-\n-    /**\n-     * set store\n-     */\n-    public void setProperties(Map<String, String> properties) {\n-        if (properties != null) {\n-            this.store = properties;\n-        }\n-    }\n-\n-    // for unit test\n-    public void clear() {\n-        this.store.clear();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import java.util.LinkedHashMap;\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * In-memory configuration\r\n+ */\r\n+public class InmemoryConfiguration implements Configuration {\r\n+\r\n+    // stores the configuration key-value pairs\r\n+    private Map<String, String> store = new LinkedHashMap<>();\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return store.get(key);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add one property into the store, the previous value will be replaced if the key exists\r\n+     */\r\n+    public void addProperty(String key, String value) {\r\n+        store.put(key, value);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add a set of properties into the store\r\n+     */\r\n+    public void addProperties(Map<String, String> properties) {\r\n+        if (properties != null) {\r\n+            this.store.putAll(properties);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * set store\r\n+     */\r\n+    public void setProperties(Map<String, String> properties) {\r\n+        if (properties != null) {\r\n+            this.store = properties;\r\n+        }\r\n+    }\r\n+\r\n+    // for unit test\r\n+    public void clear() {\r\n+        this.store.clear();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/OrderedPropertiesProvider.java", "source2": "org/apache/dubbo/common/config/OrderedPropertiesProvider.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,44 +1,44 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import java.util.Properties;\n-\n-/**\n- * \n- * The smaller value, the higher priority\n- * \n- */\n-@SPI\n-public interface OrderedPropertiesProvider {\n-    /**\n-     * order\n-     *\n-     * @return\n-     */\n-    int priority();\n-\n-    /**\n-     * load the properties\n-     *\n-     * @return\n-     */\n-    Properties initProperties();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import java.util.Properties;\r\n+\r\n+/**\r\n+ * \r\n+ * The smaller value, the higher priority\r\n+ * \r\n+ */\r\n+@SPI\r\n+public interface OrderedPropertiesProvider {\r\n+    /**\r\n+     * order\r\n+     *\r\n+     * @return\r\n+     */\r\n+    int priority();\r\n+\r\n+    /**\r\n+     * load the properties\r\n+     *\r\n+     * @return\r\n+     */\r\n+    Properties initProperties();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/PropertiesConfiguration.java", "source2": "org/apache/dubbo/common/config/PropertiesConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,64 +1,64 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Properties;\n-import java.util.Set;\n-\n-/**\n- * Configuration from system properties and dubbo.properties\n- */\n-public class PropertiesConfiguration implements Configuration {\n-\n-    public PropertiesConfiguration() {\n-        ExtensionLoader<OrderedPropertiesProvider> propertiesProviderExtensionLoader = ExtensionLoader.getExtensionLoader(OrderedPropertiesProvider.class);\n-        Set<String> propertiesProviderNames = propertiesProviderExtensionLoader.getSupportedExtensions();\n-        if (propertiesProviderNames == null || propertiesProviderNames.isEmpty()) {\n-            return;\n-        }\n-        List<OrderedPropertiesProvider> orderedPropertiesProviders = new ArrayList<>();\n-        for (String propertiesProviderName : propertiesProviderNames) {\n-            orderedPropertiesProviders.add(propertiesProviderExtensionLoader.getExtension(propertiesProviderName));\n-        }\n-\n-        //order the propertiesProvider according the priority descending\n-        orderedPropertiesProviders.sort((OrderedPropertiesProvider a, OrderedPropertiesProvider b) -> {\n-            return b.priority() - a.priority();\n-        });\n-\n-        //load the default properties\n-        Properties properties = ConfigUtils.getProperties();\n-\n-        //override the properties.\n-        for (OrderedPropertiesProvider orderedPropertiesProvider :\n-                orderedPropertiesProviders) {\n-            properties.putAll(orderedPropertiesProvider.initProperties());\n-        }\n-\n-        ConfigUtils.setProperties(properties);\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return ConfigUtils.getProperty(key);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Properties;\r\n+import java.util.Set;\r\n+\r\n+/**\r\n+ * Configuration from system properties and dubbo.properties\r\n+ */\r\n+public class PropertiesConfiguration implements Configuration {\r\n+\r\n+    public PropertiesConfiguration() {\r\n+        ExtensionLoader<OrderedPropertiesProvider> propertiesProviderExtensionLoader = ExtensionLoader.getExtensionLoader(OrderedPropertiesProvider.class);\r\n+        Set<String> propertiesProviderNames = propertiesProviderExtensionLoader.getSupportedExtensions();\r\n+        if (propertiesProviderNames == null || propertiesProviderNames.isEmpty()) {\r\n+            return;\r\n+        }\r\n+        List<OrderedPropertiesProvider> orderedPropertiesProviders = new ArrayList<>();\r\n+        for (String propertiesProviderName : propertiesProviderNames) {\r\n+            orderedPropertiesProviders.add(propertiesProviderExtensionLoader.getExtension(propertiesProviderName));\r\n+        }\r\n+\r\n+        //order the propertiesProvider according the priority descending\r\n+        orderedPropertiesProviders.sort((OrderedPropertiesProvider a, OrderedPropertiesProvider b) -> {\r\n+            return b.priority() - a.priority();\r\n+        });\r\n+\r\n+        //load the default properties\r\n+        Properties properties = ConfigUtils.getProperties();\r\n+\r\n+        //override the properties.\r\n+        for (OrderedPropertiesProvider orderedPropertiesProvider :\r\n+                orderedPropertiesProviders) {\r\n+            properties.putAll(orderedPropertiesProvider.initProperties());\r\n+        }\r\n+\r\n+        ConfigUtils.setProperties(properties);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return ConfigUtils.getProperty(key);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/SystemConfiguration.java", "source2": "org/apache/dubbo/common/config/SystemConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config;\n-\n-\n-/**\n- * FIXME: is this really necessary? PropertiesConfiguration should have already covered this:\n- *\n- * @See ConfigUtils#getProperty(String)\n- * @see PropertiesConfiguration\n- */\n-public class SystemConfiguration implements Configuration {\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return System.getProperty(key);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config;\r\n+\r\n+\r\n+/**\r\n+ * FIXME: is this really necessary? PropertiesConfiguration should have already covered this:\r\n+ *\r\n+ * @See ConfigUtils#getProperty(String)\r\n+ * @see PropertiesConfiguration\r\n+ */\r\n+public class SystemConfiguration implements Configuration {\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return System.getProperty(key);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java", "source2": "org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,306 +1,306 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.concurrent.Callable;\n-import java.util.concurrent.Future;\n-import java.util.concurrent.LinkedBlockingQueue;\n-import java.util.concurrent.ThreadPoolExecutor;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\n-\n-/**\n- * The abstract implementation of {@link DynamicConfiguration}\n- *\n- * @since 2.7.5\n- */\n-public abstract class AbstractDynamicConfiguration implements DynamicConfiguration {\n-\n-    public static final String PARAM_NAME_PREFIX = \"dubbo.config-center.\";\n-\n-    public static final String THREAD_POOL_PREFIX_PARAM_NAME = PARAM_NAME_PREFIX + \"thread-pool.prefix\";\n-\n-    public static final String DEFAULT_THREAD_POOL_PREFIX = PARAM_NAME_PREFIX + \"workers\";\n-\n-    public static final String THREAD_POOL_SIZE_PARAM_NAME = PARAM_NAME_PREFIX + \"thread-pool.size\";\n-\n-    /**\n-     * The keep alive time in milliseconds for threads in {@link ThreadPoolExecutor}\n-     */\n-    public static final String THREAD_POOL_KEEP_ALIVE_TIME_PARAM_NAME = PARAM_NAME_PREFIX + \"thread-pool.keep-alive-time\";\n-\n-    /**\n-     * The parameter name of group for config-center\n-     *\n-     * @since 2.7.8\n-     */\n-    public static final String GROUP_PARAM_NAME = PARAM_NAME_PREFIX + GROUP_KEY;\n-\n-    /**\n-     * The parameter name of timeout for config-center\n-     *\n-     * @since 2.7.8\n-     */\n-    public static final String TIMEOUT_PARAM_NAME = PARAM_NAME_PREFIX + TIMEOUT_KEY;\n-\n-    public static final int DEFAULT_THREAD_POOL_SIZE = 1;\n-\n-    /**\n-     * Default keep alive time in milliseconds for threads in {@link ThreadPoolExecutor} is 1 minute( 60 * 1000 ms)\n-     */\n-    public static final long DEFAULT_THREAD_POOL_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);\n-\n-    /**\n-     * Logger\n-     */\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    /**\n-     * The thread pool for workers who executes the tasks\n-     */\n-    private final ThreadPoolExecutor workersThreadPool;\n-\n-    private final String group;\n-\n-    private final long timeout;\n-\n-    public AbstractDynamicConfiguration(URL url) {\n-        this(getThreadPoolPrefixName(url), getThreadPoolSize(url), getThreadPoolKeepAliveTime(url), getGroup(url),\n-                getTimeout(url));\n-    }\n-\n-    public AbstractDynamicConfiguration(String threadPoolPrefixName,\n-                                        int threadPoolSize,\n-                                        long keepAliveTime,\n-                                        String group,\n-                                        long timeout) {\n-        this.workersThreadPool = initWorkersThreadPool(threadPoolPrefixName, threadPoolSize, keepAliveTime);\n-        this.group = group;\n-        this.timeout = timeout;\n-    }\n-\n-    @Override\n-    public void addListener(String key, String group, ConfigurationListener listener) {\n-    }\n-\n-    @Override\n-    public void removeListener(String key, String group, ConfigurationListener listener) {\n-    }\n-\n-    @Override\n-    public final String getConfig(String key, String group, long timeout) throws IllegalStateException {\n-        return execute(() -> doGetConfig(key, group), timeout);\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return null;\n-    }\n-\n-    @Override\n-    public final void close() throws Exception {\n-        try {\n-            doClose();\n-        } finally {\n-            doFinally();\n-        }\n-    }\n-\n-    @Override\n-    public boolean removeConfig(String key, String group) {\n-        return Boolean.TRUE.equals(execute(() -> doRemoveConfig(key, group), -1L));\n-    }\n-\n-    /**\n-     * @return the default group\n-     * @since 2.7.8\n-     */\n-    @Override\n-    public String getDefaultGroup() {\n-        return getGroup();\n-    }\n-\n-    /**\n-     * @return the default timeout\n-     * @since 2.7.8\n-     */\n-    @Override\n-    public long getDefaultTimeout() {\n-        return getTimeout();\n-    }\n-\n-    /**\n-     * Get the content of configuration in the specified key and group\n-     *\n-     * @param key   the key\n-     * @param group the group\n-     * @return if found, return the content of configuration\n-     * @throws Exception If met with some problems\n-     */\n-    protected abstract String doGetConfig(String key, String group) throws Exception;\n-\n-    /**\n-     * Close the resources if necessary\n-     *\n-     * @throws Exception If met with some problems\n-     */\n-    protected abstract void doClose() throws Exception;\n-\n-    /**\n-     * Remove the config in the specified key and group\n-     *\n-     * @param key   the key\n-     * @param group the group\n-     * @return If successful, return <code>true</code>, or <code>false</code>\n-     * @throws Exception\n-     * @since 2.7.8\n-     */\n-    protected abstract boolean doRemoveConfig(String key, String group) throws Exception;\n-\n-    /**\n-     * Executes the {@link Runnable} with the specified timeout\n-     *\n-     * @param task    the {@link Runnable task}\n-     * @param timeout timeout in milliseconds\n-     */\n-    protected final void execute(Runnable task, long timeout) {\n-        execute(() -> {\n-            task.run();\n-            return null;\n-        }, timeout);\n-    }\n-\n-    /**\n-     * Executes the {@link Callable} with the specified timeout\n-     *\n-     * @param task    the {@link Callable task}\n-     * @param timeout timeout in milliseconds\n-     * @param <V>     the type of computing result\n-     * @return the computing result\n-     */\n-    protected final <V> V execute(Callable<V> task, long timeout) {\n-        V value = null;\n-        try {\n-\n-            if (timeout < 1) { // less or equal 0\n-                value = task.call();\n-            } else {\n-                Future<V> future = workersThreadPool.submit(task);\n-                value = future.get(timeout, TimeUnit.MILLISECONDS);\n-            }\n-        } catch (Exception e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getMessage(), e);\n-            }\n-        }\n-        return value;\n-    }\n-\n-    protected ThreadPoolExecutor getWorkersThreadPool() {\n-        return workersThreadPool;\n-    }\n-\n-    private void doFinally() {\n-        shutdownWorkersThreadPool();\n-    }\n-\n-    private void shutdownWorkersThreadPool() {\n-        if (!workersThreadPool.isShutdown()) {\n-            workersThreadPool.shutdown();\n-        }\n-    }\n-\n-    protected ThreadPoolExecutor initWorkersThreadPool(String threadPoolPrefixName,\n-                                                       int threadPoolSize,\n-                                                       long keepAliveTime) {\n-        return new ThreadPoolExecutor(threadPoolSize, threadPoolSize, keepAliveTime,\n-                TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory(threadPoolPrefixName, true));\n-    }\n-\n-    protected static String getThreadPoolPrefixName(URL url) {\n-        return getParameter(url, THREAD_POOL_PREFIX_PARAM_NAME, DEFAULT_THREAD_POOL_PREFIX);\n-    }\n-\n-    protected static int getThreadPoolSize(URL url) {\n-        return getParameter(url, THREAD_POOL_SIZE_PARAM_NAME, DEFAULT_THREAD_POOL_SIZE);\n-    }\n-\n-    protected static long getThreadPoolKeepAliveTime(URL url) {\n-        return getParameter(url, THREAD_POOL_KEEP_ALIVE_TIME_PARAM_NAME, DEFAULT_THREAD_POOL_KEEP_ALIVE_TIME);\n-    }\n-\n-    protected static String getParameter(URL url, String name, String defaultValue) {\n-        if (url != null) {\n-            return url.getParameter(name, defaultValue);\n-        }\n-        return defaultValue;\n-    }\n-\n-    protected static int getParameter(URL url, String name, int defaultValue) {\n-        if (url != null) {\n-            return url.getParameter(name, defaultValue);\n-        }\n-        return defaultValue;\n-    }\n-\n-    protected static long getParameter(URL url, String name, long defaultValue) {\n-        if (url != null) {\n-            return url.getParameter(name, defaultValue);\n-        }\n-        return defaultValue;\n-    }\n-\n-\n-    protected String getGroup() {\n-        return group;\n-    }\n-\n-    protected long getTimeout() {\n-        return timeout;\n-    }\n-\n-    /**\n-     * Get the group from {@link URL the specified connection URL}\n-     *\n-     * @param url {@link URL the specified connection URL}\n-     * @return non-null\n-     * @since 2.7.8\n-     */\n-    protected static String getGroup(URL url) {\n-        String group = getParameter(url, GROUP_PARAM_NAME, null);\n-        return StringUtils.isBlank(group) ? getParameter(url, GROUP_KEY, DEFAULT_GROUP) : group;\n-    }\n-\n-    /**\n-     * Get the timeout from {@link URL the specified connection URL}\n-     *\n-     * @param url {@link URL the specified connection URL}\n-     * @return non-null\n-     * @since 2.7.8\n-     */\n-    protected static long getTimeout(URL url) {\n-        return getParameter(url, TIMEOUT_PARAM_NAME, -1L);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.concurrent.Callable;\r\n+import java.util.concurrent.Future;\r\n+import java.util.concurrent.LinkedBlockingQueue;\r\n+import java.util.concurrent.ThreadPoolExecutor;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\r\n+\r\n+/**\r\n+ * The abstract implementation of {@link DynamicConfiguration}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class AbstractDynamicConfiguration implements DynamicConfiguration {\r\n+\r\n+    public static final String PARAM_NAME_PREFIX = \"dubbo.config-center.\";\r\n+\r\n+    public static final String THREAD_POOL_PREFIX_PARAM_NAME = PARAM_NAME_PREFIX + \"thread-pool.prefix\";\r\n+\r\n+    public static final String DEFAULT_THREAD_POOL_PREFIX = PARAM_NAME_PREFIX + \"workers\";\r\n+\r\n+    public static final String THREAD_POOL_SIZE_PARAM_NAME = PARAM_NAME_PREFIX + \"thread-pool.size\";\r\n+\r\n+    /**\r\n+     * The keep alive time in milliseconds for threads in {@link ThreadPoolExecutor}\r\n+     */\r\n+    public static final String THREAD_POOL_KEEP_ALIVE_TIME_PARAM_NAME = PARAM_NAME_PREFIX + \"thread-pool.keep-alive-time\";\r\n+\r\n+    /**\r\n+     * The parameter name of group for config-center\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    public static final String GROUP_PARAM_NAME = PARAM_NAME_PREFIX + GROUP_KEY;\r\n+\r\n+    /**\r\n+     * The parameter name of timeout for config-center\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    public static final String TIMEOUT_PARAM_NAME = PARAM_NAME_PREFIX + TIMEOUT_KEY;\r\n+\r\n+    public static final int DEFAULT_THREAD_POOL_SIZE = 1;\r\n+\r\n+    /**\r\n+     * Default keep alive time in milliseconds for threads in {@link ThreadPoolExecutor} is 1 minute( 60 * 1000 ms)\r\n+     */\r\n+    public static final long DEFAULT_THREAD_POOL_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);\r\n+\r\n+    /**\r\n+     * Logger\r\n+     */\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    /**\r\n+     * The thread pool for workers who executes the tasks\r\n+     */\r\n+    private final ThreadPoolExecutor workersThreadPool;\r\n+\r\n+    private final String group;\r\n+\r\n+    private final long timeout;\r\n+\r\n+    public AbstractDynamicConfiguration(URL url) {\r\n+        this(getThreadPoolPrefixName(url), getThreadPoolSize(url), getThreadPoolKeepAliveTime(url), getGroup(url),\r\n+                getTimeout(url));\r\n+    }\r\n+\r\n+    public AbstractDynamicConfiguration(String threadPoolPrefixName,\r\n+                                        int threadPoolSize,\r\n+                                        long keepAliveTime,\r\n+                                        String group,\r\n+                                        long timeout) {\r\n+        this.workersThreadPool = initWorkersThreadPool(threadPoolPrefixName, threadPoolSize, keepAliveTime);\r\n+        this.group = group;\r\n+        this.timeout = timeout;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addListener(String key, String group, ConfigurationListener listener) {\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeListener(String key, String group, ConfigurationListener listener) {\r\n+    }\r\n+\r\n+    @Override\r\n+    public final String getConfig(String key, String group, long timeout) throws IllegalStateException {\r\n+        return execute(() -> doGetConfig(key, group), timeout);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void close() throws Exception {\r\n+        try {\r\n+            doClose();\r\n+        } finally {\r\n+            doFinally();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean removeConfig(String key, String group) {\r\n+        return Boolean.TRUE.equals(execute(() -> doRemoveConfig(key, group), -1L));\r\n+    }\r\n+\r\n+    /**\r\n+     * @return the default group\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Override\r\n+    public String getDefaultGroup() {\r\n+        return getGroup();\r\n+    }\r\n+\r\n+    /**\r\n+     * @return the default timeout\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Override\r\n+    public long getDefaultTimeout() {\r\n+        return getTimeout();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the content of configuration in the specified key and group\r\n+     *\r\n+     * @param key   the key\r\n+     * @param group the group\r\n+     * @return if found, return the content of configuration\r\n+     * @throws Exception If met with some problems\r\n+     */\r\n+    protected abstract String doGetConfig(String key, String group) throws Exception;\r\n+\r\n+    /**\r\n+     * Close the resources if necessary\r\n+     *\r\n+     * @throws Exception If met with some problems\r\n+     */\r\n+    protected abstract void doClose() throws Exception;\r\n+\r\n+    /**\r\n+     * Remove the config in the specified key and group\r\n+     *\r\n+     * @param key   the key\r\n+     * @param group the group\r\n+     * @return If successful, return <code>true</code>, or <code>false</code>\r\n+     * @throws Exception\r\n+     * @since 2.7.8\r\n+     */\r\n+    protected abstract boolean doRemoveConfig(String key, String group) throws Exception;\r\n+\r\n+    /**\r\n+     * Executes the {@link Runnable} with the specified timeout\r\n+     *\r\n+     * @param task    the {@link Runnable task}\r\n+     * @param timeout timeout in milliseconds\r\n+     */\r\n+    protected final void execute(Runnable task, long timeout) {\r\n+        execute(() -> {\r\n+            task.run();\r\n+            return null;\r\n+        }, timeout);\r\n+    }\r\n+\r\n+    /**\r\n+     * Executes the {@link Callable} with the specified timeout\r\n+     *\r\n+     * @param task    the {@link Callable task}\r\n+     * @param timeout timeout in milliseconds\r\n+     * @param <V>     the type of computing result\r\n+     * @return the computing result\r\n+     */\r\n+    protected final <V> V execute(Callable<V> task, long timeout) {\r\n+        V value = null;\r\n+        try {\r\n+\r\n+            if (timeout < 1) { // less or equal 0\r\n+                value = task.call();\r\n+            } else {\r\n+                Future<V> future = workersThreadPool.submit(task);\r\n+                value = future.get(timeout, TimeUnit.MILLISECONDS);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    protected ThreadPoolExecutor getWorkersThreadPool() {\r\n+        return workersThreadPool;\r\n+    }\r\n+\r\n+    private void doFinally() {\r\n+        shutdownWorkersThreadPool();\r\n+    }\r\n+\r\n+    private void shutdownWorkersThreadPool() {\r\n+        if (!workersThreadPool.isShutdown()) {\r\n+            workersThreadPool.shutdown();\r\n+        }\r\n+    }\r\n+\r\n+    protected ThreadPoolExecutor initWorkersThreadPool(String threadPoolPrefixName,\r\n+                                                       int threadPoolSize,\r\n+                                                       long keepAliveTime) {\r\n+        return new ThreadPoolExecutor(threadPoolSize, threadPoolSize, keepAliveTime,\r\n+                TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory(threadPoolPrefixName, true));\r\n+    }\r\n+\r\n+    protected static String getThreadPoolPrefixName(URL url) {\r\n+        return getParameter(url, THREAD_POOL_PREFIX_PARAM_NAME, DEFAULT_THREAD_POOL_PREFIX);\r\n+    }\r\n+\r\n+    protected static int getThreadPoolSize(URL url) {\r\n+        return getParameter(url, THREAD_POOL_SIZE_PARAM_NAME, DEFAULT_THREAD_POOL_SIZE);\r\n+    }\r\n+\r\n+    protected static long getThreadPoolKeepAliveTime(URL url) {\r\n+        return getParameter(url, THREAD_POOL_KEEP_ALIVE_TIME_PARAM_NAME, DEFAULT_THREAD_POOL_KEEP_ALIVE_TIME);\r\n+    }\r\n+\r\n+    protected static String getParameter(URL url, String name, String defaultValue) {\r\n+        if (url != null) {\r\n+            return url.getParameter(name, defaultValue);\r\n+        }\r\n+        return defaultValue;\r\n+    }\r\n+\r\n+    protected static int getParameter(URL url, String name, int defaultValue) {\r\n+        if (url != null) {\r\n+            return url.getParameter(name, defaultValue);\r\n+        }\r\n+        return defaultValue;\r\n+    }\r\n+\r\n+    protected static long getParameter(URL url, String name, long defaultValue) {\r\n+        if (url != null) {\r\n+            return url.getParameter(name, defaultValue);\r\n+        }\r\n+        return defaultValue;\r\n+    }\r\n+\r\n+\r\n+    protected String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    protected long getTimeout() {\r\n+        return timeout;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the group from {@link URL the specified connection URL}\r\n+     *\r\n+     * @param url {@link URL the specified connection URL}\r\n+     * @return non-null\r\n+     * @since 2.7.8\r\n+     */\r\n+    protected static String getGroup(URL url) {\r\n+        String group = getParameter(url, GROUP_PARAM_NAME, null);\r\n+        return StringUtils.isBlank(group) ? getParameter(url, GROUP_KEY, DEFAULT_GROUP) : group;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the timeout from {@link URL the specified connection URL}\r\n+     *\r\n+     * @param url {@link URL the specified connection URL}\r\n+     * @return non-null\r\n+     * @since 2.7.8\r\n+     */\r\n+    protected static long getTimeout(URL url) {\r\n+        return getParameter(url, TIMEOUT_PARAM_NAME, -1L);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java", "source2": "org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,43 +1,43 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-\n-/**\n- * Abstract {@link DynamicConfigurationFactory} implementation with cache ability\n- *\n- * @see DynamicConfigurationFactory\n- * @since 2.7.5\n- */\n-public abstract class AbstractDynamicConfigurationFactory implements DynamicConfigurationFactory {\n-\n-    private volatile Map<String, DynamicConfiguration> dynamicConfigurations = new ConcurrentHashMap<>();\n-\n-    @Override\n-    public final DynamicConfiguration getDynamicConfiguration(URL url) {\n-        String key = url == null ? DEFAULT_KEY : url.toServiceString();\n-        return dynamicConfigurations.computeIfAbsent(key, k -> createDynamicConfiguration(url));\n-    }\n-\n-    protected abstract DynamicConfiguration createDynamicConfiguration(URL url);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+\r\n+/**\r\n+ * Abstract {@link DynamicConfigurationFactory} implementation with cache ability\r\n+ *\r\n+ * @see DynamicConfigurationFactory\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class AbstractDynamicConfigurationFactory implements DynamicConfigurationFactory {\r\n+\r\n+    private volatile Map<String, DynamicConfiguration> dynamicConfigurations = new ConcurrentHashMap<>();\r\n+\r\n+    @Override\r\n+    public final DynamicConfiguration getDynamicConfiguration(URL url) {\r\n+        String key = url == null ? DEFAULT_KEY : url.toServiceString();\r\n+        return dynamicConfigurations.computeIfAbsent(key, k -> createDynamicConfiguration(url));\r\n+    }\r\n+\r\n+    protected abstract DynamicConfiguration createDynamicConfiguration(URL url);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/ConfigChangeType.java", "source2": "org/apache/dubbo/common/config/configcenter/ConfigChangeType.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,37 +1,37 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-/**\n- * Config change event type\n- */\n-public enum ConfigChangeType {\n-    /**\n-     * A config is created.\n-     */\n-    ADDED,\n-\n-    /**\n-     * A config is updated.\n-     */\n-    MODIFIED,\n-\n-    /**\n-     * A config is deleted.\n-     */\n-    DELETED\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+/**\r\n+ * Config change event type\r\n+ */\r\n+public enum ConfigChangeType {\r\n+    /**\r\n+     * A config is created.\r\n+     */\r\n+    ADDED,\r\n+\r\n+    /**\r\n+     * A config is updated.\r\n+     */\r\n+    MODIFIED,\r\n+\r\n+    /**\r\n+     * A config is deleted.\r\n+     */\r\n+    DELETED\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/ConfigChangedEvent.java", "source2": "org/apache/dubbo/common/config/configcenter/ConfigChangedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,94 +1,94 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import java.util.EventObject;\n-import java.util.Objects;\n-\n-/**\n- * An event raised when the config changed, immutable.\n- *\n- * @see ConfigChangeType\n- */\n-public class ConfigChangedEvent extends EventObject {\n-\n-    private final String key;\n-\n-    private final String group;\n-\n-    private final String content;\n-\n-    private final ConfigChangeType changeType;\n-\n-    public ConfigChangedEvent(String key, String group, String content) {\n-        this(key, group, content, ConfigChangeType.MODIFIED);\n-    }\n-\n-    public ConfigChangedEvent(String key, String group, String content, ConfigChangeType changeType) {\n-        super(key + \",\" + group);\n-        this.key = key;\n-        this.group = group;\n-        this.content = content;\n-        this.changeType = changeType;\n-    }\n-\n-    public String getKey() {\n-        return key;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public String getContent() {\n-        return content;\n-    }\n-\n-    public ConfigChangeType getChangeType() {\n-        return changeType;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return \"ConfigChangedEvent{\" +\n-                \"key='\" + key + '\\'' +\n-                \", group='\" + group + '\\'' +\n-                \", content='\" + content + '\\'' +\n-                \", changeType=\" + changeType +\n-                \"} \" + super.toString();\n-    }\n-\n-    @Override\n-    public boolean equals(Object o) {\n-        if (this == o) {\n-            return true;\n-        }\n-        if (!(o instanceof ConfigChangedEvent)) {\n-            return false;\n-        }\n-        ConfigChangedEvent that = (ConfigChangedEvent) o;\n-        return Objects.equals(getKey(), that.getKey()) &&\n-                Objects.equals(getGroup(), that.getGroup()) &&\n-                Objects.equals(getContent(), that.getContent()) &&\n-                getChangeType() == that.getChangeType();\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        return Objects.hash(getKey(), getGroup(), getContent(), getChangeType());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import java.util.EventObject;\r\n+import java.util.Objects;\r\n+\r\n+/**\r\n+ * An event raised when the config changed, immutable.\r\n+ *\r\n+ * @see ConfigChangeType\r\n+ */\r\n+public class ConfigChangedEvent extends EventObject {\r\n+\r\n+    private final String key;\r\n+\r\n+    private final String group;\r\n+\r\n+    private final String content;\r\n+\r\n+    private final ConfigChangeType changeType;\r\n+\r\n+    public ConfigChangedEvent(String key, String group, String content) {\r\n+        this(key, group, content, ConfigChangeType.MODIFIED);\r\n+    }\r\n+\r\n+    public ConfigChangedEvent(String key, String group, String content, ConfigChangeType changeType) {\r\n+        super(key + \",\" + group);\r\n+        this.key = key;\r\n+        this.group = group;\r\n+        this.content = content;\r\n+        this.changeType = changeType;\r\n+    }\r\n+\r\n+    public String getKey() {\r\n+        return key;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public String getContent() {\r\n+        return content;\r\n+    }\r\n+\r\n+    public ConfigChangeType getChangeType() {\r\n+        return changeType;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return \"ConfigChangedEvent{\" +\r\n+                \"key='\" + key + '\\'' +\r\n+                \", group='\" + group + '\\'' +\r\n+                \", content='\" + content + '\\'' +\r\n+                \", changeType=\" + changeType +\r\n+                \"} \" + super.toString();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean equals(Object o) {\r\n+        if (this == o) {\r\n+            return true;\r\n+        }\r\n+        if (!(o instanceof ConfigChangedEvent)) {\r\n+            return false;\r\n+        }\r\n+        ConfigChangedEvent that = (ConfigChangedEvent) o;\r\n+        return Objects.equals(getKey(), that.getKey()) &&\r\n+                Objects.equals(getGroup(), that.getGroup()) &&\r\n+                Objects.equals(getContent(), that.getContent()) &&\r\n+                getChangeType() == that.getChangeType();\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        return Objects.hash(getKey(), getGroup(), getContent(), getChangeType());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/ConfigurationListener.java", "source2": "org/apache/dubbo/common/config/configcenter/ConfigurationListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import java.util.EventListener;\n-\n-/**\n- * Config listener, will get notified when the config it listens on changes.\n- */\n-public interface ConfigurationListener extends EventListener {\n-\n-    /**\n-     * Listener call back method. Listener gets notified by this method once there's any change happens on the config\n-     * the listener listens on.\n-     *\n-     * @param event config change event\n-     */\n-    void process(ConfigChangedEvent event);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import java.util.EventListener;\r\n+\r\n+/**\r\n+ * Config listener, will get notified when the config it listens on changes.\r\n+ */\r\n+public interface ConfigurationListener extends EventListener {\r\n+\r\n+    /**\r\n+     * Listener call back method. Listener gets notified by this method once there's any change happens on the config\r\n+     * the listener listens on.\r\n+     *\r\n+     * @param event config change event\r\n+     */\r\n+    void process(ConfigChangedEvent event);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/Constants.java", "source2": "org/apache/dubbo/common/config/configcenter/Constants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,25 +1,25 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-@Deprecated\n-public interface Constants {\n-    String CONFIG_CLUSTER_KEY = \"config.cluster\";\n-    String CONFIG_NAMESPACE_KEY = \"config.namespace\";\n-    String CONFIG_GROUP_KEY = \"config.group\";\n-    String CONFIG_CHECK_KEY = \"config.check\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+@Deprecated\r\n+public interface Constants {\r\n+    String CONFIG_CLUSTER_KEY = \"config.cluster\";\r\n+    String CONFIG_NAMESPACE_KEY = \"config.namespace\";\r\n+    String CONFIG_GROUP_KEY = \"config.group\";\r\n+    String CONFIG_CHECK_KEY = \"config.check\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java", "source2": "org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,245 +1,245 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.Configuration;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Collections;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.SortedSet;\n-\n-import static org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory.getDynamicConfigurationFactory;\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-\n-/**\n- * Dynamic Configuration\n- * <br/>\n- * From the use scenario internally inside framework, there're mainly three kinds of methods:\n- * <ol>\n- * <li>{@link #getProperties(String, String, long)}, get configuration file from Config Center at start up.</li>\n- * <li>{@link #addListener(String, String, ConfigurationListener)}/ {@link #removeListener(String, String, ConfigurationListener)}\n- * , add or remove listeners for governance rules or config items that need to watch.</li>\n- * <li>{@link #getProperty(String, Object)}, get a single config item.</li>\n- * <li>{@link #getConfig(String, String, long)}, get the specified config</li>\n- * </ol>\n- *\n- * @see AbstractDynamicConfiguration\n- */\n-public interface DynamicConfiguration extends Configuration, AutoCloseable {\n-\n-    String DEFAULT_GROUP = \"dubbo\";\n-\n-    /**\n-     * {@link #addListener(String, String, ConfigurationListener)}\n-     *\n-     * @param key      the key to represent a configuration\n-     * @param listener configuration listener\n-     */\n-    default void addListener(String key, ConfigurationListener listener) {\n-        addListener(key, getDefaultGroup(), listener);\n-    }\n-\n-\n-    /**\n-     * {@link #removeListener(String, String, ConfigurationListener)}\n-     *\n-     * @param key      the key to represent a configuration\n-     * @param listener configuration listener\n-     */\n-    default void removeListener(String key, ConfigurationListener listener) {\n-        removeListener(key, getDefaultGroup(), listener);\n-    }\n-\n-    /**\n-     * Register a configuration listener for a specified key\n-     * The listener only works for service governance purpose, so the target group would always be the value user\n-     * specifies at startup or 'dubbo' by default. This method will only register listener, which means it will not\n-     * trigger a notification that contains the current value.\n-     *\n-     * @param key      the key to represent a configuration\n-     * @param group    the group where the key belongs to\n-     * @param listener configuration listener\n-     */\n-    void addListener(String key, String group, ConfigurationListener listener);\n-\n-    /**\n-     * Stops one listener from listening to value changes in the specified key.\n-     *\n-     * @param key      the key to represent a configuration\n-     * @param group    the group where the key belongs to\n-     * @param listener configuration listener\n-     */\n-    void removeListener(String key, String group, ConfigurationListener listener);\n-\n-    /**\n-     * Get the configuration mapped to the given key and the given group with {@link #getDefaultTimeout() the default\n-     * timeout}\n-     *\n-     * @param key   the key to represent a configuration\n-     * @param group the group where the key belongs to\n-     * @return target configuration mapped to the given key and the given group\n-     */\n-    default String getConfig(String key, String group) {\n-        return getConfig(key, group, getDefaultTimeout());\n-    }\n-\n-    /**\n-     * Get the configuration mapped to the given key and the given group. If the\n-     * configuration fails to fetch after timeout exceeds, IllegalStateException will be thrown.\n-     *\n-     * @param key     the key to represent a configuration\n-     * @param group   the group where the key belongs to\n-     * @param timeout timeout value for fetching the target config\n-     * @return target configuration mapped to the given key and the given group, IllegalStateException will be thrown\n-     * if timeout exceeds.\n-     */\n-    String getConfig(String key, String group, long timeout) throws IllegalStateException;\n-\n-    /**\n-     * This method are mostly used to get a compound config file with {@link #getDefaultTimeout() the default timeout},\n-     * such as a complete dubbo.properties file.\n-     */\n-    default String getProperties(String key, String group) throws IllegalStateException {\n-        return getProperties(key, group, getDefaultTimeout());\n-    }\n-\n-    /**\n-     * This method are mostly used to get a compound config file, such as a complete dubbo.properties file.\n-     *\n-     * @revision 2.7.4\n-     */\n-    default String getProperties(String key, String group, long timeout) throws IllegalStateException {\n-        return getConfig(key, group, timeout);\n-    }\n-\n-    /**\n-     * Publish Config mapped to the given key under the {@link #getDefaultGroup() default group}\n-     *\n-     * @param key     the key to represent a configuration\n-     * @param content the content of configuration\n-     * @return <code>true</code> if success, or <code>false</code>\n-     * @throws UnsupportedOperationException If the under layer does not support\n-     * @since 2.7.5\n-     */\n-    default boolean publishConfig(String key, String content) throws UnsupportedOperationException {\n-        return publishConfig(key, getDefaultGroup(), content);\n-    }\n-\n-    /**\n-     * Publish Config mapped to the given key and the given group.\n-     *\n-     * @param key     the key to represent a configuration\n-     * @param group   the group where the key belongs to\n-     * @param content the content of configuration\n-     * @return <code>true</code> if success, or <code>false</code>\n-     * @throws UnsupportedOperationException If the under layer does not support\n-     * @since 2.7.5\n-     */\n-    default boolean publishConfig(String key, String group, String content) throws UnsupportedOperationException {\n-        return false;\n-    }\n-\n-    /**\n-     * Get the config keys by the specified group\n-     *\n-     * @param group the specified group\n-     * @return the read-only non-null sorted {@link Set set} of config keys\n-     * @throws UnsupportedOperationException If the under layer does not support\n-     * @since 2.7.5\n-     */\n-    default SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {\n-        return Collections.emptySortedSet();\n-    }\n-\n-    /**\n-     * Get the default group for the operations\n-     *\n-     * @return The default value is {@link #DEFAULT_GROUP \"dubbo\"}\n-     * @since 2.7.5\n-     */\n-    default String getDefaultGroup() {\n-        return DEFAULT_GROUP;\n-    }\n-\n-    /**\n-     * Get the default timeout for the operations in milliseconds\n-     *\n-     * @return The default value is <code>-1L</code>\n-     * @since 2.7.5\n-     */\n-    default long getDefaultTimeout() {\n-        return -1L;\n-    }\n-\n-    /**\n-     * Close the configuration\n-     *\n-     * @throws Exception\n-     * @since 2.7.5\n-     */\n-    @Override\n-    default void close() throws Exception {\n-        throw new UnsupportedOperationException();\n-    }\n-\n-    /**\n-     * Find DynamicConfiguration instance\n-     *\n-     * @return DynamicConfiguration instance\n-     */\n-    static DynamicConfiguration getDynamicConfiguration() {\n-        Optional<DynamicConfiguration> optional = ApplicationModel.getEnvironment().getDynamicConfiguration();\n-        return optional.orElseGet(() -> getExtensionLoader(DynamicConfigurationFactory.class)\n-                .getDefaultExtension()\n-                .getDynamicConfiguration(null));\n-    }\n-\n-    /**\n-     * Get the instance of {@link DynamicConfiguration} by the specified connection {@link URL}\n-     *\n-     * @param connectionURL\n-     * @return non-null\n-     * @since 2.7.5\n-     */\n-    static DynamicConfiguration getDynamicConfiguration(URL connectionURL) {\n-        String protocol = connectionURL.getProtocol();\n-        DynamicConfigurationFactory factory = getDynamicConfigurationFactory(protocol);\n-        return factory.getDynamicConfiguration(connectionURL);\n-    }\n-\n-    /**\n-     * The format is '{interfaceName}:[version]:[group]'\n-     *\n-     * @return\n-     */\n-    static String getRuleKey(URL url) {\n-        return url.getColonSeparatedKey();\n-    }\n-\n-    /**\n-     * @param key   the key to represent a configuration\n-     * @param group the group where the key belongs to\n-     * @return <code>true</code> if success, or <code>false</code>\n-     * @since 2.7.8\n-     */\n-    default boolean removeConfig(String key, String group) {\n-        return true;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.Configuration;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.SortedSet;\r\n+\r\n+import static org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory.getDynamicConfigurationFactory;\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+\r\n+/**\r\n+ * Dynamic Configuration\r\n+ * <br/>\r\n+ * From the use scenario internally inside framework, there're mainly three kinds of methods:\r\n+ * <ol>\r\n+ * <li>{@link #getProperties(String, String, long)}, get configuration file from Config Center at start up.</li>\r\n+ * <li>{@link #addListener(String, String, ConfigurationListener)}/ {@link #removeListener(String, String, ConfigurationListener)}\r\n+ * , add or remove listeners for governance rules or config items that need to watch.</li>\r\n+ * <li>{@link #getProperty(String, Object)}, get a single config item.</li>\r\n+ * <li>{@link #getConfig(String, String, long)}, get the specified config</li>\r\n+ * </ol>\r\n+ *\r\n+ * @see AbstractDynamicConfiguration\r\n+ */\r\n+public interface DynamicConfiguration extends Configuration, AutoCloseable {\r\n+\r\n+    String DEFAULT_GROUP = \"dubbo\";\r\n+\r\n+    /**\r\n+     * {@link #addListener(String, String, ConfigurationListener)}\r\n+     *\r\n+     * @param key      the key to represent a configuration\r\n+     * @param listener configuration listener\r\n+     */\r\n+    default void addListener(String key, ConfigurationListener listener) {\r\n+        addListener(key, getDefaultGroup(), listener);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * {@link #removeListener(String, String, ConfigurationListener)}\r\n+     *\r\n+     * @param key      the key to represent a configuration\r\n+     * @param listener configuration listener\r\n+     */\r\n+    default void removeListener(String key, ConfigurationListener listener) {\r\n+        removeListener(key, getDefaultGroup(), listener);\r\n+    }\r\n+\r\n+    /**\r\n+     * Register a configuration listener for a specified key\r\n+     * The listener only works for service governance purpose, so the target group would always be the value user\r\n+     * specifies at startup or 'dubbo' by default. This method will only register listener, which means it will not\r\n+     * trigger a notification that contains the current value.\r\n+     *\r\n+     * @param key      the key to represent a configuration\r\n+     * @param group    the group where the key belongs to\r\n+     * @param listener configuration listener\r\n+     */\r\n+    void addListener(String key, String group, ConfigurationListener listener);\r\n+\r\n+    /**\r\n+     * Stops one listener from listening to value changes in the specified key.\r\n+     *\r\n+     * @param key      the key to represent a configuration\r\n+     * @param group    the group where the key belongs to\r\n+     * @param listener configuration listener\r\n+     */\r\n+    void removeListener(String key, String group, ConfigurationListener listener);\r\n+\r\n+    /**\r\n+     * Get the configuration mapped to the given key and the given group with {@link #getDefaultTimeout() the default\r\n+     * timeout}\r\n+     *\r\n+     * @param key   the key to represent a configuration\r\n+     * @param group the group where the key belongs to\r\n+     * @return target configuration mapped to the given key and the given group\r\n+     */\r\n+    default String getConfig(String key, String group) {\r\n+        return getConfig(key, group, getDefaultTimeout());\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the configuration mapped to the given key and the given group. If the\r\n+     * configuration fails to fetch after timeout exceeds, IllegalStateException will be thrown.\r\n+     *\r\n+     * @param key     the key to represent a configuration\r\n+     * @param group   the group where the key belongs to\r\n+     * @param timeout timeout value for fetching the target config\r\n+     * @return target configuration mapped to the given key and the given group, IllegalStateException will be thrown\r\n+     * if timeout exceeds.\r\n+     */\r\n+    String getConfig(String key, String group, long timeout) throws IllegalStateException;\r\n+\r\n+    /**\r\n+     * This method are mostly used to get a compound config file with {@link #getDefaultTimeout() the default timeout},\r\n+     * such as a complete dubbo.properties file.\r\n+     */\r\n+    default String getProperties(String key, String group) throws IllegalStateException {\r\n+        return getProperties(key, group, getDefaultTimeout());\r\n+    }\r\n+\r\n+    /**\r\n+     * This method are mostly used to get a compound config file, such as a complete dubbo.properties file.\r\n+     *\r\n+     * @revision 2.7.4\r\n+     */\r\n+    default String getProperties(String key, String group, long timeout) throws IllegalStateException {\r\n+        return getConfig(key, group, timeout);\r\n+    }\r\n+\r\n+    /**\r\n+     * Publish Config mapped to the given key under the {@link #getDefaultGroup() default group}\r\n+     *\r\n+     * @param key     the key to represent a configuration\r\n+     * @param content the content of configuration\r\n+     * @return <code>true</code> if success, or <code>false</code>\r\n+     * @throws UnsupportedOperationException If the under layer does not support\r\n+     * @since 2.7.5\r\n+     */\r\n+    default boolean publishConfig(String key, String content) throws UnsupportedOperationException {\r\n+        return publishConfig(key, getDefaultGroup(), content);\r\n+    }\r\n+\r\n+    /**\r\n+     * Publish Config mapped to the given key and the given group.\r\n+     *\r\n+     * @param key     the key to represent a configuration\r\n+     * @param group   the group where the key belongs to\r\n+     * @param content the content of configuration\r\n+     * @return <code>true</code> if success, or <code>false</code>\r\n+     * @throws UnsupportedOperationException If the under layer does not support\r\n+     * @since 2.7.5\r\n+     */\r\n+    default boolean publishConfig(String key, String group, String content) throws UnsupportedOperationException {\r\n+        return false;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the config keys by the specified group\r\n+     *\r\n+     * @param group the specified group\r\n+     * @return the read-only non-null sorted {@link Set set} of config keys\r\n+     * @throws UnsupportedOperationException If the under layer does not support\r\n+     * @since 2.7.5\r\n+     */\r\n+    default SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {\r\n+        return Collections.emptySortedSet();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the default group for the operations\r\n+     *\r\n+     * @return The default value is {@link #DEFAULT_GROUP \"dubbo\"}\r\n+     * @since 2.7.5\r\n+     */\r\n+    default String getDefaultGroup() {\r\n+        return DEFAULT_GROUP;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the default timeout for the operations in milliseconds\r\n+     *\r\n+     * @return The default value is <code>-1L</code>\r\n+     * @since 2.7.5\r\n+     */\r\n+    default long getDefaultTimeout() {\r\n+        return -1L;\r\n+    }\r\n+\r\n+    /**\r\n+     * Close the configuration\r\n+     *\r\n+     * @throws Exception\r\n+     * @since 2.7.5\r\n+     */\r\n+    @Override\r\n+    default void close() throws Exception {\r\n+        throw new UnsupportedOperationException();\r\n+    }\r\n+\r\n+    /**\r\n+     * Find DynamicConfiguration instance\r\n+     *\r\n+     * @return DynamicConfiguration instance\r\n+     */\r\n+    static DynamicConfiguration getDynamicConfiguration() {\r\n+        Optional<DynamicConfiguration> optional = ApplicationModel.getEnvironment().getDynamicConfiguration();\r\n+        return optional.orElseGet(() -> getExtensionLoader(DynamicConfigurationFactory.class)\r\n+                .getDefaultExtension()\r\n+                .getDynamicConfiguration(null));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the instance of {@link DynamicConfiguration} by the specified connection {@link URL}\r\n+     *\r\n+     * @param connectionURL\r\n+     * @return non-null\r\n+     * @since 2.7.5\r\n+     */\r\n+    static DynamicConfiguration getDynamicConfiguration(URL connectionURL) {\r\n+        String protocol = connectionURL.getProtocol();\r\n+        DynamicConfigurationFactory factory = getDynamicConfigurationFactory(protocol);\r\n+        return factory.getDynamicConfiguration(connectionURL);\r\n+    }\r\n+\r\n+    /**\r\n+     * The format is '{interfaceName}:[version]:[group]'\r\n+     *\r\n+     * @return\r\n+     */\r\n+    static String getRuleKey(URL url) {\r\n+        return url.getColonSeparatedKey();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param key   the key to represent a configuration\r\n+     * @param group the group where the key belongs to\r\n+     * @return <code>true</code> if success, or <code>false</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    default boolean removeConfig(String key, String group) {\r\n+        return true;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java", "source2": "org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,46 +1,46 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-\n-/**\n- * The factory interface to create the instance of {@link DynamicConfiguration}\n- */\n-@SPI(\"nop\") // 2.7.5 change the default SPI implementation\n-public interface DynamicConfigurationFactory {\n-\n-    DynamicConfiguration getDynamicConfiguration(URL url);\n-\n-    /**\n-     * Get an instance of {@link DynamicConfigurationFactory} by the specified name. If not found, take the default\n-     * extension of {@link DynamicConfigurationFactory}\n-     *\n-     * @param name the name of extension of {@link DynamicConfigurationFactory}\n-     * @return non-null\n-     * @see 2.7.4\n-     */\n-    static DynamicConfigurationFactory getDynamicConfigurationFactory(String name) {\n-        Class<DynamicConfigurationFactory> factoryClass = DynamicConfigurationFactory.class;\n-        ExtensionLoader<DynamicConfigurationFactory> loader = getExtensionLoader(factoryClass);\n-        return loader.getOrDefaultExtension(name);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+\r\n+/**\r\n+ * The factory interface to create the instance of {@link DynamicConfiguration}\r\n+ */\r\n+@SPI(\"nop\") // 2.7.5 change the default SPI implementation\r\n+public interface DynamicConfigurationFactory {\r\n+\r\n+    DynamicConfiguration getDynamicConfiguration(URL url);\r\n+\r\n+    /**\r\n+     * Get an instance of {@link DynamicConfigurationFactory} by the specified name. If not found, take the default\r\n+     * extension of {@link DynamicConfigurationFactory}\r\n+     *\r\n+     * @param name the name of extension of {@link DynamicConfigurationFactory}\r\n+     * @return non-null\r\n+     * @see 2.7.4\r\n+     */\r\n+    static DynamicConfigurationFactory getDynamicConfigurationFactory(String name) {\r\n+        Class<DynamicConfigurationFactory> factoryClass = DynamicConfigurationFactory.class;\r\n+        ExtensionLoader<DynamicConfigurationFactory> loader = getExtensionLoader(factoryClass);\r\n+        return loader.getOrDefaultExtension(name);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/TreePathDynamicConfiguration.java", "source2": "org/apache/dubbo/common/config/configcenter/TreePathDynamicConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,186 +1,186 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.Collection;\n-import java.util.SortedSet;\n-import java.util.TreeSet;\n-\n-import static java.util.Collections.emptySortedSet;\n-import static java.util.Collections.unmodifiableSortedSet;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\n-import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.PathUtils.buildPath;\n-import static org.apache.dubbo.common.utils.PathUtils.normalize;\n-\n-/**\n- * An abstract implementation of {@link DynamicConfiguration} is like \"tree-structure\" path :\n- * <ul>\n- *     <li>{@link FileSystemDynamicConfiguration \"file\"}</li>\n- *     <li>{@link org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration \"zookeeper\"}</li>\n- *     <li>{@link org.apache.dubbo.configcenter.consul.ConsulDynamicConfiguration \"consul\"}</li>\n- * </ul>\n- *\n- * @see DynamicConfiguration\n- * @see AbstractDynamicConfiguration\n- * @since 2.7.8\n- */\n-public abstract class TreePathDynamicConfiguration extends AbstractDynamicConfiguration {\n-\n-    /**\n-     * The parameter name of URL for the config root path\n-     */\n-    public static final String CONFIG_ROOT_PATH_PARAM_NAME = PARAM_NAME_PREFIX + \"root-path\";\n-\n-    /**\n-     * The parameter name of URL for the config base path\n-     */\n-    public static final String CONFIG_BASE_PATH_PARAM_NAME = PARAM_NAME_PREFIX + \"base-path\";\n-\n-    /**\n-     * The default value of parameter of URL for the config base path\n-     */\n-    public static final String DEFAULT_CONFIG_BASE_PATH = \"/config\";\n-\n-    private final String rootPath;\n-\n-    public TreePathDynamicConfiguration(URL url) {\n-        super(url);\n-        this.rootPath = getRootPath(url);\n-    }\n-\n-    public TreePathDynamicConfiguration(String rootPath,\n-                                        String threadPoolPrefixName,\n-                                        int threadPoolSize,\n-                                        long keepAliveTime,\n-                                        String group,\n-                                        long timeout) {\n-        super(threadPoolPrefixName, threadPoolSize, keepAliveTime, group, timeout);\n-        this.rootPath = rootPath;\n-    }\n-\n-    @Override\n-    protected final String doGetConfig(String key, String group) throws Exception {\n-        String pathKey = buildPathKey(group, key);\n-        return doGetConfig(pathKey);\n-    }\n-\n-    @Override\n-    public final boolean publishConfig(String key, String group, String content) {\n-        String pathKey = buildPathKey(group, key);\n-        return Boolean.TRUE.equals(execute(() -> doPublishConfig(pathKey, content), getDefaultTimeout()));\n-    }\n-\n-    @Override\n-    protected final boolean doRemoveConfig(String key, String group) throws Exception {\n-        String pathKey = buildPathKey(group, key);\n-        return doRemoveConfig(pathKey);\n-    }\n-\n-    @Override\n-    public final void addListener(String key, String group, ConfigurationListener listener) {\n-        String pathKey = buildPathKey(group, key);\n-        doAddListener(pathKey, listener);\n-    }\n-\n-    @Override\n-    public final void removeListener(String key, String group, ConfigurationListener listener) {\n-        String pathKey = buildPathKey(group, key);\n-        doRemoveListener(pathKey, listener);\n-    }\n-\n-    @Override\n-    public final SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {\n-        String groupPath = buildGroupPath(group);\n-        Collection<String> configKeys = doGetConfigKeys(groupPath);\n-        return isEmpty(configKeys) ? emptySortedSet() : unmodifiableSortedSet(new TreeSet<>(configKeys));\n-    }\n-\n-    protected abstract boolean doPublishConfig(String pathKey, String content) throws Exception;\n-\n-    protected abstract String doGetConfig(String pathKey) throws Exception;\n-\n-    protected abstract boolean doRemoveConfig(String pathKey) throws Exception;\n-\n-    protected abstract Collection<String> doGetConfigKeys(String groupPath);\n-\n-    protected abstract void doAddListener(String pathKey, ConfigurationListener listener);\n-\n-    protected abstract void doRemoveListener(String pathKey, ConfigurationListener listener);\n-\n-    protected String buildGroupPath(String group) {\n-        return buildPath(rootPath, group);\n-    }\n-\n-    protected String buildPathKey(String group, String key) {\n-        return buildPath(buildGroupPath(group), key);\n-    }\n-\n-    /**\n-     * Get the root path from the specified {@link URL connection URl}\n-     *\n-     * @param url the specified {@link URL connection URl}\n-     * @return non-null\n-     */\n-    protected String getRootPath(URL url) {\n-\n-        String rootPath = url.getParameter(CONFIG_ROOT_PATH_PARAM_NAME, buildRootPath(url));\n-\n-        rootPath = normalize(rootPath);\n-\n-        int rootPathLength = rootPath.length();\n-\n-        if (rootPathLength > 1 && rootPath.endsWith(PATH_SEPARATOR)) {\n-            rootPath = rootPath.substring(0, rootPathLength - 1);\n-        }\n-\n-        return rootPath;\n-    }\n-\n-    private String buildRootPath(URL url) {\n-        return PATH_SEPARATOR + getConfigNamespace(url) + getConfigBasePath(url);\n-    }\n-\n-    /**\n-     * Get the namespace from the specified {@link URL connection URl}\n-     *\n-     * @param url the specified {@link URL connection URl}\n-     * @return non-null\n-     */\n-    protected String getConfigNamespace(URL url) {\n-        return url.getParameter(CONFIG_NAMESPACE_KEY, DEFAULT_GROUP);\n-    }\n-\n-    /**\n-     * Get the config base path from the specified {@link URL connection URl}\n-     *\n-     * @param url the specified {@link URL connection URl}\n-     * @return non-null\n-     */\n-    protected String getConfigBasePath(URL url) {\n-        String configBasePath = url.getParameter(CONFIG_BASE_PATH_PARAM_NAME, DEFAULT_CONFIG_BASE_PATH);\n-        if (StringUtils.isNotEmpty(configBasePath) && !configBasePath.startsWith(PATH_SEPARATOR)) {\n-            configBasePath = PATH_SEPARATOR + configBasePath;\n-        }\n-        return configBasePath;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.SortedSet;\r\n+import java.util.TreeSet;\r\n+\r\n+import static java.util.Collections.emptySortedSet;\r\n+import static java.util.Collections.unmodifiableSortedSet;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.PathUtils.buildPath;\r\n+import static org.apache.dubbo.common.utils.PathUtils.normalize;\r\n+\r\n+/**\r\n+ * An abstract implementation of {@link DynamicConfiguration} is like \"tree-structure\" path :\r\n+ * <ul>\r\n+ *     <li>{@link FileSystemDynamicConfiguration \"file\"}</li>\r\n+ *     <li>{@link org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration \"zookeeper\"}</li>\r\n+ *     <li>{@link org.apache.dubbo.configcenter.consul.ConsulDynamicConfiguration \"consul\"}</li>\r\n+ * </ul>\r\n+ *\r\n+ * @see DynamicConfiguration\r\n+ * @see AbstractDynamicConfiguration\r\n+ * @since 2.7.8\r\n+ */\r\n+public abstract class TreePathDynamicConfiguration extends AbstractDynamicConfiguration {\r\n+\r\n+    /**\r\n+     * The parameter name of URL for the config root path\r\n+     */\r\n+    public static final String CONFIG_ROOT_PATH_PARAM_NAME = PARAM_NAME_PREFIX + \"root-path\";\r\n+\r\n+    /**\r\n+     * The parameter name of URL for the config base path\r\n+     */\r\n+    public static final String CONFIG_BASE_PATH_PARAM_NAME = PARAM_NAME_PREFIX + \"base-path\";\r\n+\r\n+    /**\r\n+     * The default value of parameter of URL for the config base path\r\n+     */\r\n+    public static final String DEFAULT_CONFIG_BASE_PATH = \"/config\";\r\n+\r\n+    private final String rootPath;\r\n+\r\n+    public TreePathDynamicConfiguration(URL url) {\r\n+        super(url);\r\n+        this.rootPath = getRootPath(url);\r\n+    }\r\n+\r\n+    public TreePathDynamicConfiguration(String rootPath,\r\n+                                        String threadPoolPrefixName,\r\n+                                        int threadPoolSize,\r\n+                                        long keepAliveTime,\r\n+                                        String group,\r\n+                                        long timeout) {\r\n+        super(threadPoolPrefixName, threadPoolSize, keepAliveTime, group, timeout);\r\n+        this.rootPath = rootPath;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected final String doGetConfig(String key, String group) throws Exception {\r\n+        String pathKey = buildPathKey(group, key);\r\n+        return doGetConfig(pathKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final boolean publishConfig(String key, String group, String content) {\r\n+        String pathKey = buildPathKey(group, key);\r\n+        return Boolean.TRUE.equals(execute(() -> doPublishConfig(pathKey, content), getDefaultTimeout()));\r\n+    }\r\n+\r\n+    @Override\r\n+    protected final boolean doRemoveConfig(String key, String group) throws Exception {\r\n+        String pathKey = buildPathKey(group, key);\r\n+        return doRemoveConfig(pathKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void addListener(String key, String group, ConfigurationListener listener) {\r\n+        String pathKey = buildPathKey(group, key);\r\n+        doAddListener(pathKey, listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void removeListener(String key, String group, ConfigurationListener listener) {\r\n+        String pathKey = buildPathKey(group, key);\r\n+        doRemoveListener(pathKey, listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {\r\n+        String groupPath = buildGroupPath(group);\r\n+        Collection<String> configKeys = doGetConfigKeys(groupPath);\r\n+        return isEmpty(configKeys) ? emptySortedSet() : unmodifiableSortedSet(new TreeSet<>(configKeys));\r\n+    }\r\n+\r\n+    protected abstract boolean doPublishConfig(String pathKey, String content) throws Exception;\r\n+\r\n+    protected abstract String doGetConfig(String pathKey) throws Exception;\r\n+\r\n+    protected abstract boolean doRemoveConfig(String pathKey) throws Exception;\r\n+\r\n+    protected abstract Collection<String> doGetConfigKeys(String groupPath);\r\n+\r\n+    protected abstract void doAddListener(String pathKey, ConfigurationListener listener);\r\n+\r\n+    protected abstract void doRemoveListener(String pathKey, ConfigurationListener listener);\r\n+\r\n+    protected String buildGroupPath(String group) {\r\n+        return buildPath(rootPath, group);\r\n+    }\r\n+\r\n+    protected String buildPathKey(String group, String key) {\r\n+        return buildPath(buildGroupPath(group), key);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the root path from the specified {@link URL connection URl}\r\n+     *\r\n+     * @param url the specified {@link URL connection URl}\r\n+     * @return non-null\r\n+     */\r\n+    protected String getRootPath(URL url) {\r\n+\r\n+        String rootPath = url.getParameter(CONFIG_ROOT_PATH_PARAM_NAME, buildRootPath(url));\r\n+\r\n+        rootPath = normalize(rootPath);\r\n+\r\n+        int rootPathLength = rootPath.length();\r\n+\r\n+        if (rootPathLength > 1 && rootPath.endsWith(PATH_SEPARATOR)) {\r\n+            rootPath = rootPath.substring(0, rootPathLength - 1);\r\n+        }\r\n+\r\n+        return rootPath;\r\n+    }\r\n+\r\n+    private String buildRootPath(URL url) {\r\n+        return PATH_SEPARATOR + getConfigNamespace(url) + getConfigBasePath(url);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the namespace from the specified {@link URL connection URl}\r\n+     *\r\n+     * @param url the specified {@link URL connection URl}\r\n+     * @return non-null\r\n+     */\r\n+    protected String getConfigNamespace(URL url) {\r\n+        return url.getParameter(CONFIG_NAMESPACE_KEY, DEFAULT_GROUP);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the config base path from the specified {@link URL connection URl}\r\n+     *\r\n+     * @param url the specified {@link URL connection URl}\r\n+     * @return non-null\r\n+     */\r\n+    protected String getConfigBasePath(URL url) {\r\n+        String configBasePath = url.getParameter(CONFIG_BASE_PATH_PARAM_NAME, DEFAULT_CONFIG_BASE_PATH);\r\n+        if (StringUtils.isNotEmpty(configBasePath) && !configBasePath.startsWith(PATH_SEPARATOR)) {\r\n+            configBasePath = PATH_SEPARATOR + configBasePath;\r\n+        }\r\n+        return configBasePath;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java", "source2": "org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,607 +1,607 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter.file;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangeType;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.config.configcenter.TreePathDynamicConfiguration;\n-import org.apache.dubbo.common.function.ThrowableConsumer;\n-import org.apache.dubbo.common.function.ThrowableFunction;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import org.apache.commons.io.FileUtils;\n-import org.apache.commons.logging.Log;\n-import org.apache.commons.logging.LogFactory;\n-\n-import java.io.File;\n-import java.io.IOException;\n-import java.nio.file.FileSystem;\n-import java.nio.file.FileSystems;\n-import java.nio.file.Path;\n-import java.nio.file.WatchEvent;\n-import java.nio.file.WatchKey;\n-import java.nio.file.WatchService;\n-import java.util.Collection;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.LinkedHashMap;\n-import java.util.LinkedHashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.TreeSet;\n-import java.util.concurrent.Callable;\n-import java.util.concurrent.SynchronousQueue;\n-import java.util.concurrent.ThreadPoolExecutor;\n-import java.util.function.BiConsumer;\n-import java.util.function.Function;\n-import java.util.stream.Collectors;\n-import java.util.stream.Stream;\n-\n-import static java.lang.String.format;\n-import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;\n-import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;\n-import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;\n-import static java.util.Collections.emptySet;\n-import static java.util.Collections.unmodifiableMap;\n-import static java.util.concurrent.TimeUnit.MILLISECONDS;\n-import static java.util.concurrent.TimeUnit.SECONDS;\n-import static org.apache.commons.io.FileUtils.readFileToString;\n-\n-/**\n- * File-System based {@link DynamicConfiguration} implementation\n- *\n- * @since 2.7.5\n- */\n-public class FileSystemDynamicConfiguration extends TreePathDynamicConfiguration {\n-\n-    public static final String CONFIG_CENTER_DIR_PARAM_NAME = PARAM_NAME_PREFIX + \"dir\";\n-\n-    public static final String CONFIG_CENTER_ENCODING_PARAM_NAME = PARAM_NAME_PREFIX + \"encoding\";\n-\n-    public static final String DEFAULT_CONFIG_CENTER_DIR_PATH = System.getProperty(\"user.home\") + File.separator\n-            + \".dubbo\" + File.separator + \"config-center\";\n-\n-    public static final int DEFAULT_THREAD_POOL_SIZE = 1;\n-\n-    public static final String DEFAULT_CONFIG_CENTER_ENCODING = \"UTF-8\";\n-\n-    private static final WatchEvent.Kind[] INTEREST_PATH_KINDS = of(ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);\n-\n-    /**\n-     * The class name of {@linkplain sun.nio.fs.PollingWatchService}\n-     */\n-    private static final String POLLING_WATCH_SERVICE_CLASS_NAME = \"sun.nio.fs.PollingWatchService\";\n-\n-    private static final int THREAD_POOL_SIZE = 1;\n-\n-    /**\n-     * Logger\n-     */\n-    private static final Log logger = LogFactory.getLog(FileSystemDynamicConfiguration.class);\n-\n-\n-    /**\n-     * The unmodifiable map for {@link ConfigChangeType} whose key is the {@link WatchEvent.Kind#name() name} of\n-     * {@link WatchEvent.Kind WatchEvent's Kind}\n-     */\n-    private static final Map<String, ConfigChangeType> CONFIG_CHANGE_TYPES_MAP =\n-            unmodifiableMap(new HashMap<String, ConfigChangeType>() {\n-                // Initializes the elements that is mapping ConfigChangeType\n-                {\n-                    put(ENTRY_CREATE.name(), ConfigChangeType.ADDED);\n-                    put(ENTRY_DELETE.name(), ConfigChangeType.DELETED);\n-                    put(ENTRY_MODIFY.name(), ConfigChangeType.MODIFIED);\n-                }\n-            });\n-\n-    private static final Optional<WatchService> watchService;\n-\n-    /**\n-     * Is Pooling Based Watch Service\n-     *\n-     * @see #detectPoolingBasedWatchService(Optional)\n-     */\n-    private static final boolean BASED_POOLING_WATCH_SERVICE;\n-\n-    private static final WatchEvent.Modifier[] MODIFIERS;\n-\n-    /**\n-     * the delay to action in seconds. If null, execute indirectly\n-     */\n-    private static final Integer DELAY;\n-\n-    /**\n-     * The thread pool for {@link WatchEvent WatchEvents} loop\n-     * It's optional if there is not any {@link ConfigurationListener} registration\n-     *\n-     * @see ThreadPoolExecutor\n-     */\n-    private static final ThreadPoolExecutor WATCH_EVENTS_LOOP_THREAD_POOL;\n-\n-    // static initialization\n-    static {\n-        watchService = newWatchService();\n-        BASED_POOLING_WATCH_SERVICE = detectPoolingBasedWatchService(watchService);\n-        MODIFIERS = initWatchEventModifiers();\n-        DELAY = initDelay(MODIFIERS);\n-        WATCH_EVENTS_LOOP_THREAD_POOL = newWatchEventsLoopThreadPool();\n-        registerDubboShutdownHook();\n-    }\n-\n-    /**\n-     * The Root Directory for config center\n-     */\n-    private final File rootDirectory;\n-\n-    private final String encoding;\n-\n-    /**\n-     * The {@link Set} of {@link #groupDirectory(String) directories} that may be processing,\n-     * <p>\n-     * if {@link #isBasedPoolingWatchService()} is <code>false</code>, this properties will be\n-     * {@link Collections#emptySet() empty}\n-     *\n-     * @see #initProcessingDirectories()\n-     */\n-    private final Set<File> processingDirectories;\n-\n-    private final Map<File, List<ConfigurationListener>> listenersRepository;\n-\n-    public FileSystemDynamicConfiguration() {\n-        this(new File(DEFAULT_CONFIG_CENTER_DIR_PATH));\n-    }\n-\n-    public FileSystemDynamicConfiguration(File rootDirectory) {\n-        this(rootDirectory, DEFAULT_CONFIG_CENTER_ENCODING);\n-    }\n-\n-    public FileSystemDynamicConfiguration(File rootDirectory, String encoding) {\n-        this(rootDirectory, encoding, DEFAULT_THREAD_POOL_PREFIX);\n-    }\n-\n-    public FileSystemDynamicConfiguration(File rootDirectory, String encoding, String threadPoolPrefixName) {\n-        this(rootDirectory, encoding, threadPoolPrefixName, DEFAULT_THREAD_POOL_SIZE);\n-    }\n-\n-    public FileSystemDynamicConfiguration(File rootDirectory, String encoding, String threadPoolPrefixName,\n-                                          int threadPoolSize) {\n-        this(rootDirectory, encoding, threadPoolPrefixName, threadPoolSize, DEFAULT_THREAD_POOL_KEEP_ALIVE_TIME);\n-    }\n-\n-    public FileSystemDynamicConfiguration(File rootDirectory, String encoding,\n-                                          String threadPoolPrefixName,\n-                                          int threadPoolSize,\n-                                          long keepAliveTime) {\n-        super(rootDirectory.getAbsolutePath(), threadPoolPrefixName, threadPoolSize, keepAliveTime, DEFAULT_GROUP, -1L);\n-        this.rootDirectory = rootDirectory;\n-        this.encoding = encoding;\n-        this.processingDirectories = initProcessingDirectories();\n-        this.listenersRepository = new LinkedHashMap<>();\n-    }\n-\n-    public FileSystemDynamicConfiguration(URL url) {\n-        this(initDirectory(url), getEncoding(url), getThreadPoolPrefixName(url), getThreadPoolSize(url),\n-                getThreadPoolKeepAliveTime(url));\n-    }\n-\n-    private Set<File> initProcessingDirectories() {\n-        return isBasedPoolingWatchService() ? new LinkedHashSet<>() : emptySet();\n-    }\n-\n-    public File configFile(String key, String group) {\n-        return new File(buildPathKey(group, key));\n-    }\n-\n-    private void doInListener(String configFilePath, BiConsumer<File, List<ConfigurationListener>> consumer) {\n-        watchService.ifPresent(watchService -> {\n-            File configFile = new File(configFilePath);\n-            executeMutually(configFile.getParentFile(), () -> {\n-                // process the WatchEvents if not start\n-                if (!isProcessingWatchEvents()) {\n-                    processWatchEvents(watchService);\n-                }\n-\n-                List<ConfigurationListener> listeners = getListeners(configFile);\n-                consumer.accept(configFile, listeners);\n-\n-                // Nothing to return\n-                return null;\n-            });\n-        });\n-    }\n-\n-    /**\n-     * Register the Dubbo ShutdownHook\n-     *\n-     * @since 2.7.8\n-     */\n-    private static void registerDubboShutdownHook() {\n-        ShutdownHookCallbacks.INSTANCE.addCallback(() -> {\n-            watchService.ifPresent(w -> {\n-                try {\n-                    w.close();\n-                } catch (IOException e) {\n-                    throw new RuntimeException(e);\n-                }\n-            });\n-            getWatchEventsLoopThreadPool().shutdown();\n-        });\n-    }\n-\n-    private static boolean isProcessingWatchEvents() {\n-        return getWatchEventsLoopThreadPool().getActiveCount() > 0;\n-    }\n-\n-    /**\n-     * Process the {@link WatchEvent WatchEvents} loop in async execution\n-     *\n-     * @param watchService {@link WatchService}\n-     */\n-    private void processWatchEvents(WatchService watchService) {\n-        getWatchEventsLoopThreadPool().execute(() -> { // WatchEvents Loop\n-            while (true) {\n-                WatchKey watchKey = null;\n-                try {\n-                    watchKey = watchService.take();\n-                    if (watchKey.isValid()) {\n-                        for (WatchEvent event : watchKey.pollEvents()) {\n-                            WatchEvent.Kind kind = event.kind();\n-                            // configChangeType's key to match WatchEvent's Kind\n-                            ConfigChangeType configChangeType = CONFIG_CHANGE_TYPES_MAP.get(kind.name());\n-                            if (configChangeType != null) {\n-                                Path configDirectoryPath = (Path) watchKey.watchable();\n-                                Path currentPath = (Path) event.context();\n-                                Path configFilePath = configDirectoryPath.resolve(currentPath);\n-                                File configDirectory = configDirectoryPath.toFile();\n-                                executeMutually(configDirectory, () -> {\n-                                    fireConfigChangeEvent(configDirectory, configFilePath.toFile(), configChangeType);\n-                                    signalConfigDirectory(configDirectory);\n-                                    return null;\n-                                });\n-                            }\n-                        }\n-                    }\n-                } catch (Exception e) {\n-                    return;\n-                } finally {\n-                    if (watchKey != null) {\n-                        // reset\n-                        watchKey.reset();\n-                    }\n-                }\n-            }\n-        });\n-    }\n-\n-    private void signalConfigDirectory(File configDirectory) {\n-        if (isBasedPoolingWatchService()) {\n-            // remove configDirectory from processing set because it's done\n-            removeProcessingDirectory(configDirectory);\n-            // notify configDirectory\n-            notifyProcessingDirectory(configDirectory);\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(format(\"The config rootDirectory[%s] is signalled...\", configDirectory.getName()));\n-            }\n-        }\n-    }\n-\n-    private void removeProcessingDirectory(File configDirectory) {\n-        processingDirectories.remove(configDirectory);\n-    }\n-\n-    private void notifyProcessingDirectory(File configDirectory) {\n-        configDirectory.notifyAll();\n-    }\n-\n-    private List<ConfigurationListener> getListeners(File configFile) {\n-        return listenersRepository.computeIfAbsent(configFile, p -> new LinkedList<>());\n-    }\n-\n-    private void fireConfigChangeEvent(File configDirectory, File configFile, ConfigChangeType configChangeType) {\n-        String key = configFile.getName();\n-        String value = getConfig(configFile);\n-        // fire ConfigChangeEvent one by one\n-        getListeners(configFile).forEach(listener -> {\n-            try {\n-                listener.process(new ConfigChangedEvent(key, configDirectory.getName(), value, configChangeType));\n-            } catch (Throwable e) {\n-                if (logger.isErrorEnabled()) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-        });\n-    }\n-\n-    private boolean canRead(File file) {\n-        return file.exists() && file.canRead();\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return null;\n-    }\n-\n-    @Override\n-    protected boolean doPublishConfig(String pathKey, String content) throws Exception {\n-        return delay(pathKey, configFile -> {\n-            FileUtils.write(configFile, content, getEncoding());\n-            return true;\n-        });\n-    }\n-\n-    @Override\n-    protected String doGetConfig(String pathKey) throws Exception {\n-        File configFile = new File(pathKey);\n-        return getConfig(configFile);\n-    }\n-\n-    @Override\n-    protected boolean doRemoveConfig(String pathKey) throws Exception {\n-        delay(pathKey, configFile -> {\n-            String content = getConfig(configFile);\n-            FileUtils.deleteQuietly(configFile);\n-            return content;\n-        });\n-        return true;\n-    }\n-\n-    @Override\n-    protected Collection<String> doGetConfigKeys(String groupPath) {\n-        File[] files = new File(groupPath).listFiles(File::isFile);\n-        if (files == null) {\n-            return new TreeSet<>();\n-        } else {\n-            return Stream.of(files)\n-                    .map(File::getName)\n-                    .collect(Collectors.toList());\n-        }\n-    }\n-\n-    @Override\n-    protected void doAddListener(String pathKey, ConfigurationListener listener) {\n-        doInListener(pathKey, (configFilePath, listeners) -> {\n-            if (listeners.isEmpty()) { // If no element, it indicates watchService was registered before\n-                ThrowableConsumer.execute(configFilePath, configFile -> {\n-                    FileUtils.forceMkdirParent(configFile);\n-                    // A rootDirectory to be watched\n-                    File configDirectory = configFile.getParentFile();\n-                    if (configDirectory != null) {\n-                        // Register the configDirectory\n-                        configDirectory.toPath().register(watchService.get(), INTEREST_PATH_KINDS, MODIFIERS);\n-                    }\n-                });\n-            }\n-            // Add into cache\n-            listeners.add(listener);\n-        });\n-    }\n-\n-    @Override\n-    protected void doRemoveListener(String pathKey, ConfigurationListener listener) {\n-        doInListener(pathKey, (file, listeners) -> {\n-            // Remove into cache\n-            listeners.remove(listener);\n-        });\n-    }\n-\n-    /**\n-     * Delay action for {@link #configFile(String, String) config file}\n-     *\n-     * @param configFilePath the key to represent a configuration\n-     * @param function       the customized {@link Function function} with {@link File}\n-     * @param <V>            the computed value\n-     * @return\n-     */\n-    protected <V> V delay(String configFilePath, ThrowableFunction<File, V> function) {\n-        File configFile = new File(configFilePath);\n-        // Must be based on PoolingWatchService and has listeners under config file\n-        if (isBasedPoolingWatchService()) {\n-            File configDirectory = configFile.getParentFile();\n-            executeMutually(configDirectory, () -> {\n-                if (hasListeners(configFile) && isProcessing(configDirectory)) {\n-                    Integer delay = getDelay();\n-                    if (delay != null) {\n-                        // wait for delay in seconds\n-                        long timeout = SECONDS.toMillis(delay);\n-                        if (logger.isDebugEnabled()) {\n-                            logger.debug(format(\"The config[path : %s] is about to delay in %d ms.\",\n-                                    configFilePath, timeout));\n-                        }\n-                        configDirectory.wait(timeout);\n-                    }\n-                }\n-                addProcessing(configDirectory);\n-                return null;\n-            });\n-        }\n-\n-        V value = null;\n-\n-        try {\n-            value = function.apply(configFile);\n-        } catch (Throwable e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getMessage(), e);\n-            }\n-        }\n-\n-        return value;\n-    }\n-\n-    private boolean hasListeners(File configFile) {\n-        return getListeners(configFile).size() > 0;\n-    }\n-\n-    /**\n-     * Is processing on {@link #buildGroupPath(String) config rootDirectory}\n-     *\n-     * @param configDirectory {@link #buildGroupPath(String) config rootDirectory}\n-     * @return if processing , return <code>true</code>, or <code>false</code>\n-     */\n-    private boolean isProcessing(File configDirectory) {\n-        return processingDirectories.contains(configDirectory);\n-    }\n-\n-    private void addProcessing(File configDirectory) {\n-        processingDirectories.add(configDirectory);\n-    }\n-\n-    public Set<String> getConfigGroups() {\n-        return Stream.of(getRootDirectory().listFiles())\n-                .filter(File::isDirectory)\n-                .map(File::getName)\n-                .collect(Collectors.toSet());\n-    }\n-\n-    protected String getConfig(File configFile) {\n-        return ThrowableFunction.execute(configFile,\n-                file -> canRead(configFile) ? readFileToString(configFile, getEncoding()) : null);\n-    }\n-\n-    @Override\n-    protected void doClose() throws Exception {\n-\n-    }\n-\n-    public File getRootDirectory() {\n-        return rootDirectory;\n-    }\n-\n-    public String getEncoding() {\n-        return encoding;\n-    }\n-\n-    protected Integer getDelay() {\n-        return DELAY;\n-    }\n-\n-    /**\n-     * It's whether the implementation of {@link WatchService} is based on {@linkplain sun.nio.fs.PollingWatchService}\n-     * or not.\n-     * <p>\n-     *\n-     * @return if based, return <code>true</code>, or <code>false</code>\n-     * @see #detectPoolingBasedWatchService(Optional)\n-     */\n-    protected static boolean isBasedPoolingWatchService() {\n-        return BASED_POOLING_WATCH_SERVICE;\n-    }\n-\n-    protected static ThreadPoolExecutor getWatchEventsLoopThreadPool() {\n-        return WATCH_EVENTS_LOOP_THREAD_POOL;\n-    }\n-\n-    protected ThreadPoolExecutor getWorkersThreadPool() {\n-        return super.getWorkersThreadPool();\n-    }\n-\n-    private <V> V executeMutually(final Object mutex, Callable<V> callable) {\n-        V value = null;\n-        synchronized (mutex) {\n-            try {\n-                value = callable.call();\n-            } catch (Exception e) {\n-                if (logger.isErrorEnabled()) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-        }\n-        return value;\n-    }\n-\n-    private static <T> T[] of(T... values) {\n-        return values;\n-    }\n-\n-    private static Integer initDelay(WatchEvent.Modifier[] modifiers) {\n-        if (isBasedPoolingWatchService()) {\n-            return 2;\n-        } else {\n-            return null;\n-        }\n-    }\n-\n-    private static WatchEvent.Modifier[] initWatchEventModifiers() {\n-        return of();\n-    }\n-\n-    /**\n-     * Detect the argument of {@link WatchService} is based on {@linkplain sun.nio.fs.PollingWatchService}\n-     * or not.\n-     * <p>\n-     * Some platforms do not provide the native implementation of {@link WatchService}, just use\n-     * {@linkplain sun.nio.fs.PollingWatchService} in periodic poll file modifications.\n-     *\n-     * @param watchService the instance of {@link WatchService}\n-     * @return if based, return <code>true</code>, or <code>false</code>\n-     */\n-    private static boolean detectPoolingBasedWatchService(Optional<WatchService> watchService) {\n-        String className = watchService.map(Object::getClass).map(Class::getName).orElse(null);\n-        return POLLING_WATCH_SERVICE_CLASS_NAME.equals(className);\n-    }\n-\n-    private static Optional<WatchService> newWatchService() {\n-        Optional<WatchService> watchService = null;\n-        FileSystem fileSystem = FileSystems.getDefault();\n-        try {\n-            watchService = Optional.of(fileSystem.newWatchService());\n-        } catch (IOException e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getMessage(), e);\n-            }\n-            watchService = Optional.empty();\n-        }\n-        return watchService;\n-    }\n-\n-    protected static File initDirectory(URL url) {\n-        String directoryPath = getParameter(url, CONFIG_CENTER_DIR_PARAM_NAME, url == null ? null : url.getPath());\n-        File rootDirectory = null;\n-        if (!StringUtils.isBlank(directoryPath)) {\n-            rootDirectory = new File(\"/\" + directoryPath);\n-        }\n-\n-        if (directoryPath == null || !rootDirectory.exists()) { // If the directory does not exist\n-            rootDirectory = new File(DEFAULT_CONFIG_CENTER_DIR_PATH);\n-        }\n-\n-        if (!rootDirectory.exists() && !rootDirectory.mkdirs()) {\n-            throw new IllegalStateException(format(\"Dubbo config center rootDirectory[%s] can't be created!\",\n-                    rootDirectory.getAbsolutePath()));\n-        }\n-        return rootDirectory;\n-    }\n-\n-    protected static String getEncoding(URL url) {\n-        return getParameter(url, CONFIG_CENTER_ENCODING_PARAM_NAME, DEFAULT_CONFIG_CENTER_ENCODING);\n-    }\n-\n-    private static ThreadPoolExecutor newWatchEventsLoopThreadPool() {\n-        return new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE,\n-                0L, MILLISECONDS,\n-                new SynchronousQueue(),\n-                new NamedThreadFactory(\"dubbo-config-center-watch-events-loop\", true));\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter.file;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangeType;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.config.configcenter.TreePathDynamicConfiguration;\r\n+import org.apache.dubbo.common.function.ThrowableConsumer;\r\n+import org.apache.dubbo.common.function.ThrowableFunction;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import org.apache.commons.io.FileUtils;\r\n+import org.apache.commons.logging.Log;\r\n+import org.apache.commons.logging.LogFactory;\r\n+\r\n+import java.io.File;\r\n+import java.io.IOException;\r\n+import java.nio.file.FileSystem;\r\n+import java.nio.file.FileSystems;\r\n+import java.nio.file.Path;\r\n+import java.nio.file.WatchEvent;\r\n+import java.nio.file.WatchKey;\r\n+import java.nio.file.WatchService;\r\n+import java.util.Collection;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+import java.util.concurrent.Callable;\r\n+import java.util.concurrent.SynchronousQueue;\r\n+import java.util.concurrent.ThreadPoolExecutor;\r\n+import java.util.function.BiConsumer;\r\n+import java.util.function.Function;\r\n+import java.util.stream.Collectors;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static java.lang.String.format;\r\n+import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;\r\n+import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;\r\n+import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;\r\n+import static java.util.Collections.emptySet;\r\n+import static java.util.Collections.unmodifiableMap;\r\n+import static java.util.concurrent.TimeUnit.MILLISECONDS;\r\n+import static java.util.concurrent.TimeUnit.SECONDS;\r\n+import static org.apache.commons.io.FileUtils.readFileToString;\r\n+\r\n+/**\r\n+ * File-System based {@link DynamicConfiguration} implementation\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class FileSystemDynamicConfiguration extends TreePathDynamicConfiguration {\r\n+\r\n+    public static final String CONFIG_CENTER_DIR_PARAM_NAME = PARAM_NAME_PREFIX + \"dir\";\r\n+\r\n+    public static final String CONFIG_CENTER_ENCODING_PARAM_NAME = PARAM_NAME_PREFIX + \"encoding\";\r\n+\r\n+    public static final String DEFAULT_CONFIG_CENTER_DIR_PATH = System.getProperty(\"user.home\") + File.separator\r\n+            + \".dubbo\" + File.separator + \"config-center\";\r\n+\r\n+    public static final int DEFAULT_THREAD_POOL_SIZE = 1;\r\n+\r\n+    public static final String DEFAULT_CONFIG_CENTER_ENCODING = \"UTF-8\";\r\n+\r\n+    private static final WatchEvent.Kind[] INTEREST_PATH_KINDS = of(ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);\r\n+\r\n+    /**\r\n+     * The class name of {@linkplain sun.nio.fs.PollingWatchService}\r\n+     */\r\n+    private static final String POLLING_WATCH_SERVICE_CLASS_NAME = \"sun.nio.fs.PollingWatchService\";\r\n+\r\n+    private static final int THREAD_POOL_SIZE = 1;\r\n+\r\n+    /**\r\n+     * Logger\r\n+     */\r\n+    private static final Log logger = LogFactory.getLog(FileSystemDynamicConfiguration.class);\r\n+\r\n+\r\n+    /**\r\n+     * The unmodifiable map for {@link ConfigChangeType} whose key is the {@link WatchEvent.Kind#name() name} of\r\n+     * {@link WatchEvent.Kind WatchEvent's Kind}\r\n+     */\r\n+    private static final Map<String, ConfigChangeType> CONFIG_CHANGE_TYPES_MAP =\r\n+            unmodifiableMap(new HashMap<String, ConfigChangeType>() {\r\n+                // Initializes the elements that is mapping ConfigChangeType\r\n+                {\r\n+                    put(ENTRY_CREATE.name(), ConfigChangeType.ADDED);\r\n+                    put(ENTRY_DELETE.name(), ConfigChangeType.DELETED);\r\n+                    put(ENTRY_MODIFY.name(), ConfigChangeType.MODIFIED);\r\n+                }\r\n+            });\r\n+\r\n+    private static final Optional<WatchService> watchService;\r\n+\r\n+    /**\r\n+     * Is Pooling Based Watch Service\r\n+     *\r\n+     * @see #detectPoolingBasedWatchService(Optional)\r\n+     */\r\n+    private static final boolean BASED_POOLING_WATCH_SERVICE;\r\n+\r\n+    private static final WatchEvent.Modifier[] MODIFIERS;\r\n+\r\n+    /**\r\n+     * the delay to action in seconds. If null, execute indirectly\r\n+     */\r\n+    private static final Integer DELAY;\r\n+\r\n+    /**\r\n+     * The thread pool for {@link WatchEvent WatchEvents} loop\r\n+     * It's optional if there is not any {@link ConfigurationListener} registration\r\n+     *\r\n+     * @see ThreadPoolExecutor\r\n+     */\r\n+    private static final ThreadPoolExecutor WATCH_EVENTS_LOOP_THREAD_POOL;\r\n+\r\n+    // static initialization\r\n+    static {\r\n+        watchService = newWatchService();\r\n+        BASED_POOLING_WATCH_SERVICE = detectPoolingBasedWatchService(watchService);\r\n+        MODIFIERS = initWatchEventModifiers();\r\n+        DELAY = initDelay(MODIFIERS);\r\n+        WATCH_EVENTS_LOOP_THREAD_POOL = newWatchEventsLoopThreadPool();\r\n+        registerDubboShutdownHook();\r\n+    }\r\n+\r\n+    /**\r\n+     * The Root Directory for config center\r\n+     */\r\n+    private final File rootDirectory;\r\n+\r\n+    private final String encoding;\r\n+\r\n+    /**\r\n+     * The {@link Set} of {@link #groupDirectory(String) directories} that may be processing,\r\n+     * <p>\r\n+     * if {@link #isBasedPoolingWatchService()} is <code>false</code>, this properties will be\r\n+     * {@link Collections#emptySet() empty}\r\n+     *\r\n+     * @see #initProcessingDirectories()\r\n+     */\r\n+    private final Set<File> processingDirectories;\r\n+\r\n+    private final Map<File, List<ConfigurationListener>> listenersRepository;\r\n+\r\n+    public FileSystemDynamicConfiguration() {\r\n+        this(new File(DEFAULT_CONFIG_CENTER_DIR_PATH));\r\n+    }\r\n+\r\n+    public FileSystemDynamicConfiguration(File rootDirectory) {\r\n+        this(rootDirectory, DEFAULT_CONFIG_CENTER_ENCODING);\r\n+    }\r\n+\r\n+    public FileSystemDynamicConfiguration(File rootDirectory, String encoding) {\r\n+        this(rootDirectory, encoding, DEFAULT_THREAD_POOL_PREFIX);\r\n+    }\r\n+\r\n+    public FileSystemDynamicConfiguration(File rootDirectory, String encoding, String threadPoolPrefixName) {\r\n+        this(rootDirectory, encoding, threadPoolPrefixName, DEFAULT_THREAD_POOL_SIZE);\r\n+    }\r\n+\r\n+    public FileSystemDynamicConfiguration(File rootDirectory, String encoding, String threadPoolPrefixName,\r\n+                                          int threadPoolSize) {\r\n+        this(rootDirectory, encoding, threadPoolPrefixName, threadPoolSize, DEFAULT_THREAD_POOL_KEEP_ALIVE_TIME);\r\n+    }\r\n+\r\n+    public FileSystemDynamicConfiguration(File rootDirectory, String encoding,\r\n+                                          String threadPoolPrefixName,\r\n+                                          int threadPoolSize,\r\n+                                          long keepAliveTime) {\r\n+        super(rootDirectory.getAbsolutePath(), threadPoolPrefixName, threadPoolSize, keepAliveTime, DEFAULT_GROUP, -1L);\r\n+        this.rootDirectory = rootDirectory;\r\n+        this.encoding = encoding;\r\n+        this.processingDirectories = initProcessingDirectories();\r\n+        this.listenersRepository = new LinkedHashMap<>();\r\n+    }\r\n+\r\n+    public FileSystemDynamicConfiguration(URL url) {\r\n+        this(initDirectory(url), getEncoding(url), getThreadPoolPrefixName(url), getThreadPoolSize(url),\r\n+                getThreadPoolKeepAliveTime(url));\r\n+    }\r\n+\r\n+    private Set<File> initProcessingDirectories() {\r\n+        return isBasedPoolingWatchService() ? new LinkedHashSet<>() : emptySet();\r\n+    }\r\n+\r\n+    public File configFile(String key, String group) {\r\n+        return new File(buildPathKey(group, key));\r\n+    }\r\n+\r\n+    private void doInListener(String configFilePath, BiConsumer<File, List<ConfigurationListener>> consumer) {\r\n+        watchService.ifPresent(watchService -> {\r\n+            File configFile = new File(configFilePath);\r\n+            executeMutually(configFile.getParentFile(), () -> {\r\n+                // process the WatchEvents if not start\r\n+                if (!isProcessingWatchEvents()) {\r\n+                    processWatchEvents(watchService);\r\n+                }\r\n+\r\n+                List<ConfigurationListener> listeners = getListeners(configFile);\r\n+                consumer.accept(configFile, listeners);\r\n+\r\n+                // Nothing to return\r\n+                return null;\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Register the Dubbo ShutdownHook\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    private static void registerDubboShutdownHook() {\r\n+        ShutdownHookCallbacks.INSTANCE.addCallback(() -> {\r\n+            watchService.ifPresent(w -> {\r\n+                try {\r\n+                    w.close();\r\n+                } catch (IOException e) {\r\n+                    throw new RuntimeException(e);\r\n+                }\r\n+            });\r\n+            getWatchEventsLoopThreadPool().shutdown();\r\n+        });\r\n+    }\r\n+\r\n+    private static boolean isProcessingWatchEvents() {\r\n+        return getWatchEventsLoopThreadPool().getActiveCount() > 0;\r\n+    }\r\n+\r\n+    /**\r\n+     * Process the {@link WatchEvent WatchEvents} loop in async execution\r\n+     *\r\n+     * @param watchService {@link WatchService}\r\n+     */\r\n+    private void processWatchEvents(WatchService watchService) {\r\n+        getWatchEventsLoopThreadPool().execute(() -> { // WatchEvents Loop\r\n+            while (true) {\r\n+                WatchKey watchKey = null;\r\n+                try {\r\n+                    watchKey = watchService.take();\r\n+                    if (watchKey.isValid()) {\r\n+                        for (WatchEvent event : watchKey.pollEvents()) {\r\n+                            WatchEvent.Kind kind = event.kind();\r\n+                            // configChangeType's key to match WatchEvent's Kind\r\n+                            ConfigChangeType configChangeType = CONFIG_CHANGE_TYPES_MAP.get(kind.name());\r\n+                            if (configChangeType != null) {\r\n+                                Path configDirectoryPath = (Path) watchKey.watchable();\r\n+                                Path currentPath = (Path) event.context();\r\n+                                Path configFilePath = configDirectoryPath.resolve(currentPath);\r\n+                                File configDirectory = configDirectoryPath.toFile();\r\n+                                executeMutually(configDirectory, () -> {\r\n+                                    fireConfigChangeEvent(configDirectory, configFilePath.toFile(), configChangeType);\r\n+                                    signalConfigDirectory(configDirectory);\r\n+                                    return null;\r\n+                                });\r\n+                            }\r\n+                        }\r\n+                    }\r\n+                } catch (Exception e) {\r\n+                    return;\r\n+                } finally {\r\n+                    if (watchKey != null) {\r\n+                        // reset\r\n+                        watchKey.reset();\r\n+                    }\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void signalConfigDirectory(File configDirectory) {\r\n+        if (isBasedPoolingWatchService()) {\r\n+            // remove configDirectory from processing set because it's done\r\n+            removeProcessingDirectory(configDirectory);\r\n+            // notify configDirectory\r\n+            notifyProcessingDirectory(configDirectory);\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(format(\"The config rootDirectory[%s] is signalled...\", configDirectory.getName()));\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void removeProcessingDirectory(File configDirectory) {\r\n+        processingDirectories.remove(configDirectory);\r\n+    }\r\n+\r\n+    private void notifyProcessingDirectory(File configDirectory) {\r\n+        configDirectory.notifyAll();\r\n+    }\r\n+\r\n+    private List<ConfigurationListener> getListeners(File configFile) {\r\n+        return listenersRepository.computeIfAbsent(configFile, p -> new LinkedList<>());\r\n+    }\r\n+\r\n+    private void fireConfigChangeEvent(File configDirectory, File configFile, ConfigChangeType configChangeType) {\r\n+        String key = configFile.getName();\r\n+        String value = getConfig(configFile);\r\n+        // fire ConfigChangeEvent one by one\r\n+        getListeners(configFile).forEach(listener -> {\r\n+            try {\r\n+                listener.process(new ConfigChangedEvent(key, configDirectory.getName(), value, configChangeType));\r\n+            } catch (Throwable e) {\r\n+                if (logger.isErrorEnabled()) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private boolean canRead(File file) {\r\n+        return file.exists() && file.canRead();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected boolean doPublishConfig(String pathKey, String content) throws Exception {\r\n+        return delay(pathKey, configFile -> {\r\n+            FileUtils.write(configFile, content, getEncoding());\r\n+            return true;\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    protected String doGetConfig(String pathKey) throws Exception {\r\n+        File configFile = new File(pathKey);\r\n+        return getConfig(configFile);\r\n+    }\r\n+\r\n+    @Override\r\n+    protected boolean doRemoveConfig(String pathKey) throws Exception {\r\n+        delay(pathKey, configFile -> {\r\n+            String content = getConfig(configFile);\r\n+            FileUtils.deleteQuietly(configFile);\r\n+            return content;\r\n+        });\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Collection<String> doGetConfigKeys(String groupPath) {\r\n+        File[] files = new File(groupPath).listFiles(File::isFile);\r\n+        if (files == null) {\r\n+            return new TreeSet<>();\r\n+        } else {\r\n+            return Stream.of(files)\r\n+                    .map(File::getName)\r\n+                    .collect(Collectors.toList());\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void doAddListener(String pathKey, ConfigurationListener listener) {\r\n+        doInListener(pathKey, (configFilePath, listeners) -> {\r\n+            if (listeners.isEmpty()) { // If no element, it indicates watchService was registered before\r\n+                ThrowableConsumer.execute(configFilePath, configFile -> {\r\n+                    FileUtils.forceMkdirParent(configFile);\r\n+                    // A rootDirectory to be watched\r\n+                    File configDirectory = configFile.getParentFile();\r\n+                    if (configDirectory != null) {\r\n+                        // Register the configDirectory\r\n+                        configDirectory.toPath().register(watchService.get(), INTEREST_PATH_KINDS, MODIFIERS);\r\n+                    }\r\n+                });\r\n+            }\r\n+            // Add into cache\r\n+            listeners.add(listener);\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void doRemoveListener(String pathKey, ConfigurationListener listener) {\r\n+        doInListener(pathKey, (file, listeners) -> {\r\n+            // Remove into cache\r\n+            listeners.remove(listener);\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Delay action for {@link #configFile(String, String) config file}\r\n+     *\r\n+     * @param configFilePath the key to represent a configuration\r\n+     * @param function       the customized {@link Function function} with {@link File}\r\n+     * @param <V>            the computed value\r\n+     * @return\r\n+     */\r\n+    protected <V> V delay(String configFilePath, ThrowableFunction<File, V> function) {\r\n+        File configFile = new File(configFilePath);\r\n+        // Must be based on PoolingWatchService and has listeners under config file\r\n+        if (isBasedPoolingWatchService()) {\r\n+            File configDirectory = configFile.getParentFile();\r\n+            executeMutually(configDirectory, () -> {\r\n+                if (hasListeners(configFile) && isProcessing(configDirectory)) {\r\n+                    Integer delay = getDelay();\r\n+                    if (delay != null) {\r\n+                        // wait for delay in seconds\r\n+                        long timeout = SECONDS.toMillis(delay);\r\n+                        if (logger.isDebugEnabled()) {\r\n+                            logger.debug(format(\"The config[path : %s] is about to delay in %d ms.\",\r\n+                                    configFilePath, timeout));\r\n+                        }\r\n+                        configDirectory.wait(timeout);\r\n+                    }\r\n+                }\r\n+                addProcessing(configDirectory);\r\n+                return null;\r\n+            });\r\n+        }\r\n+\r\n+        V value = null;\r\n+\r\n+        try {\r\n+            value = function.apply(configFile);\r\n+        } catch (Throwable e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+\r\n+        return value;\r\n+    }\r\n+\r\n+    private boolean hasListeners(File configFile) {\r\n+        return getListeners(configFile).size() > 0;\r\n+    }\r\n+\r\n+    /**\r\n+     * Is processing on {@link #buildGroupPath(String) config rootDirectory}\r\n+     *\r\n+     * @param configDirectory {@link #buildGroupPath(String) config rootDirectory}\r\n+     * @return if processing , return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    private boolean isProcessing(File configDirectory) {\r\n+        return processingDirectories.contains(configDirectory);\r\n+    }\r\n+\r\n+    private void addProcessing(File configDirectory) {\r\n+        processingDirectories.add(configDirectory);\r\n+    }\r\n+\r\n+    public Set<String> getConfigGroups() {\r\n+        return Stream.of(getRootDirectory().listFiles())\r\n+                .filter(File::isDirectory)\r\n+                .map(File::getName)\r\n+                .collect(Collectors.toSet());\r\n+    }\r\n+\r\n+    protected String getConfig(File configFile) {\r\n+        return ThrowableFunction.execute(configFile,\r\n+                file -> canRead(configFile) ? readFileToString(configFile, getEncoding()) : null);\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void doClose() throws Exception {\r\n+\r\n+    }\r\n+\r\n+    public File getRootDirectory() {\r\n+        return rootDirectory;\r\n+    }\r\n+\r\n+    public String getEncoding() {\r\n+        return encoding;\r\n+    }\r\n+\r\n+    protected Integer getDelay() {\r\n+        return DELAY;\r\n+    }\r\n+\r\n+    /**\r\n+     * It's whether the implementation of {@link WatchService} is based on {@linkplain sun.nio.fs.PollingWatchService}\r\n+     * or not.\r\n+     * <p>\r\n+     *\r\n+     * @return if based, return <code>true</code>, or <code>false</code>\r\n+     * @see #detectPoolingBasedWatchService(Optional)\r\n+     */\r\n+    protected static boolean isBasedPoolingWatchService() {\r\n+        return BASED_POOLING_WATCH_SERVICE;\r\n+    }\r\n+\r\n+    protected static ThreadPoolExecutor getWatchEventsLoopThreadPool() {\r\n+        return WATCH_EVENTS_LOOP_THREAD_POOL;\r\n+    }\r\n+\r\n+    protected ThreadPoolExecutor getWorkersThreadPool() {\r\n+        return super.getWorkersThreadPool();\r\n+    }\r\n+\r\n+    private <V> V executeMutually(final Object mutex, Callable<V> callable) {\r\n+        V value = null;\r\n+        synchronized (mutex) {\r\n+            try {\r\n+                value = callable.call();\r\n+            } catch (Exception e) {\r\n+                if (logger.isErrorEnabled()) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    private static <T> T[] of(T... values) {\r\n+        return values;\r\n+    }\r\n+\r\n+    private static Integer initDelay(WatchEvent.Modifier[] modifiers) {\r\n+        if (isBasedPoolingWatchService()) {\r\n+            return 2;\r\n+        } else {\r\n+            return null;\r\n+        }\r\n+    }\r\n+\r\n+    private static WatchEvent.Modifier[] initWatchEventModifiers() {\r\n+        return of();\r\n+    }\r\n+\r\n+    /**\r\n+     * Detect the argument of {@link WatchService} is based on {@linkplain sun.nio.fs.PollingWatchService}\r\n+     * or not.\r\n+     * <p>\r\n+     * Some platforms do not provide the native implementation of {@link WatchService}, just use\r\n+     * {@linkplain sun.nio.fs.PollingWatchService} in periodic poll file modifications.\r\n+     *\r\n+     * @param watchService the instance of {@link WatchService}\r\n+     * @return if based, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    private static boolean detectPoolingBasedWatchService(Optional<WatchService> watchService) {\r\n+        String className = watchService.map(Object::getClass).map(Class::getName).orElse(null);\r\n+        return POLLING_WATCH_SERVICE_CLASS_NAME.equals(className);\r\n+    }\r\n+\r\n+    private static Optional<WatchService> newWatchService() {\r\n+        Optional<WatchService> watchService = null;\r\n+        FileSystem fileSystem = FileSystems.getDefault();\r\n+        try {\r\n+            watchService = Optional.of(fileSystem.newWatchService());\r\n+        } catch (IOException e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getMessage(), e);\r\n+            }\r\n+            watchService = Optional.empty();\r\n+        }\r\n+        return watchService;\r\n+    }\r\n+\r\n+    protected static File initDirectory(URL url) {\r\n+        String directoryPath = getParameter(url, CONFIG_CENTER_DIR_PARAM_NAME, url == null ? null : url.getPath());\r\n+        File rootDirectory = null;\r\n+        if (!StringUtils.isBlank(directoryPath)) {\r\n+            rootDirectory = new File(\"/\" + directoryPath);\r\n+        }\r\n+\r\n+        if (directoryPath == null || !rootDirectory.exists()) { // If the directory does not exist\r\n+            rootDirectory = new File(DEFAULT_CONFIG_CENTER_DIR_PATH);\r\n+        }\r\n+\r\n+        if (!rootDirectory.exists() && !rootDirectory.mkdirs()) {\r\n+            throw new IllegalStateException(format(\"Dubbo config center rootDirectory[%s] can't be created!\",\r\n+                    rootDirectory.getAbsolutePath()));\r\n+        }\r\n+        return rootDirectory;\r\n+    }\r\n+\r\n+    protected static String getEncoding(URL url) {\r\n+        return getParameter(url, CONFIG_CENTER_ENCODING_PARAM_NAME, DEFAULT_CONFIG_CENTER_ENCODING);\r\n+    }\r\n+\r\n+    private static ThreadPoolExecutor newWatchEventsLoopThreadPool() {\r\n+        return new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE,\r\n+                0L, MILLISECONDS,\r\n+                new SynchronousQueue(),\r\n+                new NamedThreadFactory(\"dubbo-config-center-watch-events-loop\", true));\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactory.java", "source2": "org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter.file;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;\n-\n-/**\n- * File-System based {@link DynamicConfigurationFactory} implementation\n- *\n- * @since 2.7.5\n- */\n-public class FileSystemDynamicConfigurationFactory extends AbstractDynamicConfigurationFactory {\n-\n-    @Override\n-    protected DynamicConfiguration createDynamicConfiguration(URL url) {\n-        return new FileSystemDynamicConfiguration(url);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter.file;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;\r\n+\r\n+/**\r\n+ * File-System based {@link DynamicConfigurationFactory} implementation\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class FileSystemDynamicConfigurationFactory extends AbstractDynamicConfigurationFactory {\r\n+\r\n+    @Override\r\n+    protected DynamicConfiguration createDynamicConfiguration(URL url) {\r\n+        return new FileSystemDynamicConfiguration(url);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java", "source2": "org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,72 +1,72 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter.nop;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-\n-import java.util.SortedSet;\n-\n-/**\n- * The default extension of {@link DynamicConfiguration}. If user does not specify a config center, or specifies one\n- * that is not a valid extension, it will default to this one.\n- */\n-@Deprecated\n-public class NopDynamicConfiguration implements DynamicConfiguration {\n-\n-    public NopDynamicConfiguration(URL url) {\n-        // no-op\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return null;\n-    }\n-\n-    @Override\n-    public void addListener(String key, String group, ConfigurationListener listener) {\n-        // no-op\n-    }\n-\n-    @Override\n-    public void removeListener(String key, String group, ConfigurationListener listener) {\n-        // no-op\n-    }\n-\n-    @Override\n-    public String getConfig(String key, String group, long timeout) throws IllegalStateException {\n-        // no-op\n-        return null;\n-    }\n-\n-    /**\n-     * @since 2.7.5\n-     */\n-    @Override\n-    public boolean publishConfig(String key, String group, String content) {\n-        return true;\n-    }\n-\n-    /**\n-     * @since 2.7.5\n-     */\n-    @Override\n-    public SortedSet<String> getConfigKeys(String group) {\n-        return null;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter.nop;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+\r\n+import java.util.SortedSet;\r\n+\r\n+/**\r\n+ * The default extension of {@link DynamicConfiguration}. If user does not specify a config center, or specifies one\r\n+ * that is not a valid extension, it will default to this one.\r\n+ */\r\n+@Deprecated\r\n+public class NopDynamicConfiguration implements DynamicConfiguration {\r\n+\r\n+    public NopDynamicConfiguration(URL url) {\r\n+        // no-op\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addListener(String key, String group, ConfigurationListener listener) {\r\n+        // no-op\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeListener(String key, String group, ConfigurationListener listener) {\r\n+        // no-op\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getConfig(String key, String group, long timeout) throws IllegalStateException {\r\n+        // no-op\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * @since 2.7.5\r\n+     */\r\n+    @Override\r\n+    public boolean publishConfig(String key, String group, String content) {\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * @since 2.7.5\r\n+     */\r\n+    @Override\r\n+    public SortedSet<String> getConfigKeys(String group) {\r\n+        return null;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfigurationFactory.java", "source2": "org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfigurationFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter.nop;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-\n-/**\n- *\n- */\n-@Deprecated\n-public class NopDynamicConfigurationFactory extends AbstractDynamicConfigurationFactory {\n-\n-    @Override\n-    protected DynamicConfiguration createDynamicConfiguration(URL url) {\n-        return new NopDynamicConfiguration(url);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter.nop;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+@Deprecated\r\n+public class NopDynamicConfigurationFactory extends AbstractDynamicConfigurationFactory {\r\n+\r\n+    @Override\r\n+    protected DynamicConfiguration createDynamicConfiguration(URL url) {\r\n+        return new NopDynamicConfiguration(url);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java", "source2": "org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,101 +1,101 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.config.configcenter.wrapper;\n-\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-\n-import java.util.HashSet;\n-import java.util.Set;\n-import java.util.SortedSet;\n-import java.util.function.Consumer;\n-import java.util.function.Function;\n-\n-/**\n- * support multiple config center, simply iterating each concrete config center.\n- */\n-public class CompositeDynamicConfiguration implements DynamicConfiguration {\n-\n-    public static final String NAME = \"COMPOSITE\";\n-\n-    private Set<DynamicConfiguration> configurations = new HashSet<>();\n-\n-    public void addConfiguration(DynamicConfiguration configuration) {\n-        if (configuration != null) {\n-            this.configurations.add(configuration);\n-        }\n-    }\n-\n-    @Override\n-    public void addListener(String key, String group, ConfigurationListener listener) {\n-        iterateListenerOperation(configuration -> configuration.addListener(key, group, listener));\n-    }\n-\n-    @Override\n-    public void removeListener(String key, String group, ConfigurationListener listener) {\n-        iterateListenerOperation(configuration -> configuration.removeListener(key, group, listener));\n-    }\n-\n-    @Override\n-    public String getConfig(String key, String group, long timeout) throws IllegalStateException {\n-        return (String) iterateConfigOperation(configuration -> configuration.getConfig(key, group, timeout));\n-    }\n-\n-    @Override\n-    public String getProperties(String key, String group, long timeout) throws IllegalStateException {\n-        return (String) iterateConfigOperation(configuration -> configuration.getProperties(key, group, timeout));\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return iterateConfigOperation(configuration -> configuration.getInternalProperty(key));\n-    }\n-\n-    @Override\n-    public boolean publishConfig(String key, String group, String content) throws UnsupportedOperationException {\n-        boolean publishedAll = true;\n-        for (DynamicConfiguration configuration : configurations) {\n-            if (!configuration.publishConfig(key, group, content)) {\n-                publishedAll = false;\n-            }\n-        }\n-        return publishedAll;\n-    }\n-\n-    @Override\n-    @SuppressWarnings(\"unchecked\")\n-    public SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {\n-        return (SortedSet<String>) iterateConfigOperation(configuration -> configuration.getConfigKeys(group));\n-    }\n-\n-    private void iterateListenerOperation(Consumer<DynamicConfiguration> consumer) {\n-        for (DynamicConfiguration configuration : configurations) {\n-            consumer.accept(configuration);\n-        }\n-    }\n-\n-    private Object iterateConfigOperation(Function<DynamicConfiguration, Object> func) {\n-        Object value = null;\n-        for (DynamicConfiguration configuration : configurations) {\n-            value = func.apply(configuration);\n-            if (value != null) {\n-                break;\n-            }\n-        }\n-        return value;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.config.configcenter.wrapper;\r\n+\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+\r\n+import java.util.HashSet;\r\n+import java.util.Set;\r\n+import java.util.SortedSet;\r\n+import java.util.function.Consumer;\r\n+import java.util.function.Function;\r\n+\r\n+/**\r\n+ * support multiple config center, simply iterating each concrete config center.\r\n+ */\r\n+public class CompositeDynamicConfiguration implements DynamicConfiguration {\r\n+\r\n+    public static final String NAME = \"COMPOSITE\";\r\n+\r\n+    private Set<DynamicConfiguration> configurations = new HashSet<>();\r\n+\r\n+    public void addConfiguration(DynamicConfiguration configuration) {\r\n+        if (configuration != null) {\r\n+            this.configurations.add(configuration);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addListener(String key, String group, ConfigurationListener listener) {\r\n+        iterateListenerOperation(configuration -> configuration.addListener(key, group, listener));\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeListener(String key, String group, ConfigurationListener listener) {\r\n+        iterateListenerOperation(configuration -> configuration.removeListener(key, group, listener));\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getConfig(String key, String group, long timeout) throws IllegalStateException {\r\n+        return (String) iterateConfigOperation(configuration -> configuration.getConfig(key, group, timeout));\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getProperties(String key, String group, long timeout) throws IllegalStateException {\r\n+        return (String) iterateConfigOperation(configuration -> configuration.getProperties(key, group, timeout));\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return iterateConfigOperation(configuration -> configuration.getInternalProperty(key));\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean publishConfig(String key, String group, String content) throws UnsupportedOperationException {\r\n+        boolean publishedAll = true;\r\n+        for (DynamicConfiguration configuration : configurations) {\r\n+            if (!configuration.publishConfig(key, group, content)) {\r\n+                publishedAll = false;\r\n+            }\r\n+        }\r\n+        return publishedAll;\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {\r\n+        return (SortedSet<String>) iterateConfigOperation(configuration -> configuration.getConfigKeys(group));\r\n+    }\r\n+\r\n+    private void iterateListenerOperation(Consumer<DynamicConfiguration> consumer) {\r\n+        for (DynamicConfiguration configuration : configurations) {\r\n+            consumer.accept(configuration);\r\n+        }\r\n+    }\r\n+\r\n+    private Object iterateConfigOperation(Function<DynamicConfiguration, Object> func) {\r\n+        Object value = null;\r\n+        for (DynamicConfiguration configuration : configurations) {\r\n+            value = func.apply(configuration);\r\n+            if (value != null) {\r\n+                break;\r\n+            }\r\n+        }\r\n+        return value;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/constants/CommonConstants.java", "source2": "org/apache/dubbo/common/constants/CommonConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,393 +1,393 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.constants;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import java.net.NetworkInterface;\n-import java.util.Properties;\n-import java.util.concurrent.ExecutorService;\n-import java.util.regex.Pattern;\n-\n-public interface CommonConstants {\n-    String DUBBO = \"dubbo\";\n-\n-    String PROVIDER = \"provider\";\n-\n-    String CONSUMER = \"consumer\";\n-\n-    String APPLICATION_KEY = \"application\";\n-\n-    String REMOTE_APPLICATION_KEY = \"remote.application\";\n-\n-    String ENABLED_KEY = \"enabled\";\n-\n-    String DISABLED_KEY = \"disabled\";\n-\n-    String DUBBO_PROPERTIES_KEY = \"dubbo.properties.file\";\n-\n-    String DEFAULT_DUBBO_PROPERTIES = \"dubbo.properties\";\n-\n-    String ANY_VALUE = \"*\";\n-\n-    /**\n-     * @since 2.7.8\n-     */\n-    char COMMA_SEPARATOR_CHAR = ',';\n-\n-    String COMMA_SEPARATOR = \",\";\n-\n-    String DOT_SEPARATOR = \".\";\n-\n-    Pattern COMMA_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[,]+\\\\s*\");\n-\n-    String PATH_SEPARATOR = \"/\";\n-\n-    String PROTOCOL_SEPARATOR = \"://\";\n-\n-    String PROTOCOL_SEPARATOR_ENCODED = URL.encode(PROTOCOL_SEPARATOR);\n-\n-    String REGISTRY_SEPARATOR = \"|\";\n-\n-    Pattern REGISTRY_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[|;]+\\\\s*\");\n-\n-    Pattern D_REGISTRY_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[|]+\\\\s*\");\n-\n-    String SEMICOLON_SEPARATOR = \";\";\n-\n-    Pattern SEMICOLON_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[;]+\\\\s*\");\n-\n-    Pattern EQUAL_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[=]+\\\\s*\");\n-\n-    Pattern COLON_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[:]+\\\\s*\");\n-\n-    String DEFAULT_PROXY = \"javassist\";\n-\n-    String DEFAULT_DIRECTORY = \"dubbo\";\n-\n-    String PROTOCOL_KEY = \"protocol\";\n-\n-    String DEFAULT_PROTOCOL = \"dubbo\";\n-\n-    String DEFAULT_THREAD_NAME = \"Dubbo\";\n-\n-    int DEFAULT_CORE_THREADS = 0;\n-\n-    int DEFAULT_THREADS = 200;\n-\n-    String EXECUTOR_SERVICE_COMPONENT_KEY = ExecutorService.class.getName();\n-\n-    String THREADPOOL_KEY = \"threadpool\";\n-\n-    String THREAD_NAME_KEY = \"threadname\";\n-\n-    String CORE_THREADS_KEY = \"corethreads\";\n-\n-    String THREADS_KEY = \"threads\";\n-\n-    String QUEUES_KEY = \"queues\";\n-\n-    String ALIVE_KEY = \"alive\";\n-\n-    String DEFAULT_THREADPOOL = \"limited\";\n-\n-    String DEFAULT_CLIENT_THREADPOOL = \"cached\";\n-\n-    String IO_THREADS_KEY = \"iothreads\";\n-\n-    String KEEP_ALIVE_KEY = \"keep.alive\";\n-\n-    int DEFAULT_QUEUES = 0;\n-\n-    int DEFAULT_ALIVE = 60 * 1000;\n-\n-    String TIMEOUT_KEY = \"timeout\";\n-\n-    int DEFAULT_TIMEOUT = 1000;\n-\n-    // used by invocation attachments to transfer timeout from Consumer to Provider.\n-    // works as a replacement of TIMEOUT_KEY on wire, which seems to be totally useless in previous releases).\n-    String TIMEOUT_ATTACHMENT_KEY = \"_TO\";\n-\n-    String TIME_COUNTDOWN_KEY = \"timeout-countdown\";\n-\n-    String ENABLE_TIMEOUT_COUNTDOWN_KEY = \"enable-timeout-countdown\";\n-\n-    String REMOVE_VALUE_PREFIX = \"-\";\n-\n-    String PROPERTIES_CHAR_SEPARATOR = \"-\";\n-\n-    String UNDERLINE_SEPARATOR = \"_\";\n-\n-    String SEPARATOR_REGEX = \"_|-\";\n-\n-    String GROUP_CHAR_SEPARATOR = \":\";\n-\n-    String HIDDEN_KEY_PREFIX = \".\";\n-\n-    String DOT_REGEX = \"\\\\.\";\n-\n-    String DEFAULT_KEY_PREFIX = \"default.\";\n-\n-    String DEFAULT_KEY = \"default\";\n-\n-    String PREFERRED_KEY = \"preferred\";\n-\n-    /**\n-     * Default timeout value in milliseconds for server shutdown\n-     */\n-    int DEFAULT_SERVER_SHUTDOWN_TIMEOUT = 10000;\n-\n-    String SIDE_KEY = \"side\";\n-\n-    String PROVIDER_SIDE = \"provider\";\n-\n-    String CONSUMER_SIDE = \"consumer\";\n-\n-    String ANYHOST_KEY = \"anyhost\";\n-\n-    String ANYHOST_VALUE = \"0.0.0.0\";\n-\n-    String LOCALHOST_KEY = \"localhost\";\n-\n-    String LOCALHOST_VALUE = \"127.0.0.1\";\n-\n-    String METHODS_KEY = \"methods\";\n-\n-    String METHOD_KEY = \"method\";\n-\n-    String PID_KEY = \"pid\";\n-\n-    String TIMESTAMP_KEY = \"timestamp\";\n-\n-    String GROUP_KEY = \"group\";\n-\n-    String PATH_KEY = \"path\";\n-\n-    String INTERFACE_KEY = \"interface\";\n-\n-    String FILE_KEY = \"file\";\n-\n-    String DUMP_DIRECTORY = \"dump.directory\";\n-\n-    String CLASSIFIER_KEY = \"classifier\";\n-\n-    String VERSION_KEY = \"version\";\n-\n-    String REVISION_KEY = \"revision\";\n-\n-    String METADATA_KEY = \"metadata-type\";\n-\n-    String MAPPING_KEY = \"mapping-type\";\n-\n-    String CONFIG_MAPPING_TYPE = \"config\";\n-\n-    String METADATA_MAPPING_TYPE = \"metadata\";\n-\n-    String DEFAULT_METADATA_STORAGE_TYPE = \"local\";\n-\n-    String REMOTE_METADATA_STORAGE_TYPE = \"remote\";\n-\n-    /**\n-     * The composite metadata storage type includes {@link #DEFAULT_METADATA_STORAGE_TYPE \"local\"} and\n-     * {@link #REMOTE_METADATA_STORAGE_TYPE \"remote\"}.\n-     *\n-     * @since 2.7.8\n-     */\n-    String COMPOSITE_METADATA_STORAGE_TYPE = \"composite\";\n-\n-    /**\n-     * Consumer side 's proxy class\n-     */\n-    String PROXY_CLASS_REF = \"refClass\";\n-\n-    /**\n-     * generic call\n-     */\n-    String $INVOKE = \"$invoke\";\n-    String $INVOKE_ASYNC = \"$invokeAsync\";\n-    String GENERIC_PARAMETER_DESC = \"Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;\";\n-\n-    /**\n-     * package version in the manifest\n-     */\n-    String RELEASE_KEY = \"release\";\n-\n-    int MAX_PROXY_COUNT = 65535;\n-\n-    String MONITOR_KEY = \"monitor\";\n-    String CLUSTER_KEY = \"cluster\";\n-    String USERNAME_KEY = \"username\";\n-    String PASSWORD_KEY = \"password\";\n-    String HOST_KEY = \"host\";\n-    String PORT_KEY = \"port\";\n-    String DUBBO_IP_TO_BIND = \"DUBBO_IP_TO_BIND\";\n-\n-    /**\n-     * The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that\n-     * the Dubbo application prefers\n-     *\n-     * @since 2.7.6\n-     */\n-    String DUBBO_PREFERRED_NETWORK_INTERFACE = \"dubbo.network.interface.preferred\";\n-\n-    @Deprecated\n-    String SHUTDOWN_WAIT_SECONDS_KEY = \"dubbo.service.shutdown.wait.seconds\";\n-    String SHUTDOWN_WAIT_KEY = \"dubbo.service.shutdown.wait\";\n-    String DUBBO_PROTOCOL = \"dubbo\";\n-\n-    String DUBBO_LABELS = \"dubbo.labels\";\n-    String DUBBO_ENV_KEYS = \"dubbo.env.keys\";\n-\n-    String CONFIG_CONFIGFILE_KEY = \"config-file\";\n-    String CONFIG_ENABLE_KEY = \"highest-priority\";\n-    String CONFIG_NAMESPACE_KEY = \"namespace\";\n-    String CHECK_KEY = \"check\";\n-\n-    String BACKLOG_KEY = \"backlog\";\n-\n-    String HEARTBEAT_EVENT = null;\n-    String MOCK_HEARTBEAT_EVENT = \"H\";\n-    String READONLY_EVENT = \"R\";\n-\n-    String REFERENCE_FILTER_KEY = \"reference.filter\";\n-\n-    String INVOKER_LISTENER_KEY = \"invoker.listener\";\n-\n-    String DUBBO_VERSION_KEY = \"dubbo\";\n-\n-    String TAG_KEY = \"dubbo.tag\";\n-\n-    /**\n-     * To decide whether to make connection when the client is created\n-     */\n-    String LAZY_CONNECT_KEY = \"lazy\";\n-\n-    String STUB_EVENT_KEY = \"dubbo.stub.event\";\n-\n-    String REFERENCE_INTERCEPTOR_KEY = \"reference.interceptor\";\n-\n-    String SERVICE_FILTER_KEY = \"service.filter\";\n-\n-    String EXPORTER_LISTENER_KEY = \"exporter.listener\";\n-\n-    String METRICS_PORT = \"metrics.port\";\n-\n-    String METRICS_PROTOCOL = \"metrics.protocol\";\n-\n-    /**\n-     * After simplify the registry, should add some parameter individually for provider.\n-     *\n-     * @since 2.7.0\n-     */\n-    String EXTRA_KEYS_KEY = \"extra-keys\";\n-\n-    String GENERIC_SERIALIZATION_NATIVE_JAVA = \"nativejava\";\n-\n-    String GENERIC_SERIALIZATION_DEFAULT = \"true\";\n-\n-    String GENERIC_SERIALIZATION_BEAN = \"bean\";\n-\n-    String GENERIC_RAW_RETURN = \"raw.return\";\n-\n-    String GENERIC_SERIALIZATION_PROTOBUF = \"protobuf-json\";\n-\n-    String GENERIC_WITH_CLZ_KEY = \"generic.include.class\";\n-\n-    /**\n-     * The limit of callback service instances for one interface on every client\n-     */\n-    String CALLBACK_INSTANCES_LIMIT_KEY = \"callbacks\";\n-\n-    /**\n-     * The default limit number for callback service instances\n-     *\n-     * @see #CALLBACK_INSTANCES_LIMIT_KEY\n-     */\n-    int DEFAULT_CALLBACK_INSTANCES = 1;\n-\n-    String LOADBALANCE_KEY = \"loadbalance\";\n-\n-    String DEFAULT_LOADBALANCE = \"random\";\n-\n-    String RETRIES_KEY = \"retries\";\n-\n-    String FORKS_KEY = \"forks\";\n-\n-    int DEFAULT_RETRIES = 2;\n-\n-    int DEFAULT_FAILBACK_TIMES = 3;\n-\n-    String REGISTER_KEY = \"register\";\n-\n-    String INTERFACES = \"interfaces\";\n-\n-    String SSL_ENABLED_KEY = \"ssl-enabled\";\n-\n-    String SERVICE_PATH_PREFIX = \"service.path.prefix\";\n-\n-    String PROTOCOL_SERVER_SERVLET = \"servlet\";\n-\n-    String PROTOCOL_SERVER = \"server\";\n-\n-    /**\n-     * The parameter key for the class path of the ServiceNameMapping {@link Properties} file\n-     *\n-     * @since 2.7.8\n-     */\n-    String SERVICE_NAME_MAPPING_PROPERTIES_FILE_KEY = \"service-name-mapping.properties-path\";\n-\n-    /**\n-     * The default class path of the ServiceNameMapping {@link Properties} file\n-     *\n-     * @since 2.7.8\n-     */\n-    String DEFAULT_SERVICE_NAME_MAPPING_PROPERTIES_PATH = \"META-INF/dubbo/service-name-mapping.properties\";\n-\n-    String REDIS_CLIENT_KEY = \"redis-client\";\n-\n-    String MONO_REDIS = \"mono\";\n-\n-    String SENTINEL_REDIS = \"sentinel\";\n-\n-    String CLUSTER_REDIS = \"cluster\";\n-\n-    /** Pseudo URL prefix for loading from the class path: \"classpath:\". */\n-    String CLASSPATH_URL_PREFIX = \"classpath:\";\n-\n-    String DEFAULT_VERSION = \"0.0.0\";\n-\n-    String CLASS_DESERIALIZE_BLOCK_ALL = \"dubbo.security.serialize.blockAllClassExceptAllow\";\n-\n-    String CLASS_DESERIALIZE_ALLOWED_LIST = \"dubbo.security.serialize.allowedClassList\";\n-\n-    String CLASS_DESERIALIZE_BLOCKED_LIST = \"dubbo.security.serialize.blockedClassList\";\n-\n-    String ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE = \"dubbo.security.serialize.generic.native-java-enable\";\n-\n-    String SERIALIZE_BLOCKED_LIST_FILE_PATH = \"security/serialize.blockedlist\";\n-\n-\n-    /**\n-     *  Interface configuration item\n-     * @since 2.7.10\n-     */\n-    String ON_CONNECT_KEY = \"onconnect\";\n-\n-    String ON_DISCONNECT_KEY = \"ondisconnect\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.constants;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.net.NetworkInterface;\r\n+import java.util.Properties;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.regex.Pattern;\r\n+\r\n+public interface CommonConstants {\r\n+    String DUBBO = \"dubbo\";\r\n+\r\n+    String PROVIDER = \"provider\";\r\n+\r\n+    String CONSUMER = \"consumer\";\r\n+\r\n+    String APPLICATION_KEY = \"application\";\r\n+\r\n+    String REMOTE_APPLICATION_KEY = \"remote.application\";\r\n+\r\n+    String ENABLED_KEY = \"enabled\";\r\n+\r\n+    String DISABLED_KEY = \"disabled\";\r\n+\r\n+    String DUBBO_PROPERTIES_KEY = \"dubbo.properties.file\";\r\n+\r\n+    String DEFAULT_DUBBO_PROPERTIES = \"dubbo.properties\";\r\n+\r\n+    String ANY_VALUE = \"*\";\r\n+\r\n+    /**\r\n+     * @since 2.7.8\r\n+     */\r\n+    char COMMA_SEPARATOR_CHAR = ',';\r\n+\r\n+    String COMMA_SEPARATOR = \",\";\r\n+\r\n+    String DOT_SEPARATOR = \".\";\r\n+\r\n+    Pattern COMMA_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[,]+\\\\s*\");\r\n+\r\n+    String PATH_SEPARATOR = \"/\";\r\n+\r\n+    String PROTOCOL_SEPARATOR = \"://\";\r\n+\r\n+    String PROTOCOL_SEPARATOR_ENCODED = URL.encode(PROTOCOL_SEPARATOR);\r\n+\r\n+    String REGISTRY_SEPARATOR = \"|\";\r\n+\r\n+    Pattern REGISTRY_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[|;]+\\\\s*\");\r\n+\r\n+    Pattern D_REGISTRY_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[|]+\\\\s*\");\r\n+\r\n+    String SEMICOLON_SEPARATOR = \";\";\r\n+\r\n+    Pattern SEMICOLON_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[;]+\\\\s*\");\r\n+\r\n+    Pattern EQUAL_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[=]+\\\\s*\");\r\n+\r\n+    Pattern COLON_SPLIT_PATTERN = Pattern.compile(\"\\\\s*[:]+\\\\s*\");\r\n+\r\n+    String DEFAULT_PROXY = \"javassist\";\r\n+\r\n+    String DEFAULT_DIRECTORY = \"dubbo\";\r\n+\r\n+    String PROTOCOL_KEY = \"protocol\";\r\n+\r\n+    String DEFAULT_PROTOCOL = \"dubbo\";\r\n+\r\n+    String DEFAULT_THREAD_NAME = \"Dubbo\";\r\n+\r\n+    int DEFAULT_CORE_THREADS = 0;\r\n+\r\n+    int DEFAULT_THREADS = 200;\r\n+\r\n+    String EXECUTOR_SERVICE_COMPONENT_KEY = ExecutorService.class.getName();\r\n+\r\n+    String THREADPOOL_KEY = \"threadpool\";\r\n+\r\n+    String THREAD_NAME_KEY = \"threadname\";\r\n+\r\n+    String CORE_THREADS_KEY = \"corethreads\";\r\n+\r\n+    String THREADS_KEY = \"threads\";\r\n+\r\n+    String QUEUES_KEY = \"queues\";\r\n+\r\n+    String ALIVE_KEY = \"alive\";\r\n+\r\n+    String DEFAULT_THREADPOOL = \"limited\";\r\n+\r\n+    String DEFAULT_CLIENT_THREADPOOL = \"cached\";\r\n+\r\n+    String IO_THREADS_KEY = \"iothreads\";\r\n+\r\n+    String KEEP_ALIVE_KEY = \"keep.alive\";\r\n+\r\n+    int DEFAULT_QUEUES = 0;\r\n+\r\n+    int DEFAULT_ALIVE = 60 * 1000;\r\n+\r\n+    String TIMEOUT_KEY = \"timeout\";\r\n+\r\n+    int DEFAULT_TIMEOUT = 1000;\r\n+\r\n+    // used by invocation attachments to transfer timeout from Consumer to Provider.\r\n+    // works as a replacement of TIMEOUT_KEY on wire, which seems to be totally useless in previous releases).\r\n+    String TIMEOUT_ATTACHMENT_KEY = \"_TO\";\r\n+\r\n+    String TIME_COUNTDOWN_KEY = \"timeout-countdown\";\r\n+\r\n+    String ENABLE_TIMEOUT_COUNTDOWN_KEY = \"enable-timeout-countdown\";\r\n+\r\n+    String REMOVE_VALUE_PREFIX = \"-\";\r\n+\r\n+    String PROPERTIES_CHAR_SEPARATOR = \"-\";\r\n+\r\n+    String UNDERLINE_SEPARATOR = \"_\";\r\n+\r\n+    String SEPARATOR_REGEX = \"_|-\";\r\n+\r\n+    String GROUP_CHAR_SEPARATOR = \":\";\r\n+\r\n+    String HIDDEN_KEY_PREFIX = \".\";\r\n+\r\n+    String DOT_REGEX = \"\\\\.\";\r\n+\r\n+    String DEFAULT_KEY_PREFIX = \"default.\";\r\n+\r\n+    String DEFAULT_KEY = \"default\";\r\n+\r\n+    String PREFERRED_KEY = \"preferred\";\r\n+\r\n+    /**\r\n+     * Default timeout value in milliseconds for server shutdown\r\n+     */\r\n+    int DEFAULT_SERVER_SHUTDOWN_TIMEOUT = 10000;\r\n+\r\n+    String SIDE_KEY = \"side\";\r\n+\r\n+    String PROVIDER_SIDE = \"provider\";\r\n+\r\n+    String CONSUMER_SIDE = \"consumer\";\r\n+\r\n+    String ANYHOST_KEY = \"anyhost\";\r\n+\r\n+    String ANYHOST_VALUE = \"0.0.0.0\";\r\n+\r\n+    String LOCALHOST_KEY = \"localhost\";\r\n+\r\n+    String LOCALHOST_VALUE = \"127.0.0.1\";\r\n+\r\n+    String METHODS_KEY = \"methods\";\r\n+\r\n+    String METHOD_KEY = \"method\";\r\n+\r\n+    String PID_KEY = \"pid\";\r\n+\r\n+    String TIMESTAMP_KEY = \"timestamp\";\r\n+\r\n+    String GROUP_KEY = \"group\";\r\n+\r\n+    String PATH_KEY = \"path\";\r\n+\r\n+    String INTERFACE_KEY = \"interface\";\r\n+\r\n+    String FILE_KEY = \"file\";\r\n+\r\n+    String DUMP_DIRECTORY = \"dump.directory\";\r\n+\r\n+    String CLASSIFIER_KEY = \"classifier\";\r\n+\r\n+    String VERSION_KEY = \"version\";\r\n+\r\n+    String REVISION_KEY = \"revision\";\r\n+\r\n+    String METADATA_KEY = \"metadata-type\";\r\n+\r\n+    String MAPPING_KEY = \"mapping-type\";\r\n+\r\n+    String CONFIG_MAPPING_TYPE = \"config\";\r\n+\r\n+    String METADATA_MAPPING_TYPE = \"metadata\";\r\n+\r\n+    String DEFAULT_METADATA_STORAGE_TYPE = \"local\";\r\n+\r\n+    String REMOTE_METADATA_STORAGE_TYPE = \"remote\";\r\n+\r\n+    /**\r\n+     * The composite metadata storage type includes {@link #DEFAULT_METADATA_STORAGE_TYPE \"local\"} and\r\n+     * {@link #REMOTE_METADATA_STORAGE_TYPE \"remote\"}.\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    String COMPOSITE_METADATA_STORAGE_TYPE = \"composite\";\r\n+\r\n+    /**\r\n+     * Consumer side 's proxy class\r\n+     */\r\n+    String PROXY_CLASS_REF = \"refClass\";\r\n+\r\n+    /**\r\n+     * generic call\r\n+     */\r\n+    String $INVOKE = \"$invoke\";\r\n+    String $INVOKE_ASYNC = \"$invokeAsync\";\r\n+    String GENERIC_PARAMETER_DESC = \"Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;\";\r\n+\r\n+    /**\r\n+     * package version in the manifest\r\n+     */\r\n+    String RELEASE_KEY = \"release\";\r\n+\r\n+    int MAX_PROXY_COUNT = 65535;\r\n+\r\n+    String MONITOR_KEY = \"monitor\";\r\n+    String CLUSTER_KEY = \"cluster\";\r\n+    String USERNAME_KEY = \"username\";\r\n+    String PASSWORD_KEY = \"password\";\r\n+    String HOST_KEY = \"host\";\r\n+    String PORT_KEY = \"port\";\r\n+    String DUBBO_IP_TO_BIND = \"DUBBO_IP_TO_BIND\";\r\n+\r\n+    /**\r\n+     * The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that\r\n+     * the Dubbo application prefers\r\n+     *\r\n+     * @since 2.7.6\r\n+     */\r\n+    String DUBBO_PREFERRED_NETWORK_INTERFACE = \"dubbo.network.interface.preferred\";\r\n+\r\n+    @Deprecated\r\n+    String SHUTDOWN_WAIT_SECONDS_KEY = \"dubbo.service.shutdown.wait.seconds\";\r\n+    String SHUTDOWN_WAIT_KEY = \"dubbo.service.shutdown.wait\";\r\n+    String DUBBO_PROTOCOL = \"dubbo\";\r\n+\r\n+    String DUBBO_LABELS = \"dubbo.labels\";\r\n+    String DUBBO_ENV_KEYS = \"dubbo.env.keys\";\r\n+\r\n+    String CONFIG_CONFIGFILE_KEY = \"config-file\";\r\n+    String CONFIG_ENABLE_KEY = \"highest-priority\";\r\n+    String CONFIG_NAMESPACE_KEY = \"namespace\";\r\n+    String CHECK_KEY = \"check\";\r\n+\r\n+    String BACKLOG_KEY = \"backlog\";\r\n+\r\n+    String HEARTBEAT_EVENT = null;\r\n+    String MOCK_HEARTBEAT_EVENT = \"H\";\r\n+    String READONLY_EVENT = \"R\";\r\n+\r\n+    String REFERENCE_FILTER_KEY = \"reference.filter\";\r\n+\r\n+    String INVOKER_LISTENER_KEY = \"invoker.listener\";\r\n+\r\n+    String DUBBO_VERSION_KEY = \"dubbo\";\r\n+\r\n+    String TAG_KEY = \"dubbo.tag\";\r\n+\r\n+    /**\r\n+     * To decide whether to make connection when the client is created\r\n+     */\r\n+    String LAZY_CONNECT_KEY = \"lazy\";\r\n+\r\n+    String STUB_EVENT_KEY = \"dubbo.stub.event\";\r\n+\r\n+    String REFERENCE_INTERCEPTOR_KEY = \"reference.interceptor\";\r\n+\r\n+    String SERVICE_FILTER_KEY = \"service.filter\";\r\n+\r\n+    String EXPORTER_LISTENER_KEY = \"exporter.listener\";\r\n+\r\n+    String METRICS_PORT = \"metrics.port\";\r\n+\r\n+    String METRICS_PROTOCOL = \"metrics.protocol\";\r\n+\r\n+    /**\r\n+     * After simplify the registry, should add some parameter individually for provider.\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    String EXTRA_KEYS_KEY = \"extra-keys\";\r\n+\r\n+    String GENERIC_SERIALIZATION_NATIVE_JAVA = \"nativejava\";\r\n+\r\n+    String GENERIC_SERIALIZATION_DEFAULT = \"true\";\r\n+\r\n+    String GENERIC_SERIALIZATION_BEAN = \"bean\";\r\n+\r\n+    String GENERIC_RAW_RETURN = \"raw.return\";\r\n+\r\n+    String GENERIC_SERIALIZATION_PROTOBUF = \"protobuf-json\";\r\n+\r\n+    String GENERIC_WITH_CLZ_KEY = \"generic.include.class\";\r\n+\r\n+    /**\r\n+     * The limit of callback service instances for one interface on every client\r\n+     */\r\n+    String CALLBACK_INSTANCES_LIMIT_KEY = \"callbacks\";\r\n+\r\n+    /**\r\n+     * The default limit number for callback service instances\r\n+     *\r\n+     * @see #CALLBACK_INSTANCES_LIMIT_KEY\r\n+     */\r\n+    int DEFAULT_CALLBACK_INSTANCES = 1;\r\n+\r\n+    String LOADBALANCE_KEY = \"loadbalance\";\r\n+\r\n+    String DEFAULT_LOADBALANCE = \"random\";\r\n+\r\n+    String RETRIES_KEY = \"retries\";\r\n+\r\n+    String FORKS_KEY = \"forks\";\r\n+\r\n+    int DEFAULT_RETRIES = 2;\r\n+\r\n+    int DEFAULT_FAILBACK_TIMES = 3;\r\n+\r\n+    String REGISTER_KEY = \"register\";\r\n+\r\n+    String INTERFACES = \"interfaces\";\r\n+\r\n+    String SSL_ENABLED_KEY = \"ssl-enabled\";\r\n+\r\n+    String SERVICE_PATH_PREFIX = \"service.path.prefix\";\r\n+\r\n+    String PROTOCOL_SERVER_SERVLET = \"servlet\";\r\n+\r\n+    String PROTOCOL_SERVER = \"server\";\r\n+\r\n+    /**\r\n+     * The parameter key for the class path of the ServiceNameMapping {@link Properties} file\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    String SERVICE_NAME_MAPPING_PROPERTIES_FILE_KEY = \"service-name-mapping.properties-path\";\r\n+\r\n+    /**\r\n+     * The default class path of the ServiceNameMapping {@link Properties} file\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    String DEFAULT_SERVICE_NAME_MAPPING_PROPERTIES_PATH = \"META-INF/dubbo/service-name-mapping.properties\";\r\n+\r\n+    String REDIS_CLIENT_KEY = \"redis-client\";\r\n+\r\n+    String MONO_REDIS = \"mono\";\r\n+\r\n+    String SENTINEL_REDIS = \"sentinel\";\r\n+\r\n+    String CLUSTER_REDIS = \"cluster\";\r\n+\r\n+    /** Pseudo URL prefix for loading from the class path: \"classpath:\". */\r\n+    String CLASSPATH_URL_PREFIX = \"classpath:\";\r\n+\r\n+    String DEFAULT_VERSION = \"0.0.0\";\r\n+\r\n+    String CLASS_DESERIALIZE_BLOCK_ALL = \"dubbo.security.serialize.blockAllClassExceptAllow\";\r\n+\r\n+    String CLASS_DESERIALIZE_ALLOWED_LIST = \"dubbo.security.serialize.allowedClassList\";\r\n+\r\n+    String CLASS_DESERIALIZE_BLOCKED_LIST = \"dubbo.security.serialize.blockedClassList\";\r\n+\r\n+    String ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE = \"dubbo.security.serialize.generic.native-java-enable\";\r\n+\r\n+    String SERIALIZE_BLOCKED_LIST_FILE_PATH = \"security/serialize.blockedlist\";\r\n+\r\n+\r\n+    /**\r\n+     *  Interface configuration item\r\n+     * @since 2.7.10\r\n+     */\r\n+    String ON_CONNECT_KEY = \"onconnect\";\r\n+\r\n+    String ON_DISCONNECT_KEY = \"ondisconnect\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/constants/FilterConstants.java", "source2": "org/apache/dubbo/common/constants/FilterConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,24 +1,24 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.constants;\n-\n-public interface FilterConstants {\n-    String CACHE_KEY = \"cache\";\n-\n-    String VALIDATION_KEY = \"validation\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.constants;\r\n+\r\n+public interface FilterConstants {\r\n+    String CACHE_KEY = \"cache\";\r\n+\r\n+    String VALIDATION_KEY = \"validation\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/constants/QosConstants.java", "source2": "org/apache/dubbo/common/constants/QosConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,32 +1,32 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.constants;\n-\n-/**\n- * QosConstants\n- */\n-public interface QosConstants {\n-\n-    String QOS_ENABLE = \"qos.enable\";\n-\n-    String QOS_HOST = \"qos.host\";\n-\n-    String QOS_PORT = \"qos.port\";\n-\n-    String ACCEPT_FOREIGN_IP = \"qos.accept.foreign.ip\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.constants;\r\n+\r\n+/**\r\n+ * QosConstants\r\n+ */\r\n+public interface QosConstants {\r\n+\r\n+    String QOS_ENABLE = \"qos.enable\";\r\n+\r\n+    String QOS_HOST = \"qos.host\";\r\n+\r\n+    String QOS_PORT = \"qos.port\";\r\n+\r\n+    String ACCEPT_FOREIGN_IP = \"qos.accept.foreign.ip\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/constants/RegistryConstants.java", "source2": "org/apache/dubbo/common/constants/RegistryConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,122 +1,122 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.constants;\n-\n-public interface RegistryConstants {\n-\n-    String REGISTRY_KEY = \"registry\";\n-\n-    String REGISTRY_CLUSTER_KEY = \"REGISTRY_CLUSTER\";\n-\n-    String REGISTRY_CLUSTER = \"REGISTRY_CLUSTER\";\n-\n-    String REGISTRY_CLUSTER_TYPE_KEY = \"registry-cluster-type\";\n-\n-    String REGISTRY_PROTOCOL = \"registry\";\n-\n-    String DYNAMIC_KEY = \"dynamic\";\n-\n-    String CATEGORY_KEY = \"category\";\n-\n-    String PROVIDERS_CATEGORY = \"providers\";\n-\n-    String CONSUMERS_CATEGORY = \"consumers\";\n-\n-    String ROUTERS_CATEGORY = \"routers\";\n-\n-    String DYNAMIC_ROUTERS_CATEGORY = \"dynamicrouters\";\n-\n-    String DEFAULT_CATEGORY = PROVIDERS_CATEGORY;\n-\n-    String CONFIGURATORS_CATEGORY = \"configurators\";\n-\n-    String DYNAMIC_CONFIGURATORS_CATEGORY = \"dynamicconfigurators\";\n-\n-    String APP_DYNAMIC_CONFIGURATORS_CATEGORY = \"appdynamicconfigurators\";\n-\n-    String ROUTERS_SUFFIX = \".routers\";\n-\n-    String EMPTY_PROTOCOL = \"empty\";\n-\n-    String ROUTE_PROTOCOL = \"route\";\n-\n-    String OVERRIDE_PROTOCOL = \"override\";\n-\n-    String COMPATIBLE_CONFIG_KEY = \"compatible_config\";\n-\n-    String REGISTRY_PUBLISH_INTERFACE_KEY = \"publish-interface\";\n-\n-    String DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY = \"dubbo.application.publish-interface\";\n-    /**\n-     * The parameter key of Dubbo Registry type\n-     *\n-     * @since 2.7.5\n-     */\n-    String REGISTRY_TYPE_KEY = \"registry-type\";\n-\n-    /**\n-     * The parameter value of Service-Oriented Registry type\n-     *\n-     * @since 2.7.5\n-     */\n-    String SERVICE_REGISTRY_TYPE = \"service\";\n-\n-    /**\n-     * The protocol for Service Discovery\n-     *\n-     * @since 2.7.5\n-     */\n-    String SERVICE_REGISTRY_PROTOCOL = \"service-discovery-registry\";\n-\n-    /**\n-     * The parameter key of the subscribed service names for Service-Oriented Registry\n-     * <p>\n-     * If there is a multiple-values, the  \"comma\" is the separator.\n-     *\n-     * @since 2.7.5\n-     */\n-    String SUBSCRIBED_SERVICE_NAMES_KEY = \"subscribed-services\";\n-\n-    String PROVIDED_BY = \"provided-by\";\n-\n-    /**\n-     * The request size of service instances\n-     *\n-     * @since 2.7.5\n-     */\n-    String INSTANCES_REQUEST_SIZE_KEY = \"instances-request-size\";\n-\n-    /**\n-     * The default request size of service instances\n-     */\n-    int DEFAULT_INSTANCES_REQUEST_SIZE = 100;\n-\n-    String ACCEPTS_KEY = \"accepts\";\n-\n-    String REGISTRY_ZONE = \"registry_zone\";\n-    String REGISTRY_ZONE_FORCE = \"registry_zone_force\";\n-    String ZONE_KEY = \"zone\";\n-\n-    String REGISTRY_SERVICE_REFERENCE_PATH = \"org.apache.dubbo.registry.RegistryService\";\n-\n-    String INIT = \"INIT\";\n-\n-    String MIGRATION_MULTI_REGISTRY = \"MIGRATION_MULTI_REGISTRY\";\n-\n-    String LOADBALANCE_AMONG_REGISTRIES = \"random\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.constants;\r\n+\r\n+public interface RegistryConstants {\r\n+\r\n+    String REGISTRY_KEY = \"registry\";\r\n+\r\n+    String REGISTRY_CLUSTER_KEY = \"REGISTRY_CLUSTER\";\r\n+\r\n+    String REGISTRY_CLUSTER = \"REGISTRY_CLUSTER\";\r\n+\r\n+    String REGISTRY_CLUSTER_TYPE_KEY = \"registry-cluster-type\";\r\n+\r\n+    String REGISTRY_PROTOCOL = \"registry\";\r\n+\r\n+    String DYNAMIC_KEY = \"dynamic\";\r\n+\r\n+    String CATEGORY_KEY = \"category\";\r\n+\r\n+    String PROVIDERS_CATEGORY = \"providers\";\r\n+\r\n+    String CONSUMERS_CATEGORY = \"consumers\";\r\n+\r\n+    String ROUTERS_CATEGORY = \"routers\";\r\n+\r\n+    String DYNAMIC_ROUTERS_CATEGORY = \"dynamicrouters\";\r\n+\r\n+    String DEFAULT_CATEGORY = PROVIDERS_CATEGORY;\r\n+\r\n+    String CONFIGURATORS_CATEGORY = \"configurators\";\r\n+\r\n+    String DYNAMIC_CONFIGURATORS_CATEGORY = \"dynamicconfigurators\";\r\n+\r\n+    String APP_DYNAMIC_CONFIGURATORS_CATEGORY = \"appdynamicconfigurators\";\r\n+\r\n+    String ROUTERS_SUFFIX = \".routers\";\r\n+\r\n+    String EMPTY_PROTOCOL = \"empty\";\r\n+\r\n+    String ROUTE_PROTOCOL = \"route\";\r\n+\r\n+    String OVERRIDE_PROTOCOL = \"override\";\r\n+\r\n+    String COMPATIBLE_CONFIG_KEY = \"compatible_config\";\r\n+\r\n+    String REGISTRY_PUBLISH_INTERFACE_KEY = \"publish-interface\";\r\n+\r\n+    String DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY = \"dubbo.application.publish-interface\";\r\n+    /**\r\n+     * The parameter key of Dubbo Registry type\r\n+     *\r\n+     * @since 2.7.5\r\n+     */\r\n+    String REGISTRY_TYPE_KEY = \"registry-type\";\r\n+\r\n+    /**\r\n+     * The parameter value of Service-Oriented Registry type\r\n+     *\r\n+     * @since 2.7.5\r\n+     */\r\n+    String SERVICE_REGISTRY_TYPE = \"service\";\r\n+\r\n+    /**\r\n+     * The protocol for Service Discovery\r\n+     *\r\n+     * @since 2.7.5\r\n+     */\r\n+    String SERVICE_REGISTRY_PROTOCOL = \"service-discovery-registry\";\r\n+\r\n+    /**\r\n+     * The parameter key of the subscribed service names for Service-Oriented Registry\r\n+     * <p>\r\n+     * If there is a multiple-values, the  \"comma\" is the separator.\r\n+     *\r\n+     * @since 2.7.5\r\n+     */\r\n+    String SUBSCRIBED_SERVICE_NAMES_KEY = \"subscribed-services\";\r\n+\r\n+    String PROVIDED_BY = \"provided-by\";\r\n+\r\n+    /**\r\n+     * The request size of service instances\r\n+     *\r\n+     * @since 2.7.5\r\n+     */\r\n+    String INSTANCES_REQUEST_SIZE_KEY = \"instances-request-size\";\r\n+\r\n+    /**\r\n+     * The default request size of service instances\r\n+     */\r\n+    int DEFAULT_INSTANCES_REQUEST_SIZE = 100;\r\n+\r\n+    String ACCEPTS_KEY = \"accepts\";\r\n+\r\n+    String REGISTRY_ZONE = \"registry_zone\";\r\n+    String REGISTRY_ZONE_FORCE = \"registry_zone_force\";\r\n+    String ZONE_KEY = \"zone\";\r\n+\r\n+    String REGISTRY_SERVICE_REFERENCE_PATH = \"org.apache.dubbo.registry.RegistryService\";\r\n+\r\n+    String INIT = \"INIT\";\r\n+\r\n+    String MIGRATION_MULTI_REGISTRY = \"MIGRATION_MULTI_REGISTRY\";\r\n+\r\n+    String LOADBALANCE_AMONG_REGISTRIES = \"random\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/constants/RemotingConstants.java", "source2": "org/apache/dubbo/common/constants/RemotingConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,26 +1,26 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.constants;\n-\n-/**\n- * RemotingConstants\n- */\n-public interface RemotingConstants {\n-\n-    String BACKUP_KEY = \"backup\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.constants;\r\n+\r\n+/**\r\n+ * RemotingConstants\r\n+ */\r\n+public interface RemotingConstants {\r\n+\r\n+    String BACKUP_KEY = \"backup\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/context/FrameworkExt.java", "source2": "org/apache/dubbo/common/context/FrameworkExt.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,24 +1,24 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.context;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-@SPI\n-public interface FrameworkExt extends Lifecycle {\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.context;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+@SPI\r\n+public interface FrameworkExt extends Lifecycle {\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/context/Lifecycle.java", "source2": "org/apache/dubbo/common/context/Lifecycle.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,48 +1,48 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.context;\n-\n-/**\n- * The Lifecycle of Dubbo component\n- *\n- * @since 2.7.5\n- */\n-public interface Lifecycle {\n-\n-    /**\n-     * Initialize the component before {@link #start() start}\n-     *\n-     * @return current {@link Lifecycle}\n-     * @throws IllegalStateException\n-     */\n-    void initialize() throws IllegalStateException;\n-\n-    /**\n-     * Start the component\n-     *\n-     * @return current {@link Lifecycle}\n-     * @throws IllegalStateException\n-     */\n-    void start() throws IllegalStateException;\n-\n-    /**\n-     * Destroy the component\n-     *\n-     * @throws IllegalStateException\n-     */\n-    void destroy() throws IllegalStateException;\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.context;\r\n+\r\n+/**\r\n+ * The Lifecycle of Dubbo component\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface Lifecycle {\r\n+\r\n+    /**\r\n+     * Initialize the component before {@link #start() start}\r\n+     *\r\n+     * @return current {@link Lifecycle}\r\n+     * @throws IllegalStateException\r\n+     */\r\n+    void initialize() throws IllegalStateException;\r\n+\r\n+    /**\r\n+     * Start the component\r\n+     *\r\n+     * @return current {@link Lifecycle}\r\n+     * @throws IllegalStateException\r\n+     */\r\n+    void start() throws IllegalStateException;\r\n+\r\n+    /**\r\n+     * Destroy the component\r\n+     *\r\n+     * @throws IllegalStateException\r\n+     */\r\n+    void destroy() throws IllegalStateException;\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/context/LifecycleAdapter.java", "source2": "org/apache/dubbo/common/context/LifecycleAdapter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.context;\n-\n-public abstract class LifecycleAdapter implements Lifecycle {\n-\n-    @Override\n-    public void initialize() throws IllegalStateException {\n-\n-    }\n-\n-    @Override\n-    public void start() throws IllegalStateException {\n-\n-    }\n-\n-    @Override\n-    public void destroy() throws IllegalStateException {\n-\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.context;\r\n+\r\n+public abstract class LifecycleAdapter implements Lifecycle {\r\n+\r\n+    @Override\r\n+    public void initialize() throws IllegalStateException {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void start() throws IllegalStateException {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws IllegalStateException {\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/Converter.java", "source2": "org/apache/dubbo/common/convert/Converter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,108 +1,108 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;\n-import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;\n-\n-/**\n- * A class to convert the source-typed value to the target-typed value\n- *\n- * @param <S> The source type\n- * @param <T> The target type\n- * @since 2.7.6\n- */\n-@SPI\n-@FunctionalInterface\n-public interface Converter<S, T> extends Prioritized {\n-\n-    /**\n-     * Accept the source type and target type or not\n-     *\n-     * @param sourceType the source type\n-     * @param targetType the target type\n-     * @return if accepted, return <code>true</code>, or <code>false</code>\n-     */\n-    default boolean accept(Class<?> sourceType, Class<?> targetType) {\n-        return isAssignableFrom(sourceType, getSourceType()) && isAssignableFrom(targetType, getTargetType());\n-    }\n-\n-    /**\n-     * Convert the source-typed value to the target-typed value\n-     *\n-     * @param source the source-typed value\n-     * @return the target-typed value\n-     */\n-    T convert(S source);\n-\n-    /**\n-     * Get the source type\n-     *\n-     * @return non-null\n-     */\n-    default Class<S> getSourceType() {\n-        return findActualTypeArgument(getClass(), Converter.class, 0);\n-    }\n-\n-    /**\n-     * Get the target type\n-     *\n-     * @return non-null\n-     */\n-    default Class<T> getTargetType() {\n-        return findActualTypeArgument(getClass(), Converter.class, 1);\n-    }\n-\n-    /**\n-     * Get the Converter instance from {@link ExtensionLoader} with the specified source and target type\n-     *\n-     * @param sourceType the source type\n-     * @param targetType the target type\n-     * @return\n-     * @see ExtensionLoader#getSupportedExtensionInstances()\n-     */\n-    static Converter<?, ?> getConverter(Class<?> sourceType, Class<?> targetType) {\n-        return getExtensionLoader(Converter.class)\n-                .getSupportedExtensionInstances()\n-                .stream()\n-                .filter(converter -> converter.accept(sourceType, targetType))\n-                .findFirst()\n-                .orElse(null);\n-    }\n-\n-    /**\n-     * Convert the value of source to target-type value if possible\n-     *\n-     * @param source     the value of source\n-     * @param targetType the target type\n-     * @param <T>        the target type\n-     * @return <code>null</code> if can't be converted\n-     * @since 2.7.8\n-     */\n-    static <T> T convertIfPossible(Object source, Class<T> targetType) {\n-        Converter converter = getConverter(source.getClass(), targetType);\n-        if (converter != null) {\n-            return (T) converter.convert(source);\n-        }\n-        return null;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;\r\n+import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;\r\n+\r\n+/**\r\n+ * A class to convert the source-typed value to the target-typed value\r\n+ *\r\n+ * @param <S> The source type\r\n+ * @param <T> The target type\r\n+ * @since 2.7.6\r\n+ */\r\n+@SPI\r\n+@FunctionalInterface\r\n+public interface Converter<S, T> extends Prioritized {\r\n+\r\n+    /**\r\n+     * Accept the source type and target type or not\r\n+     *\r\n+     * @param sourceType the source type\r\n+     * @param targetType the target type\r\n+     * @return if accepted, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    default boolean accept(Class<?> sourceType, Class<?> targetType) {\r\n+        return isAssignableFrom(sourceType, getSourceType()) && isAssignableFrom(targetType, getTargetType());\r\n+    }\r\n+\r\n+    /**\r\n+     * Convert the source-typed value to the target-typed value\r\n+     *\r\n+     * @param source the source-typed value\r\n+     * @return the target-typed value\r\n+     */\r\n+    T convert(S source);\r\n+\r\n+    /**\r\n+     * Get the source type\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    default Class<S> getSourceType() {\r\n+        return findActualTypeArgument(getClass(), Converter.class, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the target type\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    default Class<T> getTargetType() {\r\n+        return findActualTypeArgument(getClass(), Converter.class, 1);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the Converter instance from {@link ExtensionLoader} with the specified source and target type\r\n+     *\r\n+     * @param sourceType the source type\r\n+     * @param targetType the target type\r\n+     * @return\r\n+     * @see ExtensionLoader#getSupportedExtensionInstances()\r\n+     */\r\n+    static Converter<?, ?> getConverter(Class<?> sourceType, Class<?> targetType) {\r\n+        return getExtensionLoader(Converter.class)\r\n+                .getSupportedExtensionInstances()\r\n+                .stream()\r\n+                .filter(converter -> converter.accept(sourceType, targetType))\r\n+                .findFirst()\r\n+                .orElse(null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Convert the value of source to target-type value if possible\r\n+     *\r\n+     * @param source     the value of source\r\n+     * @param targetType the target type\r\n+     * @param <T>        the target type\r\n+     * @return <code>null</code> if can't be converted\r\n+     * @since 2.7.8\r\n+     */\r\n+    static <T> T convertIfPossible(Object source, Class<T> targetType) {\r\n+        Converter converter = getConverter(source.getClass(), targetType);\r\n+        if (converter != null) {\r\n+            return (T) converter.convert(source);\r\n+        }\r\n+        return null;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringConverter.java", "source2": "org/apache/dubbo/common/convert/StringConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,27 +1,27 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-/**\n- * A class to covert {@link String} to the target-typed value\n- *\n- * @see Converter\n- * @since 2.7.6\n- */\n-@FunctionalInterface\n-public interface StringConverter<T> extends Converter<String, T> {\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+/**\r\n+ * A class to covert {@link String} to the target-typed value\r\n+ *\r\n+ * @see Converter\r\n+ * @since 2.7.6\r\n+ */\r\n+@FunctionalInterface\r\n+public interface StringConverter<T> extends Converter<String, T> {\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToBooleanConverter.java", "source2": "org/apache/dubbo/common/convert/StringToBooleanConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static java.lang.Boolean.valueOf;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to {@link Boolean}\n- *\n- * @since 2.7.6\n- */\n-public class StringToBooleanConverter implements StringConverter<Boolean> {\n-\n-    @Override\n-    public Boolean convert(String source) {\n-        return isNotEmpty(source) ? valueOf(source) : null;\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 5;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static java.lang.Boolean.valueOf;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Boolean}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToBooleanConverter implements StringConverter<Boolean> {\r\n+\r\n+    @Override\r\n+    public Boolean convert(String source) {\r\n+        return isNotEmpty(source) ? valueOf(source) : null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 5;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToCharArrayConverter.java", "source2": "org/apache/dubbo/common/convert/StringToCharArrayConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,39 +1,39 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to <code>char[]</code>\n- *\n- * @since 2.7.6\n- */\n-public class StringToCharArrayConverter implements StringConverter<char[]> {\n-\n-    @Override\n-    public char[] convert(String source) {\n-        return isNotEmpty(source) ? source.toCharArray() : null;\n-    }\n-\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 7;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to <code>char[]</code>\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToCharArrayConverter implements StringConverter<char[]> {\r\n+\r\n+    @Override\r\n+    public char[] convert(String source) {\r\n+        return isNotEmpty(source) ? source.toCharArray() : null;\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 7;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToCharacterConverter.java", "source2": "org/apache/dubbo/common/convert/StringToCharacterConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,44 +1,44 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.length;\n-\n-/**\n- * The class to convert {@link String} to {@link Character}\n- *\n- * @since 2.7.6\n- */\n-public class StringToCharacterConverter implements StringConverter<Character> {\n-\n-    @Override\n-    public Character convert(String source) {\n-        int length = length(source);\n-        if (length == 0) {\n-            return null;\n-        }\n-        if (length > 1) {\n-            throw new IllegalArgumentException(\"The source String is more than one character!\");\n-        }\n-        return source.charAt(0);\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 8;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.length;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Character}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToCharacterConverter implements StringConverter<Character> {\r\n+\r\n+    @Override\r\n+    public Character convert(String source) {\r\n+        int length = length(source);\r\n+        if (length == 0) {\r\n+            return null;\r\n+        }\r\n+        if (length > 1) {\r\n+            throw new IllegalArgumentException(\"The source String is more than one character!\");\r\n+        }\r\n+        return source.charAt(0);\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 8;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToDoubleConverter.java", "source2": "org/apache/dubbo/common/convert/StringToDoubleConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,39 +1,39 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static java.lang.Double.valueOf;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to {@link Double}\n- *\n- * @since 2.7.6\n- */\n-public class StringToDoubleConverter implements StringConverter<Double> {\n-\n-    @Override\n-    public Double convert(String source) {\n-        return isNotEmpty(source) ? valueOf(source) : null;\n-    }\n-\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 3;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static java.lang.Double.valueOf;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Double}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToDoubleConverter implements StringConverter<Double> {\r\n+\r\n+    @Override\r\n+    public Double convert(String source) {\r\n+        return isNotEmpty(source) ? valueOf(source) : null;\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 3;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToFloatConverter.java", "source2": "org/apache/dubbo/common/convert/StringToFloatConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static java.lang.Float.valueOf;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to {@link Float}\n- *\n- * @since 2.7.6\n- */\n-public class StringToFloatConverter implements StringConverter<Float> {\n-\n-    @Override\n-    public Float convert(String source) {\n-        return isNotEmpty(source) ? valueOf(source) : null;\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 4;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static java.lang.Float.valueOf;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Float}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToFloatConverter implements StringConverter<Float> {\r\n+\r\n+    @Override\r\n+    public Float convert(String source) {\r\n+        return isNotEmpty(source) ? valueOf(source) : null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 4;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToIntegerConverter.java", "source2": "org/apache/dubbo/common/convert/StringToIntegerConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static java.lang.Integer.valueOf;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to {@link Integer}\n- *\n- * @since 2.7.6\n- */\n-public class StringToIntegerConverter implements StringConverter<Integer> {\n-\n-    @Override\n-    public Integer convert(String source) {\n-        return isNotEmpty(source) ? valueOf(source) : null;\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static java.lang.Integer.valueOf;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Integer}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToIntegerConverter implements StringConverter<Integer> {\r\n+\r\n+    @Override\r\n+    public Integer convert(String source) {\r\n+        return isNotEmpty(source) ? valueOf(source) : null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToLongConverter.java", "source2": "org/apache/dubbo/common/convert/StringToLongConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,39 +1,39 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static java.lang.Long.valueOf;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to {@link Long}\n- *\n- * @since 2.7.6\n- */\n-public class StringToLongConverter implements StringConverter<Long> {\n-\n-    @Override\n-    public Long convert(String source) {\n-        return isNotEmpty(source) ? valueOf(source) : null;\n-    }\n-\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 1;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static java.lang.Long.valueOf;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Long}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToLongConverter implements StringConverter<Long> {\r\n+\r\n+    @Override\r\n+    public Long convert(String source) {\r\n+        return isNotEmpty(source) ? valueOf(source) : null;\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 1;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToOptionalConverter.java", "source2": "org/apache/dubbo/common/convert/StringToOptionalConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,40 +1,40 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import java.util.Optional;\n-\n-import static java.util.Optional.ofNullable;\n-\n-/**\n- * The class to convert {@link String} to {@link Optional}\n- *\n- * @since 2.7.6\n- */\n-public class StringToOptionalConverter implements StringConverter<Optional> {\n-\n-    @Override\n-    public Optional convert(String source) {\n-        return ofNullable(source);\n-    }\n-\n-\n-    @Override\n-    public int getPriority() {\n-        return MIN_PRIORITY;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import java.util.Optional;\r\n+\r\n+import static java.util.Optional.ofNullable;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Optional}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToOptionalConverter implements StringConverter<Optional> {\r\n+\r\n+    @Override\r\n+    public Optional convert(String source) {\r\n+        return ofNullable(source);\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return MIN_PRIORITY;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToShortConverter.java", "source2": "org/apache/dubbo/common/convert/StringToShortConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,39 +1,39 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-import static java.lang.Short.valueOf;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * The class to convert {@link String} to {@link Short}\n- *\n- * @since 2.7.6\n- */\n-public class StringToShortConverter implements StringConverter<Short> {\n-\n-    @Override\n-    public Short convert(String source) {\n-        return isNotEmpty(source) ? valueOf(source) : null;\n-    }\n-\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY + 2;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+import static java.lang.Short.valueOf;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Short}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToShortConverter implements StringConverter<Short> {\r\n+\r\n+    @Override\r\n+    public Short convert(String source) {\r\n+        return isNotEmpty(source) ? valueOf(source) : null;\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY + 2;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/StringToStringConverter.java", "source2": "org/apache/dubbo/common/convert/StringToStringConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,30 +1,30 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert;\n-\n-/**\n- * A class to covert {@link String} to {@link String} value, just no-op\n- *\n- * @since 2.7.6\n- */\n-public class StringToStringConverter implements StringConverter<String> {\n-\n-    @Override\n-    public String convert(String source) {\n-        return source;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert;\r\n+\r\n+/**\r\n+ * A class to covert {@link String} to {@link String} value, just no-op\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToStringConverter implements StringConverter<String> {\r\n+\r\n+    @Override\r\n+    public String convert(String source) {\r\n+        return source;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/MultiValueConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/MultiValueConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,92 +1,92 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-\n-import java.util.Collection;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;\n-\n-/**\n- * An interface to convert the source-typed value to multiple value, e.g , Java array, {@link Collection} or\n- * sub-interfaces\n- *\n- * @param <S> The source type\n- * @since 2.7.6\n- */\n-@SPI\n-public interface MultiValueConverter<S> extends Prioritized {\n-\n-    /**\n-     * Accept the source type and target type or not\n-     *\n-     * @param sourceType     the source type\n-     * @param multiValueType the multi-value type\n-     * @return if accepted, return <code>true</code>, or <code>false</code>\n-     */\n-    boolean accept(Class<S> sourceType, Class<?> multiValueType);\n-\n-    /**\n-     * Convert the source to be the multiple value\n-     *\n-     * @param source         the source-typed value\n-     * @param multiValueType the multi-value type\n-     * @param elementType    the element type\n-     * @return\n-     */\n-    Object convert(S source, Class<?> multiValueType, Class<?> elementType);\n-\n-    /**\n-     * Get the source type\n-     *\n-     * @return non-null\n-     */\n-    default Class<S> getSourceType() {\n-        return findActualTypeArgument(getClass(), MultiValueConverter.class, 0);\n-    }\n-\n-    /**\n-     * Find the {@link MultiValueConverter} instance from {@link ExtensionLoader} with the specified source and target type\n-     *\n-     * @param sourceType the source type\n-     * @param targetType the target type\n-     * @return <code>null</code> if not found\n-     * @see ExtensionLoader#getSupportedExtensionInstances()\n-     * @since 2.7.8\n-     */\n-    static MultiValueConverter<?> find(Class<?> sourceType, Class<?> targetType) {\n-        return getExtensionLoader(MultiValueConverter.class)\n-                .getSupportedExtensionInstances()\n-                .stream()\n-                .filter(converter -> converter.accept(sourceType, targetType))\n-                .findFirst()\n-                .orElse(null);\n-    }\n-\n-    static <T> T convertIfPossible(Object source, Class<?> multiValueType, Class<?> elementType) {\n-        Class<?> sourceType = source.getClass();\n-        MultiValueConverter converter = find(sourceType, multiValueType);\n-        if (converter != null) {\n-            return (T) converter.convert(source, multiValueType, elementType);\n-        }\n-        return null;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+\r\n+import java.util.Collection;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;\r\n+\r\n+/**\r\n+ * An interface to convert the source-typed value to multiple value, e.g , Java array, {@link Collection} or\r\n+ * sub-interfaces\r\n+ *\r\n+ * @param <S> The source type\r\n+ * @since 2.7.6\r\n+ */\r\n+@SPI\r\n+public interface MultiValueConverter<S> extends Prioritized {\r\n+\r\n+    /**\r\n+     * Accept the source type and target type or not\r\n+     *\r\n+     * @param sourceType     the source type\r\n+     * @param multiValueType the multi-value type\r\n+     * @return if accepted, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean accept(Class<S> sourceType, Class<?> multiValueType);\r\n+\r\n+    /**\r\n+     * Convert the source to be the multiple value\r\n+     *\r\n+     * @param source         the source-typed value\r\n+     * @param multiValueType the multi-value type\r\n+     * @param elementType    the element type\r\n+     * @return\r\n+     */\r\n+    Object convert(S source, Class<?> multiValueType, Class<?> elementType);\r\n+\r\n+    /**\r\n+     * Get the source type\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    default Class<S> getSourceType() {\r\n+        return findActualTypeArgument(getClass(), MultiValueConverter.class, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link MultiValueConverter} instance from {@link ExtensionLoader} with the specified source and target type\r\n+     *\r\n+     * @param sourceType the source type\r\n+     * @param targetType the target type\r\n+     * @return <code>null</code> if not found\r\n+     * @see ExtensionLoader#getSupportedExtensionInstances()\r\n+     * @since 2.7.8\r\n+     */\r\n+    static MultiValueConverter<?> find(Class<?> sourceType, Class<?> targetType) {\r\n+        return getExtensionLoader(MultiValueConverter.class)\r\n+                .getSupportedExtensionInstances()\r\n+                .stream()\r\n+                .filter(converter -> converter.accept(sourceType, targetType))\r\n+                .findFirst()\r\n+                .orElse(null);\r\n+    }\r\n+\r\n+    static <T> T convertIfPossible(Object source, Class<?> multiValueType, Class<?> elementType) {\r\n+        Class<?> sourceType = source.getClass();\r\n+        MultiValueConverter converter = find(sourceType, multiValueType);\r\n+        if (converter != null) {\r\n+            return (T) converter.convert(source, multiValueType, elementType);\r\n+        }\r\n+        return null;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToArrayConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,60 +1,60 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import org.apache.dubbo.common.convert.Converter;\n-\n-import java.lang.reflect.Array;\n-\n-import static java.lang.reflect.Array.newInstance;\n-\n-/**\n- * The class to convert {@link String} to array-type object\n- *\n- * @since 2.7.6\n- */\n-public class StringToArrayConverter implements StringToMultiValueConverter {\n-\n-    public boolean accept(Class<String> type, Class<?> multiValueType) {\n-        if (multiValueType != null && multiValueType.isArray()) {\n-            return true;\n-        }\n-        return false;\n-    }\n-\n-    @Override\n-    public Object convert(String[] segments, int size, Class<?> targetType, Class<?> elementType) {\n-\n-        Class<?> componentType = targetType.getComponentType();\n-\n-        Converter converter = Converter.getConverter(String.class, componentType);\n-\n-        Object array = newInstance(componentType, size);\n-\n-        for (int i = 0; i < size; i++) {\n-            Array.set(array, i, converter.convert(segments[i]));\n-        }\n-\n-        return array;\n-    }\n-\n-\n-    @Override\n-    public int getPriority() {\n-        return MIN_PRIORITY;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import org.apache.dubbo.common.convert.Converter;\r\n+\r\n+import java.lang.reflect.Array;\r\n+\r\n+import static java.lang.reflect.Array.newInstance;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to array-type object\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToArrayConverter implements StringToMultiValueConverter {\r\n+\r\n+    public boolean accept(Class<String> type, Class<?> multiValueType) {\r\n+        if (multiValueType != null && multiValueType.isArray()) {\r\n+            return true;\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object convert(String[] segments, int size, Class<?> targetType, Class<?> elementType) {\r\n+\r\n+        Class<?> componentType = targetType.getComponentType();\r\n+\r\n+        Converter converter = Converter.getConverter(String.class, componentType);\r\n+\r\n+        Object array = newInstance(componentType, size);\r\n+\r\n+        for (int i = 0; i < size; i++) {\r\n+            Array.set(array, i, converter.convert(segments[i]));\r\n+        }\r\n+\r\n+        return array;\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return MIN_PRIORITY;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToBlockingDequeConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.concurrent.BlockingDeque;\n-import java.util.concurrent.LinkedBlockingDeque;\n-\n-/**\n- * The class to convert {@link String} to {@link BlockingDeque}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToBlockingDequeConverter extends StringToIterableConverter<BlockingDeque> {\n-\n-    @Override\n-    protected BlockingDeque createMultiValue(int size, Class<?> multiValueType) {\n-        return new LinkedBlockingDeque(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.concurrent.BlockingDeque;\r\n+import java.util.concurrent.LinkedBlockingDeque;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link BlockingDeque}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToBlockingDequeConverter extends StringToIterableConverter<BlockingDeque> {\r\n+\r\n+    @Override\r\n+    protected BlockingDeque createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new LinkedBlockingDeque(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToBlockingQueueConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.concurrent.ArrayBlockingQueue;\n-import java.util.concurrent.BlockingDeque;\n-import java.util.concurrent.BlockingQueue;\n-\n-/**\n- * The class to convert {@link String} to {@link BlockingDeque}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToBlockingQueueConverter extends StringToIterableConverter<BlockingQueue> {\n-\n-    @Override\n-    protected BlockingQueue createMultiValue(int size, Class<?> multiValueType) {\n-        return new ArrayBlockingQueue(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.concurrent.ArrayBlockingQueue;\r\n+import java.util.concurrent.BlockingDeque;\r\n+import java.util.concurrent.BlockingQueue;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link BlockingDeque}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToBlockingQueueConverter extends StringToIterableConverter<BlockingQueue> {\r\n+\r\n+    @Override\r\n+    protected BlockingQueue createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new ArrayBlockingQueue(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToCollectionConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.ArrayList;\n-import java.util.Collection;\n-\n-/**\n- * The class to convert {@link String} to {@link Collection}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToCollectionConverter extends StringToIterableConverter<Collection> {\n-\n-    @Override\n-    protected Collection createMultiValue(int size, Class<?> multiValueType) {\n-        return new ArrayList(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Collection}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToCollectionConverter extends StringToIterableConverter<Collection> {\r\n+\r\n+    @Override\r\n+    protected Collection createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new ArrayList(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToDequeConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.ArrayDeque;\n-import java.util.Deque;\n-\n-/**\n- * The class to convert {@link String} to {@link Deque}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToDequeConverter extends StringToIterableConverter<Deque> {\n-\n-    @Override\n-    protected Deque createMultiValue(int size, Class<?> multiValueType) {\n-        return new ArrayDeque(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.ArrayDeque;\r\n+import java.util.Deque;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Deque}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToDequeConverter extends StringToIterableConverter<Deque> {\r\n+\r\n+    @Override\r\n+    protected Deque createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new ArrayDeque(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToIterableConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,80 +1,80 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import org.apache.dubbo.common.convert.StringConverter;\n-\n-import java.util.Collection;\n-import java.util.Optional;\n-\n-import static org.apache.dubbo.common.convert.Converter.getConverter;\n-import static org.apache.dubbo.common.utils.ClassUtils.getAllInterfaces;\n-import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;\n-import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;\n-\n-/**\n- * The class to convert {@link String} to {@link Iterable}-based value\n- *\n- * @since 2.7.6\n- */\n-public abstract class StringToIterableConverter<T extends Iterable> implements StringToMultiValueConverter {\n-\n-    public boolean accept(Class<String> type, Class<?> multiValueType) {\n-        return isAssignableFrom(getSupportedType(), multiValueType);\n-    }\n-\n-    @Override\n-    public final Object convert(String[] segments, int size, Class<?> multiValueType, Class<?> elementType) {\n-\n-        Optional<StringConverter> stringConverter = getStringConverter(elementType);\n-\n-        return stringConverter.map(converter -> {\n-\n-            T convertedObject = createMultiValue(size, multiValueType);\n-\n-            if (convertedObject instanceof Collection) {\n-                Collection collection = (Collection) convertedObject;\n-                for (int i = 0; i < size; i++) {\n-                    String segment = segments[i];\n-                    Object element = converter.convert(segment);\n-                    collection.add(element);\n-                }\n-                return collection;\n-            }\n-\n-            return convertedObject;\n-        }).orElse(null);\n-    }\n-\n-    protected abstract T createMultiValue(int size, Class<?> multiValueType);\n-\n-    protected Optional<StringConverter> getStringConverter(Class<?> elementType) {\n-        StringConverter converter = (StringConverter) getConverter(String.class, elementType);\n-        return Optional.ofNullable(converter);\n-    }\n-\n-    protected final Class<T> getSupportedType() {\n-        return findActualTypeArgument(getClass(), StringToIterableConverter.class, 0);\n-    }\n-\n-    @Override\n-    public final int getPriority() {\n-        int level = getAllInterfaces(getSupportedType(), type ->\n-                isAssignableFrom(Iterable.class, type)).size();\n-        return MIN_PRIORITY - level;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import org.apache.dubbo.common.convert.StringConverter;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.Optional;\r\n+\r\n+import static org.apache.dubbo.common.convert.Converter.getConverter;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.getAllInterfaces;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;\r\n+import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Iterable}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public abstract class StringToIterableConverter<T extends Iterable> implements StringToMultiValueConverter {\r\n+\r\n+    public boolean accept(Class<String> type, Class<?> multiValueType) {\r\n+        return isAssignableFrom(getSupportedType(), multiValueType);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final Object convert(String[] segments, int size, Class<?> multiValueType, Class<?> elementType) {\r\n+\r\n+        Optional<StringConverter> stringConverter = getStringConverter(elementType);\r\n+\r\n+        return stringConverter.map(converter -> {\r\n+\r\n+            T convertedObject = createMultiValue(size, multiValueType);\r\n+\r\n+            if (convertedObject instanceof Collection) {\r\n+                Collection collection = (Collection) convertedObject;\r\n+                for (int i = 0; i < size; i++) {\r\n+                    String segment = segments[i];\r\n+                    Object element = converter.convert(segment);\r\n+                    collection.add(element);\r\n+                }\r\n+                return collection;\r\n+            }\r\n+\r\n+            return convertedObject;\r\n+        }).orElse(null);\r\n+    }\r\n+\r\n+    protected abstract T createMultiValue(int size, Class<?> multiValueType);\r\n+\r\n+    protected Optional<StringConverter> getStringConverter(Class<?> elementType) {\r\n+        StringConverter converter = (StringConverter) getConverter(String.class, elementType);\r\n+        return Optional.ofNullable(converter);\r\n+    }\r\n+\r\n+    protected final Class<T> getSupportedType() {\r\n+        return findActualTypeArgument(getClass(), StringToIterableConverter.class, 0);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final int getPriority() {\r\n+        int level = getAllInterfaces(getSupportedType(), type ->\r\n+                isAssignableFrom(Iterable.class, type)).size();\r\n+        return MIN_PRIORITY - level;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToListConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToListConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * The class to convert {@link String} to {@link List}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToListConverter extends StringToIterableConverter<List> {\n-\n-    @Override\n-    protected List createMultiValue(int size, Class<?> multiValueType) {\n-        return new ArrayList(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link List}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToListConverter extends StringToIterableConverter<List> {\r\n+\r\n+    @Override\r\n+    protected List createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new ArrayList(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToMultiValueConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToMultiValueConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,61 +1,61 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import org.apache.dubbo.common.utils.ArrayUtils;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.StringUtils.split;\n-\n-/**\n- * The class to convert {@link String} to multiple value object\n- *\n- * @see MultiValueConverter\n- * @since 2.7.6\n- */\n-public interface StringToMultiValueConverter extends MultiValueConverter<String> {\n-\n-    @Override\n-    default Object convert(String source, Class<?> multiValueType, Class<?> elementType) {\n-\n-        if (isEmpty(source)) {\n-            return null;\n-        }\n-\n-        // split by the comma\n-        String[] segments = split(source, ',');\n-\n-        if (ArrayUtils.isEmpty(segments)) { // If empty array, create an array with only one element\n-            segments = new String[]{source};\n-        }\n-\n-        int size = segments.length;\n-\n-        return convert(segments, size, multiValueType, elementType);\n-    }\n-\n-    /**\n-     * Convert the segments to multiple value object\n-     *\n-     * @param segments    the String array of content\n-     * @param size        the size of multiple value object\n-     * @param targetType  the target type\n-     * @param elementType the element type\n-     * @return multiple value object\n-     */\n-    Object convert(String[] segments, int size, Class<?> targetType, Class<?> elementType);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import org.apache.dubbo.common.utils.ArrayUtils;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.split;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to multiple value object\r\n+ *\r\n+ * @see MultiValueConverter\r\n+ * @since 2.7.6\r\n+ */\r\n+public interface StringToMultiValueConverter extends MultiValueConverter<String> {\r\n+\r\n+    @Override\r\n+    default Object convert(String source, Class<?> multiValueType, Class<?> elementType) {\r\n+\r\n+        if (isEmpty(source)) {\r\n+            return null;\r\n+        }\r\n+\r\n+        // split by the comma\r\n+        String[] segments = split(source, ',');\r\n+\r\n+        if (ArrayUtils.isEmpty(segments)) { // If empty array, create an array with only one element\r\n+            segments = new String[]{source};\r\n+        }\r\n+\r\n+        int size = segments.length;\r\n+\r\n+        return convert(segments, size, multiValueType, elementType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Convert the segments to multiple value object\r\n+     *\r\n+     * @param segments    the String array of content\r\n+     * @param size        the size of multiple value object\r\n+     * @param targetType  the target type\r\n+     * @param elementType the element type\r\n+     * @return multiple value object\r\n+     */\r\n+    Object convert(String[] segments, int size, Class<?> targetType, Class<?> elementType);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToNavigableSetConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.NavigableSet;\n-import java.util.SortedSet;\n-import java.util.TreeSet;\n-\n-/**\n- * The class to convert {@link String} to {@link SortedSet}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToNavigableSetConverter extends StringToIterableConverter<NavigableSet> {\n-\n-    @Override\n-    protected NavigableSet createMultiValue(int size, Class<?> multiValueType) {\n-        return new TreeSet();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.NavigableSet;\r\n+import java.util.SortedSet;\r\n+import java.util.TreeSet;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link SortedSet}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToNavigableSetConverter extends StringToIterableConverter<NavigableSet> {\r\n+\r\n+    @Override\r\n+    protected NavigableSet createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new TreeSet();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToQueueConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.ArrayDeque;\n-import java.util.Deque;\n-import java.util.Queue;\n-\n-/**\n- * The class to convert {@link String} to {@link Deque}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToQueueConverter extends StringToIterableConverter<Queue> {\n-\n-    @Override\n-    protected Queue createMultiValue(int size, Class<?> multiValueType) {\n-        return new ArrayDeque(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.ArrayDeque;\r\n+import java.util.Deque;\r\n+import java.util.Queue;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Deque}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToQueueConverter extends StringToIterableConverter<Queue> {\r\n+\r\n+    @Override\r\n+    protected Queue createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new ArrayDeque(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToSetConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToSetConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.HashSet;\n-import java.util.Set;\n-\n-/**\n- * The class to convert {@link String} to {@link Set}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToSetConverter extends StringToIterableConverter<Set> {\n-\n-    @Override\n-    protected Set createMultiValue(int size, Class<?> multiValueType) {\n-        return new HashSet(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.HashSet;\r\n+import java.util.Set;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link Set}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToSetConverter extends StringToIterableConverter<Set> {\r\n+\r\n+    @Override\r\n+    protected Set createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new HashSet(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToSortedSetConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.SortedSet;\n-import java.util.TreeSet;\n-\n-/**\n- * The class to convert {@link String} to {@link SortedSet}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToSortedSetConverter extends StringToIterableConverter<SortedSet> {\n-\n-    @Override\n-    protected SortedSet createMultiValue(int size, Class<?> multiValueType) {\n-        return new TreeSet();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.SortedSet;\r\n+import java.util.TreeSet;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link SortedSet}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToSortedSetConverter extends StringToIterableConverter<SortedSet> {\r\n+\r\n+    @Override\r\n+    protected SortedSet createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new TreeSet();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java", "source2": "org/apache/dubbo/common/convert/multiple/StringToTransferQueueConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.convert.multiple;\n-\n-import java.util.concurrent.LinkedTransferQueue;\n-import java.util.concurrent.TransferQueue;\n-\n-/**\n- * The class to convert {@link String} to {@link TransferQueue}-based value\n- *\n- * @since 2.7.6\n- */\n-public class StringToTransferQueueConverter extends StringToIterableConverter<TransferQueue> {\n-\n-    @Override\n-    protected TransferQueue createMultiValue(int size, Class<?> multiValueType) {\n-        return new LinkedTransferQueue();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.convert.multiple;\r\n+\r\n+import java.util.concurrent.LinkedTransferQueue;\r\n+import java.util.concurrent.TransferQueue;\r\n+\r\n+/**\r\n+ * The class to convert {@link String} to {@link TransferQueue}-based value\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class StringToTransferQueueConverter extends StringToIterableConverter<TransferQueue> {\r\n+\r\n+    @Override\r\n+    protected TransferQueue createMultiValue(int size, Class<?> multiValueType) {\r\n+        return new LinkedTransferQueue();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/Adaptive.java", "source2": "org/apache/dubbo/common/extension/Adaptive.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,60 +1,60 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * Provide helpful information for {@link ExtensionLoader} to inject dependency extension instance.\n- *\n- * @see ExtensionLoader\n- * @see URL\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.TYPE, ElementType.METHOD})\n-public @interface Adaptive {\n-    /**\n-     * Decide which target extension to be injected. The name of the target extension is decided by the parameter passed\n-     * in the URL, and the parameter names are given by this method.\n-     * <p>\n-     * If the specified parameters are not found from {@link URL}, then the default extension will be used for\n-     * dependency injection (specified in its interface's {@link SPI}).\n-     * <p>\n-     * For example, given <code>String[] {\"key1\", \"key2\"}</code>:\n-     * <ol>\n-     * <li>find parameter 'key1' in URL, use its value as the extension's name</li>\n-     * <li>try 'key2' for extension's name if 'key1' is not found (or its value is empty) in URL</li>\n-     * <li>use default extension if 'key2' doesn't exist either</li>\n-     * <li>otherwise, throw {@link IllegalStateException}</li>\n-     * </ol>\n-     * If the parameter names are empty, then a default parameter name is generated from interface's\n-     * class name with the rule: divide classname from capital char into several parts, and separate the parts with\n-     * dot '.', for example, for {@code org.apache.dubbo.xxx.YyyInvokerWrapper}, the generated name is\n-     * <code>String[] {\"yyy.invoker.wrapper\"}</code>.\n-     *\n-     * @return parameter names in URL\n-     */\n-    String[] value() default {};\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * Provide helpful information for {@link ExtensionLoader} to inject dependency extension instance.\r\n+ *\r\n+ * @see ExtensionLoader\r\n+ * @see URL\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.TYPE, ElementType.METHOD})\r\n+public @interface Adaptive {\r\n+    /**\r\n+     * Decide which target extension to be injected. The name of the target extension is decided by the parameter passed\r\n+     * in the URL, and the parameter names are given by this method.\r\n+     * <p>\r\n+     * If the specified parameters are not found from {@link URL}, then the default extension will be used for\r\n+     * dependency injection (specified in its interface's {@link SPI}).\r\n+     * <p>\r\n+     * For example, given <code>String[] {\"key1\", \"key2\"}</code>:\r\n+     * <ol>\r\n+     * <li>find parameter 'key1' in URL, use its value as the extension's name</li>\r\n+     * <li>try 'key2' for extension's name if 'key1' is not found (or its value is empty) in URL</li>\r\n+     * <li>use default extension if 'key2' doesn't exist either</li>\r\n+     * <li>otherwise, throw {@link IllegalStateException}</li>\r\n+     * </ol>\r\n+     * If the parameter names are empty, then a default parameter name is generated from interface's\r\n+     * class name with the rule: divide classname from capital char into several parts, and separate the parts with\r\n+     * dot '.', for example, for {@code org.apache.dubbo.xxx.YyyInvokerWrapper}, the generated name is\r\n+     * <code>String[] {\"yyy.invoker.wrapper\"}</code>.\r\n+     *\r\n+     * @return parameter names in URL\r\n+     */\r\n+    String[] value() default {};\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/common/extension/AdaptiveClassCodeGenerator.java", "source2": "org/apache/dubbo/common/extension/AdaptiveClassCodeGenerator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,396 +1,396 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.util.Arrays;\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.stream.Collectors;\n-import java.util.stream.IntStream;\n-\n-/**\n- * Code generator for Adaptive class\n- */\n-public class AdaptiveClassCodeGenerator {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(AdaptiveClassCodeGenerator.class);\n-\n-    private static final String CLASSNAME_INVOCATION = \"org.apache.dubbo.rpc.Invocation\";\n-\n-    private static final String CODE_PACKAGE = \"package %s;\\n\";\n-\n-    private static final String CODE_IMPORTS = \"import %s;\\n\";\n-\n-    private static final String CODE_CLASS_DECLARATION = \"public class %s$Adaptive implements %s {\\n\";\n-\n-    private static final String CODE_METHOD_DECLARATION = \"public %s %s(%s) %s {\\n%s}\\n\";\n-\n-    private static final String CODE_METHOD_ARGUMENT = \"%s arg%d\";\n-\n-    private static final String CODE_METHOD_THROWS = \"throws %s\";\n-\n-    private static final String CODE_UNSUPPORTED = \"throw new UnsupportedOperationException(\\\"The method %s of interface %s is not adaptive method!\\\");\\n\";\n-\n-    private static final String CODE_URL_NULL_CHECK = \"if (arg%d == null) throw new IllegalArgumentException(\\\"url == null\\\");\\n%s url = arg%d;\\n\";\n-\n-    private static final String CODE_EXT_NAME_ASSIGNMENT = \"String extName = %s;\\n\";\n-\n-    private static final String CODE_EXT_NAME_NULL_CHECK = \"if(extName == null) \"\n-                    + \"throw new IllegalStateException(\\\"Failed to get extension (%s) name from url (\\\" + url.toString() + \\\") use keys(%s)\\\");\\n\";\n-\n-    private static final String CODE_INVOCATION_ARGUMENT_NULL_CHECK = \"if (arg%d == null) throw new IllegalArgumentException(\\\"invocation == null\\\"); \"\n-                    + \"String methodName = arg%d.getMethodName();\\n\";\n-\n-\n-    private static final String CODE_EXTENSION_ASSIGNMENT = \"%s extension = (%<s)%s.getExtensionLoader(%s.class).getExtension(extName);\\n\";\n-\n-    private static final String CODE_EXTENSION_METHOD_INVOKE_ARGUMENT = \"arg%d\";\n-\n-    private final Class<?> type;\n-\n-    private String defaultExtName;\n-\n-    public AdaptiveClassCodeGenerator(Class<?> type, String defaultExtName) {\n-        this.type = type;\n-        this.defaultExtName = defaultExtName;\n-    }\n-\n-    /**\n-     * test if given type has at least one method annotated with <code>Adaptive</code>\n-     */\n-    private boolean hasAdaptiveMethod() {\n-        return Arrays.stream(type.getMethods()).anyMatch(m -> m.isAnnotationPresent(Adaptive.class));\n-    }\n-\n-    /**\n-     * generate and return class code\n-     */\n-    public String generate() {\n-        // no need to generate adaptive class since there's no adaptive method found.\n-        if (!hasAdaptiveMethod()) {\n-            throw new IllegalStateException(\"No adaptive method exist on extension \" + type.getName() + \", refuse to create the adaptive class!\");\n-        }\n-\n-        StringBuilder code = new StringBuilder();\n-        code.append(generatePackageInfo());\n-        code.append(generateImports());\n-        code.append(generateClassDeclaration());\n-\n-        Method[] methods = type.getMethods();\n-        for (Method method : methods) {\n-            code.append(generateMethod(method));\n-        }\n-        code.append(\"}\");\n-\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(code.toString());\n-        }\n-        return code.toString();\n-    }\n-\n-    /**\n-     * generate package info\n-     */\n-    private String generatePackageInfo() {\n-        return String.format(CODE_PACKAGE, type.getPackage().getName());\n-    }\n-\n-    /**\n-     * generate imports\n-     */\n-    private String generateImports() {\n-        return String.format(CODE_IMPORTS, ExtensionLoader.class.getName());\n-    }\n-\n-    /**\n-     * generate class declaration\n-     */\n-    private String generateClassDeclaration() {\n-        return String.format(CODE_CLASS_DECLARATION, type.getSimpleName(), type.getCanonicalName());\n-    }\n-\n-    /**\n-     * generate method not annotated with Adaptive with throwing unsupported exception\n-     */\n-    private String generateUnsupported(Method method) {\n-        return String.format(CODE_UNSUPPORTED, method, type.getName());\n-    }\n-\n-    /**\n-     * get index of parameter with type URL\n-     */\n-    private int getUrlTypeIndex(Method method) {\n-        int urlTypeIndex = -1;\n-        Class<?>[] pts = method.getParameterTypes();\n-        for (int i = 0; i < pts.length; ++i) {\n-            if (pts[i].equals(URL.class)) {\n-                urlTypeIndex = i;\n-                break;\n-            }\n-        }\n-        return urlTypeIndex;\n-    }\n-\n-    /**\n-     * generate method declaration\n-     */\n-    private String generateMethod(Method method) {\n-        String methodReturnType = method.getReturnType().getCanonicalName();\n-        String methodName = method.getName();\n-        String methodContent = generateMethodContent(method);\n-        String methodArgs = generateMethodArguments(method);\n-        String methodThrows = generateMethodThrows(method);\n-        return String.format(CODE_METHOD_DECLARATION, methodReturnType, methodName, methodArgs, methodThrows, methodContent);\n-    }\n-\n-    /**\n-     * generate method arguments\n-     */\n-    private String generateMethodArguments(Method method) {\n-        Class<?>[] pts = method.getParameterTypes();\n-        return IntStream.range(0, pts.length)\n-                        .mapToObj(i -> String.format(CODE_METHOD_ARGUMENT, pts[i].getCanonicalName(), i))\n-                        .collect(Collectors.joining(\", \"));\n-    }\n-\n-    /**\n-     * generate method throws\n-     */\n-    private String generateMethodThrows(Method method) {\n-        Class<?>[] ets = method.getExceptionTypes();\n-        if (ets.length > 0) {\n-            String list = Arrays.stream(ets).map(Class::getCanonicalName).collect(Collectors.joining(\", \"));\n-            return String.format(CODE_METHOD_THROWS, list);\n-        } else {\n-            return \"\";\n-        }\n-    }\n-\n-    /**\n-     * generate method URL argument null check\n-     */\n-    private String generateUrlNullCheck(int index) {\n-        return String.format(CODE_URL_NULL_CHECK, index, URL.class.getName(), index);\n-    }\n-\n-    /**\n-     * generate method content\n-     */\n-    private String generateMethodContent(Method method) {\n-        Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);\n-        StringBuilder code = new StringBuilder(512);\n-        if (adaptiveAnnotation == null) {\n-            return generateUnsupported(method);\n-        } else {\n-            int urlTypeIndex = getUrlTypeIndex(method);\n-\n-            // found parameter in URL type\n-            if (urlTypeIndex != -1) {\n-                // Null Point check\n-                code.append(generateUrlNullCheck(urlTypeIndex));\n-            } else {\n-                // did not find parameter in URL type\n-                code.append(generateUrlAssignmentIndirectly(method));\n-            }\n-\n-            String[] value = getMethodAdaptiveValue(adaptiveAnnotation);\n-\n-            boolean hasInvocation = hasInvocationArgument(method);\n-\n-            code.append(generateInvocationArgumentNullCheck(method));\n-\n-            code.append(generateExtNameAssignment(value, hasInvocation));\n-            // check extName == null?\n-            code.append(generateExtNameNullCheck(value));\n-\n-            code.append(generateExtensionAssignment());\n-\n-            // return statement\n-            code.append(generateReturnAndInvocation(method));\n-        }\n-\n-        return code.toString();\n-    }\n-\n-    /**\n-     * generate code for variable extName null check\n-     */\n-    private String generateExtNameNullCheck(String[] value) {\n-        return String.format(CODE_EXT_NAME_NULL_CHECK, type.getName(), Arrays.toString(value));\n-    }\n-\n-    /**\n-     * generate extName assignment code\n-     */\n-    private String generateExtNameAssignment(String[] value, boolean hasInvocation) {\n-        // TODO: refactor it\n-        String getNameCode = null;\n-        for (int i = value.length - 1; i >= 0; --i) {\n-            if (i == value.length - 1) {\n-                if (null != defaultExtName) {\n-                    if (!\"protocol\".equals(value[i])) {\n-                        if (hasInvocation) {\n-                            getNameCode = String.format(\"url.getMethodParameter(methodName, \\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\n-                        } else {\n-                            getNameCode = String.format(\"url.getParameter(\\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\n-                        }\n-                    } else {\n-                        getNameCode = String.format(\"( url.getProtocol() == null ? \\\"%s\\\" : url.getProtocol() )\", defaultExtName);\n-                    }\n-                } else {\n-                    if (!\"protocol\".equals(value[i])) {\n-                        if (hasInvocation) {\n-                            getNameCode = String.format(\"url.getMethodParameter(methodName, \\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\n-                        } else {\n-                            getNameCode = String.format(\"url.getParameter(\\\"%s\\\")\", value[i]);\n-                        }\n-                    } else {\n-                        getNameCode = \"url.getProtocol()\";\n-                    }\n-                }\n-            } else {\n-                if (!\"protocol\".equals(value[i])) {\n-                    if (hasInvocation) {\n-                        getNameCode = String.format(\"url.getMethodParameter(methodName, \\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\n-                    } else {\n-                        getNameCode = String.format(\"url.getParameter(\\\"%s\\\", %s)\", value[i], getNameCode);\n-                    }\n-                } else {\n-                    getNameCode = String.format(\"url.getProtocol() == null ? (%s) : url.getProtocol()\", getNameCode);\n-                }\n-            }\n-        }\n-\n-        return String.format(CODE_EXT_NAME_ASSIGNMENT, getNameCode);\n-    }\n-\n-    /**\n-     * @return\n-     */\n-    private String generateExtensionAssignment() {\n-        return String.format(CODE_EXTENSION_ASSIGNMENT, type.getName(), ExtensionLoader.class.getSimpleName(), type.getName());\n-    }\n-\n-    /**\n-     * generate method invocation statement and return it if necessary\n-     */\n-    private String generateReturnAndInvocation(Method method) {\n-        String returnStatement = method.getReturnType().equals(void.class) ? \"\" : \"return \";\n-\n-        String args = IntStream.range(0, method.getParameters().length)\n-                .mapToObj(i -> String.format(CODE_EXTENSION_METHOD_INVOKE_ARGUMENT, i))\n-                .collect(Collectors.joining(\", \"));\n-\n-        return returnStatement + String.format(\"extension.%s(%s);\\n\", method.getName(), args);\n-    }\n-\n-    /**\n-     * test if method has argument of type <code>Invocation</code>\n-     */\n-    private boolean hasInvocationArgument(Method method) {\n-        Class<?>[] pts = method.getParameterTypes();\n-        return Arrays.stream(pts).anyMatch(p -> CLASSNAME_INVOCATION.equals(p.getName()));\n-    }\n-\n-    /**\n-     * generate code to test argument of type <code>Invocation</code> is null\n-     */\n-    private String generateInvocationArgumentNullCheck(Method method) {\n-        Class<?>[] pts = method.getParameterTypes();\n-        return IntStream.range(0, pts.length).filter(i -> CLASSNAME_INVOCATION.equals(pts[i].getName()))\n-                        .mapToObj(i -> String.format(CODE_INVOCATION_ARGUMENT_NULL_CHECK, i, i))\n-                        .findFirst().orElse(\"\");\n-    }\n-\n-    /**\n-     * get value of adaptive annotation or if empty return splitted simple name\n-     */\n-    private String[] getMethodAdaptiveValue(Adaptive adaptiveAnnotation) {\n-        String[] value = adaptiveAnnotation.value();\n-        // value is not set, use the value generated from class name as the key\n-        if (value.length == 0) {\n-            String splitName = StringUtils.camelToSplitName(type.getSimpleName(), \".\");\n-            value = new String[]{splitName};\n-        }\n-        return value;\n-    }\n-\n-    /**\n-     * get parameter with type <code>URL</code> from method parameter:\n-     * <p>\n-     * test if parameter has method which returns type <code>URL</code>\n-     * <p>\n-     * if not found, throws IllegalStateException\n-     */\n-    private String generateUrlAssignmentIndirectly(Method method) {\n-        Class<?>[] pts = method.getParameterTypes();\n-\n-        Map<String, Integer> getterReturnUrl = new HashMap<>();\n-        // find URL getter method\n-        for (int i = 0; i < pts.length; ++i) {\n-            for (Method m : pts[i].getMethods()) {\n-                String name = m.getName();\n-                if ((name.startsWith(\"get\") || name.length() > 3)\n-                        && Modifier.isPublic(m.getModifiers())\n-                        && !Modifier.isStatic(m.getModifiers())\n-                        && m.getParameterTypes().length == 0\n-                        && m.getReturnType() == URL.class) {\n-                    getterReturnUrl.put(name, i);\n-                }\n-            }\n-        }\n-\n-        if (getterReturnUrl.size() <= 0) {\n-            // getter method not found, throw\n-            throw new IllegalStateException(\"Failed to create adaptive class for interface \" + type.getName()\n-                    + \": not found url parameter or url attribute in parameters of method \" + method.getName());\n-        }\n-\n-        Integer index = getterReturnUrl.get(\"getUrl\");\n-        if (index != null) {\n-            return generateGetUrlNullCheck(index, pts[index], \"getUrl\");\n-        } else {\n-            Map.Entry<String, Integer> entry = getterReturnUrl.entrySet().iterator().next();\n-            return generateGetUrlNullCheck(entry.getValue(), pts[entry.getValue()], entry.getKey());\n-        }\n-    }\n-\n-    /**\n-     * 1, test if argi is null\n-     * 2, test if argi.getXX() returns null\n-     * 3, assign url with argi.getXX()\n-     */\n-    private String generateGetUrlNullCheck(int index, Class<?> type, String method) {\n-        // Null point check\n-        StringBuilder code = new StringBuilder();\n-        code.append(String.format(\"if (arg%d == null) throw new IllegalArgumentException(\\\"%s argument == null\\\");\\n\",\n-                index, type.getName()));\n-        code.append(String.format(\"if (arg%d.%s() == null) throw new IllegalArgumentException(\\\"%s argument %s() == null\\\");\\n\",\n-                index, method, type.getName(), method));\n-\n-        code.append(String.format(\"%s url = arg%d.%s();\\n\", URL.class.getName(), index, method));\n-        return code.toString();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.util.Arrays;\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.stream.Collectors;\r\n+import java.util.stream.IntStream;\r\n+\r\n+/**\r\n+ * Code generator for Adaptive class\r\n+ */\r\n+public class AdaptiveClassCodeGenerator {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(AdaptiveClassCodeGenerator.class);\r\n+\r\n+    private static final String CLASSNAME_INVOCATION = \"org.apache.dubbo.rpc.Invocation\";\r\n+\r\n+    private static final String CODE_PACKAGE = \"package %s;\\n\";\r\n+\r\n+    private static final String CODE_IMPORTS = \"import %s;\\n\";\r\n+\r\n+    private static final String CODE_CLASS_DECLARATION = \"public class %s$Adaptive implements %s {\\n\";\r\n+\r\n+    private static final String CODE_METHOD_DECLARATION = \"public %s %s(%s) %s {\\n%s}\\n\";\r\n+\r\n+    private static final String CODE_METHOD_ARGUMENT = \"%s arg%d\";\r\n+\r\n+    private static final String CODE_METHOD_THROWS = \"throws %s\";\r\n+\r\n+    private static final String CODE_UNSUPPORTED = \"throw new UnsupportedOperationException(\\\"The method %s of interface %s is not adaptive method!\\\");\\n\";\r\n+\r\n+    private static final String CODE_URL_NULL_CHECK = \"if (arg%d == null) throw new IllegalArgumentException(\\\"url == null\\\");\\n%s url = arg%d;\\n\";\r\n+\r\n+    private static final String CODE_EXT_NAME_ASSIGNMENT = \"String extName = %s;\\n\";\r\n+\r\n+    private static final String CODE_EXT_NAME_NULL_CHECK = \"if(extName == null) \"\r\n+                    + \"throw new IllegalStateException(\\\"Failed to get extension (%s) name from url (\\\" + url.toString() + \\\") use keys(%s)\\\");\\n\";\r\n+\r\n+    private static final String CODE_INVOCATION_ARGUMENT_NULL_CHECK = \"if (arg%d == null) throw new IllegalArgumentException(\\\"invocation == null\\\"); \"\r\n+                    + \"String methodName = arg%d.getMethodName();\\n\";\r\n+\r\n+\r\n+    private static final String CODE_EXTENSION_ASSIGNMENT = \"%s extension = (%<s)%s.getExtensionLoader(%s.class).getExtension(extName);\\n\";\r\n+\r\n+    private static final String CODE_EXTENSION_METHOD_INVOKE_ARGUMENT = \"arg%d\";\r\n+\r\n+    private final Class<?> type;\r\n+\r\n+    private String defaultExtName;\r\n+\r\n+    public AdaptiveClassCodeGenerator(Class<?> type, String defaultExtName) {\r\n+        this.type = type;\r\n+        this.defaultExtName = defaultExtName;\r\n+    }\r\n+\r\n+    /**\r\n+     * test if given type has at least one method annotated with <code>Adaptive</code>\r\n+     */\r\n+    private boolean hasAdaptiveMethod() {\r\n+        return Arrays.stream(type.getMethods()).anyMatch(m -> m.isAnnotationPresent(Adaptive.class));\r\n+    }\r\n+\r\n+    /**\r\n+     * generate and return class code\r\n+     */\r\n+    public String generate() {\r\n+        // no need to generate adaptive class since there's no adaptive method found.\r\n+        if (!hasAdaptiveMethod()) {\r\n+            throw new IllegalStateException(\"No adaptive method exist on extension \" + type.getName() + \", refuse to create the adaptive class!\");\r\n+        }\r\n+\r\n+        StringBuilder code = new StringBuilder();\r\n+        code.append(generatePackageInfo());\r\n+        code.append(generateImports());\r\n+        code.append(generateClassDeclaration());\r\n+\r\n+        Method[] methods = type.getMethods();\r\n+        for (Method method : methods) {\r\n+            code.append(generateMethod(method));\r\n+        }\r\n+        code.append(\"}\");\r\n+\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(code.toString());\r\n+        }\r\n+        return code.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * generate package info\r\n+     */\r\n+    private String generatePackageInfo() {\r\n+        return String.format(CODE_PACKAGE, type.getPackage().getName());\r\n+    }\r\n+\r\n+    /**\r\n+     * generate imports\r\n+     */\r\n+    private String generateImports() {\r\n+        return String.format(CODE_IMPORTS, ExtensionLoader.class.getName());\r\n+    }\r\n+\r\n+    /**\r\n+     * generate class declaration\r\n+     */\r\n+    private String generateClassDeclaration() {\r\n+        return String.format(CODE_CLASS_DECLARATION, type.getSimpleName(), type.getCanonicalName());\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method not annotated with Adaptive with throwing unsupported exception\r\n+     */\r\n+    private String generateUnsupported(Method method) {\r\n+        return String.format(CODE_UNSUPPORTED, method, type.getName());\r\n+    }\r\n+\r\n+    /**\r\n+     * get index of parameter with type URL\r\n+     */\r\n+    private int getUrlTypeIndex(Method method) {\r\n+        int urlTypeIndex = -1;\r\n+        Class<?>[] pts = method.getParameterTypes();\r\n+        for (int i = 0; i < pts.length; ++i) {\r\n+            if (pts[i].equals(URL.class)) {\r\n+                urlTypeIndex = i;\r\n+                break;\r\n+            }\r\n+        }\r\n+        return urlTypeIndex;\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method declaration\r\n+     */\r\n+    private String generateMethod(Method method) {\r\n+        String methodReturnType = method.getReturnType().getCanonicalName();\r\n+        String methodName = method.getName();\r\n+        String methodContent = generateMethodContent(method);\r\n+        String methodArgs = generateMethodArguments(method);\r\n+        String methodThrows = generateMethodThrows(method);\r\n+        return String.format(CODE_METHOD_DECLARATION, methodReturnType, methodName, methodArgs, methodThrows, methodContent);\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method arguments\r\n+     */\r\n+    private String generateMethodArguments(Method method) {\r\n+        Class<?>[] pts = method.getParameterTypes();\r\n+        return IntStream.range(0, pts.length)\r\n+                        .mapToObj(i -> String.format(CODE_METHOD_ARGUMENT, pts[i].getCanonicalName(), i))\r\n+                        .collect(Collectors.joining(\", \"));\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method throws\r\n+     */\r\n+    private String generateMethodThrows(Method method) {\r\n+        Class<?>[] ets = method.getExceptionTypes();\r\n+        if (ets.length > 0) {\r\n+            String list = Arrays.stream(ets).map(Class::getCanonicalName).collect(Collectors.joining(\", \"));\r\n+            return String.format(CODE_METHOD_THROWS, list);\r\n+        } else {\r\n+            return \"\";\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method URL argument null check\r\n+     */\r\n+    private String generateUrlNullCheck(int index) {\r\n+        return String.format(CODE_URL_NULL_CHECK, index, URL.class.getName(), index);\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method content\r\n+     */\r\n+    private String generateMethodContent(Method method) {\r\n+        Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);\r\n+        StringBuilder code = new StringBuilder(512);\r\n+        if (adaptiveAnnotation == null) {\r\n+            return generateUnsupported(method);\r\n+        } else {\r\n+            int urlTypeIndex = getUrlTypeIndex(method);\r\n+\r\n+            // found parameter in URL type\r\n+            if (urlTypeIndex != -1) {\r\n+                // Null Point check\r\n+                code.append(generateUrlNullCheck(urlTypeIndex));\r\n+            } else {\r\n+                // did not find parameter in URL type\r\n+                code.append(generateUrlAssignmentIndirectly(method));\r\n+            }\r\n+\r\n+            String[] value = getMethodAdaptiveValue(adaptiveAnnotation);\r\n+\r\n+            boolean hasInvocation = hasInvocationArgument(method);\r\n+\r\n+            code.append(generateInvocationArgumentNullCheck(method));\r\n+\r\n+            code.append(generateExtNameAssignment(value, hasInvocation));\r\n+            // check extName == null?\r\n+            code.append(generateExtNameNullCheck(value));\r\n+\r\n+            code.append(generateExtensionAssignment());\r\n+\r\n+            // return statement\r\n+            code.append(generateReturnAndInvocation(method));\r\n+        }\r\n+\r\n+        return code.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * generate code for variable extName null check\r\n+     */\r\n+    private String generateExtNameNullCheck(String[] value) {\r\n+        return String.format(CODE_EXT_NAME_NULL_CHECK, type.getName(), Arrays.toString(value));\r\n+    }\r\n+\r\n+    /**\r\n+     * generate extName assignment code\r\n+     */\r\n+    private String generateExtNameAssignment(String[] value, boolean hasInvocation) {\r\n+        // TODO: refactor it\r\n+        String getNameCode = null;\r\n+        for (int i = value.length - 1; i >= 0; --i) {\r\n+            if (i == value.length - 1) {\r\n+                if (null != defaultExtName) {\r\n+                    if (!\"protocol\".equals(value[i])) {\r\n+                        if (hasInvocation) {\r\n+                            getNameCode = String.format(\"url.getMethodParameter(methodName, \\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\r\n+                        } else {\r\n+                            getNameCode = String.format(\"url.getParameter(\\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\r\n+                        }\r\n+                    } else {\r\n+                        getNameCode = String.format(\"( url.getProtocol() == null ? \\\"%s\\\" : url.getProtocol() )\", defaultExtName);\r\n+                    }\r\n+                } else {\r\n+                    if (!\"protocol\".equals(value[i])) {\r\n+                        if (hasInvocation) {\r\n+                            getNameCode = String.format(\"url.getMethodParameter(methodName, \\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\r\n+                        } else {\r\n+                            getNameCode = String.format(\"url.getParameter(\\\"%s\\\")\", value[i]);\r\n+                        }\r\n+                    } else {\r\n+                        getNameCode = \"url.getProtocol()\";\r\n+                    }\r\n+                }\r\n+            } else {\r\n+                if (!\"protocol\".equals(value[i])) {\r\n+                    if (hasInvocation) {\r\n+                        getNameCode = String.format(\"url.getMethodParameter(methodName, \\\"%s\\\", \\\"%s\\\")\", value[i], defaultExtName);\r\n+                    } else {\r\n+                        getNameCode = String.format(\"url.getParameter(\\\"%s\\\", %s)\", value[i], getNameCode);\r\n+                    }\r\n+                } else {\r\n+                    getNameCode = String.format(\"url.getProtocol() == null ? (%s) : url.getProtocol()\", getNameCode);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return String.format(CODE_EXT_NAME_ASSIGNMENT, getNameCode);\r\n+    }\r\n+\r\n+    /**\r\n+     * @return\r\n+     */\r\n+    private String generateExtensionAssignment() {\r\n+        return String.format(CODE_EXTENSION_ASSIGNMENT, type.getName(), ExtensionLoader.class.getSimpleName(), type.getName());\r\n+    }\r\n+\r\n+    /**\r\n+     * generate method invocation statement and return it if necessary\r\n+     */\r\n+    private String generateReturnAndInvocation(Method method) {\r\n+        String returnStatement = method.getReturnType().equals(void.class) ? \"\" : \"return \";\r\n+\r\n+        String args = IntStream.range(0, method.getParameters().length)\r\n+                .mapToObj(i -> String.format(CODE_EXTENSION_METHOD_INVOKE_ARGUMENT, i))\r\n+                .collect(Collectors.joining(\", \"));\r\n+\r\n+        return returnStatement + String.format(\"extension.%s(%s);\\n\", method.getName(), args);\r\n+    }\r\n+\r\n+    /**\r\n+     * test if method has argument of type <code>Invocation</code>\r\n+     */\r\n+    private boolean hasInvocationArgument(Method method) {\r\n+        Class<?>[] pts = method.getParameterTypes();\r\n+        return Arrays.stream(pts).anyMatch(p -> CLASSNAME_INVOCATION.equals(p.getName()));\r\n+    }\r\n+\r\n+    /**\r\n+     * generate code to test argument of type <code>Invocation</code> is null\r\n+     */\r\n+    private String generateInvocationArgumentNullCheck(Method method) {\r\n+        Class<?>[] pts = method.getParameterTypes();\r\n+        return IntStream.range(0, pts.length).filter(i -> CLASSNAME_INVOCATION.equals(pts[i].getName()))\r\n+                        .mapToObj(i -> String.format(CODE_INVOCATION_ARGUMENT_NULL_CHECK, i, i))\r\n+                        .findFirst().orElse(\"\");\r\n+    }\r\n+\r\n+    /**\r\n+     * get value of adaptive annotation or if empty return splitted simple name\r\n+     */\r\n+    private String[] getMethodAdaptiveValue(Adaptive adaptiveAnnotation) {\r\n+        String[] value = adaptiveAnnotation.value();\r\n+        // value is not set, use the value generated from class name as the key\r\n+        if (value.length == 0) {\r\n+            String splitName = StringUtils.camelToSplitName(type.getSimpleName(), \".\");\r\n+            value = new String[]{splitName};\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    /**\r\n+     * get parameter with type <code>URL</code> from method parameter:\r\n+     * <p>\r\n+     * test if parameter has method which returns type <code>URL</code>\r\n+     * <p>\r\n+     * if not found, throws IllegalStateException\r\n+     */\r\n+    private String generateUrlAssignmentIndirectly(Method method) {\r\n+        Class<?>[] pts = method.getParameterTypes();\r\n+\r\n+        Map<String, Integer> getterReturnUrl = new HashMap<>();\r\n+        // find URL getter method\r\n+        for (int i = 0; i < pts.length; ++i) {\r\n+            for (Method m : pts[i].getMethods()) {\r\n+                String name = m.getName();\r\n+                if ((name.startsWith(\"get\") || name.length() > 3)\r\n+                        && Modifier.isPublic(m.getModifiers())\r\n+                        && !Modifier.isStatic(m.getModifiers())\r\n+                        && m.getParameterTypes().length == 0\r\n+                        && m.getReturnType() == URL.class) {\r\n+                    getterReturnUrl.put(name, i);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (getterReturnUrl.size() <= 0) {\r\n+            // getter method not found, throw\r\n+            throw new IllegalStateException(\"Failed to create adaptive class for interface \" + type.getName()\r\n+                    + \": not found url parameter or url attribute in parameters of method \" + method.getName());\r\n+        }\r\n+\r\n+        Integer index = getterReturnUrl.get(\"getUrl\");\r\n+        if (index != null) {\r\n+            return generateGetUrlNullCheck(index, pts[index], \"getUrl\");\r\n+        } else {\r\n+            Map.Entry<String, Integer> entry = getterReturnUrl.entrySet().iterator().next();\r\n+            return generateGetUrlNullCheck(entry.getValue(), pts[entry.getValue()], entry.getKey());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * 1, test if argi is null\r\n+     * 2, test if argi.getXX() returns null\r\n+     * 3, assign url with argi.getXX()\r\n+     */\r\n+    private String generateGetUrlNullCheck(int index, Class<?> type, String method) {\r\n+        // Null point check\r\n+        StringBuilder code = new StringBuilder();\r\n+        code.append(String.format(\"if (arg%d == null) throw new IllegalArgumentException(\\\"%s argument == null\\\");\\n\",\r\n+                index, type.getName()));\r\n+        code.append(String.format(\"if (arg%d.%s() == null) throw new IllegalArgumentException(\\\"%s argument %s() == null\\\");\\n\",\r\n+                index, method, type.getName(), method));\r\n+\r\n+        code.append(String.format(\"%s url = arg%d.%s();\\n\", URL.class.getName(), index, method));\r\n+        return code.toString();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java", "source2": "org/apache/dubbo/common/extension/DubboInternalLoadingStrategy.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-/**\n- * Dubbo internal {@link LoadingStrategy}\n- *\n- * @since 2.7.7\n- */\n-public class DubboInternalLoadingStrategy implements LoadingStrategy {\n-\n-    @Override\n-    public String directory() {\n-        return \"META-INF/dubbo/internal/\";\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return MAX_PRIORITY;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+/**\r\n+ * Dubbo internal {@link LoadingStrategy}\r\n+ *\r\n+ * @since 2.7.7\r\n+ */\r\n+public class DubboInternalLoadingStrategy implements LoadingStrategy {\r\n+\r\n+    @Override\r\n+    public String directory() {\r\n+        return \"META-INF/dubbo/internal/\";\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return MAX_PRIORITY;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/DubboLoadingStrategy.java", "source2": "org/apache/dubbo/common/extension/DubboLoadingStrategy.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,42 +1,42 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-/**\n- * Dubbo {@link LoadingStrategy}\n- *\n- * @since 2.7.7\n- */\n-public class DubboLoadingStrategy implements LoadingStrategy {\n-\n-    @Override\n-    public String directory() {\n-        return \"META-INF/dubbo/\";\n-    }\n-\n-    @Override\n-    public boolean overridden() {\n-        return true;\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return NORMAL_PRIORITY;\n-    }\n-\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+/**\r\n+ * Dubbo {@link LoadingStrategy}\r\n+ *\r\n+ * @since 2.7.7\r\n+ */\r\n+public class DubboLoadingStrategy implements LoadingStrategy {\r\n+\r\n+    @Override\r\n+    public String directory() {\r\n+        return \"META-INF/dubbo/\";\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean overridden() {\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return NORMAL_PRIORITY;\r\n+    }\r\n+\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/ExtensionLoader.java", "source2": "org/apache/dubbo/common/extension/ExtensionLoader.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,1047 +1,1047 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.context.Lifecycle;\n-import org.apache.dubbo.common.extension.support.ActivateComparator;\n-import org.apache.dubbo.common.extension.support.WrapperComparator;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ArrayUtils;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConcurrentHashSet;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.Holder;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.io.BufferedReader;\n-import java.io.InputStreamReader;\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.nio.charset.StandardCharsets;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.Collections;\n-import java.util.Enumeration;\n-import java.util.HashMap;\n-import java.util.LinkedHashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.ServiceLoader;\n-import java.util.Set;\n-import java.util.TreeSet;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.regex.Pattern;\n-\n-import static java.util.Arrays.asList;\n-import static java.util.Collections.sort;\n-import static java.util.ServiceLoader.load;\n-import static java.util.stream.StreamSupport.stream;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;\n-\n-/**\n- * {@link org.apache.dubbo.rpc.model.ApplicationModel}, {@code DubboBootstrap} and this class are\n- * at present designed to be singleton or static (by itself totally static or uses some static fields).\n- * So the instances returned from them are of process or classloader scope. If you want to support\n- * multiple dubbo servers in a single process, you may need to refactor these three classes.\n- * <p>\n- * Load dubbo extensions\n- * <ul>\n- * <li>auto inject dependency extension </li>\n- * <li>auto wrap extension in wrapper </li>\n- * <li>default extension is an adaptive instance</li>\n- * </ul>\n- *\n- * @see <a href=\"http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider\">Service Provider in Java 5</a>\n- * @see org.apache.dubbo.common.extension.SPI\n- * @see org.apache.dubbo.common.extension.Adaptive\n- * @see org.apache.dubbo.common.extension.Activate\n- */\n-public class ExtensionLoader<T> {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(ExtensionLoader.class);\n-\n-    private static final Pattern NAME_SEPARATOR = Pattern.compile(\"\\\\s*[,]+\\\\s*\");\n-\n-    private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<>(64);\n-\n-    private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<>(64);\n-\n-    private final Class<?> type;\n-\n-    private final ExtensionFactory objectFactory;\n-\n-    private final ConcurrentMap<Class<?>, String> cachedNames = new ConcurrentHashMap<>();\n-\n-    private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();\n-\n-    private final Map<String, Object> cachedActivates = new ConcurrentHashMap<>();\n-    private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<>();\n-    private final Holder<Object> cachedAdaptiveInstance = new Holder<>();\n-    private volatile Class<?> cachedAdaptiveClass = null;\n-    private String cachedDefaultName;\n-    private volatile Throwable createAdaptiveInstanceError;\n-\n-    private Set<Class<?>> cachedWrapperClasses;\n-\n-    private Map<String, IllegalStateException> exceptions = new ConcurrentHashMap<>();\n-\n-    private static volatile LoadingStrategy[] strategies = loadLoadingStrategies();\n-\n-    public static void setLoadingStrategies(LoadingStrategy... strategies) {\n-        if (ArrayUtils.isNotEmpty(strategies)) {\n-            ExtensionLoader.strategies = strategies;\n-        }\n-    }\n-\n-    /**\n-     * Load all {@link Prioritized prioritized} {@link LoadingStrategy Loading Strategies} via {@link ServiceLoader}\n-     *\n-     * @return non-null\n-     * @since 2.7.7\n-     */\n-    private static LoadingStrategy[] loadLoadingStrategies() {\n-        return stream(load(LoadingStrategy.class).spliterator(), false)\n-                .sorted()\n-                .toArray(LoadingStrategy[]::new);\n-    }\n-\n-    /**\n-     * Get all {@link LoadingStrategy Loading Strategies}\n-     *\n-     * @return non-null\n-     * @see LoadingStrategy\n-     * @see Prioritized\n-     * @since 2.7.7\n-     */\n-    public static List<LoadingStrategy> getLoadingStrategies() {\n-        return asList(strategies);\n-    }\n-\n-    private ExtensionLoader(Class<?> type) {\n-        this.type = type;\n-        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());\n-    }\n-\n-    private static <T> boolean withExtensionAnnotation(Class<T> type) {\n-        return type.isAnnotationPresent(SPI.class);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {\n-        if (type == null) {\n-            throw new IllegalArgumentException(\"Extension type == null\");\n-        }\n-        if (!type.isInterface()) {\n-            throw new IllegalArgumentException(\"Extension type (\" + type + \") is not an interface!\");\n-        }\n-        if (!withExtensionAnnotation(type)) {\n-            throw new IllegalArgumentException(\"Extension type (\" + type +\n-                    \") is not an extension, because it is NOT annotated with @\" + SPI.class.getSimpleName() + \"!\");\n-        }\n-\n-        ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);\n-        if (loader == null) {\n-            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));\n-            loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);\n-        }\n-        return loader;\n-    }\n-\n-    // For testing purposes only\n-    public static void resetExtensionLoader(Class type) {\n-        ExtensionLoader loader = EXTENSION_LOADERS.get(type);\n-        if (loader != null) {\n-            // Remove all instances associated with this loader as well\n-            Map<String, Class<?>> classes = loader.getExtensionClasses();\n-            for (Map.Entry<String, Class<?>> entry : classes.entrySet()) {\n-                EXTENSION_INSTANCES.remove(entry.getValue());\n-            }\n-            classes.clear();\n-            EXTENSION_LOADERS.remove(type);\n-        }\n-    }\n-\n-    public static void destroyAll() {\n-        EXTENSION_INSTANCES.forEach((_type, instance) -> {\n-            if (instance instanceof Lifecycle) {\n-                Lifecycle lifecycle = (Lifecycle) instance;\n-                try {\n-                    lifecycle.destroy();\n-                } catch (Exception e) {\n-                    logger.error(\"Error destroying extension \" + lifecycle, e);\n-                }\n-            }\n-        });\n-    }\n-\n-    private static ClassLoader findClassLoader() {\n-        return ClassUtils.getClassLoader(ExtensionLoader.class);\n-    }\n-\n-    public String getExtensionName(T extensionInstance) {\n-        return getExtensionName(extensionInstance.getClass());\n-    }\n-\n-    public String getExtensionName(Class<?> extensionClass) {\n-        getExtensionClasses();// load class\n-        return cachedNames.get(extensionClass);\n-    }\n-\n-    /**\n-     * This is equivalent to {@code getActivateExtension(url, key, null)}\n-     *\n-     * @param url url\n-     * @param key url parameter key which used to get extension point names\n-     * @return extension list which are activated.\n-     * @see #getActivateExtension(org.apache.dubbo.common.URL, String, String)\n-     */\n-    public List<T> getActivateExtension(URL url, String key) {\n-        return getActivateExtension(url, key, null);\n-    }\n-\n-    /**\n-     * This is equivalent to {@code getActivateExtension(url, values, null)}\n-     *\n-     * @param url    url\n-     * @param values extension point names\n-     * @return extension list which are activated\n-     * @see #getActivateExtension(org.apache.dubbo.common.URL, String[], String)\n-     */\n-    public List<T> getActivateExtension(URL url, String[] values) {\n-        return getActivateExtension(url, values, null);\n-    }\n-\n-    /**\n-     * This is equivalent to {@code getActivateExtension(url, url.getParameter(key).split(\",\"), null)}\n-     *\n-     * @param url   url\n-     * @param key   url parameter key which used to get extension point names\n-     * @param group group\n-     * @return extension list which are activated.\n-     * @see #getActivateExtension(org.apache.dubbo.common.URL, String[], String)\n-     */\n-    public List<T> getActivateExtension(URL url, String key, String group) {\n-        String value = url.getParameter(key);\n-        return getActivateExtension(url, StringUtils.isEmpty(value) ? null : COMMA_SPLIT_PATTERN.split(value), group);\n-    }\n-\n-    /**\n-     * Get activate extensions.\n-     *\n-     * @param url    url\n-     * @param values extension point names\n-     * @param group  group\n-     * @return extension list which are activated\n-     * @see org.apache.dubbo.common.extension.Activate\n-     */\n-    public List<T> getActivateExtension(URL url, String[] values, String group) {\n-        List<T> activateExtensions = new ArrayList<>();\n-        List<String> names = values == null ? new ArrayList<>(0) : asList(values);\n-        if (!names.contains(REMOVE_VALUE_PREFIX + DEFAULT_KEY)) {\n-            getExtensionClasses();\n-            for (Map.Entry<String, Object> entry : cachedActivates.entrySet()) {\n-                String name = entry.getKey();\n-                Object activate = entry.getValue();\n-\n-                String[] activateGroup, activateValue;\n-\n-                if (activate instanceof Activate) {\n-                    activateGroup = ((Activate) activate).group();\n-                    activateValue = ((Activate) activate).value();\n-                } else if (activate instanceof com.alibaba.dubbo.common.extension.Activate) {\n-                    activateGroup = ((com.alibaba.dubbo.common.extension.Activate) activate).group();\n-                    activateValue = ((com.alibaba.dubbo.common.extension.Activate) activate).value();\n-                } else {\n-                    continue;\n-                }\n-                if (isMatchGroup(group, activateGroup)\n-                        && !names.contains(name)\n-                        && !names.contains(REMOVE_VALUE_PREFIX + name)\n-                        && isActive(activateValue, url)) {\n-                    activateExtensions.add(getExtension(name));\n-                }\n-            }\n-            activateExtensions.sort(ActivateComparator.COMPARATOR);\n-        }\n-        List<T> loadedExtensions = new ArrayList<>();\n-        for (int i = 0; i < names.size(); i++) {\n-            String name = names.get(i);\n-            if (!name.startsWith(REMOVE_VALUE_PREFIX)\n-                    && !names.contains(REMOVE_VALUE_PREFIX + name)) {\n-                if (DEFAULT_KEY.equals(name)) {\n-                    if (!loadedExtensions.isEmpty()) {\n-                        activateExtensions.addAll(0, loadedExtensions);\n-                        loadedExtensions.clear();\n-                    }\n-                } else {\n-                    loadedExtensions.add(getExtension(name));\n-                }\n-            }\n-        }\n-        if (!loadedExtensions.isEmpty()) {\n-            activateExtensions.addAll(loadedExtensions);\n-        }\n-        return activateExtensions;\n-    }\n-\n-    private boolean isMatchGroup(String group, String[] groups) {\n-        if (StringUtils.isEmpty(group)) {\n-            return true;\n-        }\n-        if (groups != null && groups.length > 0) {\n-            for (String g : groups) {\n-                if (group.equals(g)) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return false;\n-    }\n-\n-    private boolean isActive(String[] keys, URL url) {\n-        if (keys.length == 0) {\n-            return true;\n-        }\n-        for (String key : keys) {\n-            // @Active(value=\"key1:value1, key2:value2\")\n-            String keyValue = null;\n-            if (key.contains(\":\")) {\n-                String[] arr = key.split(\":\");\n-                key = arr[0];\n-                keyValue = arr[1];\n-            }\n-\n-            for (Map.Entry<String, String> entry : url.getParameters().entrySet()) {\n-                String k = entry.getKey();\n-                String v = entry.getValue();\n-                if ((k.equals(key) || k.endsWith(\".\" + key))\n-                        && ((keyValue != null && keyValue.equals(v)) || (keyValue == null && ConfigUtils.isNotEmpty(v)))) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return false;\n-    }\n-\n-    /**\n-     * Get extension's instance. Return <code>null</code> if extension is not found or is not initialized. Pls. note\n-     * that this method will not trigger extension load.\n-     * <p>\n-     * In order to trigger extension load, call {@link #getExtension(String)} instead.\n-     *\n-     * @see #getExtension(String)\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public T getLoadedExtension(String name) {\n-        if (StringUtils.isEmpty(name)) {\n-            throw new IllegalArgumentException(\"Extension name == null\");\n-        }\n-        Holder<Object> holder = getOrCreateHolder(name);\n-        return (T) holder.get();\n-    }\n-\n-    private Holder<Object> getOrCreateHolder(String name) {\n-        Holder<Object> holder = cachedInstances.get(name);\n-        if (holder == null) {\n-            cachedInstances.putIfAbsent(name, new Holder<>());\n-            holder = cachedInstances.get(name);\n-        }\n-        return holder;\n-    }\n-\n-    /**\n-     * Return the list of extensions which are already loaded.\n-     * <p>\n-     * Usually {@link #getSupportedExtensions()} should be called in order to get all extensions.\n-     *\n-     * @see #getSupportedExtensions()\n-     */\n-    public Set<String> getLoadedExtensions() {\n-        return Collections.unmodifiableSet(new TreeSet<>(cachedInstances.keySet()));\n-    }\n-\n-    public List<T> getLoadedExtensionInstances() {\n-        List<T> instances = new ArrayList<>();\n-        cachedInstances.values().forEach(holder -> instances.add((T) holder.get()));\n-        return instances;\n-    }\n-\n-    public Object getLoadedAdaptiveExtensionInstances() {\n-        return cachedAdaptiveInstance.get();\n-    }\n-\n-//    public T getPrioritizedExtensionInstance() {\n-//        Set<String> supported = getSupportedExtensions();\n-//\n-//        Set<T> instances = new HashSet<>();\n-//        Set<T> prioritized = new HashSet<>();\n-//        for (String s : supported) {\n-//\n-//        }\n-//\n-//    }\n-\n-    /**\n-     * Find the extension with the given name. If the specified name is not found, then {@link IllegalStateException}\n-     * will be thrown.\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public T getExtension(String name) {\n-        return getExtension(name, true);\n-    }\n-\n-    public T getExtension(String name, boolean wrap) {\n-        if (StringUtils.isEmpty(name)) {\n-            throw new IllegalArgumentException(\"Extension name == null\");\n-        }\n-        if (\"true\".equals(name)) {\n-            return getDefaultExtension();\n-        }\n-        final Holder<Object> holder = getOrCreateHolder(name);\n-        Object instance = holder.get();\n-        if (instance == null) {\n-            synchronized (holder) {\n-                instance = holder.get();\n-                if (instance == null) {\n-                    instance = createExtension(name, wrap);\n-                    holder.set(instance);\n-                }\n-            }\n-        }\n-        return (T) instance;\n-    }\n-\n-    /**\n-     * Get the extension by specified name if found, or {@link #getDefaultExtension() returns the default one}\n-     *\n-     * @param name the name of extension\n-     * @return non-null\n-     */\n-    public T getOrDefaultExtension(String name) {\n-        return containsExtension(name) ? getExtension(name) : getDefaultExtension();\n-    }\n-\n-    /**\n-     * Return default extension, return <code>null</code> if it's not configured.\n-     */\n-    public T getDefaultExtension() {\n-        getExtensionClasses();\n-        if (StringUtils.isBlank(cachedDefaultName) || \"true\".equals(cachedDefaultName)) {\n-            return null;\n-        }\n-        return getExtension(cachedDefaultName);\n-    }\n-\n-    public boolean hasExtension(String name) {\n-        if (StringUtils.isEmpty(name)) {\n-            throw new IllegalArgumentException(\"Extension name == null\");\n-        }\n-        Class<?> c = this.getExtensionClass(name);\n-        return c != null;\n-    }\n-\n-    public Set<String> getSupportedExtensions() {\n-        Map<String, Class<?>> clazzes = getExtensionClasses();\n-        return Collections.unmodifiableSet(new TreeSet<>(clazzes.keySet()));\n-    }\n-\n-    public Set<T> getSupportedExtensionInstances() {\n-        List<T> instances = new LinkedList<>();\n-        Set<String> supportedExtensions = getSupportedExtensions();\n-        if (CollectionUtils.isNotEmpty(supportedExtensions)) {\n-            for (String name : supportedExtensions) {\n-                instances.add(getExtension(name));\n-            }\n-        }\n-        // sort the Prioritized instances\n-        sort(instances, Prioritized.COMPARATOR);\n-        return new LinkedHashSet<>(instances);\n-    }\n-\n-    /**\n-     * Return default extension name, return <code>null</code> if not configured.\n-     */\n-    public String getDefaultExtensionName() {\n-        getExtensionClasses();\n-        return cachedDefaultName;\n-    }\n-\n-    /**\n-     * Register new extension via API\n-     *\n-     * @param name  extension name\n-     * @param clazz extension class\n-     * @throws IllegalStateException when extension with the same name has already been registered.\n-     */\n-    public void addExtension(String name, Class<?> clazz) {\n-        getExtensionClasses(); // load classes\n-\n-        if (!type.isAssignableFrom(clazz)) {\n-            throw new IllegalStateException(\"Input type \" +\n-                    clazz + \" doesn't implement the Extension \" + type);\n-        }\n-        if (clazz.isInterface()) {\n-            throw new IllegalStateException(\"Input type \" +\n-                    clazz + \" can't be interface!\");\n-        }\n-\n-        if (!clazz.isAnnotationPresent(Adaptive.class)) {\n-            if (StringUtils.isBlank(name)) {\n-                throw new IllegalStateException(\"Extension name is blank (Extension \" + type + \")!\");\n-            }\n-            if (cachedClasses.get().containsKey(name)) {\n-                throw new IllegalStateException(\"Extension name \" +\n-                        name + \" already exists (Extension \" + type + \")!\");\n-            }\n-\n-            cachedNames.put(clazz, name);\n-            cachedClasses.get().put(name, clazz);\n-        } else {\n-            if (cachedAdaptiveClass != null) {\n-                throw new IllegalStateException(\"Adaptive Extension already exists (Extension \" + type + \")!\");\n-            }\n-\n-            cachedAdaptiveClass = clazz;\n-        }\n-    }\n-\n-    /**\n-     * Replace the existing extension via API\n-     *\n-     * @param name  extension name\n-     * @param clazz extension class\n-     * @throws IllegalStateException when extension to be placed doesn't exist\n-     * @deprecated not recommended any longer, and use only when test\n-     */\n-    @Deprecated\n-    public void replaceExtension(String name, Class<?> clazz) {\n-        getExtensionClasses(); // load classes\n-\n-        if (!type.isAssignableFrom(clazz)) {\n-            throw new IllegalStateException(\"Input type \" +\n-                    clazz + \" doesn't implement Extension \" + type);\n-        }\n-        if (clazz.isInterface()) {\n-            throw new IllegalStateException(\"Input type \" +\n-                    clazz + \" can't be interface!\");\n-        }\n-\n-        if (!clazz.isAnnotationPresent(Adaptive.class)) {\n-            if (StringUtils.isBlank(name)) {\n-                throw new IllegalStateException(\"Extension name is blank (Extension \" + type + \")!\");\n-            }\n-            if (!cachedClasses.get().containsKey(name)) {\n-                throw new IllegalStateException(\"Extension name \" +\n-                        name + \" doesn't exist (Extension \" + type + \")!\");\n-            }\n-\n-            cachedNames.put(clazz, name);\n-            cachedClasses.get().put(name, clazz);\n-            cachedInstances.remove(name);\n-        } else {\n-            if (cachedAdaptiveClass == null) {\n-                throw new IllegalStateException(\"Adaptive Extension doesn't exist (Extension \" + type + \")!\");\n-            }\n-\n-            cachedAdaptiveClass = clazz;\n-            cachedAdaptiveInstance.set(null);\n-        }\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public T getAdaptiveExtension() {\n-        Object instance = cachedAdaptiveInstance.get();\n-        if (instance == null) {\n-            if (createAdaptiveInstanceError != null) {\n-                throw new IllegalStateException(\"Failed to create adaptive instance: \" +\n-                        createAdaptiveInstanceError.toString(),\n-                        createAdaptiveInstanceError);\n-            }\n-\n-            synchronized (cachedAdaptiveInstance) {\n-                instance = cachedAdaptiveInstance.get();\n-                if (instance == null) {\n-                    try {\n-                        instance = createAdaptiveExtension();\n-                        cachedAdaptiveInstance.set(instance);\n-                    } catch (Throwable t) {\n-                        createAdaptiveInstanceError = t;\n-                        throw new IllegalStateException(\"Failed to create adaptive instance: \" + t.toString(), t);\n-                    }\n-                }\n-            }\n-        }\n-\n-        return (T) instance;\n-    }\n-\n-    private IllegalStateException findException(String name) {\n-        StringBuilder buf = new StringBuilder(\"No such extension \" + type.getName() + \" by name \" + name);\n-\n-        int i = 1;\n-        for (Map.Entry<String, IllegalStateException> entry : exceptions.entrySet()) {\n-            if (entry.getKey().toLowerCase().startsWith(name.toLowerCase())) {\n-                if (i == 1) {\n-                    buf.append(\", possible causes: \");\n-                }\n-                buf.append(\"\\r\\n(\");\n-                buf.append(i++);\n-                buf.append(\") \");\n-                buf.append(entry.getKey());\n-                buf.append(\":\\r\\n\");\n-                buf.append(StringUtils.toString(entry.getValue()));\n-            }\n-        }\n-\n-        if (i == 1) {\n-            buf.append(\", no related exception was found, please check whether related SPI module is missing.\");\n-        }\n-        return new IllegalStateException(buf.toString());\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private T createExtension(String name, boolean wrap) {\n-        Class<?> clazz = getExtensionClasses().get(name);\n-        if (clazz == null) {\n-            throw findException(name);\n-        }\n-        try {\n-            T instance = (T) EXTENSION_INSTANCES.get(clazz);\n-            if (instance == null) {\n-                EXTENSION_INSTANCES.putIfAbsent(clazz, clazz.getDeclaredConstructor().newInstance());\n-                instance = (T) EXTENSION_INSTANCES.get(clazz);\n-            }\n-            injectExtension(instance);\n-\n-\n-            if (wrap) {\n-\n-                List<Class<?>> wrapperClassesList = new ArrayList<>();\n-                if (cachedWrapperClasses != null) {\n-                    wrapperClassesList.addAll(cachedWrapperClasses);\n-                    wrapperClassesList.sort(WrapperComparator.COMPARATOR);\n-                    Collections.reverse(wrapperClassesList);\n-                }\n-\n-                if (CollectionUtils.isNotEmpty(wrapperClassesList)) {\n-                    for (Class<?> wrapperClass : wrapperClassesList) {\n-                        Wrapper wrapper = wrapperClass.getAnnotation(Wrapper.class);\n-                        if (wrapper == null\n-                                || (ArrayUtils.contains(wrapper.matches(), name) && !ArrayUtils.contains(wrapper.mismatches(), name))) {\n-                            instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));\n-                        }\n-                    }\n-                }\n-            }\n-\n-            initExtension(instance);\n-            return instance;\n-        } catch (Throwable t) {\n-            throw new IllegalStateException(\"Extension instance (name: \" + name + \", class: \" +\n-                    type + \") couldn't be instantiated: \" + t.getMessage(), t);\n-        }\n-    }\n-\n-    private boolean containsExtension(String name) {\n-        return getExtensionClasses().containsKey(name);\n-    }\n-\n-    private T injectExtension(T instance) {\n-\n-        if (objectFactory == null) {\n-            return instance;\n-        }\n-\n-        try {\n-            for (Method method : instance.getClass().getMethods()) {\n-                if (!isSetter(method)) {\n-                    continue;\n-                }\n-                /**\n-                 * Check {@link DisableInject} to see if we need auto injection for this property\n-                 */\n-                if (method.getAnnotation(DisableInject.class) != null) {\n-                    continue;\n-                }\n-                Class<?> pt = method.getParameterTypes()[0];\n-                if (ReflectUtils.isPrimitives(pt)) {\n-                    continue;\n-                }\n-\n-                try {\n-                    String property = getSetterProperty(method);\n-                    Object object = objectFactory.getExtension(pt, property);\n-                    if (object != null) {\n-                        method.invoke(instance, object);\n-                    }\n-                } catch (Exception e) {\n-                    logger.error(\"Failed to inject via method \" + method.getName()\n-                            + \" of interface \" + type.getName() + \": \" + e.getMessage(), e);\n-                }\n-\n-            }\n-        } catch (Exception e) {\n-            logger.error(e.getMessage(), e);\n-        }\n-        return instance;\n-    }\n-\n-    private void initExtension(T instance) {\n-        if (instance instanceof Lifecycle) {\n-            Lifecycle lifecycle = (Lifecycle) instance;\n-            lifecycle.initialize();\n-        }\n-    }\n-\n-    /**\n-     * get properties name for setter, for instance: setVersion, return \"version\"\n-     * <p>\n-     * return \"\", if setter name with length less than 3\n-     */\n-    private String getSetterProperty(Method method) {\n-        return method.getName().length() > 3 ? method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4) : \"\";\n-    }\n-\n-    /**\n-     * return true if and only if:\n-     * <p>\n-     * 1, public\n-     * <p>\n-     * 2, name starts with \"set\"\n-     * <p>\n-     * 3, only has one parameter\n-     */\n-    private boolean isSetter(Method method) {\n-        return method.getName().startsWith(\"set\")\n-                && method.getParameterTypes().length == 1\n-                && Modifier.isPublic(method.getModifiers());\n-    }\n-\n-    private Class<?> getExtensionClass(String name) {\n-        if (type == null) {\n-            throw new IllegalArgumentException(\"Extension type == null\");\n-        }\n-        if (name == null) {\n-            throw new IllegalArgumentException(\"Extension name == null\");\n-        }\n-        return getExtensionClasses().get(name);\n-    }\n-\n-    private Map<String, Class<?>> getExtensionClasses() {\n-        Map<String, Class<?>> classes = cachedClasses.get();\n-        if (classes == null) {\n-            synchronized (cachedClasses) {\n-                classes = cachedClasses.get();\n-                if (classes == null) {\n-                    classes = loadExtensionClasses();\n-                    cachedClasses.set(classes);\n-                }\n-            }\n-        }\n-        return classes;\n-    }\n-\n-    /**\n-     * synchronized in getExtensionClasses\n-     */\n-    private Map<String, Class<?>> loadExtensionClasses() {\n-        cacheDefaultExtensionName();\n-\n-        Map<String, Class<?>> extensionClasses = new HashMap<>();\n-\n-        for (LoadingStrategy strategy : strategies) {\n-            loadDirectory(extensionClasses, strategy.directory(), type.getName(), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages());\n-            loadDirectory(extensionClasses, strategy.directory(), type.getName().replace(\"org.apache\", \"com.alibaba\"), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages());\n-        }\n-\n-        return extensionClasses;\n-    }\n-\n-    /**\n-     * extract and cache default extension name if exists\n-     */\n-    private void cacheDefaultExtensionName() {\n-        final SPI defaultAnnotation = type.getAnnotation(SPI.class);\n-        if (defaultAnnotation == null) {\n-            return;\n-        }\n-\n-        String value = defaultAnnotation.value();\n-        if ((value = value.trim()).length() > 0) {\n-            String[] names = NAME_SEPARATOR.split(value);\n-            if (names.length > 1) {\n-                throw new IllegalStateException(\"More than 1 default extension name on extension \" + type.getName()\n-                        + \": \" + Arrays.toString(names));\n-            }\n-            if (names.length == 1) {\n-                cachedDefaultName = names[0];\n-            }\n-        }\n-    }\n-\n-    private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type) {\n-        loadDirectory(extensionClasses, dir, type, false, false);\n-    }\n-\n-    private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type,\n-                               boolean extensionLoaderClassLoaderFirst, boolean overridden, String... excludedPackages) {\n-        String fileName = dir + type;\n-        try {\n-            Enumeration<java.net.URL> urls = null;\n-            ClassLoader classLoader = findClassLoader();\n-\n-            // try to load from ExtensionLoader's ClassLoader first\n-            if (extensionLoaderClassLoaderFirst) {\n-                ClassLoader extensionLoaderClassLoader = ExtensionLoader.class.getClassLoader();\n-                if (ClassLoader.getSystemClassLoader() != extensionLoaderClassLoader) {\n-                    urls = extensionLoaderClassLoader.getResources(fileName);\n-                }\n-            }\n-\n-            if (urls == null || !urls.hasMoreElements()) {\n-                if (classLoader != null) {\n-                    urls = classLoader.getResources(fileName);\n-                } else {\n-                    urls = ClassLoader.getSystemResources(fileName);\n-                }\n-            }\n-\n-            if (urls != null) {\n-                while (urls.hasMoreElements()) {\n-                    java.net.URL resourceURL = urls.nextElement();\n-                    loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages);\n-                }\n-            }\n-        } catch (Throwable t) {\n-            logger.error(\"Exception occurred when loading extension class (interface: \" +\n-                    type + \", description file: \" + fileName + \").\", t);\n-        }\n-    }\n-\n-    private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader,\n-                              java.net.URL resourceURL, boolean overridden, String... excludedPackages) {\n-        try {\n-            try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), StandardCharsets.UTF_8))) {\n-                String line;\n-                String clazz = null;\n-                while ((line = reader.readLine()) != null) {\n-                    final int ci = line.indexOf('#');\n-                    if (ci >= 0) {\n-                        line = line.substring(0, ci);\n-                    }\n-                    line = line.trim();\n-                    if (line.length() > 0) {\n-                        try {\n-                            String name = null;\n-                            int i = line.indexOf('=');\n-                            if (i > 0) {\n-                                name = line.substring(0, i).trim();\n-                                clazz = line.substring(i + 1).trim();\n-                            } else {\n-                                clazz = line;\n-                            }\n-                            if (StringUtils.isNotEmpty(clazz) && !isExcluded(clazz, excludedPackages)) {\n-                                loadClass(extensionClasses, resourceURL, Class.forName(clazz, true, classLoader), name, overridden);\n-                            }\n-                        } catch (Throwable t) {\n-                            IllegalStateException e = new IllegalStateException(\"Failed to load extension class (interface: \" + type + \", class line: \" + line + \") in \" + resourceURL + \", cause: \" + t.getMessage(), t);\n-                            exceptions.put(line, e);\n-                        }\n-                    }\n-                }\n-            }\n-        } catch (Throwable t) {\n-            logger.error(\"Exception occurred when loading extension class (interface: \" +\n-                    type + \", class file: \" + resourceURL + \") in \" + resourceURL, t);\n-        }\n-    }\n-\n-    private boolean isExcluded(String className, String... excludedPackages) {\n-        if (excludedPackages != null) {\n-            for (String excludePackage : excludedPackages) {\n-                if (className.startsWith(excludePackage + \".\")) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return false;\n-    }\n-\n-    private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL, Class<?> clazz, String name,\n-                           boolean overridden) throws NoSuchMethodException {\n-        if (!type.isAssignableFrom(clazz)) {\n-            throw new IllegalStateException(\"Error occurred when loading extension class (interface: \" +\n-                    type + \", class line: \" + clazz.getName() + \"), class \"\n-                    + clazz.getName() + \" is not subtype of interface.\");\n-        }\n-        if (clazz.isAnnotationPresent(Adaptive.class)) {\n-            cacheAdaptiveClass(clazz, overridden);\n-        } else if (isWrapperClass(clazz)) {\n-            cacheWrapperClass(clazz);\n-        } else {\n-            clazz.getConstructor();\n-            if (StringUtils.isEmpty(name)) {\n-                name = findAnnotationName(clazz);\n-                if (name.length() == 0) {\n-                    throw new IllegalStateException(\"No such extension name for the class \" + clazz.getName() + \" in the config \" + resourceURL);\n-                }\n-            }\n-\n-            String[] names = NAME_SEPARATOR.split(name);\n-            if (ArrayUtils.isNotEmpty(names)) {\n-                cacheActivateClass(clazz, names[0]);\n-                for (String n : names) {\n-                    cacheName(clazz, n);\n-                    saveInExtensionClass(extensionClasses, clazz, n, overridden);\n-                }\n-            }\n-        }\n-    }\n-\n-    /**\n-     * cache name\n-     */\n-    private void cacheName(Class<?> clazz, String name) {\n-        if (!cachedNames.containsKey(clazz)) {\n-            cachedNames.put(clazz, name);\n-        }\n-    }\n-\n-    /**\n-     * put clazz in extensionClasses\n-     */\n-    private void saveInExtensionClass(Map<String, Class<?>> extensionClasses, Class<?> clazz, String name, boolean overridden) {\n-        Class<?> c = extensionClasses.get(name);\n-        if (c == null || overridden) {\n-            extensionClasses.put(name, clazz);\n-        } else if (c != clazz) {\n-            String duplicateMsg = \"Duplicate extension \" + type.getName() + \" name \" + name + \" on \" + c.getName() + \" and \" + clazz.getName();\n-            logger.error(duplicateMsg);\n-            throw new IllegalStateException(duplicateMsg);\n-        }\n-    }\n-\n-    /**\n-     * cache Activate class which is annotated with <code>Activate</code>\n-     * <p>\n-     * for compatibility, also cache class with old alibaba Activate annotation\n-     */\n-    private void cacheActivateClass(Class<?> clazz, String name) {\n-        Activate activate = clazz.getAnnotation(Activate.class);\n-        if (activate != null) {\n-            cachedActivates.put(name, activate);\n-        } else {\n-            // support com.alibaba.dubbo.common.extension.Activate\n-            com.alibaba.dubbo.common.extension.Activate oldActivate = clazz.getAnnotation(com.alibaba.dubbo.common.extension.Activate.class);\n-            if (oldActivate != null) {\n-                cachedActivates.put(name, oldActivate);\n-            }\n-        }\n-    }\n-\n-    /**\n-     * cache Adaptive class which is annotated with <code>Adaptive</code>\n-     */\n-    private void cacheAdaptiveClass(Class<?> clazz, boolean overridden) {\n-        if (cachedAdaptiveClass == null || overridden) {\n-            cachedAdaptiveClass = clazz;\n-        } else if (!cachedAdaptiveClass.equals(clazz)) {\n-            throw new IllegalStateException(\"More than 1 adaptive class found: \"\n-                    + cachedAdaptiveClass.getName()\n-                    + \", \" + clazz.getName());\n-        }\n-    }\n-\n-    /**\n-     * cache wrapper class\n-     * <p>\n-     * like: ProtocolFilterWrapper, ProtocolListenerWrapper\n-     */\n-    private void cacheWrapperClass(Class<?> clazz) {\n-        if (cachedWrapperClasses == null) {\n-            cachedWrapperClasses = new ConcurrentHashSet<>();\n-        }\n-        cachedWrapperClasses.add(clazz);\n-    }\n-\n-    /**\n-     * test if clazz is a wrapper class\n-     * <p>\n-     * which has Constructor with given class type as its only argument\n-     */\n-    private boolean isWrapperClass(Class<?> clazz) {\n-        try {\n-            clazz.getConstructor(type);\n-            return true;\n-        } catch (NoSuchMethodException e) {\n-            return false;\n-        }\n-    }\n-\n-    @SuppressWarnings(\"deprecation\")\n-    private String findAnnotationName(Class<?> clazz) {\n-        org.apache.dubbo.common.Extension extension = clazz.getAnnotation(org.apache.dubbo.common.Extension.class);\n-        if (extension != null) {\n-            return extension.value();\n-        }\n-\n-        String name = clazz.getSimpleName();\n-        if (name.endsWith(type.getSimpleName())) {\n-            name = name.substring(0, name.length() - type.getSimpleName().length());\n-        }\n-        return name.toLowerCase();\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private T createAdaptiveExtension() {\n-        try {\n-            return injectExtension((T) getAdaptiveExtensionClass().newInstance());\n-        } catch (Exception e) {\n-            throw new IllegalStateException(\"Can't create adaptive extension \" + type + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    private Class<?> getAdaptiveExtensionClass() {\n-        getExtensionClasses();\n-        if (cachedAdaptiveClass != null) {\n-            return cachedAdaptiveClass;\n-        }\n-        return cachedAdaptiveClass = createAdaptiveExtensionClass();\n-    }\n-\n-    private Class<?> createAdaptiveExtensionClass() {\n-        String code = new AdaptiveClassCodeGenerator(type, cachedDefaultName).generate();\n-        ClassLoader classLoader = findClassLoader();\n-        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();\n-        return compiler.compile(code, classLoader);\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return this.getClass().getName() + \"[\" + type.getName() + \"]\";\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.context.Lifecycle;\r\n+import org.apache.dubbo.common.extension.support.ActivateComparator;\r\n+import org.apache.dubbo.common.extension.support.WrapperComparator;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ArrayUtils;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConcurrentHashSet;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.Holder;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.io.BufferedReader;\r\n+import java.io.InputStreamReader;\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.nio.charset.StandardCharsets;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.Collections;\r\n+import java.util.Enumeration;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.ServiceLoader;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.regex.Pattern;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static java.util.Collections.sort;\r\n+import static java.util.ServiceLoader.load;\r\n+import static java.util.stream.StreamSupport.stream;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;\r\n+\r\n+/**\r\n+ * {@link org.apache.dubbo.rpc.model.ApplicationModel}, {@code DubboBootstrap} and this class are\r\n+ * at present designed to be singleton or static (by itself totally static or uses some static fields).\r\n+ * So the instances returned from them are of process or classloader scope. If you want to support\r\n+ * multiple dubbo servers in a single process, you may need to refactor these three classes.\r\n+ * <p>\r\n+ * Load dubbo extensions\r\n+ * <ul>\r\n+ * <li>auto inject dependency extension </li>\r\n+ * <li>auto wrap extension in wrapper </li>\r\n+ * <li>default extension is an adaptive instance</li>\r\n+ * </ul>\r\n+ *\r\n+ * @see <a href=\"http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider\">Service Provider in Java 5</a>\r\n+ * @see org.apache.dubbo.common.extension.SPI\r\n+ * @see org.apache.dubbo.common.extension.Adaptive\r\n+ * @see org.apache.dubbo.common.extension.Activate\r\n+ */\r\n+public class ExtensionLoader<T> {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(ExtensionLoader.class);\r\n+\r\n+    private static final Pattern NAME_SEPARATOR = Pattern.compile(\"\\\\s*[,]+\\\\s*\");\r\n+\r\n+    private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<>(64);\r\n+\r\n+    private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<>(64);\r\n+\r\n+    private final Class<?> type;\r\n+\r\n+    private final ExtensionFactory objectFactory;\r\n+\r\n+    private final ConcurrentMap<Class<?>, String> cachedNames = new ConcurrentHashMap<>();\r\n+\r\n+    private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();\r\n+\r\n+    private final Map<String, Object> cachedActivates = new ConcurrentHashMap<>();\r\n+    private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<>();\r\n+    private final Holder<Object> cachedAdaptiveInstance = new Holder<>();\r\n+    private volatile Class<?> cachedAdaptiveClass = null;\r\n+    private String cachedDefaultName;\r\n+    private volatile Throwable createAdaptiveInstanceError;\r\n+\r\n+    private Set<Class<?>> cachedWrapperClasses;\r\n+\r\n+    private Map<String, IllegalStateException> exceptions = new ConcurrentHashMap<>();\r\n+\r\n+    private static volatile LoadingStrategy[] strategies = loadLoadingStrategies();\r\n+\r\n+    public static void setLoadingStrategies(LoadingStrategy... strategies) {\r\n+        if (ArrayUtils.isNotEmpty(strategies)) {\r\n+            ExtensionLoader.strategies = strategies;\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Load all {@link Prioritized prioritized} {@link LoadingStrategy Loading Strategies} via {@link ServiceLoader}\r\n+     *\r\n+     * @return non-null\r\n+     * @since 2.7.7\r\n+     */\r\n+    private static LoadingStrategy[] loadLoadingStrategies() {\r\n+        return stream(load(LoadingStrategy.class).spliterator(), false)\r\n+                .sorted()\r\n+                .toArray(LoadingStrategy[]::new);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all {@link LoadingStrategy Loading Strategies}\r\n+     *\r\n+     * @return non-null\r\n+     * @see LoadingStrategy\r\n+     * @see Prioritized\r\n+     * @since 2.7.7\r\n+     */\r\n+    public static List<LoadingStrategy> getLoadingStrategies() {\r\n+        return asList(strategies);\r\n+    }\r\n+\r\n+    private ExtensionLoader(Class<?> type) {\r\n+        this.type = type;\r\n+        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());\r\n+    }\r\n+\r\n+    private static <T> boolean withExtensionAnnotation(Class<T> type) {\r\n+        return type.isAnnotationPresent(SPI.class);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {\r\n+        if (type == null) {\r\n+            throw new IllegalArgumentException(\"Extension type == null\");\r\n+        }\r\n+        if (!type.isInterface()) {\r\n+            throw new IllegalArgumentException(\"Extension type (\" + type + \") is not an interface!\");\r\n+        }\r\n+        if (!withExtensionAnnotation(type)) {\r\n+            throw new IllegalArgumentException(\"Extension type (\" + type +\r\n+                    \") is not an extension, because it is NOT annotated with @\" + SPI.class.getSimpleName() + \"!\");\r\n+        }\r\n+\r\n+        ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);\r\n+        if (loader == null) {\r\n+            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));\r\n+            loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);\r\n+        }\r\n+        return loader;\r\n+    }\r\n+\r\n+    // For testing purposes only\r\n+    public static void resetExtensionLoader(Class type) {\r\n+        ExtensionLoader loader = EXTENSION_LOADERS.get(type);\r\n+        if (loader != null) {\r\n+            // Remove all instances associated with this loader as well\r\n+            Map<String, Class<?>> classes = loader.getExtensionClasses();\r\n+            for (Map.Entry<String, Class<?>> entry : classes.entrySet()) {\r\n+                EXTENSION_INSTANCES.remove(entry.getValue());\r\n+            }\r\n+            classes.clear();\r\n+            EXTENSION_LOADERS.remove(type);\r\n+        }\r\n+    }\r\n+\r\n+    public static void destroyAll() {\r\n+        EXTENSION_INSTANCES.forEach((_type, instance) -> {\r\n+            if (instance instanceof Lifecycle) {\r\n+                Lifecycle lifecycle = (Lifecycle) instance;\r\n+                try {\r\n+                    lifecycle.destroy();\r\n+                } catch (Exception e) {\r\n+                    logger.error(\"Error destroying extension \" + lifecycle, e);\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private static ClassLoader findClassLoader() {\r\n+        return ClassUtils.getClassLoader(ExtensionLoader.class);\r\n+    }\r\n+\r\n+    public String getExtensionName(T extensionInstance) {\r\n+        return getExtensionName(extensionInstance.getClass());\r\n+    }\r\n+\r\n+    public String getExtensionName(Class<?> extensionClass) {\r\n+        getExtensionClasses();// load class\r\n+        return cachedNames.get(extensionClass);\r\n+    }\r\n+\r\n+    /**\r\n+     * This is equivalent to {@code getActivateExtension(url, key, null)}\r\n+     *\r\n+     * @param url url\r\n+     * @param key url parameter key which used to get extension point names\r\n+     * @return extension list which are activated.\r\n+     * @see #getActivateExtension(org.apache.dubbo.common.URL, String, String)\r\n+     */\r\n+    public List<T> getActivateExtension(URL url, String key) {\r\n+        return getActivateExtension(url, key, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * This is equivalent to {@code getActivateExtension(url, values, null)}\r\n+     *\r\n+     * @param url    url\r\n+     * @param values extension point names\r\n+     * @return extension list which are activated\r\n+     * @see #getActivateExtension(org.apache.dubbo.common.URL, String[], String)\r\n+     */\r\n+    public List<T> getActivateExtension(URL url, String[] values) {\r\n+        return getActivateExtension(url, values, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * This is equivalent to {@code getActivateExtension(url, url.getParameter(key).split(\",\"), null)}\r\n+     *\r\n+     * @param url   url\r\n+     * @param key   url parameter key which used to get extension point names\r\n+     * @param group group\r\n+     * @return extension list which are activated.\r\n+     * @see #getActivateExtension(org.apache.dubbo.common.URL, String[], String)\r\n+     */\r\n+    public List<T> getActivateExtension(URL url, String key, String group) {\r\n+        String value = url.getParameter(key);\r\n+        return getActivateExtension(url, StringUtils.isEmpty(value) ? null : COMMA_SPLIT_PATTERN.split(value), group);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get activate extensions.\r\n+     *\r\n+     * @param url    url\r\n+     * @param values extension point names\r\n+     * @param group  group\r\n+     * @return extension list which are activated\r\n+     * @see org.apache.dubbo.common.extension.Activate\r\n+     */\r\n+    public List<T> getActivateExtension(URL url, String[] values, String group) {\r\n+        List<T> activateExtensions = new ArrayList<>();\r\n+        List<String> names = values == null ? new ArrayList<>(0) : asList(values);\r\n+        if (!names.contains(REMOVE_VALUE_PREFIX + DEFAULT_KEY)) {\r\n+            getExtensionClasses();\r\n+            for (Map.Entry<String, Object> entry : cachedActivates.entrySet()) {\r\n+                String name = entry.getKey();\r\n+                Object activate = entry.getValue();\r\n+\r\n+                String[] activateGroup, activateValue;\r\n+\r\n+                if (activate instanceof Activate) {\r\n+                    activateGroup = ((Activate) activate).group();\r\n+                    activateValue = ((Activate) activate).value();\r\n+                } else if (activate instanceof com.alibaba.dubbo.common.extension.Activate) {\r\n+                    activateGroup = ((com.alibaba.dubbo.common.extension.Activate) activate).group();\r\n+                    activateValue = ((com.alibaba.dubbo.common.extension.Activate) activate).value();\r\n+                } else {\r\n+                    continue;\r\n+                }\r\n+                if (isMatchGroup(group, activateGroup)\r\n+                        && !names.contains(name)\r\n+                        && !names.contains(REMOVE_VALUE_PREFIX + name)\r\n+                        && isActive(activateValue, url)) {\r\n+                    activateExtensions.add(getExtension(name));\r\n+                }\r\n+            }\r\n+            activateExtensions.sort(ActivateComparator.COMPARATOR);\r\n+        }\r\n+        List<T> loadedExtensions = new ArrayList<>();\r\n+        for (int i = 0; i < names.size(); i++) {\r\n+            String name = names.get(i);\r\n+            if (!name.startsWith(REMOVE_VALUE_PREFIX)\r\n+                    && !names.contains(REMOVE_VALUE_PREFIX + name)) {\r\n+                if (DEFAULT_KEY.equals(name)) {\r\n+                    if (!loadedExtensions.isEmpty()) {\r\n+                        activateExtensions.addAll(0, loadedExtensions);\r\n+                        loadedExtensions.clear();\r\n+                    }\r\n+                } else {\r\n+                    loadedExtensions.add(getExtension(name));\r\n+                }\r\n+            }\r\n+        }\r\n+        if (!loadedExtensions.isEmpty()) {\r\n+            activateExtensions.addAll(loadedExtensions);\r\n+        }\r\n+        return activateExtensions;\r\n+    }\r\n+\r\n+    private boolean isMatchGroup(String group, String[] groups) {\r\n+        if (StringUtils.isEmpty(group)) {\r\n+            return true;\r\n+        }\r\n+        if (groups != null && groups.length > 0) {\r\n+            for (String g : groups) {\r\n+                if (group.equals(g)) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    private boolean isActive(String[] keys, URL url) {\r\n+        if (keys.length == 0) {\r\n+            return true;\r\n+        }\r\n+        for (String key : keys) {\r\n+            // @Active(value=\"key1:value1, key2:value2\")\r\n+            String keyValue = null;\r\n+            if (key.contains(\":\")) {\r\n+                String[] arr = key.split(\":\");\r\n+                key = arr[0];\r\n+                keyValue = arr[1];\r\n+            }\r\n+\r\n+            for (Map.Entry<String, String> entry : url.getParameters().entrySet()) {\r\n+                String k = entry.getKey();\r\n+                String v = entry.getValue();\r\n+                if ((k.equals(key) || k.endsWith(\".\" + key))\r\n+                        && ((keyValue != null && keyValue.equals(v)) || (keyValue == null && ConfigUtils.isNotEmpty(v)))) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get extension's instance. Return <code>null</code> if extension is not found or is not initialized. Pls. note\r\n+     * that this method will not trigger extension load.\r\n+     * <p>\r\n+     * In order to trigger extension load, call {@link #getExtension(String)} instead.\r\n+     *\r\n+     * @see #getExtension(String)\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public T getLoadedExtension(String name) {\r\n+        if (StringUtils.isEmpty(name)) {\r\n+            throw new IllegalArgumentException(\"Extension name == null\");\r\n+        }\r\n+        Holder<Object> holder = getOrCreateHolder(name);\r\n+        return (T) holder.get();\r\n+    }\r\n+\r\n+    private Holder<Object> getOrCreateHolder(String name) {\r\n+        Holder<Object> holder = cachedInstances.get(name);\r\n+        if (holder == null) {\r\n+            cachedInstances.putIfAbsent(name, new Holder<>());\r\n+            holder = cachedInstances.get(name);\r\n+        }\r\n+        return holder;\r\n+    }\r\n+\r\n+    /**\r\n+     * Return the list of extensions which are already loaded.\r\n+     * <p>\r\n+     * Usually {@link #getSupportedExtensions()} should be called in order to get all extensions.\r\n+     *\r\n+     * @see #getSupportedExtensions()\r\n+     */\r\n+    public Set<String> getLoadedExtensions() {\r\n+        return Collections.unmodifiableSet(new TreeSet<>(cachedInstances.keySet()));\r\n+    }\r\n+\r\n+    public List<T> getLoadedExtensionInstances() {\r\n+        List<T> instances = new ArrayList<>();\r\n+        cachedInstances.values().forEach(holder -> instances.add((T) holder.get()));\r\n+        return instances;\r\n+    }\r\n+\r\n+    public Object getLoadedAdaptiveExtensionInstances() {\r\n+        return cachedAdaptiveInstance.get();\r\n+    }\r\n+\r\n+//    public T getPrioritizedExtensionInstance() {\r\n+//        Set<String> supported = getSupportedExtensions();\r\n+//\r\n+//        Set<T> instances = new HashSet<>();\r\n+//        Set<T> prioritized = new HashSet<>();\r\n+//        for (String s : supported) {\r\n+//\r\n+//        }\r\n+//\r\n+//    }\r\n+\r\n+    /**\r\n+     * Find the extension with the given name. If the specified name is not found, then {@link IllegalStateException}\r\n+     * will be thrown.\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public T getExtension(String name) {\r\n+        return getExtension(name, true);\r\n+    }\r\n+\r\n+    public T getExtension(String name, boolean wrap) {\r\n+        if (StringUtils.isEmpty(name)) {\r\n+            throw new IllegalArgumentException(\"Extension name == null\");\r\n+        }\r\n+        if (\"true\".equals(name)) {\r\n+            return getDefaultExtension();\r\n+        }\r\n+        final Holder<Object> holder = getOrCreateHolder(name);\r\n+        Object instance = holder.get();\r\n+        if (instance == null) {\r\n+            synchronized (holder) {\r\n+                instance = holder.get();\r\n+                if (instance == null) {\r\n+                    instance = createExtension(name, wrap);\r\n+                    holder.set(instance);\r\n+                }\r\n+            }\r\n+        }\r\n+        return (T) instance;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the extension by specified name if found, or {@link #getDefaultExtension() returns the default one}\r\n+     *\r\n+     * @param name the name of extension\r\n+     * @return non-null\r\n+     */\r\n+    public T getOrDefaultExtension(String name) {\r\n+        return containsExtension(name) ? getExtension(name) : getDefaultExtension();\r\n+    }\r\n+\r\n+    /**\r\n+     * Return default extension, return <code>null</code> if it's not configured.\r\n+     */\r\n+    public T getDefaultExtension() {\r\n+        getExtensionClasses();\r\n+        if (StringUtils.isBlank(cachedDefaultName) || \"true\".equals(cachedDefaultName)) {\r\n+            return null;\r\n+        }\r\n+        return getExtension(cachedDefaultName);\r\n+    }\r\n+\r\n+    public boolean hasExtension(String name) {\r\n+        if (StringUtils.isEmpty(name)) {\r\n+            throw new IllegalArgumentException(\"Extension name == null\");\r\n+        }\r\n+        Class<?> c = this.getExtensionClass(name);\r\n+        return c != null;\r\n+    }\r\n+\r\n+    public Set<String> getSupportedExtensions() {\r\n+        Map<String, Class<?>> clazzes = getExtensionClasses();\r\n+        return Collections.unmodifiableSet(new TreeSet<>(clazzes.keySet()));\r\n+    }\r\n+\r\n+    public Set<T> getSupportedExtensionInstances() {\r\n+        List<T> instances = new LinkedList<>();\r\n+        Set<String> supportedExtensions = getSupportedExtensions();\r\n+        if (CollectionUtils.isNotEmpty(supportedExtensions)) {\r\n+            for (String name : supportedExtensions) {\r\n+                instances.add(getExtension(name));\r\n+            }\r\n+        }\r\n+        // sort the Prioritized instances\r\n+        sort(instances, Prioritized.COMPARATOR);\r\n+        return new LinkedHashSet<>(instances);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return default extension name, return <code>null</code> if not configured.\r\n+     */\r\n+    public String getDefaultExtensionName() {\r\n+        getExtensionClasses();\r\n+        return cachedDefaultName;\r\n+    }\r\n+\r\n+    /**\r\n+     * Register new extension via API\r\n+     *\r\n+     * @param name  extension name\r\n+     * @param clazz extension class\r\n+     * @throws IllegalStateException when extension with the same name has already been registered.\r\n+     */\r\n+    public void addExtension(String name, Class<?> clazz) {\r\n+        getExtensionClasses(); // load classes\r\n+\r\n+        if (!type.isAssignableFrom(clazz)) {\r\n+            throw new IllegalStateException(\"Input type \" +\r\n+                    clazz + \" doesn't implement the Extension \" + type);\r\n+        }\r\n+        if (clazz.isInterface()) {\r\n+            throw new IllegalStateException(\"Input type \" +\r\n+                    clazz + \" can't be interface!\");\r\n+        }\r\n+\r\n+        if (!clazz.isAnnotationPresent(Adaptive.class)) {\r\n+            if (StringUtils.isBlank(name)) {\r\n+                throw new IllegalStateException(\"Extension name is blank (Extension \" + type + \")!\");\r\n+            }\r\n+            if (cachedClasses.get().containsKey(name)) {\r\n+                throw new IllegalStateException(\"Extension name \" +\r\n+                        name + \" already exists (Extension \" + type + \")!\");\r\n+            }\r\n+\r\n+            cachedNames.put(clazz, name);\r\n+            cachedClasses.get().put(name, clazz);\r\n+        } else {\r\n+            if (cachedAdaptiveClass != null) {\r\n+                throw new IllegalStateException(\"Adaptive Extension already exists (Extension \" + type + \")!\");\r\n+            }\r\n+\r\n+            cachedAdaptiveClass = clazz;\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Replace the existing extension via API\r\n+     *\r\n+     * @param name  extension name\r\n+     * @param clazz extension class\r\n+     * @throws IllegalStateException when extension to be placed doesn't exist\r\n+     * @deprecated not recommended any longer, and use only when test\r\n+     */\r\n+    @Deprecated\r\n+    public void replaceExtension(String name, Class<?> clazz) {\r\n+        getExtensionClasses(); // load classes\r\n+\r\n+        if (!type.isAssignableFrom(clazz)) {\r\n+            throw new IllegalStateException(\"Input type \" +\r\n+                    clazz + \" doesn't implement Extension \" + type);\r\n+        }\r\n+        if (clazz.isInterface()) {\r\n+            throw new IllegalStateException(\"Input type \" +\r\n+                    clazz + \" can't be interface!\");\r\n+        }\r\n+\r\n+        if (!clazz.isAnnotationPresent(Adaptive.class)) {\r\n+            if (StringUtils.isBlank(name)) {\r\n+                throw new IllegalStateException(\"Extension name is blank (Extension \" + type + \")!\");\r\n+            }\r\n+            if (!cachedClasses.get().containsKey(name)) {\r\n+                throw new IllegalStateException(\"Extension name \" +\r\n+                        name + \" doesn't exist (Extension \" + type + \")!\");\r\n+            }\r\n+\r\n+            cachedNames.put(clazz, name);\r\n+            cachedClasses.get().put(name, clazz);\r\n+            cachedInstances.remove(name);\r\n+        } else {\r\n+            if (cachedAdaptiveClass == null) {\r\n+                throw new IllegalStateException(\"Adaptive Extension doesn't exist (Extension \" + type + \")!\");\r\n+            }\r\n+\r\n+            cachedAdaptiveClass = clazz;\r\n+            cachedAdaptiveInstance.set(null);\r\n+        }\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public T getAdaptiveExtension() {\r\n+        Object instance = cachedAdaptiveInstance.get();\r\n+        if (instance == null) {\r\n+            if (createAdaptiveInstanceError != null) {\r\n+                throw new IllegalStateException(\"Failed to create adaptive instance: \" +\r\n+                        createAdaptiveInstanceError.toString(),\r\n+                        createAdaptiveInstanceError);\r\n+            }\r\n+\r\n+            synchronized (cachedAdaptiveInstance) {\r\n+                instance = cachedAdaptiveInstance.get();\r\n+                if (instance == null) {\r\n+                    try {\r\n+                        instance = createAdaptiveExtension();\r\n+                        cachedAdaptiveInstance.set(instance);\r\n+                    } catch (Throwable t) {\r\n+                        createAdaptiveInstanceError = t;\r\n+                        throw new IllegalStateException(\"Failed to create adaptive instance: \" + t.toString(), t);\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return (T) instance;\r\n+    }\r\n+\r\n+    private IllegalStateException findException(String name) {\r\n+        StringBuilder buf = new StringBuilder(\"No such extension \" + type.getName() + \" by name \" + name);\r\n+\r\n+        int i = 1;\r\n+        for (Map.Entry<String, IllegalStateException> entry : exceptions.entrySet()) {\r\n+            if (entry.getKey().toLowerCase().startsWith(name.toLowerCase())) {\r\n+                if (i == 1) {\r\n+                    buf.append(\", possible causes: \");\r\n+                }\r\n+                buf.append(\"\\r\\n(\");\r\n+                buf.append(i++);\r\n+                buf.append(\") \");\r\n+                buf.append(entry.getKey());\r\n+                buf.append(\":\\r\\n\");\r\n+                buf.append(StringUtils.toString(entry.getValue()));\r\n+            }\r\n+        }\r\n+\r\n+        if (i == 1) {\r\n+            buf.append(\", no related exception was found, please check whether related SPI module is missing.\");\r\n+        }\r\n+        return new IllegalStateException(buf.toString());\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private T createExtension(String name, boolean wrap) {\r\n+        Class<?> clazz = getExtensionClasses().get(name);\r\n+        if (clazz == null) {\r\n+            throw findException(name);\r\n+        }\r\n+        try {\r\n+            T instance = (T) EXTENSION_INSTANCES.get(clazz);\r\n+            if (instance == null) {\r\n+                EXTENSION_INSTANCES.putIfAbsent(clazz, clazz.getDeclaredConstructor().newInstance());\r\n+                instance = (T) EXTENSION_INSTANCES.get(clazz);\r\n+            }\r\n+            injectExtension(instance);\r\n+\r\n+\r\n+            if (wrap) {\r\n+\r\n+                List<Class<?>> wrapperClassesList = new ArrayList<>();\r\n+                if (cachedWrapperClasses != null) {\r\n+                    wrapperClassesList.addAll(cachedWrapperClasses);\r\n+                    wrapperClassesList.sort(WrapperComparator.COMPARATOR);\r\n+                    Collections.reverse(wrapperClassesList);\r\n+                }\r\n+\r\n+                if (CollectionUtils.isNotEmpty(wrapperClassesList)) {\r\n+                    for (Class<?> wrapperClass : wrapperClassesList) {\r\n+                        Wrapper wrapper = wrapperClass.getAnnotation(Wrapper.class);\r\n+                        if (wrapper == null\r\n+                                || (ArrayUtils.contains(wrapper.matches(), name) && !ArrayUtils.contains(wrapper.mismatches(), name))) {\r\n+                            instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+\r\n+            initExtension(instance);\r\n+            return instance;\r\n+        } catch (Throwable t) {\r\n+            throw new IllegalStateException(\"Extension instance (name: \" + name + \", class: \" +\r\n+                    type + \") couldn't be instantiated: \" + t.getMessage(), t);\r\n+        }\r\n+    }\r\n+\r\n+    private boolean containsExtension(String name) {\r\n+        return getExtensionClasses().containsKey(name);\r\n+    }\r\n+\r\n+    private T injectExtension(T instance) {\r\n+\r\n+        if (objectFactory == null) {\r\n+            return instance;\r\n+        }\r\n+\r\n+        try {\r\n+            for (Method method : instance.getClass().getMethods()) {\r\n+                if (!isSetter(method)) {\r\n+                    continue;\r\n+                }\r\n+                /**\r\n+                 * Check {@link DisableInject} to see if we need auto injection for this property\r\n+                 */\r\n+                if (method.getAnnotation(DisableInject.class) != null) {\r\n+                    continue;\r\n+                }\r\n+                Class<?> pt = method.getParameterTypes()[0];\r\n+                if (ReflectUtils.isPrimitives(pt)) {\r\n+                    continue;\r\n+                }\r\n+\r\n+                try {\r\n+                    String property = getSetterProperty(method);\r\n+                    Object object = objectFactory.getExtension(pt, property);\r\n+                    if (object != null) {\r\n+                        method.invoke(instance, object);\r\n+                    }\r\n+                } catch (Exception e) {\r\n+                    logger.error(\"Failed to inject via method \" + method.getName()\r\n+                            + \" of interface \" + type.getName() + \": \" + e.getMessage(), e);\r\n+                }\r\n+\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.error(e.getMessage(), e);\r\n+        }\r\n+        return instance;\r\n+    }\r\n+\r\n+    private void initExtension(T instance) {\r\n+        if (instance instanceof Lifecycle) {\r\n+            Lifecycle lifecycle = (Lifecycle) instance;\r\n+            lifecycle.initialize();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * get properties name for setter, for instance: setVersion, return \"version\"\r\n+     * <p>\r\n+     * return \"\", if setter name with length less than 3\r\n+     */\r\n+    private String getSetterProperty(Method method) {\r\n+        return method.getName().length() > 3 ? method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4) : \"\";\r\n+    }\r\n+\r\n+    /**\r\n+     * return true if and only if:\r\n+     * <p>\r\n+     * 1, public\r\n+     * <p>\r\n+     * 2, name starts with \"set\"\r\n+     * <p>\r\n+     * 3, only has one parameter\r\n+     */\r\n+    private boolean isSetter(Method method) {\r\n+        return method.getName().startsWith(\"set\")\r\n+                && method.getParameterTypes().length == 1\r\n+                && Modifier.isPublic(method.getModifiers());\r\n+    }\r\n+\r\n+    private Class<?> getExtensionClass(String name) {\r\n+        if (type == null) {\r\n+            throw new IllegalArgumentException(\"Extension type == null\");\r\n+        }\r\n+        if (name == null) {\r\n+            throw new IllegalArgumentException(\"Extension name == null\");\r\n+        }\r\n+        return getExtensionClasses().get(name);\r\n+    }\r\n+\r\n+    private Map<String, Class<?>> getExtensionClasses() {\r\n+        Map<String, Class<?>> classes = cachedClasses.get();\r\n+        if (classes == null) {\r\n+            synchronized (cachedClasses) {\r\n+                classes = cachedClasses.get();\r\n+                if (classes == null) {\r\n+                    classes = loadExtensionClasses();\r\n+                    cachedClasses.set(classes);\r\n+                }\r\n+            }\r\n+        }\r\n+        return classes;\r\n+    }\r\n+\r\n+    /**\r\n+     * synchronized in getExtensionClasses\r\n+     */\r\n+    private Map<String, Class<?>> loadExtensionClasses() {\r\n+        cacheDefaultExtensionName();\r\n+\r\n+        Map<String, Class<?>> extensionClasses = new HashMap<>();\r\n+\r\n+        for (LoadingStrategy strategy : strategies) {\r\n+            loadDirectory(extensionClasses, strategy.directory(), type.getName(), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages());\r\n+            loadDirectory(extensionClasses, strategy.directory(), type.getName().replace(\"org.apache\", \"com.alibaba\"), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages());\r\n+        }\r\n+\r\n+        return extensionClasses;\r\n+    }\r\n+\r\n+    /**\r\n+     * extract and cache default extension name if exists\r\n+     */\r\n+    private void cacheDefaultExtensionName() {\r\n+        final SPI defaultAnnotation = type.getAnnotation(SPI.class);\r\n+        if (defaultAnnotation == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        String value = defaultAnnotation.value();\r\n+        if ((value = value.trim()).length() > 0) {\r\n+            String[] names = NAME_SEPARATOR.split(value);\r\n+            if (names.length > 1) {\r\n+                throw new IllegalStateException(\"More than 1 default extension name on extension \" + type.getName()\r\n+                        + \": \" + Arrays.toString(names));\r\n+            }\r\n+            if (names.length == 1) {\r\n+                cachedDefaultName = names[0];\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type) {\r\n+        loadDirectory(extensionClasses, dir, type, false, false);\r\n+    }\r\n+\r\n+    private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type,\r\n+                               boolean extensionLoaderClassLoaderFirst, boolean overridden, String... excludedPackages) {\r\n+        String fileName = dir + type;\r\n+        try {\r\n+            Enumeration<java.net.URL> urls = null;\r\n+            ClassLoader classLoader = findClassLoader();\r\n+\r\n+            // try to load from ExtensionLoader's ClassLoader first\r\n+            if (extensionLoaderClassLoaderFirst) {\r\n+                ClassLoader extensionLoaderClassLoader = ExtensionLoader.class.getClassLoader();\r\n+                if (ClassLoader.getSystemClassLoader() != extensionLoaderClassLoader) {\r\n+                    urls = extensionLoaderClassLoader.getResources(fileName);\r\n+                }\r\n+            }\r\n+\r\n+            if (urls == null || !urls.hasMoreElements()) {\r\n+                if (classLoader != null) {\r\n+                    urls = classLoader.getResources(fileName);\r\n+                } else {\r\n+                    urls = ClassLoader.getSystemResources(fileName);\r\n+                }\r\n+            }\r\n+\r\n+            if (urls != null) {\r\n+                while (urls.hasMoreElements()) {\r\n+                    java.net.URL resourceURL = urls.nextElement();\r\n+                    loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages);\r\n+                }\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.error(\"Exception occurred when loading extension class (interface: \" +\r\n+                    type + \", description file: \" + fileName + \").\", t);\r\n+        }\r\n+    }\r\n+\r\n+    private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader,\r\n+                              java.net.URL resourceURL, boolean overridden, String... excludedPackages) {\r\n+        try {\r\n+            try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), StandardCharsets.UTF_8))) {\r\n+                String line;\r\n+                String clazz = null;\r\n+                while ((line = reader.readLine()) != null) {\r\n+                    final int ci = line.indexOf('#');\r\n+                    if (ci >= 0) {\r\n+                        line = line.substring(0, ci);\r\n+                    }\r\n+                    line = line.trim();\r\n+                    if (line.length() > 0) {\r\n+                        try {\r\n+                            String name = null;\r\n+                            int i = line.indexOf('=');\r\n+                            if (i > 0) {\r\n+                                name = line.substring(0, i).trim();\r\n+                                clazz = line.substring(i + 1).trim();\r\n+                            } else {\r\n+                                clazz = line;\r\n+                            }\r\n+                            if (StringUtils.isNotEmpty(clazz) && !isExcluded(clazz, excludedPackages)) {\r\n+                                loadClass(extensionClasses, resourceURL, Class.forName(clazz, true, classLoader), name, overridden);\r\n+                            }\r\n+                        } catch (Throwable t) {\r\n+                            IllegalStateException e = new IllegalStateException(\"Failed to load extension class (interface: \" + type + \", class line: \" + line + \") in \" + resourceURL + \", cause: \" + t.getMessage(), t);\r\n+                            exceptions.put(line, e);\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.error(\"Exception occurred when loading extension class (interface: \" +\r\n+                    type + \", class file: \" + resourceURL + \") in \" + resourceURL, t);\r\n+        }\r\n+    }\r\n+\r\n+    private boolean isExcluded(String className, String... excludedPackages) {\r\n+        if (excludedPackages != null) {\r\n+            for (String excludePackage : excludedPackages) {\r\n+                if (className.startsWith(excludePackage + \".\")) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL, Class<?> clazz, String name,\r\n+                           boolean overridden) throws NoSuchMethodException {\r\n+        if (!type.isAssignableFrom(clazz)) {\r\n+            throw new IllegalStateException(\"Error occurred when loading extension class (interface: \" +\r\n+                    type + \", class line: \" + clazz.getName() + \"), class \"\r\n+                    + clazz.getName() + \" is not subtype of interface.\");\r\n+        }\r\n+        if (clazz.isAnnotationPresent(Adaptive.class)) {\r\n+            cacheAdaptiveClass(clazz, overridden);\r\n+        } else if (isWrapperClass(clazz)) {\r\n+            cacheWrapperClass(clazz);\r\n+        } else {\r\n+            clazz.getConstructor();\r\n+            if (StringUtils.isEmpty(name)) {\r\n+                name = findAnnotationName(clazz);\r\n+                if (name.length() == 0) {\r\n+                    throw new IllegalStateException(\"No such extension name for the class \" + clazz.getName() + \" in the config \" + resourceURL);\r\n+                }\r\n+            }\r\n+\r\n+            String[] names = NAME_SEPARATOR.split(name);\r\n+            if (ArrayUtils.isNotEmpty(names)) {\r\n+                cacheActivateClass(clazz, names[0]);\r\n+                for (String n : names) {\r\n+                    cacheName(clazz, n);\r\n+                    saveInExtensionClass(extensionClasses, clazz, n, overridden);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * cache name\r\n+     */\r\n+    private void cacheName(Class<?> clazz, String name) {\r\n+        if (!cachedNames.containsKey(clazz)) {\r\n+            cachedNames.put(clazz, name);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * put clazz in extensionClasses\r\n+     */\r\n+    private void saveInExtensionClass(Map<String, Class<?>> extensionClasses, Class<?> clazz, String name, boolean overridden) {\r\n+        Class<?> c = extensionClasses.get(name);\r\n+        if (c == null || overridden) {\r\n+            extensionClasses.put(name, clazz);\r\n+        } else if (c != clazz) {\r\n+            String duplicateMsg = \"Duplicate extension \" + type.getName() + \" name \" + name + \" on \" + c.getName() + \" and \" + clazz.getName();\r\n+            logger.error(duplicateMsg);\r\n+            throw new IllegalStateException(duplicateMsg);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * cache Activate class which is annotated with <code>Activate</code>\r\n+     * <p>\r\n+     * for compatibility, also cache class with old alibaba Activate annotation\r\n+     */\r\n+    private void cacheActivateClass(Class<?> clazz, String name) {\r\n+        Activate activate = clazz.getAnnotation(Activate.class);\r\n+        if (activate != null) {\r\n+            cachedActivates.put(name, activate);\r\n+        } else {\r\n+            // support com.alibaba.dubbo.common.extension.Activate\r\n+            com.alibaba.dubbo.common.extension.Activate oldActivate = clazz.getAnnotation(com.alibaba.dubbo.common.extension.Activate.class);\r\n+            if (oldActivate != null) {\r\n+                cachedActivates.put(name, oldActivate);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * cache Adaptive class which is annotated with <code>Adaptive</code>\r\n+     */\r\n+    private void cacheAdaptiveClass(Class<?> clazz, boolean overridden) {\r\n+        if (cachedAdaptiveClass == null || overridden) {\r\n+            cachedAdaptiveClass = clazz;\r\n+        } else if (!cachedAdaptiveClass.equals(clazz)) {\r\n+            throw new IllegalStateException(\"More than 1 adaptive class found: \"\r\n+                    + cachedAdaptiveClass.getName()\r\n+                    + \", \" + clazz.getName());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * cache wrapper class\r\n+     * <p>\r\n+     * like: ProtocolFilterWrapper, ProtocolListenerWrapper\r\n+     */\r\n+    private void cacheWrapperClass(Class<?> clazz) {\r\n+        if (cachedWrapperClasses == null) {\r\n+            cachedWrapperClasses = new ConcurrentHashSet<>();\r\n+        }\r\n+        cachedWrapperClasses.add(clazz);\r\n+    }\r\n+\r\n+    /**\r\n+     * test if clazz is a wrapper class\r\n+     * <p>\r\n+     * which has Constructor with given class type as its only argument\r\n+     */\r\n+    private boolean isWrapperClass(Class<?> clazz) {\r\n+        try {\r\n+            clazz.getConstructor(type);\r\n+            return true;\r\n+        } catch (NoSuchMethodException e) {\r\n+            return false;\r\n+        }\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"deprecation\")\r\n+    private String findAnnotationName(Class<?> clazz) {\r\n+        org.apache.dubbo.common.Extension extension = clazz.getAnnotation(org.apache.dubbo.common.Extension.class);\r\n+        if (extension != null) {\r\n+            return extension.value();\r\n+        }\r\n+\r\n+        String name = clazz.getSimpleName();\r\n+        if (name.endsWith(type.getSimpleName())) {\r\n+            name = name.substring(0, name.length() - type.getSimpleName().length());\r\n+        }\r\n+        return name.toLowerCase();\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private T createAdaptiveExtension() {\r\n+        try {\r\n+            return injectExtension((T) getAdaptiveExtensionClass().newInstance());\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(\"Can't create adaptive extension \" + type + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    private Class<?> getAdaptiveExtensionClass() {\r\n+        getExtensionClasses();\r\n+        if (cachedAdaptiveClass != null) {\r\n+            return cachedAdaptiveClass;\r\n+        }\r\n+        return cachedAdaptiveClass = createAdaptiveExtensionClass();\r\n+    }\r\n+\r\n+    private Class<?> createAdaptiveExtensionClass() {\r\n+        String code = new AdaptiveClassCodeGenerator(type, cachedDefaultName).generate();\r\n+        ClassLoader classLoader = findClassLoader();\r\n+        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();\r\n+        return compiler.compile(code, classLoader);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return this.getClass().getName() + \"[\" + type.getName() + \"]\";\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/LoadingStrategy.java", "source2": "org/apache/dubbo/common/extension/LoadingStrategy.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,42 +1,42 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-import org.apache.dubbo.common.lang.Prioritized;\n-\n-public interface LoadingStrategy extends Prioritized {\n-\n-    String directory();\n-\n-    default boolean preferExtensionClassLoader() {\n-        return false;\n-    }\n-\n-    default String[] excludedPackages() {\n-        return null;\n-    }\n-\n-    /**\n-     * Indicates current {@link LoadingStrategy} supports overriding other lower prioritized instances or not.\n-     *\n-     * @return if supports, return <code>true</code>, or <code>false</code>\n-     * @since 2.7.7\n-     */\n-    default boolean overridden() {\n-        return false;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+\r\n+public interface LoadingStrategy extends Prioritized {\r\n+\r\n+    String directory();\r\n+\r\n+    default boolean preferExtensionClassLoader() {\r\n+        return false;\r\n+    }\r\n+\r\n+    default String[] excludedPackages() {\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Indicates current {@link LoadingStrategy} supports overriding other lower prioritized instances or not.\r\n+     *\r\n+     * @return if supports, return <code>true</code>, or <code>false</code>\r\n+     * @since 2.7.7\r\n+     */\r\n+    default boolean overridden() {\r\n+        return false;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/ServicesLoadingStrategy.java", "source2": "org/apache/dubbo/common/extension/ServicesLoadingStrategy.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,41 +1,41 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-/**\n- * Services {@link LoadingStrategy}\n- *\n- * @since 2.7.7\n- */\n-public class ServicesLoadingStrategy implements LoadingStrategy {\n-\n-    @Override\n-    public String directory() {\n-        return \"META-INF/services/\";\n-    }\n-\n-    @Override\n-    public boolean overridden() {\n-        return true;\n-    }\n-\n-    @Override\n-    public int getPriority() {\n-        return MIN_PRIORITY;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+/**\r\n+ * Services {@link LoadingStrategy}\r\n+ *\r\n+ * @since 2.7.7\r\n+ */\r\n+public class ServicesLoadingStrategy implements LoadingStrategy {\r\n+\r\n+    @Override\r\n+    public String directory() {\r\n+        return \"META-INF/services/\";\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean overridden() {\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPriority() {\r\n+        return MIN_PRIORITY;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/Wrapper.java", "source2": "org/apache/dubbo/common/extension/Wrapper.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,37 +1,37 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension;\n-\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-\n-/**\n- * The annotated class will only work as a wrapper when the condition matches.\n- */\n-@Retention(RetentionPolicy.RUNTIME)\n-public @interface Wrapper {\n-\n-    /**\n-     * the extension names that need to be wrapped.\n-     */\n-    String[] matches() default {};\n-\n-    /**\n-     * the extension names that need to be excluded.\n-     */\n-    String[] mismatches() default {};\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension;\r\n+\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+\r\n+/**\r\n+ * The annotated class will only work as a wrapper when the condition matches.\r\n+ */\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+public @interface Wrapper {\r\n+\r\n+    /**\r\n+     * the extension names that need to be wrapped.\r\n+     */\r\n+    String[] matches() default {};\r\n+\r\n+    /**\r\n+     * the extension names that need to be excluded.\r\n+     */\r\n+    String[] mismatches() default {};\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/extension/support/WrapperComparator.java", "source2": "org/apache/dubbo/common/extension/support/WrapperComparator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,95 +1,95 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.extension.support;\n-\n-import org.apache.dubbo.common.extension.Activate;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import java.util.Comparator;\n-\n-/**\n- * OrderComparator\n- */\n-public class WrapperComparator implements Comparator<Object> {\n-\n-    public static final Comparator<Object> COMPARATOR = new WrapperComparator();\n-\n-    @Override\n-    public int compare(Object o1, Object o2) {\n-        if (o1 == null && o2 == null) {\n-            return 0;\n-        }\n-        if (o1 == null) {\n-            return -1;\n-        }\n-        if (o2 == null) {\n-            return 1;\n-        }\n-        if (o1.equals(o2)) {\n-            return 0;\n-        }\n-\n-        Class clazz1 = (Class) o1;\n-        Class clazz2 = (Class) o2;\n-\n-        Class<?> inf = findSpi(clazz1);\n-\n-        OrderInfo a1 = parseOrder(clazz1);\n-        OrderInfo a2 = parseOrder(clazz2);\n-\n-        int n1 = a1 == null ? 0 : a1.order;\n-        int n2 = a2 == null ? 0 : a2.order;\n-        // never return 0 even if n1 equals n2, otherwise, o1 and o2 will override each other in collection like HashSet\n-        return n1 > n2 ? 1 : -1;\n-    }\n-\n-    private Class<?> findSpi(Class clazz) {\n-        if (clazz.getInterfaces().length == 0) {\n-            return null;\n-        }\n-\n-        for (Class<?> intf : clazz.getInterfaces()) {\n-            if (intf.isAnnotationPresent(SPI.class)) {\n-                return intf;\n-            } else {\n-                Class result = findSpi(intf);\n-                if (result != null) {\n-                    return result;\n-                }\n-            }\n-        }\n-\n-        return null;\n-    }\n-\n-    private OrderInfo parseOrder(Class<?> clazz) {\n-        OrderInfo info = new OrderInfo();\n-        if (clazz.isAnnotationPresent(Activate.class)) {\n-            Activate activate = clazz.getAnnotation(Activate.class);\n-            info.order = activate.order();\n-        } else if (clazz.isAnnotationPresent(com.alibaba.dubbo.common.extension.Activate.class)) {\n-            com.alibaba.dubbo.common.extension.Activate activate = clazz.getAnnotation(\n-                    com.alibaba.dubbo.common.extension.Activate.class);\n-            info.order = activate.order();\n-        }\n-        return info;\n-    }\n-\n-    private static class OrderInfo {\n-        private int order;\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.extension.support;\r\n+\r\n+import org.apache.dubbo.common.extension.Activate;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import java.util.Comparator;\r\n+\r\n+/**\r\n+ * OrderComparator\r\n+ */\r\n+public class WrapperComparator implements Comparator<Object> {\r\n+\r\n+    public static final Comparator<Object> COMPARATOR = new WrapperComparator();\r\n+\r\n+    @Override\r\n+    public int compare(Object o1, Object o2) {\r\n+        if (o1 == null && o2 == null) {\r\n+            return 0;\r\n+        }\r\n+        if (o1 == null) {\r\n+            return -1;\r\n+        }\r\n+        if (o2 == null) {\r\n+            return 1;\r\n+        }\r\n+        if (o1.equals(o2)) {\r\n+            return 0;\r\n+        }\r\n+\r\n+        Class clazz1 = (Class) o1;\r\n+        Class clazz2 = (Class) o2;\r\n+\r\n+        Class<?> inf = findSpi(clazz1);\r\n+\r\n+        OrderInfo a1 = parseOrder(clazz1);\r\n+        OrderInfo a2 = parseOrder(clazz2);\r\n+\r\n+        int n1 = a1 == null ? 0 : a1.order;\r\n+        int n2 = a2 == null ? 0 : a2.order;\r\n+        // never return 0 even if n1 equals n2, otherwise, o1 and o2 will override each other in collection like HashSet\r\n+        return n1 > n2 ? 1 : -1;\r\n+    }\r\n+\r\n+    private Class<?> findSpi(Class clazz) {\r\n+        if (clazz.getInterfaces().length == 0) {\r\n+            return null;\r\n+        }\r\n+\r\n+        for (Class<?> intf : clazz.getInterfaces()) {\r\n+            if (intf.isAnnotationPresent(SPI.class)) {\r\n+                return intf;\r\n+            } else {\r\n+                Class result = findSpi(intf);\r\n+                if (result != null) {\r\n+                    return result;\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return null;\r\n+    }\r\n+\r\n+    private OrderInfo parseOrder(Class<?> clazz) {\r\n+        OrderInfo info = new OrderInfo();\r\n+        if (clazz.isAnnotationPresent(Activate.class)) {\r\n+            Activate activate = clazz.getAnnotation(Activate.class);\r\n+            info.order = activate.order();\r\n+        } else if (clazz.isAnnotationPresent(com.alibaba.dubbo.common.extension.Activate.class)) {\r\n+            com.alibaba.dubbo.common.extension.Activate activate = clazz.getAnnotation(\r\n+                    com.alibaba.dubbo.common.extension.Activate.class);\r\n+            info.order = activate.order();\r\n+        }\r\n+        return info;\r\n+    }\r\n+\r\n+    private static class OrderInfo {\r\n+        private int order;\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/function/Predicates.java", "source2": "org/apache/dubbo/common/function/Predicates.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,74 +1,74 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.function;\n-\n-import java.util.function.Predicate;\n-\n-import static java.util.stream.Stream.of;\n-\n-/**\n- * The utilities class for Java {@link Predicate}\n- *\n- * @since 2.7.5\n- */\n-public interface Predicates {\n-\n-    Predicate[] EMPTY_ARRAY = new Predicate[0];\n-\n-    /**\n-     * {@link Predicate} always return <code>true</code>\n-     *\n-     * @param <T> the type to test\n-     * @return <code>true</code>\n-     */\n-    static <T> Predicate<T> alwaysTrue() {\n-        return e -> true;\n-    }\n-\n-    /**\n-     * {@link Predicate} always return <code>false</code>\n-     *\n-     * @param <T> the type to test\n-     * @return <code>false</code>\n-     */\n-    static <T> Predicate<T> alwaysFalse() {\n-        return e -> false;\n-    }\n-\n-    /**\n-     * a composed predicate that represents a short-circuiting logical AND of {@link Predicate predicates}\n-     *\n-     * @param predicates {@link Predicate predicates}\n-     * @param <T>        the type to test\n-     * @return non-null\n-     */\n-    static <T> Predicate<T> and(Predicate<T>... predicates) {\n-        return of(predicates).reduce((a, b) -> a.and(b)).orElseGet(Predicates::alwaysTrue);\n-    }\n-\n-    /**\n-     * a composed predicate that represents a short-circuiting logical OR of {@link Predicate predicates}\n-     *\n-     * @param predicates {@link Predicate predicates}\n-     * @param <T>        the detected type\n-     * @return non-null\n-     */\n-    static <T> Predicate<T> or(Predicate<T>... predicates) {\n-        return of(predicates).reduce((a, b) -> a.or(b)).orElse(e -> true);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.function;\r\n+\r\n+import java.util.function.Predicate;\r\n+\r\n+import static java.util.stream.Stream.of;\r\n+\r\n+/**\r\n+ * The utilities class for Java {@link Predicate}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface Predicates {\r\n+\r\n+    Predicate[] EMPTY_ARRAY = new Predicate[0];\r\n+\r\n+    /**\r\n+     * {@link Predicate} always return <code>true</code>\r\n+     *\r\n+     * @param <T> the type to test\r\n+     * @return <code>true</code>\r\n+     */\r\n+    static <T> Predicate<T> alwaysTrue() {\r\n+        return e -> true;\r\n+    }\r\n+\r\n+    /**\r\n+     * {@link Predicate} always return <code>false</code>\r\n+     *\r\n+     * @param <T> the type to test\r\n+     * @return <code>false</code>\r\n+     */\r\n+    static <T> Predicate<T> alwaysFalse() {\r\n+        return e -> false;\r\n+    }\r\n+\r\n+    /**\r\n+     * a composed predicate that represents a short-circuiting logical AND of {@link Predicate predicates}\r\n+     *\r\n+     * @param predicates {@link Predicate predicates}\r\n+     * @param <T>        the type to test\r\n+     * @return non-null\r\n+     */\r\n+    static <T> Predicate<T> and(Predicate<T>... predicates) {\r\n+        return of(predicates).reduce((a, b) -> a.and(b)).orElseGet(Predicates::alwaysTrue);\r\n+    }\r\n+\r\n+    /**\r\n+     * a composed predicate that represents a short-circuiting logical OR of {@link Predicate predicates}\r\n+     *\r\n+     * @param predicates {@link Predicate predicates}\r\n+     * @param <T>        the detected type\r\n+     * @return non-null\r\n+     */\r\n+    static <T> Predicate<T> or(Predicate<T>... predicates) {\r\n+        return of(predicates).reduce((a, b) -> a.or(b)).orElse(e -> true);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/function/Streams.java", "source2": "org/apache/dubbo/common/function/Streams.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.function;\n-\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Set;\n-import java.util.function.Predicate;\n-import java.util.stream.Stream;\n-\n-import static java.util.stream.Collectors.toList;\n-import static java.util.stream.StreamSupport.stream;\n-import static org.apache.dubbo.common.function.Predicates.and;\n-import static org.apache.dubbo.common.function.Predicates.or;\n-\n-/**\n- * The utilities class for {@link Stream}\n- *\n- * @since 2.7.5\n- */\n-public interface Streams {\n-\n-    static <T, S extends Iterable<T>> Stream<T> filterStream(S values, Predicate<T> predicate) {\n-        return stream(values.spliterator(), false).filter(predicate);\n-    }\n-\n-    static <T, S extends Iterable<T>> List<T> filterList(S values, Predicate<T> predicate) {\n-        return filterStream(values, predicate).collect(toList());\n-    }\n-\n-    static <T, S extends Iterable<T>> Set<T> filterSet(S values, Predicate<T> predicate) {\n-        // new Set with insertion order\n-        return filterStream(values, predicate).collect(LinkedHashSet::new, Set::add, Set::addAll);\n-    }\n-\n-    static <T, S extends Iterable<T>> S filter(S values, Predicate<T> predicate) {\n-        final boolean isSet = Set.class.isAssignableFrom(values.getClass());\n-        return (S) (isSet ? filterSet(values, predicate) : filterList(values, predicate));\n-    }\n-\n-    static <T, S extends Iterable<T>> S filterAll(S values, Predicate<T>... predicates) {\n-        return filter(values, and(predicates));\n-    }\n-\n-    static <T, S extends Iterable<T>> S filterAny(S values, Predicate<T>... predicates) {\n-        return filter(values, or(predicates));\n-    }\n-\n-    static <T> T filterFirst(Iterable<T> values, Predicate<T>... predicates) {\n-        return stream(values.spliterator(), false)\n-                .filter(and(predicates))\n-                .findFirst()\n-                .orElse(null);\n-    }\n-}\n-\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.function;\r\n+\r\n+import java.util.LinkedHashSet;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+import java.util.function.Predicate;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static java.util.stream.Collectors.toList;\r\n+import static java.util.stream.StreamSupport.stream;\r\n+import static org.apache.dubbo.common.function.Predicates.and;\r\n+import static org.apache.dubbo.common.function.Predicates.or;\r\n+\r\n+/**\r\n+ * The utilities class for {@link Stream}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface Streams {\r\n+\r\n+    static <T, S extends Iterable<T>> Stream<T> filterStream(S values, Predicate<T> predicate) {\r\n+        return stream(values.spliterator(), false).filter(predicate);\r\n+    }\r\n+\r\n+    static <T, S extends Iterable<T>> List<T> filterList(S values, Predicate<T> predicate) {\r\n+        return filterStream(values, predicate).collect(toList());\r\n+    }\r\n+\r\n+    static <T, S extends Iterable<T>> Set<T> filterSet(S values, Predicate<T> predicate) {\r\n+        // new Set with insertion order\r\n+        return filterStream(values, predicate).collect(LinkedHashSet::new, Set::add, Set::addAll);\r\n+    }\r\n+\r\n+    static <T, S extends Iterable<T>> S filter(S values, Predicate<T> predicate) {\r\n+        final boolean isSet = Set.class.isAssignableFrom(values.getClass());\r\n+        return (S) (isSet ? filterSet(values, predicate) : filterList(values, predicate));\r\n+    }\r\n+\r\n+    static <T, S extends Iterable<T>> S filterAll(S values, Predicate<T>... predicates) {\r\n+        return filter(values, and(predicates));\r\n+    }\r\n+\r\n+    static <T, S extends Iterable<T>> S filterAny(S values, Predicate<T>... predicates) {\r\n+        return filter(values, or(predicates));\r\n+    }\r\n+\r\n+    static <T> T filterFirst(Iterable<T> values, Predicate<T>... predicates) {\r\n+        return stream(values.spliterator(), false)\r\n+                .filter(and(predicates))\r\n+                .findFirst()\r\n+                .orElse(null);\r\n+    }\r\n+}\r\n+\r\n+\r\n"}, {"source1": "org/apache/dubbo/common/function/ThrowableAction.java", "source2": "org/apache/dubbo/common/function/ThrowableAction.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,51 +1,51 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.function;\n-\n-import java.util.function.Function;\n-\n-/**\n- * A function interface for action with {@link Throwable}\n- *\n- * @see Function\n- * @see Throwable\n- * @since 2.7.5\n- */\n-@FunctionalInterface\n-public interface ThrowableAction {\n-\n-    /**\n-     * Executes the action\n-     *\n-     * @throws Throwable if met with error\n-     */\n-    void execute() throws Throwable;\n-\n-    /**\n-     * Executes {@link ThrowableAction}\n-     *\n-     * @param action {@link ThrowableAction}\n-     * @throws RuntimeException wrap {@link Exception} to {@link RuntimeException}\n-     */\n-    static void execute(ThrowableAction action) throws RuntimeException {\n-        try {\n-            action.execute();\n-        } catch (Throwable e) {\n-            throw new RuntimeException(e);\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.function;\r\n+\r\n+import java.util.function.Function;\r\n+\r\n+/**\r\n+ * A function interface for action with {@link Throwable}\r\n+ *\r\n+ * @see Function\r\n+ * @see Throwable\r\n+ * @since 2.7.5\r\n+ */\r\n+@FunctionalInterface\r\n+public interface ThrowableAction {\r\n+\r\n+    /**\r\n+     * Executes the action\r\n+     *\r\n+     * @throws Throwable if met with error\r\n+     */\r\n+    void execute() throws Throwable;\r\n+\r\n+    /**\r\n+     * Executes {@link ThrowableAction}\r\n+     *\r\n+     * @param action {@link ThrowableAction}\r\n+     * @throws RuntimeException wrap {@link Exception} to {@link RuntimeException}\r\n+     */\r\n+    static void execute(ThrowableAction action) throws RuntimeException {\r\n+        try {\r\n+            action.execute();\r\n+        } catch (Throwable e) {\r\n+            throw new RuntimeException(e);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/function/ThrowableConsumer.java", "source2": "org/apache/dubbo/common/function/ThrowableConsumer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,66 +1,66 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.function;\n-\n-import java.util.function.Consumer;\n-import java.util.function.Function;\n-\n-/**\n- * {@link Consumer} with {@link Throwable}\n- *\n- * @param <T> the source type\n- * @see Function\n- * @see Throwable\n- * @since 2.7.5\n- */\n-@FunctionalInterface\n-public interface ThrowableConsumer<T> {\n-\n-    /**\n-     * Applies this function to the given argument.\n-     *\n-     * @param t the function argument\n-     * @throws Throwable if met with any error\n-     */\n-    void accept(T t) throws Throwable;\n-\n-    /**\n-     * Executes {@link ThrowableConsumer}\n-     *\n-     * @param t the function argument\n-     * @throws RuntimeException wrappers {@link Throwable}\n-     */\n-    default void execute(T t) throws RuntimeException {\n-        try {\n-            accept(t);\n-        } catch (Throwable e) {\n-            throw new RuntimeException(e.getMessage(), e.getCause());\n-        }\n-    }\n-\n-    /**\n-     * Executes {@link ThrowableConsumer}\n-     *\n-     * @param t        the function argument\n-     * @param consumer {@link ThrowableConsumer}\n-     * @param <T>      the source type\n-     * @return the result after execution\n-     */\n-    static <T> void execute(T t, ThrowableConsumer<T> consumer) {\n-        consumer.execute(t);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.function;\r\n+\r\n+import java.util.function.Consumer;\r\n+import java.util.function.Function;\r\n+\r\n+/**\r\n+ * {@link Consumer} with {@link Throwable}\r\n+ *\r\n+ * @param <T> the source type\r\n+ * @see Function\r\n+ * @see Throwable\r\n+ * @since 2.7.5\r\n+ */\r\n+@FunctionalInterface\r\n+public interface ThrowableConsumer<T> {\r\n+\r\n+    /**\r\n+     * Applies this function to the given argument.\r\n+     *\r\n+     * @param t the function argument\r\n+     * @throws Throwable if met with any error\r\n+     */\r\n+    void accept(T t) throws Throwable;\r\n+\r\n+    /**\r\n+     * Executes {@link ThrowableConsumer}\r\n+     *\r\n+     * @param t the function argument\r\n+     * @throws RuntimeException wrappers {@link Throwable}\r\n+     */\r\n+    default void execute(T t) throws RuntimeException {\r\n+        try {\r\n+            accept(t);\r\n+        } catch (Throwable e) {\r\n+            throw new RuntimeException(e.getMessage(), e.getCause());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Executes {@link ThrowableConsumer}\r\n+     *\r\n+     * @param t        the function argument\r\n+     * @param consumer {@link ThrowableConsumer}\r\n+     * @param <T>      the source type\r\n+     * @return the result after execution\r\n+     */\r\n+    static <T> void execute(T t, ThrowableConsumer<T> consumer) {\r\n+        consumer.execute(t);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/function/ThrowableFunction.java", "source2": "org/apache/dubbo/common/function/ThrowableFunction.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.function;\n-\n-import java.util.function.Function;\n-\n-/**\n- * {@link Function} with {@link Throwable}\n- *\n- * @param <T> the source type\n- * @param <R> the return type\n- * @see Function\n- * @see Throwable\n- * @since 2.7.5\n- */\n-@FunctionalInterface\n-public interface ThrowableFunction<T, R> {\n-\n-    /**\n-     * Applies this function to the given argument.\n-     *\n-     * @param t the function argument\n-     * @return the function result\n-     * @throws Throwable if met with any error\n-     */\n-    R apply(T t) throws Throwable;\n-\n-    /**\n-     * Executes {@link ThrowableFunction}\n-     *\n-     * @param t the function argument\n-     * @return the function result\n-     * @throws RuntimeException wrappers {@link Throwable}\n-     */\n-    default R execute(T t) throws RuntimeException {\n-        R result = null;\n-        try {\n-            result = apply(t);\n-        } catch (Throwable e) {\n-            throw new RuntimeException(e.getCause());\n-        }\n-        return result;\n-    }\n-\n-    /**\n-     * Executes {@link ThrowableFunction}\n-     *\n-     * @param t        the function argument\n-     * @param function {@link ThrowableFunction}\n-     * @param <T>      the source type\n-     * @param <R>      the return type\n-     * @return the result after execution\n-     */\n-    static <T, R> R execute(T t, ThrowableFunction<T, R> function) {\n-        return function.execute(t);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.function;\r\n+\r\n+import java.util.function.Function;\r\n+\r\n+/**\r\n+ * {@link Function} with {@link Throwable}\r\n+ *\r\n+ * @param <T> the source type\r\n+ * @param <R> the return type\r\n+ * @see Function\r\n+ * @see Throwable\r\n+ * @since 2.7.5\r\n+ */\r\n+@FunctionalInterface\r\n+public interface ThrowableFunction<T, R> {\r\n+\r\n+    /**\r\n+     * Applies this function to the given argument.\r\n+     *\r\n+     * @param t the function argument\r\n+     * @return the function result\r\n+     * @throws Throwable if met with any error\r\n+     */\r\n+    R apply(T t) throws Throwable;\r\n+\r\n+    /**\r\n+     * Executes {@link ThrowableFunction}\r\n+     *\r\n+     * @param t the function argument\r\n+     * @return the function result\r\n+     * @throws RuntimeException wrappers {@link Throwable}\r\n+     */\r\n+    default R execute(T t) throws RuntimeException {\r\n+        R result = null;\r\n+        try {\r\n+            result = apply(t);\r\n+        } catch (Throwable e) {\r\n+            throw new RuntimeException(e.getCause());\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    /**\r\n+     * Executes {@link ThrowableFunction}\r\n+     *\r\n+     * @param t        the function argument\r\n+     * @param function {@link ThrowableFunction}\r\n+     * @param <T>      the source type\r\n+     * @param <R>      the return type\r\n+     * @return the result after execution\r\n+     */\r\n+    static <T, R> R execute(T t, ThrowableFunction<T, R> function) {\r\n+        return function.execute(t);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/infra/InfraAdapter.java", "source2": "org/apache/dubbo/common/infra/InfraAdapter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,46 +1,46 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.infra;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import java.util.Map;\n-\n-/**\n- * Used to interact with other systems. Typical use cases are:\n- * 1. get extra attributes from underlying infrastructures related to the instance on which Dubbo is currently deploying.\n- * 2. get configurations from third-party systems which maybe useful for a specific component.\n- */\n-\n-@SPI\n-public interface InfraAdapter {\n-\n-    /**\n-     * get extra attributes\n-     *\n-     * @param params application name or hostname are most likely to be used as input params.\n-     * @return\n-     */\n-    Map<String, String> getExtraAttributes(Map<String, String> params);\n-\n-    /**\n-     * @param key\n-     * @return\n-     */\n-    String getAttribute(String key);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.infra;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * Used to interact with other systems. Typical use cases are:\r\n+ * 1. get extra attributes from underlying infrastructures related to the instance on which Dubbo is currently deploying.\r\n+ * 2. get configurations from third-party systems which maybe useful for a specific component.\r\n+ */\r\n+\r\n+@SPI\r\n+public interface InfraAdapter {\r\n+\r\n+    /**\r\n+     * get extra attributes\r\n+     *\r\n+     * @param params application name or hostname are most likely to be used as input params.\r\n+     * @return\r\n+     */\r\n+    Map<String, String> getExtraAttributes(Map<String, String> params);\r\n+\r\n+    /**\r\n+     * @param key\r\n+     * @return\r\n+     */\r\n+    String getAttribute(String key);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/infra/support/CmdbAdapter.java", "source2": "org/apache/dubbo/common/infra/support/CmdbAdapter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,39 +1,39 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.infra.support;\n-\n-import org.apache.dubbo.common.infra.InfraAdapter;\n-\n-import java.util.Collections;\n-import java.util.Map;\n-\n-public class CmdbAdapter implements InfraAdapter {\n-\n-    public CmdbAdapter() {\n-        // init;\n-    }\n-\n-    @Override\n-    public Map<String, String> getExtraAttributes(Map<String, String> params) {\n-        return Collections.emptyMap();\n-    }\n-\n-    @Override\n-    public String getAttribute(String key) {\n-        return \"\";\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.infra.support;\r\n+\r\n+import org.apache.dubbo.common.infra.InfraAdapter;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.Map;\r\n+\r\n+public class CmdbAdapter implements InfraAdapter {\r\n+\r\n+    public CmdbAdapter() {\r\n+        // init;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getExtraAttributes(Map<String, String> params) {\r\n+        return Collections.emptyMap();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAttribute(String key) {\r\n+        return \"\";\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/infra/support/EnvironmentAdapter.java", "source2": "org/apache/dubbo/common/infra/support/EnvironmentAdapter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,72 +1,72 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.infra.support;\n-\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.extension.Activate;\n-import org.apache.dubbo.common.infra.InfraAdapter;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_ENV_KEYS;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_LABELS;\n-import static org.apache.dubbo.common.constants.CommonConstants.EQUAL_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\n-\n-@Activate\n-public class EnvironmentAdapter implements InfraAdapter {\n-\n-    /**\n-     * 1. OS Environment: DUBBO_LABELS=tag=pre;key=value\n-     * 2. JVM Options: -Denv_keys = DUBBO_KEY1, DUBBO_KEY2\n-     */\n-    @Override\n-    public Map<String, String> getExtraAttributes(Map<String, String> params) {\n-        Map<String, String> parameters = new HashMap<>();\n-\n-        String rawLabels = ConfigurationUtils.getProperty(DUBBO_LABELS);\n-        if (StringUtils.isNotEmpty(rawLabels)) {\n-            String[] labelPairs = SEMICOLON_SPLIT_PATTERN.split(rawLabels);\n-            for (String pair : labelPairs) {\n-                String[] label = EQUAL_SPLIT_PATTERN.split(pair);\n-                if (label.length == 2) {\n-                    parameters.put(label[0], label[1]);\n-                }\n-            }\n-        }\n-\n-        String rawKeys = ConfigurationUtils.getProperty(DUBBO_ENV_KEYS);\n-        if (StringUtils.isNotEmpty(rawKeys)) {\n-            String[] keys = COMMA_SPLIT_PATTERN.split(rawKeys);\n-            for (String key : keys) {\n-                String value = ConfigurationUtils.getProperty(key);\n-                if (value != null) {\n-                    parameters.put(key, value);\n-                }\n-            }\n-        }\n-        return parameters;\n-    }\n-\n-    @Override\n-    public String getAttribute(String key) {\n-        return ConfigurationUtils.getProperty(key);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.infra.support;\r\n+\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.common.extension.Activate;\r\n+import org.apache.dubbo.common.infra.InfraAdapter;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_ENV_KEYS;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_LABELS;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.EQUAL_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\r\n+\r\n+@Activate\r\n+public class EnvironmentAdapter implements InfraAdapter {\r\n+\r\n+    /**\r\n+     * 1. OS Environment: DUBBO_LABELS=tag=pre;key=value\r\n+     * 2. JVM Options: -Denv_keys = DUBBO_KEY1, DUBBO_KEY2\r\n+     */\r\n+    @Override\r\n+    public Map<String, String> getExtraAttributes(Map<String, String> params) {\r\n+        Map<String, String> parameters = new HashMap<>();\r\n+\r\n+        String rawLabels = ConfigurationUtils.getProperty(DUBBO_LABELS);\r\n+        if (StringUtils.isNotEmpty(rawLabels)) {\r\n+            String[] labelPairs = SEMICOLON_SPLIT_PATTERN.split(rawLabels);\r\n+            for (String pair : labelPairs) {\r\n+                String[] label = EQUAL_SPLIT_PATTERN.split(pair);\r\n+                if (label.length == 2) {\r\n+                    parameters.put(label[0], label[1]);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        String rawKeys = ConfigurationUtils.getProperty(DUBBO_ENV_KEYS);\r\n+        if (StringUtils.isNotEmpty(rawKeys)) {\r\n+            String[] keys = COMMA_SPLIT_PATTERN.split(rawKeys);\r\n+            for (String key : keys) {\r\n+                String value = ConfigurationUtils.getProperty(key);\r\n+                if (value != null) {\r\n+                    parameters.put(key, value);\r\n+                }\r\n+            }\r\n+        }\r\n+        return parameters;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAttribute(String key) {\r\n+        return ConfigurationUtils.getProperty(key);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/io/Bytes.java", "source2": "org/apache/dubbo/common/io/Bytes.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,936 +1,936 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.io;\n-\n-import org.apache.dubbo.common.utils.IOUtils;\n-\n-import java.io.File;\n-import java.io.FileInputStream;\n-import java.io.IOException;\n-import java.io.InputStream;\n-import java.io.OutputStream;\n-import java.security.MessageDigest;\n-import java.security.NoSuchAlgorithmException;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.zip.DeflaterOutputStream;\n-import java.util.zip.InflaterInputStream;\n-\n-/**\n- * CodecUtils.\n- */\n-\n-public class Bytes {\n-    private static final String C64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"; //default base64.\n-\n-    private static final char[] BASE16 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}, BASE64 = C64.toCharArray();\n-\n-    private static final int MASK4 = 0x0f, MASK6 = 0x3f, MASK8 = 0xff;\n-\n-    private static final Map<Integer, byte[]> DECODE_TABLE_MAP = new ConcurrentHashMap<Integer, byte[]>();\n-\n-    private static ThreadLocal<MessageDigest> MD = new ThreadLocal<MessageDigest>();\n-\n-    private Bytes() {\n-    }\n-\n-    /**\n-     * byte array copy.\n-     *\n-     * @param src    src.\n-     * @param length new length.\n-     * @return new byte array.\n-     */\n-    public static byte[] copyOf(byte[] src, int length) {\n-        byte[] dest = new byte[length];\n-        System.arraycopy(src, 0, dest, 0, Math.min(src.length, length));\n-        return dest;\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @return byte[].\n-     */\n-    public static byte[] short2bytes(short v) {\n-        byte[] ret = {0, 0};\n-        short2bytes(v, ret);\n-        return ret;\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @param b byte array.\n-     */\n-    public static void short2bytes(short v, byte[] b) {\n-        short2bytes(v, b, 0);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @param b byte array.\n-     */\n-    public static void short2bytes(short v, byte[] b, int off) {\n-        b[off + 1] = (byte) v;\n-        b[off + 0] = (byte) (v >>> 8);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @return byte[].\n-     */\n-    public static byte[] int2bytes(int v) {\n-        byte[] ret = {0, 0, 0, 0};\n-        int2bytes(v, ret);\n-        return ret;\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @param b byte array.\n-     */\n-    public static void int2bytes(int v, byte[] b) {\n-        int2bytes(v, b, 0);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v   value.\n-     * @param b   byte array.\n-     * @param off array offset.\n-     */\n-    public static void int2bytes(int v, byte[] b, int off) {\n-        b[off + 3] = (byte) v;\n-        b[off + 2] = (byte) (v >>> 8);\n-        b[off + 1] = (byte) (v >>> 16);\n-        b[off + 0] = (byte) (v >>> 24);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @return byte[].\n-     */\n-    public static byte[] float2bytes(float v) {\n-        byte[] ret = {0, 0, 0, 0};\n-        float2bytes(v, ret);\n-        return ret;\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @param b byte array.\n-     */\n-    public static void float2bytes(float v, byte[] b) {\n-        float2bytes(v, b, 0);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v   value.\n-     * @param b   byte array.\n-     * @param off array offset.\n-     */\n-    public static void float2bytes(float v, byte[] b, int off) {\n-        int i = Float.floatToIntBits(v);\n-        b[off + 3] = (byte) i;\n-        b[off + 2] = (byte) (i >>> 8);\n-        b[off + 1] = (byte) (i >>> 16);\n-        b[off + 0] = (byte) (i >>> 24);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @return byte[].\n-     */\n-    public static byte[] long2bytes(long v) {\n-        byte[] ret = {0, 0, 0, 0, 0, 0, 0, 0};\n-        long2bytes(v, ret);\n-        return ret;\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @param b byte array.\n-     */\n-    public static void long2bytes(long v, byte[] b) {\n-        long2bytes(v, b, 0);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v   value.\n-     * @param b   byte array.\n-     * @param off array offset.\n-     */\n-    public static void long2bytes(long v, byte[] b, int off) {\n-        b[off + 7] = (byte) v;\n-        b[off + 6] = (byte) (v >>> 8);\n-        b[off + 5] = (byte) (v >>> 16);\n-        b[off + 4] = (byte) (v >>> 24);\n-        b[off + 3] = (byte) (v >>> 32);\n-        b[off + 2] = (byte) (v >>> 40);\n-        b[off + 1] = (byte) (v >>> 48);\n-        b[off + 0] = (byte) (v >>> 56);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @return byte[].\n-     */\n-    public static byte[] double2bytes(double v) {\n-        byte[] ret = {0, 0, 0, 0, 0, 0, 0, 0};\n-        double2bytes(v, ret);\n-        return ret;\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v value.\n-     * @param b byte array.\n-     */\n-    public static void double2bytes(double v, byte[] b) {\n-        double2bytes(v, b, 0);\n-    }\n-\n-    /**\n-     * to byte array.\n-     *\n-     * @param v   value.\n-     * @param b   byte array.\n-     * @param off array offset.\n-     */\n-    public static void double2bytes(double v, byte[] b, int off) {\n-        long j = Double.doubleToLongBits(v);\n-        b[off + 7] = (byte) j;\n-        b[off + 6] = (byte) (j >>> 8);\n-        b[off + 5] = (byte) (j >>> 16);\n-        b[off + 4] = (byte) (j >>> 24);\n-        b[off + 3] = (byte) (j >>> 32);\n-        b[off + 2] = (byte) (j >>> 40);\n-        b[off + 1] = (byte) (j >>> 48);\n-        b[off + 0] = (byte) (j >>> 56);\n-    }\n-\n-    /**\n-     * to short.\n-     *\n-     * @param b byte array.\n-     * @return short.\n-     */\n-    public static short bytes2short(byte[] b) {\n-        return bytes2short(b, 0);\n-    }\n-\n-    /**\n-     * to short.\n-     *\n-     * @param b   byte array.\n-     * @param off offset.\n-     * @return short.\n-     */\n-    public static short bytes2short(byte[] b, int off) {\n-        return (short) (((b[off + 1] & 0xFF) << 0) +\n-                ((b[off + 0]) << 8));\n-    }\n-\n-    /**\n-     * to int.\n-     *\n-     * @param b byte array.\n-     * @return int.\n-     */\n-    public static int bytes2int(byte[] b) {\n-        return bytes2int(b, 0);\n-    }\n-\n-    /**\n-     * to int.\n-     *\n-     * @param b   byte array.\n-     * @param off offset.\n-     * @return int.\n-     */\n-    public static int bytes2int(byte[] b, int off) {\n-        return ((b[off + 3] & 0xFF) << 0) +\n-                ((b[off + 2] & 0xFF) << 8) +\n-                ((b[off + 1] & 0xFF) << 16) +\n-                ((b[off + 0]) << 24);\n-    }\n-\n-    /**\n-     * to int.\n-     *\n-     * @param b byte array.\n-     * @return int.\n-     */\n-    public static float bytes2float(byte[] b) {\n-        return bytes2float(b, 0);\n-    }\n-\n-    /**\n-     * to int.\n-     *\n-     * @param b   byte array.\n-     * @param off offset.\n-     * @return int.\n-     */\n-    public static float bytes2float(byte[] b, int off) {\n-        int i = ((b[off + 3] & 0xFF) << 0) +\n-                ((b[off + 2] & 0xFF) << 8) +\n-                ((b[off + 1] & 0xFF) << 16) +\n-                ((b[off + 0]) << 24);\n-        return Float.intBitsToFloat(i);\n-    }\n-\n-    /**\n-     * to long.\n-     *\n-     * @param b byte array.\n-     * @return long.\n-     */\n-    public static long bytes2long(byte[] b) {\n-        return bytes2long(b, 0);\n-    }\n-\n-    /**\n-     * to long.\n-     *\n-     * @param b   byte array.\n-     * @param off offset.\n-     * @return long.\n-     */\n-    public static long bytes2long(byte[] b, int off) {\n-        return ((b[off + 7] & 0xFFL) << 0) +\n-                ((b[off + 6] & 0xFFL) << 8) +\n-                ((b[off + 5] & 0xFFL) << 16) +\n-                ((b[off + 4] & 0xFFL) << 24) +\n-                ((b[off + 3] & 0xFFL) << 32) +\n-                ((b[off + 2] & 0xFFL) << 40) +\n-                ((b[off + 1] & 0xFFL) << 48) +\n-                (((long) b[off + 0]) << 56);\n-    }\n-\n-    /**\n-     * to long.\n-     *\n-     * @param b byte array.\n-     * @return double.\n-     */\n-    public static double bytes2double(byte[] b) {\n-        return bytes2double(b, 0);\n-    }\n-\n-    /**\n-     * to long.\n-     *\n-     * @param b   byte array.\n-     * @param off offset.\n-     * @return double.\n-     */\n-    public static double bytes2double(byte[] b, int off) {\n-        long j = ((b[off + 7] & 0xFFL) << 0) +\n-                ((b[off + 6] & 0xFFL) << 8) +\n-                ((b[off + 5] & 0xFFL) << 16) +\n-                ((b[off + 4] & 0xFFL) << 24) +\n-                ((b[off + 3] & 0xFFL) << 32) +\n-                ((b[off + 2] & 0xFFL) << 40) +\n-                ((b[off + 1] & 0xFFL) << 48) +\n-                (((long) b[off + 0]) << 56);\n-        return Double.longBitsToDouble(j);\n-    }\n-\n-    /**\n-     * to hex string.\n-     *\n-     * @param bs byte array.\n-     * @return hex string.\n-     */\n-    public static String bytes2hex(byte[] bs) {\n-        return bytes2hex(bs, 0, bs.length);\n-    }\n-\n-    /**\n-     * to hex string.\n-     *\n-     * @param bs  byte array.\n-     * @param off offset.\n-     * @param len length.\n-     * @return hex string.\n-     */\n-    public static String bytes2hex(byte[] bs, int off, int len) {\n-        if (off < 0) {\n-            throw new IndexOutOfBoundsException(\"bytes2hex: offset < 0, offset is \" + off);\n-        }\n-        if (len < 0) {\n-            throw new IndexOutOfBoundsException(\"bytes2hex: length < 0, length is \" + len);\n-        }\n-        if (off + len > bs.length) {\n-            throw new IndexOutOfBoundsException(\"bytes2hex: offset + length > array length.\");\n-        }\n-\n-        byte b;\n-        int r = off, w = 0;\n-        char[] cs = new char[len * 2];\n-        for (int i = 0; i < len; i++) {\n-            b = bs[r++];\n-            cs[w++] = BASE16[b >> 4 & MASK4];\n-            cs[w++] = BASE16[b & MASK4];\n-        }\n-        return new String(cs);\n-    }\n-\n-    /**\n-     * from hex string.\n-     *\n-     * @param str hex string.\n-     * @return byte array.\n-     */\n-    public static byte[] hex2bytes(String str) {\n-        return hex2bytes(str, 0, str.length());\n-    }\n-\n-    /**\n-     * from hex string.\n-     *\n-     * @param str hex string.\n-     * @param off offset.\n-     * @param len length.\n-     * @return byte array.\n-     */\n-    public static byte[] hex2bytes(final String str, final int off, int len) {\n-        if ((len & 1) == 1) {\n-            throw new IllegalArgumentException(\"hex2bytes: ( len & 1 ) == 1.\");\n-        }\n-\n-        if (off < 0) {\n-            throw new IndexOutOfBoundsException(\"hex2bytes: offset < 0, offset is \" + off);\n-        }\n-        if (len < 0) {\n-            throw new IndexOutOfBoundsException(\"hex2bytes: length < 0, length is \" + len);\n-        }\n-        if (off + len > str.length()) {\n-            throw new IndexOutOfBoundsException(\"hex2bytes: offset + length > array length.\");\n-        }\n-\n-        int num = len / 2, r = off, w = 0;\n-        byte[] b = new byte[num];\n-        for (int i = 0; i < num; i++) {\n-            b[w++] = (byte) (hex(str.charAt(r++)) << 4 | hex(str.charAt(r++)));\n-        }\n-        return b;\n-    }\n-\n-    /**\n-     * to base64 string.\n-     *\n-     * @param b byte array.\n-     * @return base64 string.\n-     */\n-    public static String bytes2base64(byte[] b) {\n-        return bytes2base64(b, 0, b.length, BASE64);\n-    }\n-\n-    /**\n-     * to base64 string.\n-     *\n-     * @param b byte array.\n-     * @return base64 string.\n-     */\n-    public static String bytes2base64(byte[] b, int offset, int length) {\n-        return bytes2base64(b, offset, length, BASE64);\n-    }\n-\n-    /**\n-     * to base64 string.\n-     *\n-     * @param b    byte array.\n-     * @param code base64 code string(0-63 is base64 char,64 is pad char).\n-     * @return base64 string.\n-     */\n-    public static String bytes2base64(byte[] b, String code) {\n-        return bytes2base64(b, 0, b.length, code);\n-    }\n-\n-    /**\n-     * to base64 string.\n-     *\n-     * @param b    byte array.\n-     * @param code base64 code string(0-63 is base64 char,64 is pad char).\n-     * @return base64 string.\n-     */\n-    public static String bytes2base64(byte[] b, int offset, int length, String code) {\n-        if (code.length() < 64) {\n-            throw new IllegalArgumentException(\"Base64 code length < 64.\");\n-        }\n-\n-        return bytes2base64(b, offset, length, code.toCharArray());\n-    }\n-\n-    /**\n-     * to base64 string.\n-     *\n-     * @param b    byte array.\n-     * @param code base64 code(0-63 is base64 char,64 is pad char).\n-     * @return base64 string.\n-     */\n-    public static String bytes2base64(byte[] b, char[] code) {\n-        return bytes2base64(b, 0, b.length, code);\n-    }\n-\n-    /**\n-     * to base64 string.\n-     *\n-     * @param bs   byte array.\n-     * @param off  offset.\n-     * @param len  length.\n-     * @param code base64 code(0-63 is base64 char,64 is pad char).\n-     * @return base64 string.\n-     */\n-    public static String bytes2base64(final byte[] bs, final int off, final int len, final char[] code) {\n-        if (off < 0) {\n-            throw new IndexOutOfBoundsException(\"bytes2base64: offset < 0, offset is \" + off);\n-        }\n-        if (len < 0) {\n-            throw new IndexOutOfBoundsException(\"bytes2base64: length < 0, length is \" + len);\n-        }\n-        if (off + len > bs.length) {\n-            throw new IndexOutOfBoundsException(\"bytes2base64: offset + length > array length.\");\n-        }\n-\n-        if (code.length < 64) {\n-            throw new IllegalArgumentException(\"Base64 code length < 64.\");\n-        }\n-\n-        boolean pad = code.length > 64; // has pad char.\n-        int num = len / 3, rem = len % 3, r = off, w = 0;\n-        char[] cs = new char[num * 4 + (rem == 0 ? 0 : pad ? 4 : rem + 1)];\n-\n-        for (int i = 0; i < num; i++) {\n-            int b1 = bs[r++] & MASK8, b2 = bs[r++] & MASK8, b3 = bs[r++] & MASK8;\n-\n-            cs[w++] = code[b1 >> 2];\n-            cs[w++] = code[(b1 << 4) & MASK6 | (b2 >> 4)];\n-            cs[w++] = code[(b2 << 2) & MASK6 | (b3 >> 6)];\n-            cs[w++] = code[b3 & MASK6];\n-        }\n-\n-        if (rem == 1) {\n-            int b1 = bs[r++] & MASK8;\n-            cs[w++] = code[b1 >> 2];\n-            cs[w++] = code[(b1 << 4) & MASK6];\n-            if (pad) {\n-                cs[w++] = code[64];\n-                cs[w++] = code[64];\n-            }\n-        } else if (rem == 2) {\n-            int b1 = bs[r++] & MASK8, b2 = bs[r++] & MASK8;\n-            cs[w++] = code[b1 >> 2];\n-            cs[w++] = code[(b1 << 4) & MASK6 | (b2 >> 4)];\n-            cs[w++] = code[(b2 << 2) & MASK6];\n-            if (pad) {\n-                cs[w++] = code[64];\n-            }\n-        }\n-        return new String(cs);\n-    }\n-\n-    /**\n-     * from base64 string.\n-     *\n-     * @param str base64 string.\n-     * @return byte array.\n-     */\n-    public static byte[] base642bytes(String str) {\n-        return base642bytes(str, 0, str.length());\n-    }\n-\n-    /**\n-     * from base64 string.\n-     *\n-     * @param str    base64 string.\n-     * @param offset offset.\n-     * @param length length.\n-     * @return byte array.\n-     */\n-    public static byte[] base642bytes(String str, int offset, int length) {\n-        return base642bytes(str, offset, length, C64);\n-    }\n-\n-    /**\n-     * from base64 string.\n-     *\n-     * @param str  base64 string.\n-     * @param code base64 code(0-63 is base64 char,64 is pad char).\n-     * @return byte array.\n-     */\n-    public static byte[] base642bytes(String str, String code) {\n-        return base642bytes(str, 0, str.length(), code);\n-    }\n-\n-    /**\n-     * from base64 string.\n-     *\n-     * @param str  base64 string.\n-     * @param off  offset.\n-     * @param len  length.\n-     * @param code base64 code(0-63 is base64 char,64 is pad char).\n-     * @return byte array.\n-     */\n-    public static byte[] base642bytes(final String str, final int off, final int len, final String code) {\n-        if (off < 0) {\n-            throw new IndexOutOfBoundsException(\"base642bytes: offset < 0, offset is \" + off);\n-        }\n-        if (len < 0) {\n-            throw new IndexOutOfBoundsException(\"base642bytes: length < 0, length is \" + len);\n-        }\n-        if (len == 0) {\n-            return new byte[0];\n-        }\n-        if (off + len > str.length()) {\n-            throw new IndexOutOfBoundsException(\"base642bytes: offset + length > string length.\");\n-        }\n-\n-        if (code.length() < 64) {\n-            throw new IllegalArgumentException(\"Base64 code length < 64.\");\n-        }\n-\n-        int rem = len % 4;\n-        if (rem == 1) {\n-            throw new IllegalArgumentException(\"base642bytes: base64 string length % 4 == 1.\");\n-        }\n-\n-        int num = len / 4, size = num * 3;\n-        if (code.length() > 64) {\n-            if (rem != 0) {\n-                throw new IllegalArgumentException(\"base642bytes: base64 string length error.\");\n-            }\n-\n-            char pc = code.charAt(64);\n-            if (str.charAt(off + len - 2) == pc) {\n-                size -= 2;\n-                --num;\n-                rem = 2;\n-            } else if (str.charAt(off + len - 1) == pc) {\n-                size--;\n-                --num;\n-                rem = 3;\n-            }\n-        } else {\n-            if (rem == 2) {\n-                size++;\n-            } else if (rem == 3) {\n-                size += 2;\n-            }\n-        }\n-\n-        int r = off, w = 0;\n-        byte[] b = new byte[size], t = decodeTable(code);\n-        for (int i = 0; i < num; i++) {\n-            int c1 = t[str.charAt(r++)], c2 = t[str.charAt(r++)];\n-            int c3 = t[str.charAt(r++)], c4 = t[str.charAt(r++)];\n-\n-            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\n-            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\n-            b[w++] = (byte) ((c3 << 6) | c4);\n-        }\n-\n-        if (rem == 2) {\n-            int c1 = t[str.charAt(r++)], c2 = t[str.charAt(r++)];\n-\n-            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\n-        } else if (rem == 3) {\n-            int c1 = t[str.charAt(r++)], c2 = t[str.charAt(r++)], c3 = t[str.charAt(r++)];\n-\n-            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\n-            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\n-        }\n-        return b;\n-    }\n-\n-    /**\n-     * from base64 string.\n-     *\n-     * @param str  base64 string.\n-     * @param code base64 code(0-63 is base64 char,64 is pad char).\n-     * @return byte array.\n-     */\n-    public static byte[] base642bytes(String str, char[] code) {\n-        return base642bytes(str, 0, str.length(), code);\n-    }\n-\n-    /**\n-     * from base64 string.\n-     *\n-     * @param str  base64 string.\n-     * @param off  offset.\n-     * @param len  length.\n-     * @param code base64 code(0-63 is base64 char,64 is pad char).\n-     * @return byte array.\n-     */\n-    public static byte[] base642bytes(final String str, final int off, final int len, final char[] code) {\n-        if (off < 0) {\n-            throw new IndexOutOfBoundsException(\"base642bytes: offset < 0, offset is \" + off);\n-        }\n-        if (len < 0) {\n-            throw new IndexOutOfBoundsException(\"base642bytes: length < 0, length is \" + len);\n-        }\n-        if (len == 0) {\n-            return new byte[0];\n-        }\n-        if (off + len > str.length()) {\n-            throw new IndexOutOfBoundsException(\"base642bytes: offset + length > string length.\");\n-        }\n-\n-        if (code.length < 64) {\n-            throw new IllegalArgumentException(\"Base64 code length < 64.\");\n-        }\n-\n-        int rem = len % 4;\n-        if (rem == 1) {\n-            throw new IllegalArgumentException(\"base642bytes: base64 string length % 4 == 1.\");\n-        }\n-\n-        int num = len / 4, size = num * 3;\n-        if (code.length > 64) {\n-            if (rem != 0) {\n-                throw new IllegalArgumentException(\"base642bytes: base64 string length error.\");\n-            }\n-\n-            char pc = code[64];\n-            if (str.charAt(off + len - 2) == pc) {\n-                size -= 2;\n-                --num;\n-                rem = 2;\n-            } else if (str.charAt(off + len - 1) == pc) {\n-                size--;\n-                --num;\n-                rem = 3;\n-            }\n-        } else {\n-            if (rem == 2) {\n-                size++;\n-            } else if (rem == 3) {\n-                size += 2;\n-            }\n-        }\n-\n-        int r = off, w = 0;\n-        byte[] b = new byte[size];\n-        for (int i = 0; i < num; i++) {\n-            int c1 = indexOf(code, str.charAt(r++)), c2 = indexOf(code, str.charAt(r++));\n-            int c3 = indexOf(code, str.charAt(r++)), c4 = indexOf(code, str.charAt(r++));\n-\n-            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\n-            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\n-            b[w++] = (byte) ((c3 << 6) | c4);\n-        }\n-\n-        if (rem == 2) {\n-            int c1 = indexOf(code, str.charAt(r++)), c2 = indexOf(code, str.charAt(r++));\n-\n-            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\n-        } else if (rem == 3) {\n-            int c1 = indexOf(code, str.charAt(r++)), c2 = indexOf(code, str.charAt(r++)), c3 = indexOf(code, str.charAt(r++));\n-\n-            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\n-            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\n-        }\n-        return b;\n-    }\n-\n-    /**\n-     * zip.\n-     *\n-     * @param bytes source.\n-     * @return compressed byte array.\n-     * @throws IOException\n-     */\n-    public static byte[] zip(byte[] bytes) throws IOException {\n-        UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream();\n-        OutputStream os = new DeflaterOutputStream(bos);\n-        try {\n-            os.write(bytes);\n-        } finally {\n-            os.close();\n-            bos.close();\n-        }\n-        return bos.toByteArray();\n-    }\n-\n-    /**\n-     * unzip.\n-     *\n-     * @param bytes compressed byte array.\n-     * @return byte uncompressed array.\n-     * @throws IOException\n-     */\n-    public static byte[] unzip(byte[] bytes) throws IOException {\n-        UnsafeByteArrayInputStream bis = new UnsafeByteArrayInputStream(bytes);\n-        UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream();\n-        InputStream is = new InflaterInputStream(bis);\n-        try {\n-            IOUtils.write(is, bos);\n-            return bos.toByteArray();\n-        } finally {\n-            is.close();\n-            bis.close();\n-            bos.close();\n-        }\n-    }\n-\n-    /**\n-     * get md5.\n-     *\n-     * @param str input string.\n-     * @return MD5 byte array.\n-     */\n-    public static byte[] getMD5(String str) {\n-        return getMD5(str.getBytes());\n-    }\n-\n-    /**\n-     * get md5.\n-     *\n-     * @param source byte array source.\n-     * @return MD5 byte array.\n-     */\n-    public static byte[] getMD5(byte[] source) {\n-        MessageDigest md = getMessageDigest();\n-        return md.digest(source);\n-    }\n-\n-    /**\n-     * get md5.\n-     *\n-     * @param file file source.\n-     * @return MD5 byte array.\n-     */\n-    public static byte[] getMD5(File file) throws IOException {\n-        InputStream is = new FileInputStream(file);\n-        try {\n-            return getMD5(is);\n-        } finally {\n-            is.close();\n-        }\n-    }\n-\n-    /**\n-     * get md5.\n-     *\n-     * @param is input stream.\n-     * @return MD5 byte array.\n-     */\n-    public static byte[] getMD5(InputStream is) throws IOException {\n-        return getMD5(is, 1024 * 8);\n-    }\n-\n-    private static byte hex(char c) {\n-        if (c <= '9') {\n-            return (byte) (c - '0');\n-        }\n-        if (c >= 'a' && c <= 'f') {\n-            return (byte) (c - 'a' + 10);\n-        }\n-        if (c >= 'A' && c <= 'F') {\n-            return (byte) (c - 'A' + 10);\n-        }\n-        throw new IllegalArgumentException(\"hex string format error [\" + c + \"].\");\n-    }\n-\n-    private static int indexOf(char[] cs, char c) {\n-        for (int i = 0, len = cs.length; i < len; i++) {\n-            if (cs[i] == c) {\n-                return i;\n-            }\n-        }\n-        return -1;\n-    }\n-\n-    private static byte[] decodeTable(String code) {\n-        int hash = code.hashCode();\n-        byte[] ret = DECODE_TABLE_MAP.get(hash);\n-        if (ret == null) {\n-            if (code.length() < 64) {\n-                throw new IllegalArgumentException(\"Base64 code length < 64.\");\n-            }\n-            // create new decode table.\n-            ret = new byte[128];\n-            for (int i = 0; i < 128; i++) // init table.\n-            {\n-                ret[i] = -1;\n-            }\n-            for (int i = 0; i < 64; i++) {\n-                ret[code.charAt(i)] = (byte) i;\n-            }\n-            DECODE_TABLE_MAP.put(hash, ret);\n-        }\n-        return ret;\n-    }\n-\n-    private static byte[] getMD5(InputStream is, int bs) throws IOException {\n-        MessageDigest md = getMessageDigest();\n-        byte[] buf = new byte[bs];\n-        while (is.available() > 0) {\n-            int read, total = 0;\n-            do {\n-                if ((read = is.read(buf, total, bs - total)) <= 0) {\n-                    break;\n-                }\n-                total += read;\n-            }\n-            while (total < bs);\n-            md.update(buf);\n-        }\n-        return md.digest();\n-    }\n-\n-    private static MessageDigest getMessageDigest() {\n-        MessageDigest ret = MD.get();\n-        if (ret == null) {\n-            try {\n-                ret = MessageDigest.getInstance(\"MD5\");\n-                MD.set(ret);\n-            } catch (NoSuchAlgorithmException e) {\n-                throw new RuntimeException(e);\n-            }\n-        }\n-        return ret;\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.io;\r\n+\r\n+import org.apache.dubbo.common.utils.IOUtils;\r\n+\r\n+import java.io.File;\r\n+import java.io.FileInputStream;\r\n+import java.io.IOException;\r\n+import java.io.InputStream;\r\n+import java.io.OutputStream;\r\n+import java.security.MessageDigest;\r\n+import java.security.NoSuchAlgorithmException;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.zip.DeflaterOutputStream;\r\n+import java.util.zip.InflaterInputStream;\r\n+\r\n+/**\r\n+ * CodecUtils.\r\n+ */\r\n+\r\n+public class Bytes {\r\n+    private static final String C64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"; //default base64.\r\n+\r\n+    private static final char[] BASE16 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}, BASE64 = C64.toCharArray();\r\n+\r\n+    private static final int MASK4 = 0x0f, MASK6 = 0x3f, MASK8 = 0xff;\r\n+\r\n+    private static final Map<Integer, byte[]> DECODE_TABLE_MAP = new ConcurrentHashMap<Integer, byte[]>();\r\n+\r\n+    private static ThreadLocal<MessageDigest> MD = new ThreadLocal<MessageDigest>();\r\n+\r\n+    private Bytes() {\r\n+    }\r\n+\r\n+    /**\r\n+     * byte array copy.\r\n+     *\r\n+     * @param src    src.\r\n+     * @param length new length.\r\n+     * @return new byte array.\r\n+     */\r\n+    public static byte[] copyOf(byte[] src, int length) {\r\n+        byte[] dest = new byte[length];\r\n+        System.arraycopy(src, 0, dest, 0, Math.min(src.length, length));\r\n+        return dest;\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @return byte[].\r\n+     */\r\n+    public static byte[] short2bytes(short v) {\r\n+        byte[] ret = {0, 0};\r\n+        short2bytes(v, ret);\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @param b byte array.\r\n+     */\r\n+    public static void short2bytes(short v, byte[] b) {\r\n+        short2bytes(v, b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @param b byte array.\r\n+     */\r\n+    public static void short2bytes(short v, byte[] b, int off) {\r\n+        b[off + 1] = (byte) v;\r\n+        b[off + 0] = (byte) (v >>> 8);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @return byte[].\r\n+     */\r\n+    public static byte[] int2bytes(int v) {\r\n+        byte[] ret = {0, 0, 0, 0};\r\n+        int2bytes(v, ret);\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @param b byte array.\r\n+     */\r\n+    public static void int2bytes(int v, byte[] b) {\r\n+        int2bytes(v, b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v   value.\r\n+     * @param b   byte array.\r\n+     * @param off array offset.\r\n+     */\r\n+    public static void int2bytes(int v, byte[] b, int off) {\r\n+        b[off + 3] = (byte) v;\r\n+        b[off + 2] = (byte) (v >>> 8);\r\n+        b[off + 1] = (byte) (v >>> 16);\r\n+        b[off + 0] = (byte) (v >>> 24);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @return byte[].\r\n+     */\r\n+    public static byte[] float2bytes(float v) {\r\n+        byte[] ret = {0, 0, 0, 0};\r\n+        float2bytes(v, ret);\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @param b byte array.\r\n+     */\r\n+    public static void float2bytes(float v, byte[] b) {\r\n+        float2bytes(v, b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v   value.\r\n+     * @param b   byte array.\r\n+     * @param off array offset.\r\n+     */\r\n+    public static void float2bytes(float v, byte[] b, int off) {\r\n+        int i = Float.floatToIntBits(v);\r\n+        b[off + 3] = (byte) i;\r\n+        b[off + 2] = (byte) (i >>> 8);\r\n+        b[off + 1] = (byte) (i >>> 16);\r\n+        b[off + 0] = (byte) (i >>> 24);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @return byte[].\r\n+     */\r\n+    public static byte[] long2bytes(long v) {\r\n+        byte[] ret = {0, 0, 0, 0, 0, 0, 0, 0};\r\n+        long2bytes(v, ret);\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @param b byte array.\r\n+     */\r\n+    public static void long2bytes(long v, byte[] b) {\r\n+        long2bytes(v, b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v   value.\r\n+     * @param b   byte array.\r\n+     * @param off array offset.\r\n+     */\r\n+    public static void long2bytes(long v, byte[] b, int off) {\r\n+        b[off + 7] = (byte) v;\r\n+        b[off + 6] = (byte) (v >>> 8);\r\n+        b[off + 5] = (byte) (v >>> 16);\r\n+        b[off + 4] = (byte) (v >>> 24);\r\n+        b[off + 3] = (byte) (v >>> 32);\r\n+        b[off + 2] = (byte) (v >>> 40);\r\n+        b[off + 1] = (byte) (v >>> 48);\r\n+        b[off + 0] = (byte) (v >>> 56);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @return byte[].\r\n+     */\r\n+    public static byte[] double2bytes(double v) {\r\n+        byte[] ret = {0, 0, 0, 0, 0, 0, 0, 0};\r\n+        double2bytes(v, ret);\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v value.\r\n+     * @param b byte array.\r\n+     */\r\n+    public static void double2bytes(double v, byte[] b) {\r\n+        double2bytes(v, b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to byte array.\r\n+     *\r\n+     * @param v   value.\r\n+     * @param b   byte array.\r\n+     * @param off array offset.\r\n+     */\r\n+    public static void double2bytes(double v, byte[] b, int off) {\r\n+        long j = Double.doubleToLongBits(v);\r\n+        b[off + 7] = (byte) j;\r\n+        b[off + 6] = (byte) (j >>> 8);\r\n+        b[off + 5] = (byte) (j >>> 16);\r\n+        b[off + 4] = (byte) (j >>> 24);\r\n+        b[off + 3] = (byte) (j >>> 32);\r\n+        b[off + 2] = (byte) (j >>> 40);\r\n+        b[off + 1] = (byte) (j >>> 48);\r\n+        b[off + 0] = (byte) (j >>> 56);\r\n+    }\r\n+\r\n+    /**\r\n+     * to short.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return short.\r\n+     */\r\n+    public static short bytes2short(byte[] b) {\r\n+        return bytes2short(b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to short.\r\n+     *\r\n+     * @param b   byte array.\r\n+     * @param off offset.\r\n+     * @return short.\r\n+     */\r\n+    public static short bytes2short(byte[] b, int off) {\r\n+        return (short) (((b[off + 1] & 0xFF) << 0) +\r\n+                ((b[off + 0]) << 8));\r\n+    }\r\n+\r\n+    /**\r\n+     * to int.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return int.\r\n+     */\r\n+    public static int bytes2int(byte[] b) {\r\n+        return bytes2int(b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to int.\r\n+     *\r\n+     * @param b   byte array.\r\n+     * @param off offset.\r\n+     * @return int.\r\n+     */\r\n+    public static int bytes2int(byte[] b, int off) {\r\n+        return ((b[off + 3] & 0xFF) << 0) +\r\n+                ((b[off + 2] & 0xFF) << 8) +\r\n+                ((b[off + 1] & 0xFF) << 16) +\r\n+                ((b[off + 0]) << 24);\r\n+    }\r\n+\r\n+    /**\r\n+     * to int.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return int.\r\n+     */\r\n+    public static float bytes2float(byte[] b) {\r\n+        return bytes2float(b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to int.\r\n+     *\r\n+     * @param b   byte array.\r\n+     * @param off offset.\r\n+     * @return int.\r\n+     */\r\n+    public static float bytes2float(byte[] b, int off) {\r\n+        int i = ((b[off + 3] & 0xFF) << 0) +\r\n+                ((b[off + 2] & 0xFF) << 8) +\r\n+                ((b[off + 1] & 0xFF) << 16) +\r\n+                ((b[off + 0]) << 24);\r\n+        return Float.intBitsToFloat(i);\r\n+    }\r\n+\r\n+    /**\r\n+     * to long.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return long.\r\n+     */\r\n+    public static long bytes2long(byte[] b) {\r\n+        return bytes2long(b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to long.\r\n+     *\r\n+     * @param b   byte array.\r\n+     * @param off offset.\r\n+     * @return long.\r\n+     */\r\n+    public static long bytes2long(byte[] b, int off) {\r\n+        return ((b[off + 7] & 0xFFL) << 0) +\r\n+                ((b[off + 6] & 0xFFL) << 8) +\r\n+                ((b[off + 5] & 0xFFL) << 16) +\r\n+                ((b[off + 4] & 0xFFL) << 24) +\r\n+                ((b[off + 3] & 0xFFL) << 32) +\r\n+                ((b[off + 2] & 0xFFL) << 40) +\r\n+                ((b[off + 1] & 0xFFL) << 48) +\r\n+                (((long) b[off + 0]) << 56);\r\n+    }\r\n+\r\n+    /**\r\n+     * to long.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return double.\r\n+     */\r\n+    public static double bytes2double(byte[] b) {\r\n+        return bytes2double(b, 0);\r\n+    }\r\n+\r\n+    /**\r\n+     * to long.\r\n+     *\r\n+     * @param b   byte array.\r\n+     * @param off offset.\r\n+     * @return double.\r\n+     */\r\n+    public static double bytes2double(byte[] b, int off) {\r\n+        long j = ((b[off + 7] & 0xFFL) << 0) +\r\n+                ((b[off + 6] & 0xFFL) << 8) +\r\n+                ((b[off + 5] & 0xFFL) << 16) +\r\n+                ((b[off + 4] & 0xFFL) << 24) +\r\n+                ((b[off + 3] & 0xFFL) << 32) +\r\n+                ((b[off + 2] & 0xFFL) << 40) +\r\n+                ((b[off + 1] & 0xFFL) << 48) +\r\n+                (((long) b[off + 0]) << 56);\r\n+        return Double.longBitsToDouble(j);\r\n+    }\r\n+\r\n+    /**\r\n+     * to hex string.\r\n+     *\r\n+     * @param bs byte array.\r\n+     * @return hex string.\r\n+     */\r\n+    public static String bytes2hex(byte[] bs) {\r\n+        return bytes2hex(bs, 0, bs.length);\r\n+    }\r\n+\r\n+    /**\r\n+     * to hex string.\r\n+     *\r\n+     * @param bs  byte array.\r\n+     * @param off offset.\r\n+     * @param len length.\r\n+     * @return hex string.\r\n+     */\r\n+    public static String bytes2hex(byte[] bs, int off, int len) {\r\n+        if (off < 0) {\r\n+            throw new IndexOutOfBoundsException(\"bytes2hex: offset < 0, offset is \" + off);\r\n+        }\r\n+        if (len < 0) {\r\n+            throw new IndexOutOfBoundsException(\"bytes2hex: length < 0, length is \" + len);\r\n+        }\r\n+        if (off + len > bs.length) {\r\n+            throw new IndexOutOfBoundsException(\"bytes2hex: offset + length > array length.\");\r\n+        }\r\n+\r\n+        byte b;\r\n+        int r = off, w = 0;\r\n+        char[] cs = new char[len * 2];\r\n+        for (int i = 0; i < len; i++) {\r\n+            b = bs[r++];\r\n+            cs[w++] = BASE16[b >> 4 & MASK4];\r\n+            cs[w++] = BASE16[b & MASK4];\r\n+        }\r\n+        return new String(cs);\r\n+    }\r\n+\r\n+    /**\r\n+     * from hex string.\r\n+     *\r\n+     * @param str hex string.\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] hex2bytes(String str) {\r\n+        return hex2bytes(str, 0, str.length());\r\n+    }\r\n+\r\n+    /**\r\n+     * from hex string.\r\n+     *\r\n+     * @param str hex string.\r\n+     * @param off offset.\r\n+     * @param len length.\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] hex2bytes(final String str, final int off, int len) {\r\n+        if ((len & 1) == 1) {\r\n+            throw new IllegalArgumentException(\"hex2bytes: ( len & 1 ) == 1.\");\r\n+        }\r\n+\r\n+        if (off < 0) {\r\n+            throw new IndexOutOfBoundsException(\"hex2bytes: offset < 0, offset is \" + off);\r\n+        }\r\n+        if (len < 0) {\r\n+            throw new IndexOutOfBoundsException(\"hex2bytes: length < 0, length is \" + len);\r\n+        }\r\n+        if (off + len > str.length()) {\r\n+            throw new IndexOutOfBoundsException(\"hex2bytes: offset + length > array length.\");\r\n+        }\r\n+\r\n+        int num = len / 2, r = off, w = 0;\r\n+        byte[] b = new byte[num];\r\n+        for (int i = 0; i < num; i++) {\r\n+            b[w++] = (byte) (hex(str.charAt(r++)) << 4 | hex(str.charAt(r++)));\r\n+        }\r\n+        return b;\r\n+    }\r\n+\r\n+    /**\r\n+     * to base64 string.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return base64 string.\r\n+     */\r\n+    public static String bytes2base64(byte[] b) {\r\n+        return bytes2base64(b, 0, b.length, BASE64);\r\n+    }\r\n+\r\n+    /**\r\n+     * to base64 string.\r\n+     *\r\n+     * @param b byte array.\r\n+     * @return base64 string.\r\n+     */\r\n+    public static String bytes2base64(byte[] b, int offset, int length) {\r\n+        return bytes2base64(b, offset, length, BASE64);\r\n+    }\r\n+\r\n+    /**\r\n+     * to base64 string.\r\n+     *\r\n+     * @param b    byte array.\r\n+     * @param code base64 code string(0-63 is base64 char,64 is pad char).\r\n+     * @return base64 string.\r\n+     */\r\n+    public static String bytes2base64(byte[] b, String code) {\r\n+        return bytes2base64(b, 0, b.length, code);\r\n+    }\r\n+\r\n+    /**\r\n+     * to base64 string.\r\n+     *\r\n+     * @param b    byte array.\r\n+     * @param code base64 code string(0-63 is base64 char,64 is pad char).\r\n+     * @return base64 string.\r\n+     */\r\n+    public static String bytes2base64(byte[] b, int offset, int length, String code) {\r\n+        if (code.length() < 64) {\r\n+            throw new IllegalArgumentException(\"Base64 code length < 64.\");\r\n+        }\r\n+\r\n+        return bytes2base64(b, offset, length, code.toCharArray());\r\n+    }\r\n+\r\n+    /**\r\n+     * to base64 string.\r\n+     *\r\n+     * @param b    byte array.\r\n+     * @param code base64 code(0-63 is base64 char,64 is pad char).\r\n+     * @return base64 string.\r\n+     */\r\n+    public static String bytes2base64(byte[] b, char[] code) {\r\n+        return bytes2base64(b, 0, b.length, code);\r\n+    }\r\n+\r\n+    /**\r\n+     * to base64 string.\r\n+     *\r\n+     * @param bs   byte array.\r\n+     * @param off  offset.\r\n+     * @param len  length.\r\n+     * @param code base64 code(0-63 is base64 char,64 is pad char).\r\n+     * @return base64 string.\r\n+     */\r\n+    public static String bytes2base64(final byte[] bs, final int off, final int len, final char[] code) {\r\n+        if (off < 0) {\r\n+            throw new IndexOutOfBoundsException(\"bytes2base64: offset < 0, offset is \" + off);\r\n+        }\r\n+        if (len < 0) {\r\n+            throw new IndexOutOfBoundsException(\"bytes2base64: length < 0, length is \" + len);\r\n+        }\r\n+        if (off + len > bs.length) {\r\n+            throw new IndexOutOfBoundsException(\"bytes2base64: offset + length > array length.\");\r\n+        }\r\n+\r\n+        if (code.length < 64) {\r\n+            throw new IllegalArgumentException(\"Base64 code length < 64.\");\r\n+        }\r\n+\r\n+        boolean pad = code.length > 64; // has pad char.\r\n+        int num = len / 3, rem = len % 3, r = off, w = 0;\r\n+        char[] cs = new char[num * 4 + (rem == 0 ? 0 : pad ? 4 : rem + 1)];\r\n+\r\n+        for (int i = 0; i < num; i++) {\r\n+            int b1 = bs[r++] & MASK8, b2 = bs[r++] & MASK8, b3 = bs[r++] & MASK8;\r\n+\r\n+            cs[w++] = code[b1 >> 2];\r\n+            cs[w++] = code[(b1 << 4) & MASK6 | (b2 >> 4)];\r\n+            cs[w++] = code[(b2 << 2) & MASK6 | (b3 >> 6)];\r\n+            cs[w++] = code[b3 & MASK6];\r\n+        }\r\n+\r\n+        if (rem == 1) {\r\n+            int b1 = bs[r++] & MASK8;\r\n+            cs[w++] = code[b1 >> 2];\r\n+            cs[w++] = code[(b1 << 4) & MASK6];\r\n+            if (pad) {\r\n+                cs[w++] = code[64];\r\n+                cs[w++] = code[64];\r\n+            }\r\n+        } else if (rem == 2) {\r\n+            int b1 = bs[r++] & MASK8, b2 = bs[r++] & MASK8;\r\n+            cs[w++] = code[b1 >> 2];\r\n+            cs[w++] = code[(b1 << 4) & MASK6 | (b2 >> 4)];\r\n+            cs[w++] = code[(b2 << 2) & MASK6];\r\n+            if (pad) {\r\n+                cs[w++] = code[64];\r\n+            }\r\n+        }\r\n+        return new String(cs);\r\n+    }\r\n+\r\n+    /**\r\n+     * from base64 string.\r\n+     *\r\n+     * @param str base64 string.\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] base642bytes(String str) {\r\n+        return base642bytes(str, 0, str.length());\r\n+    }\r\n+\r\n+    /**\r\n+     * from base64 string.\r\n+     *\r\n+     * @param str    base64 string.\r\n+     * @param offset offset.\r\n+     * @param length length.\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] base642bytes(String str, int offset, int length) {\r\n+        return base642bytes(str, offset, length, C64);\r\n+    }\r\n+\r\n+    /**\r\n+     * from base64 string.\r\n+     *\r\n+     * @param str  base64 string.\r\n+     * @param code base64 code(0-63 is base64 char,64 is pad char).\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] base642bytes(String str, String code) {\r\n+        return base642bytes(str, 0, str.length(), code);\r\n+    }\r\n+\r\n+    /**\r\n+     * from base64 string.\r\n+     *\r\n+     * @param str  base64 string.\r\n+     * @param off  offset.\r\n+     * @param len  length.\r\n+     * @param code base64 code(0-63 is base64 char,64 is pad char).\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] base642bytes(final String str, final int off, final int len, final String code) {\r\n+        if (off < 0) {\r\n+            throw new IndexOutOfBoundsException(\"base642bytes: offset < 0, offset is \" + off);\r\n+        }\r\n+        if (len < 0) {\r\n+            throw new IndexOutOfBoundsException(\"base642bytes: length < 0, length is \" + len);\r\n+        }\r\n+        if (len == 0) {\r\n+            return new byte[0];\r\n+        }\r\n+        if (off + len > str.length()) {\r\n+            throw new IndexOutOfBoundsException(\"base642bytes: offset + length > string length.\");\r\n+        }\r\n+\r\n+        if (code.length() < 64) {\r\n+            throw new IllegalArgumentException(\"Base64 code length < 64.\");\r\n+        }\r\n+\r\n+        int rem = len % 4;\r\n+        if (rem == 1) {\r\n+            throw new IllegalArgumentException(\"base642bytes: base64 string length % 4 == 1.\");\r\n+        }\r\n+\r\n+        int num = len / 4, size = num * 3;\r\n+        if (code.length() > 64) {\r\n+            if (rem != 0) {\r\n+                throw new IllegalArgumentException(\"base642bytes: base64 string length error.\");\r\n+            }\r\n+\r\n+            char pc = code.charAt(64);\r\n+            if (str.charAt(off + len - 2) == pc) {\r\n+                size -= 2;\r\n+                --num;\r\n+                rem = 2;\r\n+            } else if (str.charAt(off + len - 1) == pc) {\r\n+                size--;\r\n+                --num;\r\n+                rem = 3;\r\n+            }\r\n+        } else {\r\n+            if (rem == 2) {\r\n+                size++;\r\n+            } else if (rem == 3) {\r\n+                size += 2;\r\n+            }\r\n+        }\r\n+\r\n+        int r = off, w = 0;\r\n+        byte[] b = new byte[size], t = decodeTable(code);\r\n+        for (int i = 0; i < num; i++) {\r\n+            int c1 = t[str.charAt(r++)], c2 = t[str.charAt(r++)];\r\n+            int c3 = t[str.charAt(r++)], c4 = t[str.charAt(r++)];\r\n+\r\n+            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\r\n+            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\r\n+            b[w++] = (byte) ((c3 << 6) | c4);\r\n+        }\r\n+\r\n+        if (rem == 2) {\r\n+            int c1 = t[str.charAt(r++)], c2 = t[str.charAt(r++)];\r\n+\r\n+            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\r\n+        } else if (rem == 3) {\r\n+            int c1 = t[str.charAt(r++)], c2 = t[str.charAt(r++)], c3 = t[str.charAt(r++)];\r\n+\r\n+            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\r\n+            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\r\n+        }\r\n+        return b;\r\n+    }\r\n+\r\n+    /**\r\n+     * from base64 string.\r\n+     *\r\n+     * @param str  base64 string.\r\n+     * @param code base64 code(0-63 is base64 char,64 is pad char).\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] base642bytes(String str, char[] code) {\r\n+        return base642bytes(str, 0, str.length(), code);\r\n+    }\r\n+\r\n+    /**\r\n+     * from base64 string.\r\n+     *\r\n+     * @param str  base64 string.\r\n+     * @param off  offset.\r\n+     * @param len  length.\r\n+     * @param code base64 code(0-63 is base64 char,64 is pad char).\r\n+     * @return byte array.\r\n+     */\r\n+    public static byte[] base642bytes(final String str, final int off, final int len, final char[] code) {\r\n+        if (off < 0) {\r\n+            throw new IndexOutOfBoundsException(\"base642bytes: offset < 0, offset is \" + off);\r\n+        }\r\n+        if (len < 0) {\r\n+            throw new IndexOutOfBoundsException(\"base642bytes: length < 0, length is \" + len);\r\n+        }\r\n+        if (len == 0) {\r\n+            return new byte[0];\r\n+        }\r\n+        if (off + len > str.length()) {\r\n+            throw new IndexOutOfBoundsException(\"base642bytes: offset + length > string length.\");\r\n+        }\r\n+\r\n+        if (code.length < 64) {\r\n+            throw new IllegalArgumentException(\"Base64 code length < 64.\");\r\n+        }\r\n+\r\n+        int rem = len % 4;\r\n+        if (rem == 1) {\r\n+            throw new IllegalArgumentException(\"base642bytes: base64 string length % 4 == 1.\");\r\n+        }\r\n+\r\n+        int num = len / 4, size = num * 3;\r\n+        if (code.length > 64) {\r\n+            if (rem != 0) {\r\n+                throw new IllegalArgumentException(\"base642bytes: base64 string length error.\");\r\n+            }\r\n+\r\n+            char pc = code[64];\r\n+            if (str.charAt(off + len - 2) == pc) {\r\n+                size -= 2;\r\n+                --num;\r\n+                rem = 2;\r\n+            } else if (str.charAt(off + len - 1) == pc) {\r\n+                size--;\r\n+                --num;\r\n+                rem = 3;\r\n+            }\r\n+        } else {\r\n+            if (rem == 2) {\r\n+                size++;\r\n+            } else if (rem == 3) {\r\n+                size += 2;\r\n+            }\r\n+        }\r\n+\r\n+        int r = off, w = 0;\r\n+        byte[] b = new byte[size];\r\n+        for (int i = 0; i < num; i++) {\r\n+            int c1 = indexOf(code, str.charAt(r++)), c2 = indexOf(code, str.charAt(r++));\r\n+            int c3 = indexOf(code, str.charAt(r++)), c4 = indexOf(code, str.charAt(r++));\r\n+\r\n+            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\r\n+            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\r\n+            b[w++] = (byte) ((c3 << 6) | c4);\r\n+        }\r\n+\r\n+        if (rem == 2) {\r\n+            int c1 = indexOf(code, str.charAt(r++)), c2 = indexOf(code, str.charAt(r++));\r\n+\r\n+            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\r\n+        } else if (rem == 3) {\r\n+            int c1 = indexOf(code, str.charAt(r++)), c2 = indexOf(code, str.charAt(r++)), c3 = indexOf(code, str.charAt(r++));\r\n+\r\n+            b[w++] = (byte) ((c1 << 2) | (c2 >> 4));\r\n+            b[w++] = (byte) ((c2 << 4) | (c3 >> 2));\r\n+        }\r\n+        return b;\r\n+    }\r\n+\r\n+    /**\r\n+     * zip.\r\n+     *\r\n+     * @param bytes source.\r\n+     * @return compressed byte array.\r\n+     * @throws IOException\r\n+     */\r\n+    public static byte[] zip(byte[] bytes) throws IOException {\r\n+        UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream();\r\n+        OutputStream os = new DeflaterOutputStream(bos);\r\n+        try {\r\n+            os.write(bytes);\r\n+        } finally {\r\n+            os.close();\r\n+            bos.close();\r\n+        }\r\n+        return bos.toByteArray();\r\n+    }\r\n+\r\n+    /**\r\n+     * unzip.\r\n+     *\r\n+     * @param bytes compressed byte array.\r\n+     * @return byte uncompressed array.\r\n+     * @throws IOException\r\n+     */\r\n+    public static byte[] unzip(byte[] bytes) throws IOException {\r\n+        UnsafeByteArrayInputStream bis = new UnsafeByteArrayInputStream(bytes);\r\n+        UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream();\r\n+        InputStream is = new InflaterInputStream(bis);\r\n+        try {\r\n+            IOUtils.write(is, bos);\r\n+            return bos.toByteArray();\r\n+        } finally {\r\n+            is.close();\r\n+            bis.close();\r\n+            bos.close();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * get md5.\r\n+     *\r\n+     * @param str input string.\r\n+     * @return MD5 byte array.\r\n+     */\r\n+    public static byte[] getMD5(String str) {\r\n+        return getMD5(str.getBytes());\r\n+    }\r\n+\r\n+    /**\r\n+     * get md5.\r\n+     *\r\n+     * @param source byte array source.\r\n+     * @return MD5 byte array.\r\n+     */\r\n+    public static byte[] getMD5(byte[] source) {\r\n+        MessageDigest md = getMessageDigest();\r\n+        return md.digest(source);\r\n+    }\r\n+\r\n+    /**\r\n+     * get md5.\r\n+     *\r\n+     * @param file file source.\r\n+     * @return MD5 byte array.\r\n+     */\r\n+    public static byte[] getMD5(File file) throws IOException {\r\n+        InputStream is = new FileInputStream(file);\r\n+        try {\r\n+            return getMD5(is);\r\n+        } finally {\r\n+            is.close();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * get md5.\r\n+     *\r\n+     * @param is input stream.\r\n+     * @return MD5 byte array.\r\n+     */\r\n+    public static byte[] getMD5(InputStream is) throws IOException {\r\n+        return getMD5(is, 1024 * 8);\r\n+    }\r\n+\r\n+    private static byte hex(char c) {\r\n+        if (c <= '9') {\r\n+            return (byte) (c - '0');\r\n+        }\r\n+        if (c >= 'a' && c <= 'f') {\r\n+            return (byte) (c - 'a' + 10);\r\n+        }\r\n+        if (c >= 'A' && c <= 'F') {\r\n+            return (byte) (c - 'A' + 10);\r\n+        }\r\n+        throw new IllegalArgumentException(\"hex string format error [\" + c + \"].\");\r\n+    }\r\n+\r\n+    private static int indexOf(char[] cs, char c) {\r\n+        for (int i = 0, len = cs.length; i < len; i++) {\r\n+            if (cs[i] == c) {\r\n+                return i;\r\n+            }\r\n+        }\r\n+        return -1;\r\n+    }\r\n+\r\n+    private static byte[] decodeTable(String code) {\r\n+        int hash = code.hashCode();\r\n+        byte[] ret = DECODE_TABLE_MAP.get(hash);\r\n+        if (ret == null) {\r\n+            if (code.length() < 64) {\r\n+                throw new IllegalArgumentException(\"Base64 code length < 64.\");\r\n+            }\r\n+            // create new decode table.\r\n+            ret = new byte[128];\r\n+            for (int i = 0; i < 128; i++) // init table.\r\n+            {\r\n+                ret[i] = -1;\r\n+            }\r\n+            for (int i = 0; i < 64; i++) {\r\n+                ret[code.charAt(i)] = (byte) i;\r\n+            }\r\n+            DECODE_TABLE_MAP.put(hash, ret);\r\n+        }\r\n+        return ret;\r\n+    }\r\n+\r\n+    private static byte[] getMD5(InputStream is, int bs) throws IOException {\r\n+        MessageDigest md = getMessageDigest();\r\n+        byte[] buf = new byte[bs];\r\n+        while (is.available() > 0) {\r\n+            int read, total = 0;\r\n+            do {\r\n+                if ((read = is.read(buf, total, bs - total)) <= 0) {\r\n+                    break;\r\n+                }\r\n+                total += read;\r\n+            }\r\n+            while (total < bs);\r\n+            md.update(buf);\r\n+        }\r\n+        return md.digest();\r\n+    }\r\n+\r\n+    private static MessageDigest getMessageDigest() {\r\n+        MessageDigest ret = MD.get();\r\n+        if (ret == null) {\r\n+            try {\r\n+                ret = MessageDigest.getInstance(\"MD5\");\r\n+                MD.set(ret);\r\n+            } catch (NoSuchAlgorithmException e) {\r\n+                throw new RuntimeException(e);\r\n+            }\r\n+        }\r\n+        return ret;\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/io/StreamUtils.java", "source2": "org/apache/dubbo/common/io/StreamUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,231 +1,231 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.io;\n-\n-import java.io.IOException;\n-import java.io.InputStream;\n-\n-/**\n- * Stream utils.\n- */\n-public class StreamUtils {\n-    private StreamUtils() {\n-    }\n-\n-    public static InputStream limitedInputStream(final InputStream is, final int limit) throws IOException {\n-        return new InputStream() {\n-            private int mPosition = 0, mMark = 0, mLimit = Math.min(limit, is.available());\n-\n-            @Override\n-            public int read() throws IOException {\n-                if (mPosition < mLimit) {\n-                    mPosition++;\n-                    return is.read();\n-                }\n-                return -1;\n-            }\n-\n-            @Override\n-            public int read(byte[] b, int off, int len) throws IOException {\n-                if (b == null) {\n-                    throw new NullPointerException();\n-                }\n-\n-                if (off < 0 || len < 0 || len > b.length - off) {\n-                    throw new IndexOutOfBoundsException();\n-                }\n-\n-                if (mPosition >= mLimit) {\n-                    return -1;\n-                }\n-\n-                if (mPosition + len > mLimit) {\n-                    len = mLimit - mPosition;\n-                }\n-\n-                if (len <= 0) {\n-                    return 0;\n-                }\n-\n-                is.read(b, off, len);\n-                mPosition += len;\n-                return len;\n-            }\n-\n-            @Override\n-            public long skip(long len) throws IOException {\n-                if (mPosition + len > mLimit) {\n-                    len = mLimit - mPosition;\n-                }\n-\n-                if (len <= 0) {\n-                    return 0;\n-                }\n-\n-                is.skip(len);\n-                mPosition += len;\n-                return len;\n-            }\n-\n-            @Override\n-            public int available() {\n-                return mLimit - mPosition;\n-            }\n-\n-            @Override\n-            public boolean markSupported() {\n-                return is.markSupported();\n-            }\n-\n-            @Override\n-            public void mark(int readlimit) {\n-                is.mark(readlimit);\n-                mMark = mPosition;\n-            }\n-\n-            @Override\n-            public void reset() throws IOException {\n-                is.reset();\n-                mPosition = mMark;\n-            }\n-\n-            @Override\n-            public void close() throws IOException {\n-                is.close();\n-            }\n-        };\n-    }\n-\n-    public static InputStream markSupportedInputStream(final InputStream is, final int markBufferSize) {\n-        if (is.markSupported()) {\n-            return is;\n-        }\n-\n-        return new InputStream() {\n-            byte[] mMarkBuffer;\n-\n-            boolean mInMarked = false;\n-            boolean mInReset = false;\n-            boolean mDry = false;\n-            private int mPosition = 0;\n-            private int mCount = 0;\n-\n-            @Override\n-            public int read() throws IOException {\n-                if (!mInMarked) {\n-                    return is.read();\n-                } else {\n-                    if (mPosition < mCount) {\n-                        byte b = mMarkBuffer[mPosition++];\n-                        return b & 0xFF;\n-                    }\n-\n-                    if (!mInReset) {\n-                        if (mDry) {\n-                            return -1;\n-                        }\n-\n-                        if (null == mMarkBuffer) {\n-                            mMarkBuffer = new byte[markBufferSize];\n-                        }\n-                        if (mPosition >= markBufferSize) {\n-                            throw new IOException(\"Mark buffer is full!\");\n-                        }\n-\n-                        int read = is.read();\n-                        if (-1 == read) {\n-                            mDry = true;\n-                            return -1;\n-                        }\n-\n-                        mMarkBuffer[mPosition++] = (byte) read;\n-                        mCount++;\n-\n-                        return read;\n-                    } else {\n-                        // mark buffer is used, exit mark status!\n-                        mInMarked = false;\n-                        mInReset = false;\n-                        mPosition = 0;\n-                        mCount = 0;\n-\n-                        return is.read();\n-                    }\n-                }\n-            }\n-\n-            /**\n-             * NOTE: the <code>readlimit</code> argument for this class\n-             *  has no meaning.\n-             */\n-            @Override\n-            public synchronized void mark(int readlimit) {\n-                mInMarked = true;\n-                mInReset = false;\n-\n-                // mark buffer is not empty\n-                int count = mCount - mPosition;\n-                if (count > 0) {\n-                    System.arraycopy(mMarkBuffer, mPosition, mMarkBuffer, 0, count);\n-                    mCount = count;\n-                    mPosition = 0;\n-                }\n-            }\n-\n-            @Override\n-            public synchronized void reset() throws IOException {\n-                if (!mInMarked) {\n-                    throw new IOException(\"should mark before reset!\");\n-                }\n-\n-                mInReset = true;\n-                mPosition = 0;\n-            }\n-\n-            @Override\n-            public boolean markSupported() {\n-                return true;\n-            }\n-\n-            @Override\n-            public int available() throws IOException {\n-                int available = is.available();\n-\n-                if (mInMarked && mInReset) {\n-                    available += mCount - mPosition;\n-                }\n-\n-                return available;\n-            }\n-\n-            @Override\n-            public void close() throws IOException {\n-                is.close();\n-            }\n-        };\n-    }\n-\n-    public static InputStream markSupportedInputStream(final InputStream is) {\n-        return markSupportedInputStream(is, 1024);\n-    }\n-\n-    public static void skipUnusedStream(InputStream is) throws IOException {\n-        if (is.available() > 0) {\n-            is.skip(is.available());\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.io;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.InputStream;\r\n+\r\n+/**\r\n+ * Stream utils.\r\n+ */\r\n+public class StreamUtils {\r\n+    private StreamUtils() {\r\n+    }\r\n+\r\n+    public static InputStream limitedInputStream(final InputStream is, final int limit) throws IOException {\r\n+        return new InputStream() {\r\n+            private int mPosition = 0, mMark = 0, mLimit = Math.min(limit, is.available());\r\n+\r\n+            @Override\r\n+            public int read() throws IOException {\r\n+                if (mPosition < mLimit) {\r\n+                    mPosition++;\r\n+                    return is.read();\r\n+                }\r\n+                return -1;\r\n+            }\r\n+\r\n+            @Override\r\n+            public int read(byte[] b, int off, int len) throws IOException {\r\n+                if (b == null) {\r\n+                    throw new NullPointerException();\r\n+                }\r\n+\r\n+                if (off < 0 || len < 0 || len > b.length - off) {\r\n+                    throw new IndexOutOfBoundsException();\r\n+                }\r\n+\r\n+                if (mPosition >= mLimit) {\r\n+                    return -1;\r\n+                }\r\n+\r\n+                if (mPosition + len > mLimit) {\r\n+                    len = mLimit - mPosition;\r\n+                }\r\n+\r\n+                if (len <= 0) {\r\n+                    return 0;\r\n+                }\r\n+\r\n+                is.read(b, off, len);\r\n+                mPosition += len;\r\n+                return len;\r\n+            }\r\n+\r\n+            @Override\r\n+            public long skip(long len) throws IOException {\r\n+                if (mPosition + len > mLimit) {\r\n+                    len = mLimit - mPosition;\r\n+                }\r\n+\r\n+                if (len <= 0) {\r\n+                    return 0;\r\n+                }\r\n+\r\n+                is.skip(len);\r\n+                mPosition += len;\r\n+                return len;\r\n+            }\r\n+\r\n+            @Override\r\n+            public int available() {\r\n+                return mLimit - mPosition;\r\n+            }\r\n+\r\n+            @Override\r\n+            public boolean markSupported() {\r\n+                return is.markSupported();\r\n+            }\r\n+\r\n+            @Override\r\n+            public void mark(int readlimit) {\r\n+                is.mark(readlimit);\r\n+                mMark = mPosition;\r\n+            }\r\n+\r\n+            @Override\r\n+            public void reset() throws IOException {\r\n+                is.reset();\r\n+                mPosition = mMark;\r\n+            }\r\n+\r\n+            @Override\r\n+            public void close() throws IOException {\r\n+                is.close();\r\n+            }\r\n+        };\r\n+    }\r\n+\r\n+    public static InputStream markSupportedInputStream(final InputStream is, final int markBufferSize) {\r\n+        if (is.markSupported()) {\r\n+            return is;\r\n+        }\r\n+\r\n+        return new InputStream() {\r\n+            byte[] mMarkBuffer;\r\n+\r\n+            boolean mInMarked = false;\r\n+            boolean mInReset = false;\r\n+            boolean mDry = false;\r\n+            private int mPosition = 0;\r\n+            private int mCount = 0;\r\n+\r\n+            @Override\r\n+            public int read() throws IOException {\r\n+                if (!mInMarked) {\r\n+                    return is.read();\r\n+                } else {\r\n+                    if (mPosition < mCount) {\r\n+                        byte b = mMarkBuffer[mPosition++];\r\n+                        return b & 0xFF;\r\n+                    }\r\n+\r\n+                    if (!mInReset) {\r\n+                        if (mDry) {\r\n+                            return -1;\r\n+                        }\r\n+\r\n+                        if (null == mMarkBuffer) {\r\n+                            mMarkBuffer = new byte[markBufferSize];\r\n+                        }\r\n+                        if (mPosition >= markBufferSize) {\r\n+                            throw new IOException(\"Mark buffer is full!\");\r\n+                        }\r\n+\r\n+                        int read = is.read();\r\n+                        if (-1 == read) {\r\n+                            mDry = true;\r\n+                            return -1;\r\n+                        }\r\n+\r\n+                        mMarkBuffer[mPosition++] = (byte) read;\r\n+                        mCount++;\r\n+\r\n+                        return read;\r\n+                    } else {\r\n+                        // mark buffer is used, exit mark status!\r\n+                        mInMarked = false;\r\n+                        mInReset = false;\r\n+                        mPosition = 0;\r\n+                        mCount = 0;\r\n+\r\n+                        return is.read();\r\n+                    }\r\n+                }\r\n+            }\r\n+\r\n+            /**\r\n+             * NOTE: the <code>readlimit</code> argument for this class\r\n+             *  has no meaning.\r\n+             */\r\n+            @Override\r\n+            public synchronized void mark(int readlimit) {\r\n+                mInMarked = true;\r\n+                mInReset = false;\r\n+\r\n+                // mark buffer is not empty\r\n+                int count = mCount - mPosition;\r\n+                if (count > 0) {\r\n+                    System.arraycopy(mMarkBuffer, mPosition, mMarkBuffer, 0, count);\r\n+                    mCount = count;\r\n+                    mPosition = 0;\r\n+                }\r\n+            }\r\n+\r\n+            @Override\r\n+            public synchronized void reset() throws IOException {\r\n+                if (!mInMarked) {\r\n+                    throw new IOException(\"should mark before reset!\");\r\n+                }\r\n+\r\n+                mInReset = true;\r\n+                mPosition = 0;\r\n+            }\r\n+\r\n+            @Override\r\n+            public boolean markSupported() {\r\n+                return true;\r\n+            }\r\n+\r\n+            @Override\r\n+            public int available() throws IOException {\r\n+                int available = is.available();\r\n+\r\n+                if (mInMarked && mInReset) {\r\n+                    available += mCount - mPosition;\r\n+                }\r\n+\r\n+                return available;\r\n+            }\r\n+\r\n+            @Override\r\n+            public void close() throws IOException {\r\n+                is.close();\r\n+            }\r\n+        };\r\n+    }\r\n+\r\n+    public static InputStream markSupportedInputStream(final InputStream is) {\r\n+        return markSupportedInputStream(is, 1024);\r\n+    }\r\n+\r\n+    public static void skipUnusedStream(InputStream is) throws IOException {\r\n+        if (is.available() > 0) {\r\n+            is.skip(is.available());\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/io/UnsafeByteArrayInputStream.java", "source2": "org/apache/dubbo/common/io/UnsafeByteArrayInputStream.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,118 +1,118 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.io;\n-\n-import java.io.IOException;\n-import java.io.InputStream;\n-\n-/**\n- * UnsafeByteArrayInputStream.\n- */\n-public class UnsafeByteArrayInputStream extends InputStream {\n-    protected byte[] mData;\n-\n-    protected int mPosition, mLimit, mMark = 0;\n-\n-    public UnsafeByteArrayInputStream(byte[] buf) {\n-        this(buf, 0, buf.length);\n-    }\n-\n-    public UnsafeByteArrayInputStream(byte[] buf, int offset) {\n-        this(buf, offset, buf.length - offset);\n-    }\n-\n-    public UnsafeByteArrayInputStream(byte[] buf, int offset, int length) {\n-        mData = buf;\n-        mPosition = mMark = offset;\n-        mLimit = Math.min(offset + length, buf.length);\n-    }\n-\n-    @Override\n-    public int read() {\n-        return (mPosition < mLimit) ? (mData[mPosition++] & 0xff) : -1;\n-    }\n-\n-    @Override\n-    public int read(byte[] b, int off, int len) {\n-        if (b == null) {\n-            throw new NullPointerException();\n-        }\n-        if (off < 0 || len < 0 || len > b.length - off) {\n-            throw new IndexOutOfBoundsException();\n-        }\n-        if (mPosition >= mLimit) {\n-            return -1;\n-        }\n-        if (mPosition + len > mLimit) {\n-            len = mLimit - mPosition;\n-        }\n-        if (len <= 0) {\n-            return 0;\n-        }\n-        System.arraycopy(mData, mPosition, b, off, len);\n-        mPosition += len;\n-        return len;\n-    }\n-\n-    @Override\n-    public long skip(long len) {\n-        if (mPosition + len > mLimit) {\n-            len = mLimit - mPosition;\n-        }\n-        if (len <= 0) {\n-            return 0;\n-        }\n-        mPosition += len;\n-        return len;\n-    }\n-\n-    @Override\n-    public int available() {\n-        return mLimit - mPosition;\n-    }\n-\n-    @Override\n-    public boolean markSupported() {\n-        return true;\n-    }\n-\n-    @Override\n-    public void mark(int readAheadLimit) {\n-        mMark = mPosition;\n-    }\n-\n-    @Override\n-    public void reset() {\n-        mPosition = mMark;\n-    }\n-\n-    @Override\n-    public void close() throws IOException {\n-    }\n-\n-    public int position() {\n-        return mPosition;\n-    }\n-\n-    public void position(int newPosition) {\n-        mPosition = newPosition;\n-    }\n-\n-    public int size() {\n-        return mData == null ? 0 : mData.length;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.io;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.InputStream;\r\n+\r\n+/**\r\n+ * UnsafeByteArrayInputStream.\r\n+ */\r\n+public class UnsafeByteArrayInputStream extends InputStream {\r\n+    protected byte[] mData;\r\n+\r\n+    protected int mPosition, mLimit, mMark = 0;\r\n+\r\n+    public UnsafeByteArrayInputStream(byte[] buf) {\r\n+        this(buf, 0, buf.length);\r\n+    }\r\n+\r\n+    public UnsafeByteArrayInputStream(byte[] buf, int offset) {\r\n+        this(buf, offset, buf.length - offset);\r\n+    }\r\n+\r\n+    public UnsafeByteArrayInputStream(byte[] buf, int offset, int length) {\r\n+        mData = buf;\r\n+        mPosition = mMark = offset;\r\n+        mLimit = Math.min(offset + length, buf.length);\r\n+    }\r\n+\r\n+    @Override\r\n+    public int read() {\r\n+        return (mPosition < mLimit) ? (mData[mPosition++] & 0xff) : -1;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int read(byte[] b, int off, int len) {\r\n+        if (b == null) {\r\n+            throw new NullPointerException();\r\n+        }\r\n+        if (off < 0 || len < 0 || len > b.length - off) {\r\n+            throw new IndexOutOfBoundsException();\r\n+        }\r\n+        if (mPosition >= mLimit) {\r\n+            return -1;\r\n+        }\r\n+        if (mPosition + len > mLimit) {\r\n+            len = mLimit - mPosition;\r\n+        }\r\n+        if (len <= 0) {\r\n+            return 0;\r\n+        }\r\n+        System.arraycopy(mData, mPosition, b, off, len);\r\n+        mPosition += len;\r\n+        return len;\r\n+    }\r\n+\r\n+    @Override\r\n+    public long skip(long len) {\r\n+        if (mPosition + len > mLimit) {\r\n+            len = mLimit - mPosition;\r\n+        }\r\n+        if (len <= 0) {\r\n+            return 0;\r\n+        }\r\n+        mPosition += len;\r\n+        return len;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int available() {\r\n+        return mLimit - mPosition;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean markSupported() {\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void mark(int readAheadLimit) {\r\n+        mMark = mPosition;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void reset() {\r\n+        mPosition = mMark;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void close() throws IOException {\r\n+    }\r\n+\r\n+    public int position() {\r\n+        return mPosition;\r\n+    }\r\n+\r\n+    public void position(int newPosition) {\r\n+        mPosition = newPosition;\r\n+    }\r\n+\r\n+    public int size() {\r\n+        return mData == null ? 0 : mData.length;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/io/UnsafeByteArrayOutputStream.java", "source2": "org/apache/dubbo/common/io/UnsafeByteArrayOutputStream.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,101 +1,101 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.io;\n-\n-import java.io.IOException;\n-import java.io.OutputStream;\n-import java.io.UnsupportedEncodingException;\n-import java.nio.ByteBuffer;\n-\n-/**\n- * UnsafeByteArrayOutputStream.\n- */\n-public class UnsafeByteArrayOutputStream extends OutputStream {\n-    protected byte[] mBuffer;\n-\n-    protected int mCount;\n-\n-    public UnsafeByteArrayOutputStream() {\n-        this(32);\n-    }\n-\n-    public UnsafeByteArrayOutputStream(int size) {\n-        if (size < 0) {\n-            throw new IllegalArgumentException(\"Negative initial size: \" + size);\n-        }\n-        mBuffer = new byte[size];\n-    }\n-\n-    @Override\n-    public void write(int b) {\n-        int newcount = mCount + 1;\n-        if (newcount > mBuffer.length) {\n-            mBuffer = Bytes.copyOf(mBuffer, Math.max(mBuffer.length << 1, newcount));\n-        }\n-        mBuffer[mCount] = (byte) b;\n-        mCount = newcount;\n-    }\n-\n-    @Override\n-    public void write(byte[] b, int off, int len) {\n-        if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) {\n-            throw new IndexOutOfBoundsException();\n-        }\n-        if (len == 0) {\n-            return;\n-        }\n-        int newcount = mCount + len;\n-        if (newcount > mBuffer.length) {\n-            mBuffer = Bytes.copyOf(mBuffer, Math.max(mBuffer.length << 1, newcount));\n-        }\n-        System.arraycopy(b, off, mBuffer, mCount, len);\n-        mCount = newcount;\n-    }\n-\n-    public int size() {\n-        return mCount;\n-    }\n-\n-    public void reset() {\n-        mCount = 0;\n-    }\n-\n-    public byte[] toByteArray() {\n-        return Bytes.copyOf(mBuffer, mCount);\n-    }\n-\n-    public ByteBuffer toByteBuffer() {\n-        return ByteBuffer.wrap(mBuffer, 0, mCount);\n-    }\n-\n-    public void writeTo(OutputStream out) throws IOException {\n-        out.write(mBuffer, 0, mCount);\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return new String(mBuffer, 0, mCount);\n-    }\n-\n-    public String toString(String charset) throws UnsupportedEncodingException {\n-        return new String(mBuffer, 0, mCount, charset);\n-    }\n-\n-    @Override\n-    public void close() throws IOException {\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.io;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.OutputStream;\r\n+import java.io.UnsupportedEncodingException;\r\n+import java.nio.ByteBuffer;\r\n+\r\n+/**\r\n+ * UnsafeByteArrayOutputStream.\r\n+ */\r\n+public class UnsafeByteArrayOutputStream extends OutputStream {\r\n+    protected byte[] mBuffer;\r\n+\r\n+    protected int mCount;\r\n+\r\n+    public UnsafeByteArrayOutputStream() {\r\n+        this(32);\r\n+    }\r\n+\r\n+    public UnsafeByteArrayOutputStream(int size) {\r\n+        if (size < 0) {\r\n+            throw new IllegalArgumentException(\"Negative initial size: \" + size);\r\n+        }\r\n+        mBuffer = new byte[size];\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(int b) {\r\n+        int newcount = mCount + 1;\r\n+        if (newcount > mBuffer.length) {\r\n+            mBuffer = Bytes.copyOf(mBuffer, Math.max(mBuffer.length << 1, newcount));\r\n+        }\r\n+        mBuffer[mCount] = (byte) b;\r\n+        mCount = newcount;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(byte[] b, int off, int len) {\r\n+        if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) {\r\n+            throw new IndexOutOfBoundsException();\r\n+        }\r\n+        if (len == 0) {\r\n+            return;\r\n+        }\r\n+        int newcount = mCount + len;\r\n+        if (newcount > mBuffer.length) {\r\n+            mBuffer = Bytes.copyOf(mBuffer, Math.max(mBuffer.length << 1, newcount));\r\n+        }\r\n+        System.arraycopy(b, off, mBuffer, mCount, len);\r\n+        mCount = newcount;\r\n+    }\r\n+\r\n+    public int size() {\r\n+        return mCount;\r\n+    }\r\n+\r\n+    public void reset() {\r\n+        mCount = 0;\r\n+    }\r\n+\r\n+    public byte[] toByteArray() {\r\n+        return Bytes.copyOf(mBuffer, mCount);\r\n+    }\r\n+\r\n+    public ByteBuffer toByteBuffer() {\r\n+        return ByteBuffer.wrap(mBuffer, 0, mCount);\r\n+    }\r\n+\r\n+    public void writeTo(OutputStream out) throws IOException {\r\n+        out.write(mBuffer, 0, mCount);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return new String(mBuffer, 0, mCount);\r\n+    }\r\n+\r\n+    public String toString(String charset) throws UnsupportedEncodingException {\r\n+        return new String(mBuffer, 0, mCount, charset);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void close() throws IOException {\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/io/UnsafeStringWriter.java", "source2": "org/apache/dubbo/common/io/UnsafeStringWriter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,107 +1,107 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.io;\n-\n-import java.io.IOException;\n-import java.io.Writer;\n-\n-/**\n- * Thread-unsafe StringWriter.\n- */\n-public class UnsafeStringWriter extends Writer {\n-    private StringBuilder mBuffer;\n-\n-    public UnsafeStringWriter() {\n-        lock = mBuffer = new StringBuilder();\n-    }\n-\n-    public UnsafeStringWriter(int size) {\n-        if (size < 0) {\n-            throw new IllegalArgumentException(\"Negative buffer size\");\n-        }\n-\n-        lock = mBuffer = new StringBuilder();\n-    }\n-\n-    @Override\n-    public void write(int c) {\n-        mBuffer.append((char) c);\n-    }\n-\n-    @Override\n-    public void write(char[] cs) throws IOException {\n-        mBuffer.append(cs, 0, cs.length);\n-    }\n-\n-    @Override\n-    public void write(char[] cs, int off, int len) throws IOException {\n-        if ((off < 0) || (off > cs.length) || (len < 0) ||\n-                ((off + len) > cs.length) || ((off + len) < 0)) {\n-            throw new IndexOutOfBoundsException();\n-        }\n-\n-        if (len > 0) {\n-            mBuffer.append(cs, off, len);\n-        }\n-    }\n-\n-    @Override\n-    public void write(String str) {\n-        mBuffer.append(str);\n-    }\n-\n-    @Override\n-    public void write(String str, int off, int len) {\n-        mBuffer.append(str, off, off + len);\n-    }\n-\n-    @Override\n-    public Writer append(CharSequence csq) {\n-        if (csq == null) {\n-            write(\"null\");\n-        } else {\n-            write(csq.toString());\n-        }\n-        return this;\n-    }\n-\n-    @Override\n-    public Writer append(CharSequence csq, int start, int end) {\n-        CharSequence cs = (csq == null ? \"null\" : csq);\n-        write(cs.subSequence(start, end).toString());\n-        return this;\n-    }\n-\n-    @Override\n-    public Writer append(char c) {\n-        mBuffer.append(c);\n-        return this;\n-    }\n-\n-    @Override\n-    public void close() {\n-    }\n-\n-    @Override\n-    public void flush() {\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return mBuffer.toString();\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.io;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.Writer;\r\n+\r\n+/**\r\n+ * Thread-unsafe StringWriter.\r\n+ */\r\n+public class UnsafeStringWriter extends Writer {\r\n+    private StringBuilder mBuffer;\r\n+\r\n+    public UnsafeStringWriter() {\r\n+        lock = mBuffer = new StringBuilder();\r\n+    }\r\n+\r\n+    public UnsafeStringWriter(int size) {\r\n+        if (size < 0) {\r\n+            throw new IllegalArgumentException(\"Negative buffer size\");\r\n+        }\r\n+\r\n+        lock = mBuffer = new StringBuilder();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(int c) {\r\n+        mBuffer.append((char) c);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(char[] cs) throws IOException {\r\n+        mBuffer.append(cs, 0, cs.length);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(char[] cs, int off, int len) throws IOException {\r\n+        if ((off < 0) || (off > cs.length) || (len < 0) ||\r\n+                ((off + len) > cs.length) || ((off + len) < 0)) {\r\n+            throw new IndexOutOfBoundsException();\r\n+        }\r\n+\r\n+        if (len > 0) {\r\n+            mBuffer.append(cs, off, len);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(String str) {\r\n+        mBuffer.append(str);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(String str, int off, int len) {\r\n+        mBuffer.append(str, off, off + len);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Writer append(CharSequence csq) {\r\n+        if (csq == null) {\r\n+            write(\"null\");\r\n+        } else {\r\n+            write(csq.toString());\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Writer append(CharSequence csq, int start, int end) {\r\n+        CharSequence cs = (csq == null ? \"null\" : csq);\r\n+        write(cs.subSequence(start, end).toString());\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Writer append(char c) {\r\n+        mBuffer.append(c);\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void close() {\r\n+    }\r\n+\r\n+    @Override\r\n+    public void flush() {\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return mBuffer.toString();\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/json/GenericJSONConverter.java", "source2": "org/apache/dubbo/common/json/GenericJSONConverter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,528 +1,528 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.json;\n-\n-import org.apache.dubbo.common.bytecode.Wrapper;\n-import org.apache.dubbo.common.io.Bytes;\n-\n-import java.io.IOException;\n-import java.lang.reflect.Array;\n-import java.math.BigDecimal;\n-import java.math.BigInteger;\n-import java.text.ParseException;\n-import java.text.SimpleDateFormat;\n-import java.util.Collection;\n-import java.util.Date;\n-import java.util.HashMap;\n-import java.util.Locale;\n-import java.util.Map;\n-import java.util.concurrent.atomic.AtomicInteger;\n-import java.util.concurrent.atomic.AtomicLong;\n-\n-@Deprecated\n-public class GenericJSONConverter implements JSONConverter {\n-    private static final String DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n-    private static final Map<Class<?>, Encoder> GLOBAL_ENCODER_MAP = new HashMap<Class<?>, Encoder>();\n-    private static final Map<Class<?>, Decoder> GLOBAL_DECODER_MAP = new HashMap<Class<?>, Decoder>();\n-\n-    static {\n-        // init encoder map.\n-        Encoder e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueBoolean((Boolean) obj);\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(boolean.class, e);\n-        GLOBAL_ENCODER_MAP.put(Boolean.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueInt(((Number) obj).intValue());\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(int.class, e);\n-        GLOBAL_ENCODER_MAP.put(Integer.class, e);\n-        GLOBAL_ENCODER_MAP.put(short.class, e);\n-        GLOBAL_ENCODER_MAP.put(Short.class, e);\n-        GLOBAL_ENCODER_MAP.put(byte.class, e);\n-        GLOBAL_ENCODER_MAP.put(Byte.class, e);\n-        GLOBAL_ENCODER_MAP.put(AtomicInteger.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueString(Character.toString((Character) obj));\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(char.class, e);\n-        GLOBAL_ENCODER_MAP.put(Character.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueLong(((Number) obj).longValue());\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(long.class, e);\n-        GLOBAL_ENCODER_MAP.put(Long.class, e);\n-        GLOBAL_ENCODER_MAP.put(AtomicLong.class, e);\n-        GLOBAL_ENCODER_MAP.put(BigInteger.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueFloat(((Number) obj).floatValue());\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(float.class, e);\n-        GLOBAL_ENCODER_MAP.put(Float.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueDouble(((Number) obj).doubleValue());\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(double.class, e);\n-        GLOBAL_ENCODER_MAP.put(Double.class, e);\n-        GLOBAL_ENCODER_MAP.put(BigDecimal.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueString(obj.toString());\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(String.class, e);\n-        GLOBAL_ENCODER_MAP.put(StringBuilder.class, e);\n-        GLOBAL_ENCODER_MAP.put(StringBuffer.class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueString(Bytes.bytes2base64((byte[]) obj));\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(byte[].class, e);\n-\n-        e = new Encoder() {\n-            @Override\n-            public void encode(Object obj, JSONWriter jb) throws IOException {\n-                jb.valueString(new SimpleDateFormat(DATE_FORMAT).format((Date) obj));\n-            }\n-        };\n-        GLOBAL_ENCODER_MAP.put(Date.class, e);\n-\n-        // init decoder map.\n-        Decoder d = Object::toString;\n-        GLOBAL_DECODER_MAP.put(String.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Boolean) {\n-                    return ((Boolean) jv).booleanValue();\n-                }\n-                return false;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(boolean.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Boolean) {\n-                    return (Boolean) jv;\n-                }\n-                return (Boolean) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Boolean.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof String && ((String) jv).length() > 0) {\n-                    return ((String) jv).charAt(0);\n-                }\n-                return (char) 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(char.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof String && ((String) jv).length() > 0) {\n-                    return ((String) jv).charAt(0);\n-                }\n-                return (Character) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Character.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return ((Number) jv).intValue();\n-                }\n-                return 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(int.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return Integer.valueOf(((Number) jv).intValue());\n-                }\n-                return (Integer) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Integer.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return ((Number) jv).shortValue();\n-                }\n-                return (short) 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(short.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return Short.valueOf(((Number) jv).shortValue());\n-                }\n-                return (Short) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Short.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return ((Number) jv).longValue();\n-                }\n-                return (long) 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(long.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return Long.valueOf(((Number) jv).longValue());\n-                }\n-                return (Long) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Long.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return ((Number) jv).floatValue();\n-                }\n-                return (float) 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(float.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return new Float(((Number) jv).floatValue());\n-                }\n-                return (Float) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Float.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return ((Number) jv).doubleValue();\n-                }\n-                return (double) 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(double.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return new Double(((Number) jv).doubleValue());\n-                }\n-                return (Double) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Double.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return ((Number) jv).byteValue();\n-                }\n-                return (byte) 0;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(byte.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) {\n-                if (jv instanceof Number) {\n-                    return Byte.valueOf(((Number) jv).byteValue());\n-                }\n-                return (Byte) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Byte.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof String) {\n-                    return Bytes.base642bytes((String) jv);\n-                }\n-                return (byte[]) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(byte[].class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                return new StringBuilder(jv.toString());\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(StringBuilder.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                return new StringBuffer(jv.toString());\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(StringBuffer.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof Number) {\n-                    return BigInteger.valueOf(((Number) jv).longValue());\n-                }\n-                return (BigInteger) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(BigInteger.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof Number) {\n-                    return BigDecimal.valueOf(((Number) jv).doubleValue());\n-                }\n-                return (BigDecimal) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(BigDecimal.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof Number) {\n-                    return new AtomicInteger(((Number) jv).intValue());\n-                }\n-                return (AtomicInteger) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(AtomicInteger.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof Number) {\n-                    return new AtomicLong(((Number) jv).longValue());\n-                }\n-                return (AtomicLong) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(AtomicLong.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof String) {\n-                    try {\n-                        return new SimpleDateFormat(DATE_FORMAT).parse((String) jv);\n-                    } catch (ParseException e) {\n-                        throw new IllegalArgumentException(e.getMessage(), e);\n-                    }\n-                }\n-                if (jv instanceof Number) {\n-                    return new Date(((Number) jv).longValue());\n-                }\n-                return (Date) null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Date.class, d);\n-\n-        d = new Decoder() {\n-            @Override\n-            public Object decode(Object jv) throws IOException {\n-                if (jv instanceof String) {\n-                    String[] items = ((String)jv).split(\"_\");\n-                    if(items.length == 1){\n-                        return new Locale(items[0]);\n-                    }\n-                    if(items.length == 2){\n-                        return new Locale(items[0], items[1]);\n-                    }\n-                    return new Locale(items[0], items[1], items[2]);\n-                }\n-                return (Locale)null;\n-            }\n-        };\n-        GLOBAL_DECODER_MAP.put(Locale.class, d);\n-    }\n-\n-    @Override\n-    @SuppressWarnings(\"unchecked\")\n-    public void writeValue(Object obj, JSONWriter jb, boolean writeClass) throws IOException {\n-        if (obj == null) {\n-            jb.valueNull();\n-            return;\n-        }\n-        Class<?> c = obj.getClass();\n-        Encoder encoder = GLOBAL_ENCODER_MAP.get(c);\n-\n-        if (encoder != null) {\n-            encoder.encode(obj, jb);\n-        } else if (obj instanceof JSONNode) {\n-            ((JSONNode) obj).writeJSON(this, jb, writeClass);\n-        } else if (c.isEnum()) {\n-            jb.valueString(((Enum<?>) obj).name());\n-        } else if (c.isArray()) {\n-            int len = Array.getLength(obj);\n-            jb.arrayBegin();\n-            for (int i = 0; i < len; i++) {\n-                writeValue(Array.get(obj, i), jb, writeClass);\n-            }\n-            jb.arrayEnd();\n-        } else if (Map.class.isAssignableFrom(c)) {\n-            Object key, value;\n-            jb.objectBegin();\n-            for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) obj).entrySet()) {\n-                key = entry.getKey();\n-                if (key == null) {\n-                    continue;\n-                }\n-                jb.objectItem(key.toString());\n-\n-                value = entry.getValue();\n-                if (value == null) {\n-                    jb.valueNull();\n-                } else {\n-                    writeValue(value, jb, writeClass);\n-                }\n-            }\n-            jb.objectEnd();\n-        } else if (Collection.class.isAssignableFrom(c)) {\n-            jb.arrayBegin();\n-            for (Object item : (Collection<Object>) obj) {\n-                if (item == null) {\n-                    jb.valueNull();\n-                } else {\n-                    writeValue(item, jb, writeClass);\n-                }\n-            }\n-            jb.arrayEnd();\n-        } else if(obj instanceof Locale) {\n-            jb.valueString(obj.toString());\n-        } else {\n-            jb.objectBegin();\n-\n-            Wrapper w = Wrapper.getWrapper(c);\n-            String[] pns = w.getPropertyNames();\n-\n-            for (String pn : pns) {\n-                if ((obj instanceof Throwable) && (\n-                        \"localizedMessage\".equals(pn)\n-                                || \"cause\".equals(pn)\n-                                || \"suppressed\".equals(pn)\n-                                || \"stackTrace\".equals(pn))) {\n-                    continue;\n-                }\n-\n-                jb.objectItem(pn);\n-\n-                Object value = w.getPropertyValue(obj, pn);\n-                if (value == null || value == obj) {\n-                    jb.valueNull();\n-                } else {\n-                    writeValue(value, jb, writeClass);\n-                }\n-            }\n-            if (writeClass) {\n-                jb.objectItem(JSONVisitor.CLASS_PROPERTY);\n-                writeValue(obj.getClass().getName(), jb, writeClass);\n-            }\n-            jb.objectEnd();\n-        }\n-    }\n-\n-    @Override\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n-    public Object readValue(Class<?> c, Object jv) throws IOException {\n-        if (jv == null) {\n-            return null;\n-        }\n-        Decoder decoder = GLOBAL_DECODER_MAP.get(c);\n-        if (decoder != null) {\n-            return decoder.decode(jv);\n-        }\n-        if (c.isEnum()) {\n-            return Enum.valueOf((Class<Enum>) c, String.valueOf(jv));\n-        }\n-        return jv;\n-    }\n-\n-    protected interface Encoder {\n-        void encode(Object obj, JSONWriter jb) throws IOException;\n-    }\n-\n-    protected interface Decoder {\n-        Object decode(Object jv) throws IOException;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.json;\r\n+\r\n+import org.apache.dubbo.common.bytecode.Wrapper;\r\n+import org.apache.dubbo.common.io.Bytes;\r\n+\r\n+import java.io.IOException;\r\n+import java.lang.reflect.Array;\r\n+import java.math.BigDecimal;\r\n+import java.math.BigInteger;\r\n+import java.text.ParseException;\r\n+import java.text.SimpleDateFormat;\r\n+import java.util.Collection;\r\n+import java.util.Date;\r\n+import java.util.HashMap;\r\n+import java.util.Locale;\r\n+import java.util.Map;\r\n+import java.util.concurrent.atomic.AtomicInteger;\r\n+import java.util.concurrent.atomic.AtomicLong;\r\n+\r\n+@Deprecated\r\n+public class GenericJSONConverter implements JSONConverter {\r\n+    private static final String DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\r\n+    private static final Map<Class<?>, Encoder> GLOBAL_ENCODER_MAP = new HashMap<Class<?>, Encoder>();\r\n+    private static final Map<Class<?>, Decoder> GLOBAL_DECODER_MAP = new HashMap<Class<?>, Decoder>();\r\n+\r\n+    static {\r\n+        // init encoder map.\r\n+        Encoder e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueBoolean((Boolean) obj);\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(boolean.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Boolean.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueInt(((Number) obj).intValue());\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(int.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Integer.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(short.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Short.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(byte.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Byte.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(AtomicInteger.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueString(Character.toString((Character) obj));\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(char.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Character.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueLong(((Number) obj).longValue());\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(long.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Long.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(AtomicLong.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(BigInteger.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueFloat(((Number) obj).floatValue());\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(float.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Float.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueDouble(((Number) obj).doubleValue());\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(double.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(Double.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(BigDecimal.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueString(obj.toString());\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(String.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(StringBuilder.class, e);\r\n+        GLOBAL_ENCODER_MAP.put(StringBuffer.class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueString(Bytes.bytes2base64((byte[]) obj));\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(byte[].class, e);\r\n+\r\n+        e = new Encoder() {\r\n+            @Override\r\n+            public void encode(Object obj, JSONWriter jb) throws IOException {\r\n+                jb.valueString(new SimpleDateFormat(DATE_FORMAT).format((Date) obj));\r\n+            }\r\n+        };\r\n+        GLOBAL_ENCODER_MAP.put(Date.class, e);\r\n+\r\n+        // init decoder map.\r\n+        Decoder d = Object::toString;\r\n+        GLOBAL_DECODER_MAP.put(String.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Boolean) {\r\n+                    return ((Boolean) jv).booleanValue();\r\n+                }\r\n+                return false;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(boolean.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Boolean) {\r\n+                    return (Boolean) jv;\r\n+                }\r\n+                return (Boolean) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Boolean.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof String && ((String) jv).length() > 0) {\r\n+                    return ((String) jv).charAt(0);\r\n+                }\r\n+                return (char) 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(char.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof String && ((String) jv).length() > 0) {\r\n+                    return ((String) jv).charAt(0);\r\n+                }\r\n+                return (Character) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Character.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return ((Number) jv).intValue();\r\n+                }\r\n+                return 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(int.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return Integer.valueOf(((Number) jv).intValue());\r\n+                }\r\n+                return (Integer) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Integer.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return ((Number) jv).shortValue();\r\n+                }\r\n+                return (short) 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(short.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return Short.valueOf(((Number) jv).shortValue());\r\n+                }\r\n+                return (Short) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Short.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return ((Number) jv).longValue();\r\n+                }\r\n+                return (long) 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(long.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return Long.valueOf(((Number) jv).longValue());\r\n+                }\r\n+                return (Long) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Long.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return ((Number) jv).floatValue();\r\n+                }\r\n+                return (float) 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(float.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return new Float(((Number) jv).floatValue());\r\n+                }\r\n+                return (Float) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Float.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return ((Number) jv).doubleValue();\r\n+                }\r\n+                return (double) 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(double.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return new Double(((Number) jv).doubleValue());\r\n+                }\r\n+                return (Double) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Double.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return ((Number) jv).byteValue();\r\n+                }\r\n+                return (byte) 0;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(byte.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) {\r\n+                if (jv instanceof Number) {\r\n+                    return Byte.valueOf(((Number) jv).byteValue());\r\n+                }\r\n+                return (Byte) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Byte.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof String) {\r\n+                    return Bytes.base642bytes((String) jv);\r\n+                }\r\n+                return (byte[]) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(byte[].class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                return new StringBuilder(jv.toString());\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(StringBuilder.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                return new StringBuffer(jv.toString());\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(StringBuffer.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof Number) {\r\n+                    return BigInteger.valueOf(((Number) jv).longValue());\r\n+                }\r\n+                return (BigInteger) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(BigInteger.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof Number) {\r\n+                    return BigDecimal.valueOf(((Number) jv).doubleValue());\r\n+                }\r\n+                return (BigDecimal) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(BigDecimal.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof Number) {\r\n+                    return new AtomicInteger(((Number) jv).intValue());\r\n+                }\r\n+                return (AtomicInteger) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(AtomicInteger.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof Number) {\r\n+                    return new AtomicLong(((Number) jv).longValue());\r\n+                }\r\n+                return (AtomicLong) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(AtomicLong.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof String) {\r\n+                    try {\r\n+                        return new SimpleDateFormat(DATE_FORMAT).parse((String) jv);\r\n+                    } catch (ParseException e) {\r\n+                        throw new IllegalArgumentException(e.getMessage(), e);\r\n+                    }\r\n+                }\r\n+                if (jv instanceof Number) {\r\n+                    return new Date(((Number) jv).longValue());\r\n+                }\r\n+                return (Date) null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Date.class, d);\r\n+\r\n+        d = new Decoder() {\r\n+            @Override\r\n+            public Object decode(Object jv) throws IOException {\r\n+                if (jv instanceof String) {\r\n+                    String[] items = ((String)jv).split(\"_\");\r\n+                    if(items.length == 1){\r\n+                        return new Locale(items[0]);\r\n+                    }\r\n+                    if(items.length == 2){\r\n+                        return new Locale(items[0], items[1]);\r\n+                    }\r\n+                    return new Locale(items[0], items[1], items[2]);\r\n+                }\r\n+                return (Locale)null;\r\n+            }\r\n+        };\r\n+        GLOBAL_DECODER_MAP.put(Locale.class, d);\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public void writeValue(Object obj, JSONWriter jb, boolean writeClass) throws IOException {\r\n+        if (obj == null) {\r\n+            jb.valueNull();\r\n+            return;\r\n+        }\r\n+        Class<?> c = obj.getClass();\r\n+        Encoder encoder = GLOBAL_ENCODER_MAP.get(c);\r\n+\r\n+        if (encoder != null) {\r\n+            encoder.encode(obj, jb);\r\n+        } else if (obj instanceof JSONNode) {\r\n+            ((JSONNode) obj).writeJSON(this, jb, writeClass);\r\n+        } else if (c.isEnum()) {\r\n+            jb.valueString(((Enum<?>) obj).name());\r\n+        } else if (c.isArray()) {\r\n+            int len = Array.getLength(obj);\r\n+            jb.arrayBegin();\r\n+            for (int i = 0; i < len; i++) {\r\n+                writeValue(Array.get(obj, i), jb, writeClass);\r\n+            }\r\n+            jb.arrayEnd();\r\n+        } else if (Map.class.isAssignableFrom(c)) {\r\n+            Object key, value;\r\n+            jb.objectBegin();\r\n+            for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) obj).entrySet()) {\r\n+                key = entry.getKey();\r\n+                if (key == null) {\r\n+                    continue;\r\n+                }\r\n+                jb.objectItem(key.toString());\r\n+\r\n+                value = entry.getValue();\r\n+                if (value == null) {\r\n+                    jb.valueNull();\r\n+                } else {\r\n+                    writeValue(value, jb, writeClass);\r\n+                }\r\n+            }\r\n+            jb.objectEnd();\r\n+        } else if (Collection.class.isAssignableFrom(c)) {\r\n+            jb.arrayBegin();\r\n+            for (Object item : (Collection<Object>) obj) {\r\n+                if (item == null) {\r\n+                    jb.valueNull();\r\n+                } else {\r\n+                    writeValue(item, jb, writeClass);\r\n+                }\r\n+            }\r\n+            jb.arrayEnd();\r\n+        } else if(obj instanceof Locale) {\r\n+            jb.valueString(obj.toString());\r\n+        } else {\r\n+            jb.objectBegin();\r\n+\r\n+            Wrapper w = Wrapper.getWrapper(c);\r\n+            String[] pns = w.getPropertyNames();\r\n+\r\n+            for (String pn : pns) {\r\n+                if ((obj instanceof Throwable) && (\r\n+                        \"localizedMessage\".equals(pn)\r\n+                                || \"cause\".equals(pn)\r\n+                                || \"suppressed\".equals(pn)\r\n+                                || \"stackTrace\".equals(pn))) {\r\n+                    continue;\r\n+                }\r\n+\r\n+                jb.objectItem(pn);\r\n+\r\n+                Object value = w.getPropertyValue(obj, pn);\r\n+                if (value == null || value == obj) {\r\n+                    jb.valueNull();\r\n+                } else {\r\n+                    writeValue(value, jb, writeClass);\r\n+                }\r\n+            }\r\n+            if (writeClass) {\r\n+                jb.objectItem(JSONVisitor.CLASS_PROPERTY);\r\n+                writeValue(obj.getClass().getName(), jb, writeClass);\r\n+            }\r\n+            jb.objectEnd();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\r\n+    public Object readValue(Class<?> c, Object jv) throws IOException {\r\n+        if (jv == null) {\r\n+            return null;\r\n+        }\r\n+        Decoder decoder = GLOBAL_DECODER_MAP.get(c);\r\n+        if (decoder != null) {\r\n+            return decoder.decode(jv);\r\n+        }\r\n+        if (c.isEnum()) {\r\n+            return Enum.valueOf((Class<Enum>) c, String.valueOf(jv));\r\n+        }\r\n+        return jv;\r\n+    }\r\n+\r\n+    protected interface Encoder {\r\n+        void encode(Object obj, JSONWriter jb) throws IOException;\r\n+    }\r\n+\r\n+    protected interface Decoder {\r\n+        Object decode(Object jv) throws IOException;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/json/Yylex.java", "source2": "org/apache/dubbo/common/json/Yylex.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,847 +1,847 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.json;\n-\n-/**\n- * This class is a scanner generated by\n- * <a href=\"http://www.jflex.de/\">JFlex</a> 1.4.3\n- * on 7/3/10 3:12 AM from the specification file\n- * <tt>/Users/qianlei/dev/proj/dubbo-1.1/dubbo.common/src/main/java/org.apache.dubbo/common/json/json.flex</tt>\n- */\n-@Deprecated\n-public class Yylex {\n-\n-    /**\n-     * This character denotes the end of file\n-     */\n-    public static final int YYEOF = -1;\n-    /**\n-     * lexical states\n-     */\n-    public static final int STR2 = 4;\n-    public static final int STR1 = 2;\n-    public static final int YYINITIAL = 0;\n-    /**\n-     * initial size of the lookahead buffer\n-     */\n-    private static final int ZZ_BUFFERSIZE = 16384;\n-    /**\n-     * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l\n-     * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l\n-     * at the beginning of a line\n-     * l is of the form l = 2*k, k a non negative integer\n-     */\n-    private static final int[] ZZ_LEXSTATE = {\n-            0, 0, 1, 1, 2, 2\n-    };\n-\n-    /**\n-     * Translates characters to character classes\n-     */\n-    private static final String ZZ_CMAP_PACKED =\n-            \"\\11\\0\\1\\13\\1\\13\\2\\0\\1\\13\\22\\0\\1\\13\\1\\0\\1\\10\\1\\0\" +\n-                    \"\\1\\2\\2\\0\\1\\11\\3\\0\\1\\7\\1\\43\\1\\4\\1\\5\\1\\14\\12\\1\" +\n-                    \"\\1\\44\\6\\0\\1\\33\\3\\3\\1\\6\\1\\32\\5\\2\\1\\34\\1\\2\\1\\36\" +\n-                    \"\\3\\2\\1\\25\\1\\35\\1\\24\\1\\26\\5\\2\\1\\41\\1\\12\\1\\42\\1\\0\" +\n-                    \"\\1\\2\\1\\0\\1\\27\\1\\15\\2\\3\\1\\23\\1\\16\\5\\2\\1\\30\\1\\2\" +\n-                    \"\\1\\17\\3\\2\\1\\20\\1\\31\\1\\21\\1\\22\\5\\2\\1\\37\\1\\0\\1\\40\" +\n-                    \"\\uff82\\0\";\n-\n-    /**\n-     * Translates characters to character classes\n-     */\n-    private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);\n-    private static final String ZZ_ACTION_PACKED_0 =\n-            \"\\3\\0\\1\\1\\1\\2\\1\\3\\1\\1\\1\\4\\1\\5\\1\\6\" +\n-                    \"\\6\\3\\1\\7\\1\\10\\1\\11\\1\\12\\1\\13\\1\\14\\1\\15\" +\n-                    \"\\1\\16\\1\\0\\1\\15\\3\\0\\6\\3\\1\\17\\1\\20\\1\\21\" +\n-                    \"\\1\\22\\1\\23\\1\\24\\1\\25\\1\\26\\1\\0\\1\\27\\2\\30\" +\n-                    \"\\1\\0\\6\\3\\1\\0\\1\\3\\1\\31\\1\\32\\1\\3\\1\\0\" +\n-                    \"\\1\\33\\1\\0\\1\\34\";\n-    /**\n-     * Translates DFA states to action switch labels.\n-     */\n-    private static final int[] ZZ_ACTION = zzUnpackAction();\n-    private static final String ZZ_ROWMAP_PACKED_0 =\n-            \"\\0\\0\\0\\45\\0\\112\\0\\157\\0\\224\\0\\271\\0\\336\\0\\157\" +\n-                    \"\\0\\157\\0\\u0103\\0\\u0128\\0\\u014d\\0\\u0172\\0\\u0197\\0\\u01bc\\0\\u01e1\" +\n-                    \"\\0\\157\\0\\157\\0\\157\\0\\157\\0\\157\\0\\157\\0\\u0206\\0\\157\" +\n-                    \"\\0\\u022b\\0\\u0250\\0\\u0275\\0\\u029a\\0\\u02bf\\0\\u02e4\\0\\u0309\\0\\u032e\" +\n-                    \"\\0\\u0353\\0\\u0378\\0\\u039d\\0\\157\\0\\157\\0\\157\\0\\157\\0\\157\" +\n-                    \"\\0\\157\\0\\157\\0\\157\\0\\u03c2\\0\\157\\0\\u03e7\\0\\u040c\\0\\u040c\" +\n-                    \"\\0\\u0431\\0\\u0456\\0\\u047b\\0\\u04a0\\0\\u04c5\\0\\u04ea\\0\\u050f\\0\\u0534\" +\n-                    \"\\0\\271\\0\\271\\0\\u0559\\0\\u057e\\0\\271\\0\\u05a3\\0\\157\";\n-    /**\n-     * Translates a state to a row index in the transition table\n-     */\n-    private static final int[] ZZ_ROWMAP = zzUnpackRowMap();\n-    /**\n-     * The transition table of the DFA\n-     */\n-    private static final int[] ZZ_TRANS = {\n-            3, 4, 5, 5, 6, 3, 5, 3, 7, 8,\n-            3, 9, 3, 5, 10, 11, 5, 12, 5, 5,\n-            13, 5, 5, 5, 5, 5, 14, 5, 5, 5,\n-            15, 16, 17, 18, 19, 20, 21, 22, 22, 22,\n-            22, 22, 22, 22, 22, 23, 22, 24, 22, 22,\n-            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n-            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n-            22, 22, 22, 22, 25, 25, 25, 25, 25, 25,\n-            25, 25, 25, 23, 26, 25, 25, 25, 25, 25,\n-            25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n-            25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n-            25, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, 4,\n-            -1, -1, -1, 27, 28, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, 28, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, 5, 5, 5, -1,\n-            -1, 5, -1, -1, -1, -1, -1, -1, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, -1, -1, -1, -1,\n-            -1, -1, -1, 4, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            9, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, 5, 5, 5,\n-            -1, -1, 5, -1, -1, -1, -1, -1, -1, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 29,\n-            5, 5, 5, 5, 5, 5, 5, -1, -1, -1,\n-            -1, -1, -1, -1, 5, 5, 5, -1, -1, 5,\n-            -1, -1, -1, -1, -1, -1, 5, 5, 5, 5,\n-            5, 30, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, -1, -1, -1, -1, -1, -1,\n-            -1, 5, 5, 5, -1, -1, 5, -1, -1, -1,\n-            -1, -1, -1, 5, 5, 5, 31, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, -1, -1, -1, -1, -1, -1, -1, 5, 5,\n-            5, -1, -1, 5, -1, -1, -1, -1, -1, -1,\n-            5, 5, 5, 5, 5, 5, 5, 5, 32, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, -1, -1,\n-            -1, -1, -1, -1, -1, 5, 5, 5, -1, -1,\n-            5, -1, -1, -1, -1, -1, -1, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 33, 5, 5, 5, -1, -1, -1, -1, -1,\n-            -1, -1, 5, 5, 5, -1, -1, 5, -1, -1,\n-            -1, -1, -1, -1, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 34, 5, 5, 5, 5, 5, 5,\n-            5, 5, -1, -1, -1, -1, -1, -1, 22, 22,\n-            22, 22, 22, 22, 22, 22, -1, 22, -1, 22,\n-            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n-            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n-            22, 22, 22, 22, 22, -1, -1, -1, -1, -1,\n-            -1, -1, -1, 35, -1, 36, -1, 37, 38, 39,\n-            40, 41, 42, 43, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, 25, 25, 25, 25, 25, 25, 25, 25,\n-            25, -1, -1, 25, 25, 25, 25, 25, 25, 25,\n-            25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\n-            25, 25, 25, 25, 25, 25, 25, 25, 25, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, 44, 36,\n-            -1, 37, 38, 39, 40, 41, 42, 43, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, 45, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, 46, -1, -1, 47, -1, -1,\n-            47, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, 5, 5, 5, -1, -1, 5, -1, -1, -1,\n-            -1, -1, -1, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 48, 5, 5, 5, 5, 5,\n-            5, -1, -1, -1, -1, -1, -1, -1, 5, 5,\n-            5, -1, -1, 5, -1, -1, -1, -1, -1, -1,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 49, 5, 5, 5, 5, 5, 5, -1, -1,\n-            -1, -1, -1, -1, -1, 5, 5, 5, -1, -1,\n-            5, -1, -1, -1, -1, -1, -1, 5, 5, 5,\n-            5, 5, 50, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, -1, -1, -1, -1, -1,\n-            -1, -1, 5, 5, 5, -1, -1, 5, -1, -1,\n-            -1, -1, -1, -1, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 51, 5, 5, 5, 5, 5, 5,\n-            5, 5, -1, -1, -1, -1, -1, -1, -1, 5,\n-            5, 5, -1, -1, 5, -1, -1, -1, -1, -1,\n-            -1, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 52, 5, 5, -1,\n-            -1, -1, -1, -1, -1, -1, 5, 5, 5, -1,\n-            -1, 5, -1, -1, -1, -1, -1, -1, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 53, 5, 5, -1, -1, -1, -1,\n-            -1, -1, -1, 54, -1, 54, -1, -1, 54, -1,\n-            -1, -1, -1, -1, -1, 54, 54, -1, -1, -1,\n-            -1, 54, -1, -1, -1, 54, -1, -1, 54, 54,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            45, -1, -1, -1, -1, 28, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, 28, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, 46, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, 5, 5, 5, -1, -1, 5,\n-            -1, -1, -1, -1, -1, -1, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 55, 5,\n-            5, 5, 5, 5, -1, -1, -1, -1, -1, -1,\n-            -1, 5, 5, 5, -1, -1, 5, -1, -1, -1,\n-            -1, -1, -1, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 56, 5, 5, 5, 5, 5,\n-            5, -1, -1, -1, -1, -1, -1, -1, 5, 5,\n-            5, -1, -1, 5, -1, -1, -1, -1, -1, -1,\n-            5, 5, 5, 5, 5, 5, 57, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, -1, -1,\n-            -1, -1, -1, -1, -1, 5, 5, 5, -1, -1,\n-            57, -1, -1, -1, -1, -1, -1, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, -1, -1, -1, -1, -1,\n-            -1, -1, 5, 5, 5, -1, -1, 5, -1, -1,\n-            -1, -1, -1, -1, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            58, 5, -1, -1, -1, -1, -1, -1, -1, 5,\n-            5, 5, -1, -1, 5, -1, -1, -1, -1, -1,\n-            -1, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 56, 5, 5, -1,\n-            -1, -1, -1, -1, -1, -1, 59, -1, 59, -1,\n-            -1, 59, -1, -1, -1, -1, -1, -1, 59, 59,\n-            -1, -1, -1, -1, 59, -1, -1, -1, 59, -1,\n-            -1, 59, 59, -1, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, 5, 5, 5, -1, -1, 5, -1,\n-            -1, -1, -1, -1, -1, 5, 5, 5, 5, 5,\n-            5, 60, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, -1, -1, -1, -1, -1, -1, -1,\n-            5, 5, 5, -1, -1, 60, -1, -1, -1, -1,\n-            -1, -1, 5, 5, 5, 5, 5, 5, 5, 5,\n-            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n-            -1, -1, -1, -1, -1, -1, -1, 61, -1, 61,\n-            -1, -1, 61, -1, -1, -1, -1, -1, -1, 61,\n-            61, -1, -1, -1, -1, 61, -1, -1, -1, 61,\n-            -1, -1, 61, 61, -1, -1, -1, -1, -1, -1,\n-            -1, -1, -1, -1, 62, -1, 62, -1, -1, 62,\n-            -1, -1, -1, -1, -1, -1, 62, 62, -1, -1,\n-            -1, -1, 62, -1, -1, -1, 62, -1, -1, 62,\n-            62, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-    };\n-    /* error codes */\n-    private static final int ZZ_UNKNOWN_ERROR = 0;\n-    private static final int ZZ_NO_MATCH = 1;\n-    private static final int ZZ_PUSHBACK_2BIG = 2;\n-    /* error messages for the codes above */\n-    private static final String[] ZZ_ERROR_MSG = {\n-            \"Unkown internal scanner error\",\n-            \"Error: could not match input\",\n-            \"Error: pushback value was too large\"\n-    };\n-    private static final String ZZ_ATTRIBUTE_PACKED_0 =\n-            \"\\3\\0\\1\\11\\3\\1\\2\\11\\7\\1\\6\\11\\1\\1\\1\\11\" +\n-                    \"\\1\\0\\1\\1\\3\\0\\6\\1\\10\\11\\1\\0\\1\\11\\2\\1\" +\n-                    \"\\1\\0\\6\\1\\1\\0\\4\\1\\1\\0\\1\\1\\1\\0\\1\\11\";\n-    /**\n-     * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>\n-     */\n-    private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();\n-    /**\n-     * the input device\n-     */\n-    private java.io.Reader zzReader;\n-    /**\n-     * the current state of the DFA\n-     */\n-    private int zzState;\n-    /**\n-     * the current lexical state\n-     */\n-    private int zzLexicalState = YYINITIAL;\n-    /**\n-     * this buffer contains the current text to be matched and is\n-     * the source of the yytext() string\n-     */\n-    private char[] zzBuffer = new char[ZZ_BUFFERSIZE];\n-    /**\n-     * the textposition at the last accepting state\n-     */\n-    private int zzMarkedPos;\n-    /**\n-     * the current text position in the buffer\n-     */\n-    private int zzCurrentPos;\n-    /**\n-     * startRead marks the beginning of the yytext() string in the buffer\n-     */\n-    private int zzStartRead;\n-    /**\n-     * endRead marks the last character in the buffer, that has been read\n-     * from input\n-     */\n-    private int zzEndRead;\n-    /**\n-     * zzAtEOF == true <=> the scanner is at the EOF\n-     */\n-    private boolean zzAtEOF;\n-    /**\n-     * denotes if the user-EOF-code has already been executed\n-     */\n-    //private boolean zzEOFDone;\n-\n-  /* user code: */\n-    private StringBuffer sb;\n-\n-    /**\n-     * Creates a new scanner\n-     * There is also a java.io.InputStream version of this constructor.\n-     *\n-     * @param in the java.io.Reader to read input from.\n-     */\n-    Yylex(java.io.Reader in) {\n-        this.zzReader = in;\n-    }\n-\n-    /**\n-     * Creates a new scanner.\n-     * There is also java.io.Reader version of this constructor.\n-     *\n-     * @param in the java.io.Inputstream to read input from.\n-     */\n-    Yylex(java.io.InputStream in) {\n-        this(new java.io.InputStreamReader(in));\n-    }\n-\n-    private static int[] zzUnpackAction() {\n-        int[] result = new int[63];\n-        int offset = 0;\n-        offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);\n-        return result;\n-    }\n-\n-    private static int zzUnpackAction(String packed, int offset, int[] result) {\n-        int i = 0;       /* index in packed string  */\n-        int j = offset;  /* index in unpacked array */\n-        int l = packed.length();\n-        while (i < l) {\n-            int count = packed.charAt(i++);\n-            int value = packed.charAt(i++);\n-            do {\n-                result[j++] = value;\n-            } while (--count > 0);\n-        }\n-        return j;\n-    }\n-\n-    /** number of newlines encountered up to the start of the matched text */\n-    //private int yyline;\n-\n-    /** the number of characters up to the start of the matched text */\n-    //private int yychar;\n-\n-    /**\n-     * the number of characters from the last newline up to the start of the\n-     * matched text\n-     */\n-    //private int yycolumn;\n-\n-    /**\n-     * zzAtBOL == true <=> the scanner is currently at the beginning of a line\n-     */\n-    //private boolean zzAtBOL = true;\n-    private static int[] zzUnpackRowMap() {\n-        int[] result = new int[63];\n-        int offset = 0;\n-        offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);\n-        return result;\n-    }\n-\n-    private static int zzUnpackRowMap(String packed, int offset, int[] result) {\n-        int i = 0;  /* index in packed string  */\n-        int j = offset;  /* index in unpacked array */\n-        int l = packed.length();\n-        while (i < l) {\n-            int high = packed.charAt(i++) << 16;\n-            result[j++] = high | packed.charAt(i++);\n-        }\n-        return j;\n-    }\n-\n-    private static int[] zzUnpackAttribute() {\n-        int[] result = new int[63];\n-        int offset = 0;\n-        offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);\n-        return result;\n-    }\n-\n-    private static int zzUnpackAttribute(String packed, int offset, int[] result) {\n-        int i = 0;       /* index in packed string  */\n-        int j = offset;  /* index in unpacked array */\n-        int l = packed.length();\n-        while (i < l) {\n-            int count = packed.charAt(i++);\n-            int value = packed.charAt(i++);\n-            do {\n-                result[j++] = value;\n-            } while (--count > 0);\n-        }\n-        return j;\n-    }\n-\n-    /**\n-     * Unpacks the compressed character translation table.\n-     *\n-     * @param packed the packed character translation table\n-     * @return the unpacked character translation table\n-     */\n-    private static char[] zzUnpackCMap(String packed) {\n-        char[] map = new char[0x10000];\n-        int i = 0;  /* index in packed string  */\n-        int j = 0;  /* index in unpacked array */\n-        while (i < 122) {\n-            int count = packed.charAt(i++);\n-            char value = packed.charAt(i++);\n-            do {\n-                map[j++] = value;\n-            } while (--count > 0);\n-        }\n-        return map;\n-    }\n-\n-\n-    /**\n-     * Refills the input buffer.\n-     *\n-     * @return <code>false</code>, iff there was new input.\n-     * @throws java.io.IOException if any I/O-Error occurs\n-     */\n-    private boolean zzRefill() throws java.io.IOException {\n-\n-    /* first: make room (if you can) */\n-        if (zzStartRead > 0) {\n-            System.arraycopy(zzBuffer, zzStartRead,\n-                    zzBuffer, 0,\n-                    zzEndRead - zzStartRead);\n-\n-      /* translate stored positions */\n-            zzEndRead -= zzStartRead;\n-            zzCurrentPos -= zzStartRead;\n-            zzMarkedPos -= zzStartRead;\n-            zzStartRead = 0;\n-        }\n-\n-    /* is the buffer big enough? */\n-        if (zzCurrentPos >= zzBuffer.length) {\n-      /* if not: blow it up */\n-            char[] newBuffer = new char[zzCurrentPos * 2];\n-            System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);\n-            zzBuffer = newBuffer;\n-        }\n-\n-    /* finally: fill the buffer with new input */\n-        int numRead = zzReader.read(zzBuffer, zzEndRead,\n-                zzBuffer.length - zzEndRead);\n-\n-        if (numRead > 0) {\n-            zzEndRead += numRead;\n-            return false;\n-        }\n-        // unlikely but not impossible: read 0 characters, but not at end of stream\n-        if (numRead == 0) {\n-            int c = zzReader.read();\n-            if (c == -1) {\n-                return true;\n-            } else {\n-                zzBuffer[zzEndRead++] = (char) c;\n-                return false;\n-            }\n-        }\n-\n-        // numRead < 0\n-        return true;\n-    }\n-\n-\n-    /**\n-     * Closes the input stream.\n-     */\n-    public final void yyclose() throws java.io.IOException {\n-        zzAtEOF = true;            /* indicate end of file */\n-        zzEndRead = zzStartRead;  /* invalidate buffer    */\n-\n-        if (zzReader != null) {\n-            zzReader.close();\n-        }\n-    }\n-\n-\n-    /**\n-     * Resets the scanner to read from a new input stream.\n-     * Does not close the old reader.\n-     * <p>\n-     * All internal variables are reset, the old input stream\n-     * <b>cannot</b> be reused (internal buffer is discarded and lost).\n-     * Lexical state is set to <tt>ZZ_INITIAL</tt>.\n-     *\n-     * @param reader the new input stream\n-     */\n-    public final void yyreset(java.io.Reader reader) {\n-        zzReader = reader;\n-        //zzAtBOL  = true;\n-        zzAtEOF = false;\n-        //zzEOFDone = false;\n-        zzEndRead = zzStartRead = 0;\n-        zzCurrentPos = zzMarkedPos = 0;\n-        //yyline = yychar = yycolumn = 0;\n-        zzLexicalState = YYINITIAL;\n-    }\n-\n-\n-    /**\n-     * Returns the current lexical state.\n-     */\n-    public final int yystate() {\n-        return zzLexicalState;\n-    }\n-\n-\n-    /**\n-     * Enters a new lexical state\n-     *\n-     * @param newState the new lexical state\n-     */\n-    public final void yybegin(int newState) {\n-        zzLexicalState = newState;\n-    }\n-\n-\n-    /**\n-     * Returns the text matched by the current regular expression.\n-     */\n-    public final String yytext() {\n-        return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);\n-    }\n-\n-\n-    /**\n-     * Returns the character at position <tt>pos</tt> from the\n-     * matched text.\n-     * <p>\n-     * It is equivalent to yytext().charAt(pos), but faster\n-     *\n-     * @param pos the position of the character to fetch.\n-     *            A value from 0 to yylength()-1.\n-     * @return the character at position pos\n-     */\n-    public final char yycharat(int pos) {\n-        return zzBuffer[zzStartRead + pos];\n-    }\n-\n-\n-    /**\n-     * Returns the length of the matched text region.\n-     */\n-    public final int yylength() {\n-        return zzMarkedPos - zzStartRead;\n-    }\n-\n-\n-    /**\n-     * Reports an error that occured while scanning.\n-     * <p>\n-     * In a wellformed scanner (no or only correct usage of\n-     * yypushback(int) and a match-all fallback rule) this method\n-     * will only be called with things that \"Can't Possibly Happen\".\n-     * If this method is called, something is seriously wrong\n-     * (e.g. a JFlex bug producing a faulty scanner etc.).\n-     * <p>\n-     * Usual syntax/scanner level error handling should be done\n-     * in error fallback rules.\n-     *\n-     * @param errorCode the code of the errormessage to display\n-     */\n-    private void zzScanError(int errorCode) {\n-        String message;\n-        try {\n-            message = ZZ_ERROR_MSG[errorCode];\n-        } catch (ArrayIndexOutOfBoundsException e) {\n-            message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];\n-        }\n-\n-        throw new Error(message);\n-    }\n-\n-\n-    /**\n-     * Pushes the specified amount of characters back into the input stream.\n-     * <p>\n-     * They will be read again by then next call of the scanning method\n-     *\n-     * @param number the number of characters to be read again.\n-     *               This number must not be greater than yylength()!\n-     */\n-    public void yypushback(int number) {\n-        if (number > yylength()) {\n-            zzScanError(ZZ_PUSHBACK_2BIG);\n-        }\n-\n-        zzMarkedPos -= number;\n-    }\n-\n-\n-    /**\n-     * Resumes scanning until the next regular expression is matched,\n-     * the end of input is encountered or an I/O-Error occurs.\n-     *\n-     * @return the next token\n-     * @throws java.io.IOException if any I/O-Error occurs\n-     */\n-    public JSONToken yylex() throws java.io.IOException, ParseException {\n-        int zzInput;\n-        int zzAction;\n-\n-        // cached fields:\n-        int zzCurrentPosL;\n-        int zzMarkedPosL;\n-        int zzEndReadL = zzEndRead;\n-        char[] zzBufferL = zzBuffer;\n-        char[] zzCMapL = ZZ_CMAP;\n-\n-        int[] zzTransL = ZZ_TRANS;\n-        int[] zzRowMapL = ZZ_ROWMAP;\n-        int[] zzAttrL = ZZ_ATTRIBUTE;\n-\n-        while (true) {\n-            zzMarkedPosL = zzMarkedPos;\n-\n-            zzAction = -1;\n-\n-            zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;\n-\n-            zzState = ZZ_LEXSTATE[zzLexicalState];\n-\n-\n-            zzForAction:\n-            {\n-                while (true) {\n-\n-                    if (zzCurrentPosL < zzEndReadL) {\n-                        zzInput = zzBufferL[zzCurrentPosL++];\n-                    } else if (zzAtEOF) {\n-                        zzInput = YYEOF;\n-                        break zzForAction;\n-                    } else {\n-                        // store back cached positions\n-                        zzCurrentPos = zzCurrentPosL;\n-                        zzMarkedPos = zzMarkedPosL;\n-                        boolean eof = zzRefill();\n-                        // get translated positions and possibly new buffer\n-                        zzCurrentPosL = zzCurrentPos;\n-                        zzMarkedPosL = zzMarkedPos;\n-                        zzBufferL = zzBuffer;\n-                        zzEndReadL = zzEndRead;\n-                        if (eof) {\n-                            zzInput = YYEOF;\n-                            break zzForAction;\n-                        } else {\n-                            zzInput = zzBufferL[zzCurrentPosL++];\n-                        }\n-                    }\n-                    int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];\n-                    if (zzNext == -1) {\n-                        break zzForAction;\n-                    }\n-                    zzState = zzNext;\n-\n-                    int zzAttributes = zzAttrL[zzState];\n-                    if ((zzAttributes & 1) == 1) {\n-                        zzAction = zzState;\n-                        zzMarkedPosL = zzCurrentPosL;\n-                        if ((zzAttributes & 8) == 8) {\n-                            break zzForAction;\n-                        }\n-                    }\n-\n-                }\n-            }\n-\n-            // store back cached position\n-            zzMarkedPos = zzMarkedPosL;\n-\n-            switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {\n-                case 25: {\n-                    return new JSONToken(JSONToken.NULL, null);\n-                }\n-                case 29:\n-                    break;\n-                case 13: {\n-                    sb.append(yytext());\n-                }\n-                case 30:\n-                    break;\n-                case 18: {\n-                    sb.append('\\b');\n-                }\n-                case 31:\n-                    break;\n-                case 9: {\n-                    return new JSONToken(JSONToken.LSQUARE);\n-                }\n-                case 32:\n-                    break;\n-                case 2: {\n-                    Long val = Long.valueOf(yytext());\n-                    return new JSONToken(JSONToken.INT, val);\n-                }\n-                case 33:\n-                    break;\n-                case 16: {\n-                    sb.append('\\\\');\n-                }\n-                case 34:\n-                    break;\n-                case 8: {\n-                    return new JSONToken(JSONToken.RBRACE);\n-                }\n-                case 35:\n-                    break;\n-                case 26: {\n-                    return new JSONToken(JSONToken.BOOL, Boolean.TRUE);\n-                }\n-                case 36:\n-                    break;\n-                case 23: {\n-                    sb.append('\\'');\n-                }\n-                case 37:\n-                    break;\n-                case 5: {\n-                    sb = new StringBuffer();\n-                    yybegin(STR2);\n-                }\n-                case 38:\n-                    break;\n-                case 27: {\n-                    return new JSONToken(JSONToken.BOOL, Boolean.FALSE);\n-                }\n-                case 39:\n-                    break;\n-                case 12: {\n-                    return new JSONToken(JSONToken.COLON);\n-                }\n-                case 40:\n-                    break;\n-                case 21: {\n-                    sb.append('\\r');\n-                }\n-                case 41:\n-                    break;\n-                case 3: {\n-                    return new JSONToken(JSONToken.IDENT, yytext());\n-                }\n-                case 42:\n-                    break;\n-                case 28: {\n-                    try {\n-                        sb.append((char) Integer.parseInt(yytext().substring(2), 16));\n-                    } catch (Exception e) {\n-                        throw new ParseException(e.getMessage());\n-                    }\n-                }\n-                case 43:\n-                    break;\n-                case 10: {\n-                    return new JSONToken(JSONToken.RSQUARE);\n-                }\n-                case 44:\n-                    break;\n-                case 17: {\n-                    sb.append('/');\n-                }\n-                case 45:\n-                    break;\n-                case 11: {\n-                    return new JSONToken(JSONToken.COMMA);\n-                }\n-                case 46:\n-                    break;\n-                case 15: {\n-                    sb.append('\"');\n-                }\n-                case 47:\n-                    break;\n-                case 24: {\n-                    Double val = Double.valueOf(yytext());\n-                    return new JSONToken(JSONToken.FLOAT, val);\n-                }\n-                case 48:\n-                    break;\n-                case 1: {\n-                    throw new ParseException(\"Unexpected char [\" + yytext() + \"]\");\n-                }\n-                case 49:\n-                    break;\n-                case 19: {\n-                    sb.append('\\f');\n-                }\n-                case 50:\n-                    break;\n-                case 7: {\n-                    return new JSONToken(JSONToken.LBRACE);\n-                }\n-                case 51:\n-                    break;\n-                case 14: {\n-                    yybegin(YYINITIAL);\n-                    return new JSONToken(JSONToken.STRING, sb.toString());\n-                }\n-                case 52:\n-                    break;\n-                case 22: {\n-                    sb.append('\\t');\n-                }\n-                case 53:\n-                    break;\n-                case 4: {\n-                    sb = new StringBuffer();\n-                    yybegin(STR1);\n-                }\n-                case 54:\n-                    break;\n-                case 20: {\n-                    sb.append('\\n');\n-                }\n-                case 55:\n-                    break;\n-                case 6: {\n-                }\n-                case 56:\n-                    break;\n-                default:\n-                    if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {\n-                        zzAtEOF = true;\n-                        return null;\n-                    } else {\n-                        zzScanError(ZZ_NO_MATCH);\n-                        break;\n-                    }\n-            }\n-        }\n-    }\n-\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.json;\r\n+\r\n+/**\r\n+ * This class is a scanner generated by\r\n+ * <a href=\"http://www.jflex.de/\">JFlex</a> 1.4.3\r\n+ * on 7/3/10 3:12 AM from the specification file\r\n+ * <tt>/Users/qianlei/dev/proj/dubbo-1.1/dubbo.common/src/main/java/org.apache.dubbo/common/json/json.flex</tt>\r\n+ */\r\n+@Deprecated\r\n+public class Yylex {\r\n+\r\n+    /**\r\n+     * This character denotes the end of file\r\n+     */\r\n+    public static final int YYEOF = -1;\r\n+    /**\r\n+     * lexical states\r\n+     */\r\n+    public static final int STR2 = 4;\r\n+    public static final int STR1 = 2;\r\n+    public static final int YYINITIAL = 0;\r\n+    /**\r\n+     * initial size of the lookahead buffer\r\n+     */\r\n+    private static final int ZZ_BUFFERSIZE = 16384;\r\n+    /**\r\n+     * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l\r\n+     * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l\r\n+     * at the beginning of a line\r\n+     * l is of the form l = 2*k, k a non negative integer\r\n+     */\r\n+    private static final int[] ZZ_LEXSTATE = {\r\n+            0, 0, 1, 1, 2, 2\r\n+    };\r\n+\r\n+    /**\r\n+     * Translates characters to character classes\r\n+     */\r\n+    private static final String ZZ_CMAP_PACKED =\r\n+            \"\\11\\0\\1\\13\\1\\13\\2\\0\\1\\13\\22\\0\\1\\13\\1\\0\\1\\10\\1\\0\" +\r\n+                    \"\\1\\2\\2\\0\\1\\11\\3\\0\\1\\7\\1\\43\\1\\4\\1\\5\\1\\14\\12\\1\" +\r\n+                    \"\\1\\44\\6\\0\\1\\33\\3\\3\\1\\6\\1\\32\\5\\2\\1\\34\\1\\2\\1\\36\" +\r\n+                    \"\\3\\2\\1\\25\\1\\35\\1\\24\\1\\26\\5\\2\\1\\41\\1\\12\\1\\42\\1\\0\" +\r\n+                    \"\\1\\2\\1\\0\\1\\27\\1\\15\\2\\3\\1\\23\\1\\16\\5\\2\\1\\30\\1\\2\" +\r\n+                    \"\\1\\17\\3\\2\\1\\20\\1\\31\\1\\21\\1\\22\\5\\2\\1\\37\\1\\0\\1\\40\" +\r\n+                    \"\\uff82\\0\";\r\n+\r\n+    /**\r\n+     * Translates characters to character classes\r\n+     */\r\n+    private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);\r\n+    private static final String ZZ_ACTION_PACKED_0 =\r\n+            \"\\3\\0\\1\\1\\1\\2\\1\\3\\1\\1\\1\\4\\1\\5\\1\\6\" +\r\n+                    \"\\6\\3\\1\\7\\1\\10\\1\\11\\1\\12\\1\\13\\1\\14\\1\\15\" +\r\n+                    \"\\1\\16\\1\\0\\1\\15\\3\\0\\6\\3\\1\\17\\1\\20\\1\\21\" +\r\n+                    \"\\1\\22\\1\\23\\1\\24\\1\\25\\1\\26\\1\\0\\1\\27\\2\\30\" +\r\n+                    \"\\1\\0\\6\\3\\1\\0\\1\\3\\1\\31\\1\\32\\1\\3\\1\\0\" +\r\n+                    \"\\1\\33\\1\\0\\1\\34\";\r\n+    /**\r\n+     * Translates DFA states to action switch labels.\r\n+     */\r\n+    private static final int[] ZZ_ACTION = zzUnpackAction();\r\n+    private static final String ZZ_ROWMAP_PACKED_0 =\r\n+            \"\\0\\0\\0\\45\\0\\112\\0\\157\\0\\224\\0\\271\\0\\336\\0\\157\" +\r\n+                    \"\\0\\157\\0\\u0103\\0\\u0128\\0\\u014d\\0\\u0172\\0\\u0197\\0\\u01bc\\0\\u01e1\" +\r\n+                    \"\\0\\157\\0\\157\\0\\157\\0\\157\\0\\157\\0\\157\\0\\u0206\\0\\157\" +\r\n+                    \"\\0\\u022b\\0\\u0250\\0\\u0275\\0\\u029a\\0\\u02bf\\0\\u02e4\\0\\u0309\\0\\u032e\" +\r\n+                    \"\\0\\u0353\\0\\u0378\\0\\u039d\\0\\157\\0\\157\\0\\157\\0\\157\\0\\157\" +\r\n+                    \"\\0\\157\\0\\157\\0\\157\\0\\u03c2\\0\\157\\0\\u03e7\\0\\u040c\\0\\u040c\" +\r\n+                    \"\\0\\u0431\\0\\u0456\\0\\u047b\\0\\u04a0\\0\\u04c5\\0\\u04ea\\0\\u050f\\0\\u0534\" +\r\n+                    \"\\0\\271\\0\\271\\0\\u0559\\0\\u057e\\0\\271\\0\\u05a3\\0\\157\";\r\n+    /**\r\n+     * Translates a state to a row index in the transition table\r\n+     */\r\n+    private static final int[] ZZ_ROWMAP = zzUnpackRowMap();\r\n+    /**\r\n+     * The transition table of the DFA\r\n+     */\r\n+    private static final int[] ZZ_TRANS = {\r\n+            3, 4, 5, 5, 6, 3, 5, 3, 7, 8,\r\n+            3, 9, 3, 5, 10, 11, 5, 12, 5, 5,\r\n+            13, 5, 5, 5, 5, 5, 14, 5, 5, 5,\r\n+            15, 16, 17, 18, 19, 20, 21, 22, 22, 22,\r\n+            22, 22, 22, 22, 22, 23, 22, 24, 22, 22,\r\n+            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\r\n+            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\r\n+            22, 22, 22, 22, 25, 25, 25, 25, 25, 25,\r\n+            25, 25, 25, 23, 26, 25, 25, 25, 25, 25,\r\n+            25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\r\n+            25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\r\n+            25, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, 4,\r\n+            -1, -1, -1, 27, 28, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, 28, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, 5, 5, 5, -1,\r\n+            -1, 5, -1, -1, -1, -1, -1, -1, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, -1, -1, -1, -1,\r\n+            -1, -1, -1, 4, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            9, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, 5, 5, 5,\r\n+            -1, -1, 5, -1, -1, -1, -1, -1, -1, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 29,\r\n+            5, 5, 5, 5, 5, 5, 5, -1, -1, -1,\r\n+            -1, -1, -1, -1, 5, 5, 5, -1, -1, 5,\r\n+            -1, -1, -1, -1, -1, -1, 5, 5, 5, 5,\r\n+            5, 30, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, -1, -1, -1, -1, -1, -1,\r\n+            -1, 5, 5, 5, -1, -1, 5, -1, -1, -1,\r\n+            -1, -1, -1, 5, 5, 5, 31, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, -1, -1, -1, -1, -1, -1, -1, 5, 5,\r\n+            5, -1, -1, 5, -1, -1, -1, -1, -1, -1,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 32, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, -1, -1,\r\n+            -1, -1, -1, -1, -1, 5, 5, 5, -1, -1,\r\n+            5, -1, -1, -1, -1, -1, -1, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 33, 5, 5, 5, -1, -1, -1, -1, -1,\r\n+            -1, -1, 5, 5, 5, -1, -1, 5, -1, -1,\r\n+            -1, -1, -1, -1, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 34, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, -1, -1, -1, -1, -1, -1, 22, 22,\r\n+            22, 22, 22, 22, 22, 22, -1, 22, -1, 22,\r\n+            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\r\n+            22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\r\n+            22, 22, 22, 22, 22, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, 35, -1, 36, -1, 37, 38, 39,\r\n+            40, 41, 42, 43, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, 25, 25, 25, 25, 25, 25, 25, 25,\r\n+            25, -1, -1, 25, 25, 25, 25, 25, 25, 25,\r\n+            25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\r\n+            25, 25, 25, 25, 25, 25, 25, 25, 25, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, 44, 36,\r\n+            -1, 37, 38, 39, 40, 41, 42, 43, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, 45, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, 46, -1, -1, 47, -1, -1,\r\n+            47, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, 5, 5, 5, -1, -1, 5, -1, -1, -1,\r\n+            -1, -1, -1, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 48, 5, 5, 5, 5, 5,\r\n+            5, -1, -1, -1, -1, -1, -1, -1, 5, 5,\r\n+            5, -1, -1, 5, -1, -1, -1, -1, -1, -1,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 49, 5, 5, 5, 5, 5, 5, -1, -1,\r\n+            -1, -1, -1, -1, -1, 5, 5, 5, -1, -1,\r\n+            5, -1, -1, -1, -1, -1, -1, 5, 5, 5,\r\n+            5, 5, 50, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, -1, -1, -1, -1, -1,\r\n+            -1, -1, 5, 5, 5, -1, -1, 5, -1, -1,\r\n+            -1, -1, -1, -1, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 51, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, -1, -1, -1, -1, -1, -1, -1, 5,\r\n+            5, 5, -1, -1, 5, -1, -1, -1, -1, -1,\r\n+            -1, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 52, 5, 5, -1,\r\n+            -1, -1, -1, -1, -1, -1, 5, 5, 5, -1,\r\n+            -1, 5, -1, -1, -1, -1, -1, -1, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 53, 5, 5, -1, -1, -1, -1,\r\n+            -1, -1, -1, 54, -1, 54, -1, -1, 54, -1,\r\n+            -1, -1, -1, -1, -1, 54, 54, -1, -1, -1,\r\n+            -1, 54, -1, -1, -1, 54, -1, -1, 54, 54,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            45, -1, -1, -1, -1, 28, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, 28, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, 46, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, 5, 5, 5, -1, -1, 5,\r\n+            -1, -1, -1, -1, -1, -1, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 55, 5,\r\n+            5, 5, 5, 5, -1, -1, -1, -1, -1, -1,\r\n+            -1, 5, 5, 5, -1, -1, 5, -1, -1, -1,\r\n+            -1, -1, -1, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 56, 5, 5, 5, 5, 5,\r\n+            5, -1, -1, -1, -1, -1, -1, -1, 5, 5,\r\n+            5, -1, -1, 5, -1, -1, -1, -1, -1, -1,\r\n+            5, 5, 5, 5, 5, 5, 57, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, -1, -1,\r\n+            -1, -1, -1, -1, -1, 5, 5, 5, -1, -1,\r\n+            57, -1, -1, -1, -1, -1, -1, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, -1, -1, -1, -1, -1,\r\n+            -1, -1, 5, 5, 5, -1, -1, 5, -1, -1,\r\n+            -1, -1, -1, -1, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            58, 5, -1, -1, -1, -1, -1, -1, -1, 5,\r\n+            5, 5, -1, -1, 5, -1, -1, -1, -1, -1,\r\n+            -1, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 56, 5, 5, -1,\r\n+            -1, -1, -1, -1, -1, -1, 59, -1, 59, -1,\r\n+            -1, 59, -1, -1, -1, -1, -1, -1, 59, 59,\r\n+            -1, -1, -1, -1, 59, -1, -1, -1, 59, -1,\r\n+            -1, 59, 59, -1, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, 5, 5, 5, -1, -1, 5, -1,\r\n+            -1, -1, -1, -1, -1, 5, 5, 5, 5, 5,\r\n+            5, 60, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, -1, -1, -1, -1, -1, -1, -1,\r\n+            5, 5, 5, -1, -1, 60, -1, -1, -1, -1,\r\n+            -1, -1, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n+            -1, -1, -1, -1, -1, -1, -1, 61, -1, 61,\r\n+            -1, -1, 61, -1, -1, -1, -1, -1, -1, 61,\r\n+            61, -1, -1, -1, -1, 61, -1, -1, -1, 61,\r\n+            -1, -1, 61, 61, -1, -1, -1, -1, -1, -1,\r\n+            -1, -1, -1, -1, 62, -1, 62, -1, -1, 62,\r\n+            -1, -1, -1, -1, -1, -1, 62, 62, -1, -1,\r\n+            -1, -1, 62, -1, -1, -1, 62, -1, -1, 62,\r\n+            62, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r\n+    };\r\n+    /* error codes */\r\n+    private static final int ZZ_UNKNOWN_ERROR = 0;\r\n+    private static final int ZZ_NO_MATCH = 1;\r\n+    private static final int ZZ_PUSHBACK_2BIG = 2;\r\n+    /* error messages for the codes above */\r\n+    private static final String[] ZZ_ERROR_MSG = {\r\n+            \"Unkown internal scanner error\",\r\n+            \"Error: could not match input\",\r\n+            \"Error: pushback value was too large\"\r\n+    };\r\n+    private static final String ZZ_ATTRIBUTE_PACKED_0 =\r\n+            \"\\3\\0\\1\\11\\3\\1\\2\\11\\7\\1\\6\\11\\1\\1\\1\\11\" +\r\n+                    \"\\1\\0\\1\\1\\3\\0\\6\\1\\10\\11\\1\\0\\1\\11\\2\\1\" +\r\n+                    \"\\1\\0\\6\\1\\1\\0\\4\\1\\1\\0\\1\\1\\1\\0\\1\\11\";\r\n+    /**\r\n+     * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>\r\n+     */\r\n+    private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();\r\n+    /**\r\n+     * the input device\r\n+     */\r\n+    private java.io.Reader zzReader;\r\n+    /**\r\n+     * the current state of the DFA\r\n+     */\r\n+    private int zzState;\r\n+    /**\r\n+     * the current lexical state\r\n+     */\r\n+    private int zzLexicalState = YYINITIAL;\r\n+    /**\r\n+     * this buffer contains the current text to be matched and is\r\n+     * the source of the yytext() string\r\n+     */\r\n+    private char[] zzBuffer = new char[ZZ_BUFFERSIZE];\r\n+    /**\r\n+     * the textposition at the last accepting state\r\n+     */\r\n+    private int zzMarkedPos;\r\n+    /**\r\n+     * the current text position in the buffer\r\n+     */\r\n+    private int zzCurrentPos;\r\n+    /**\r\n+     * startRead marks the beginning of the yytext() string in the buffer\r\n+     */\r\n+    private int zzStartRead;\r\n+    /**\r\n+     * endRead marks the last character in the buffer, that has been read\r\n+     * from input\r\n+     */\r\n+    private int zzEndRead;\r\n+    /**\r\n+     * zzAtEOF == true <=> the scanner is at the EOF\r\n+     */\r\n+    private boolean zzAtEOF;\r\n+    /**\r\n+     * denotes if the user-EOF-code has already been executed\r\n+     */\r\n+    //private boolean zzEOFDone;\r\n+\r\n+  /* user code: */\r\n+    private StringBuffer sb;\r\n+\r\n+    /**\r\n+     * Creates a new scanner\r\n+     * There is also a java.io.InputStream version of this constructor.\r\n+     *\r\n+     * @param in the java.io.Reader to read input from.\r\n+     */\r\n+    Yylex(java.io.Reader in) {\r\n+        this.zzReader = in;\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new scanner.\r\n+     * There is also java.io.Reader version of this constructor.\r\n+     *\r\n+     * @param in the java.io.Inputstream to read input from.\r\n+     */\r\n+    Yylex(java.io.InputStream in) {\r\n+        this(new java.io.InputStreamReader(in));\r\n+    }\r\n+\r\n+    private static int[] zzUnpackAction() {\r\n+        int[] result = new int[63];\r\n+        int offset = 0;\r\n+        offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);\r\n+        return result;\r\n+    }\r\n+\r\n+    private static int zzUnpackAction(String packed, int offset, int[] result) {\r\n+        int i = 0;       /* index in packed string  */\r\n+        int j = offset;  /* index in unpacked array */\r\n+        int l = packed.length();\r\n+        while (i < l) {\r\n+            int count = packed.charAt(i++);\r\n+            int value = packed.charAt(i++);\r\n+            do {\r\n+                result[j++] = value;\r\n+            } while (--count > 0);\r\n+        }\r\n+        return j;\r\n+    }\r\n+\r\n+    /** number of newlines encountered up to the start of the matched text */\r\n+    //private int yyline;\r\n+\r\n+    /** the number of characters up to the start of the matched text */\r\n+    //private int yychar;\r\n+\r\n+    /**\r\n+     * the number of characters from the last newline up to the start of the\r\n+     * matched text\r\n+     */\r\n+    //private int yycolumn;\r\n+\r\n+    /**\r\n+     * zzAtBOL == true <=> the scanner is currently at the beginning of a line\r\n+     */\r\n+    //private boolean zzAtBOL = true;\r\n+    private static int[] zzUnpackRowMap() {\r\n+        int[] result = new int[63];\r\n+        int offset = 0;\r\n+        offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);\r\n+        return result;\r\n+    }\r\n+\r\n+    private static int zzUnpackRowMap(String packed, int offset, int[] result) {\r\n+        int i = 0;  /* index in packed string  */\r\n+        int j = offset;  /* index in unpacked array */\r\n+        int l = packed.length();\r\n+        while (i < l) {\r\n+            int high = packed.charAt(i++) << 16;\r\n+            result[j++] = high | packed.charAt(i++);\r\n+        }\r\n+        return j;\r\n+    }\r\n+\r\n+    private static int[] zzUnpackAttribute() {\r\n+        int[] result = new int[63];\r\n+        int offset = 0;\r\n+        offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);\r\n+        return result;\r\n+    }\r\n+\r\n+    private static int zzUnpackAttribute(String packed, int offset, int[] result) {\r\n+        int i = 0;       /* index in packed string  */\r\n+        int j = offset;  /* index in unpacked array */\r\n+        int l = packed.length();\r\n+        while (i < l) {\r\n+            int count = packed.charAt(i++);\r\n+            int value = packed.charAt(i++);\r\n+            do {\r\n+                result[j++] = value;\r\n+            } while (--count > 0);\r\n+        }\r\n+        return j;\r\n+    }\r\n+\r\n+    /**\r\n+     * Unpacks the compressed character translation table.\r\n+     *\r\n+     * @param packed the packed character translation table\r\n+     * @return the unpacked character translation table\r\n+     */\r\n+    private static char[] zzUnpackCMap(String packed) {\r\n+        char[] map = new char[0x10000];\r\n+        int i = 0;  /* index in packed string  */\r\n+        int j = 0;  /* index in unpacked array */\r\n+        while (i < 122) {\r\n+            int count = packed.charAt(i++);\r\n+            char value = packed.charAt(i++);\r\n+            do {\r\n+                map[j++] = value;\r\n+            } while (--count > 0);\r\n+        }\r\n+        return map;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Refills the input buffer.\r\n+     *\r\n+     * @return <code>false</code>, iff there was new input.\r\n+     * @throws java.io.IOException if any I/O-Error occurs\r\n+     */\r\n+    private boolean zzRefill() throws java.io.IOException {\r\n+\r\n+    /* first: make room (if you can) */\r\n+        if (zzStartRead > 0) {\r\n+            System.arraycopy(zzBuffer, zzStartRead,\r\n+                    zzBuffer, 0,\r\n+                    zzEndRead - zzStartRead);\r\n+\r\n+      /* translate stored positions */\r\n+            zzEndRead -= zzStartRead;\r\n+            zzCurrentPos -= zzStartRead;\r\n+            zzMarkedPos -= zzStartRead;\r\n+            zzStartRead = 0;\r\n+        }\r\n+\r\n+    /* is the buffer big enough? */\r\n+        if (zzCurrentPos >= zzBuffer.length) {\r\n+      /* if not: blow it up */\r\n+            char[] newBuffer = new char[zzCurrentPos * 2];\r\n+            System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);\r\n+            zzBuffer = newBuffer;\r\n+        }\r\n+\r\n+    /* finally: fill the buffer with new input */\r\n+        int numRead = zzReader.read(zzBuffer, zzEndRead,\r\n+                zzBuffer.length - zzEndRead);\r\n+\r\n+        if (numRead > 0) {\r\n+            zzEndRead += numRead;\r\n+            return false;\r\n+        }\r\n+        // unlikely but not impossible: read 0 characters, but not at end of stream\r\n+        if (numRead == 0) {\r\n+            int c = zzReader.read();\r\n+            if (c == -1) {\r\n+                return true;\r\n+            } else {\r\n+                zzBuffer[zzEndRead++] = (char) c;\r\n+                return false;\r\n+            }\r\n+        }\r\n+\r\n+        // numRead < 0\r\n+        return true;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Closes the input stream.\r\n+     */\r\n+    public final void yyclose() throws java.io.IOException {\r\n+        zzAtEOF = true;            /* indicate end of file */\r\n+        zzEndRead = zzStartRead;  /* invalidate buffer    */\r\n+\r\n+        if (zzReader != null) {\r\n+            zzReader.close();\r\n+        }\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Resets the scanner to read from a new input stream.\r\n+     * Does not close the old reader.\r\n+     * <p>\r\n+     * All internal variables are reset, the old input stream\r\n+     * <b>cannot</b> be reused (internal buffer is discarded and lost).\r\n+     * Lexical state is set to <tt>ZZ_INITIAL</tt>.\r\n+     *\r\n+     * @param reader the new input stream\r\n+     */\r\n+    public final void yyreset(java.io.Reader reader) {\r\n+        zzReader = reader;\r\n+        //zzAtBOL  = true;\r\n+        zzAtEOF = false;\r\n+        //zzEOFDone = false;\r\n+        zzEndRead = zzStartRead = 0;\r\n+        zzCurrentPos = zzMarkedPos = 0;\r\n+        //yyline = yychar = yycolumn = 0;\r\n+        zzLexicalState = YYINITIAL;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Returns the current lexical state.\r\n+     */\r\n+    public final int yystate() {\r\n+        return zzLexicalState;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Enters a new lexical state\r\n+     *\r\n+     * @param newState the new lexical state\r\n+     */\r\n+    public final void yybegin(int newState) {\r\n+        zzLexicalState = newState;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Returns the text matched by the current regular expression.\r\n+     */\r\n+    public final String yytext() {\r\n+        return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Returns the character at position <tt>pos</tt> from the\r\n+     * matched text.\r\n+     * <p>\r\n+     * It is equivalent to yytext().charAt(pos), but faster\r\n+     *\r\n+     * @param pos the position of the character to fetch.\r\n+     *            A value from 0 to yylength()-1.\r\n+     * @return the character at position pos\r\n+     */\r\n+    public final char yycharat(int pos) {\r\n+        return zzBuffer[zzStartRead + pos];\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Returns the length of the matched text region.\r\n+     */\r\n+    public final int yylength() {\r\n+        return zzMarkedPos - zzStartRead;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Reports an error that occured while scanning.\r\n+     * <p>\r\n+     * In a wellformed scanner (no or only correct usage of\r\n+     * yypushback(int) and a match-all fallback rule) this method\r\n+     * will only be called with things that \"Can't Possibly Happen\".\r\n+     * If this method is called, something is seriously wrong\r\n+     * (e.g. a JFlex bug producing a faulty scanner etc.).\r\n+     * <p>\r\n+     * Usual syntax/scanner level error handling should be done\r\n+     * in error fallback rules.\r\n+     *\r\n+     * @param errorCode the code of the errormessage to display\r\n+     */\r\n+    private void zzScanError(int errorCode) {\r\n+        String message;\r\n+        try {\r\n+            message = ZZ_ERROR_MSG[errorCode];\r\n+        } catch (ArrayIndexOutOfBoundsException e) {\r\n+            message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];\r\n+        }\r\n+\r\n+        throw new Error(message);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Pushes the specified amount of characters back into the input stream.\r\n+     * <p>\r\n+     * They will be read again by then next call of the scanning method\r\n+     *\r\n+     * @param number the number of characters to be read again.\r\n+     *               This number must not be greater than yylength()!\r\n+     */\r\n+    public void yypushback(int number) {\r\n+        if (number > yylength()) {\r\n+            zzScanError(ZZ_PUSHBACK_2BIG);\r\n+        }\r\n+\r\n+        zzMarkedPos -= number;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Resumes scanning until the next regular expression is matched,\r\n+     * the end of input is encountered or an I/O-Error occurs.\r\n+     *\r\n+     * @return the next token\r\n+     * @throws java.io.IOException if any I/O-Error occurs\r\n+     */\r\n+    public JSONToken yylex() throws java.io.IOException, ParseException {\r\n+        int zzInput;\r\n+        int zzAction;\r\n+\r\n+        // cached fields:\r\n+        int zzCurrentPosL;\r\n+        int zzMarkedPosL;\r\n+        int zzEndReadL = zzEndRead;\r\n+        char[] zzBufferL = zzBuffer;\r\n+        char[] zzCMapL = ZZ_CMAP;\r\n+\r\n+        int[] zzTransL = ZZ_TRANS;\r\n+        int[] zzRowMapL = ZZ_ROWMAP;\r\n+        int[] zzAttrL = ZZ_ATTRIBUTE;\r\n+\r\n+        while (true) {\r\n+            zzMarkedPosL = zzMarkedPos;\r\n+\r\n+            zzAction = -1;\r\n+\r\n+            zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;\r\n+\r\n+            zzState = ZZ_LEXSTATE[zzLexicalState];\r\n+\r\n+\r\n+            zzForAction:\r\n+            {\r\n+                while (true) {\r\n+\r\n+                    if (zzCurrentPosL < zzEndReadL) {\r\n+                        zzInput = zzBufferL[zzCurrentPosL++];\r\n+                    } else if (zzAtEOF) {\r\n+                        zzInput = YYEOF;\r\n+                        break zzForAction;\r\n+                    } else {\r\n+                        // store back cached positions\r\n+                        zzCurrentPos = zzCurrentPosL;\r\n+                        zzMarkedPos = zzMarkedPosL;\r\n+                        boolean eof = zzRefill();\r\n+                        // get translated positions and possibly new buffer\r\n+                        zzCurrentPosL = zzCurrentPos;\r\n+                        zzMarkedPosL = zzMarkedPos;\r\n+                        zzBufferL = zzBuffer;\r\n+                        zzEndReadL = zzEndRead;\r\n+                        if (eof) {\r\n+                            zzInput = YYEOF;\r\n+                            break zzForAction;\r\n+                        } else {\r\n+                            zzInput = zzBufferL[zzCurrentPosL++];\r\n+                        }\r\n+                    }\r\n+                    int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];\r\n+                    if (zzNext == -1) {\r\n+                        break zzForAction;\r\n+                    }\r\n+                    zzState = zzNext;\r\n+\r\n+                    int zzAttributes = zzAttrL[zzState];\r\n+                    if ((zzAttributes & 1) == 1) {\r\n+                        zzAction = zzState;\r\n+                        zzMarkedPosL = zzCurrentPosL;\r\n+                        if ((zzAttributes & 8) == 8) {\r\n+                            break zzForAction;\r\n+                        }\r\n+                    }\r\n+\r\n+                }\r\n+            }\r\n+\r\n+            // store back cached position\r\n+            zzMarkedPos = zzMarkedPosL;\r\n+\r\n+            switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {\r\n+                case 25: {\r\n+                    return new JSONToken(JSONToken.NULL, null);\r\n+                }\r\n+                case 29:\r\n+                    break;\r\n+                case 13: {\r\n+                    sb.append(yytext());\r\n+                }\r\n+                case 30:\r\n+                    break;\r\n+                case 18: {\r\n+                    sb.append('\\b');\r\n+                }\r\n+                case 31:\r\n+                    break;\r\n+                case 9: {\r\n+                    return new JSONToken(JSONToken.LSQUARE);\r\n+                }\r\n+                case 32:\r\n+                    break;\r\n+                case 2: {\r\n+                    Long val = Long.valueOf(yytext());\r\n+                    return new JSONToken(JSONToken.INT, val);\r\n+                }\r\n+                case 33:\r\n+                    break;\r\n+                case 16: {\r\n+                    sb.append('\\\\');\r\n+                }\r\n+                case 34:\r\n+                    break;\r\n+                case 8: {\r\n+                    return new JSONToken(JSONToken.RBRACE);\r\n+                }\r\n+                case 35:\r\n+                    break;\r\n+                case 26: {\r\n+                    return new JSONToken(JSONToken.BOOL, Boolean.TRUE);\r\n+                }\r\n+                case 36:\r\n+                    break;\r\n+                case 23: {\r\n+                    sb.append('\\'');\r\n+                }\r\n+                case 37:\r\n+                    break;\r\n+                case 5: {\r\n+                    sb = new StringBuffer();\r\n+                    yybegin(STR2);\r\n+                }\r\n+                case 38:\r\n+                    break;\r\n+                case 27: {\r\n+                    return new JSONToken(JSONToken.BOOL, Boolean.FALSE);\r\n+                }\r\n+                case 39:\r\n+                    break;\r\n+                case 12: {\r\n+                    return new JSONToken(JSONToken.COLON);\r\n+                }\r\n+                case 40:\r\n+                    break;\r\n+                case 21: {\r\n+                    sb.append('\\r');\r\n+                }\r\n+                case 41:\r\n+                    break;\r\n+                case 3: {\r\n+                    return new JSONToken(JSONToken.IDENT, yytext());\r\n+                }\r\n+                case 42:\r\n+                    break;\r\n+                case 28: {\r\n+                    try {\r\n+                        sb.append((char) Integer.parseInt(yytext().substring(2), 16));\r\n+                    } catch (Exception e) {\r\n+                        throw new ParseException(e.getMessage());\r\n+                    }\r\n+                }\r\n+                case 43:\r\n+                    break;\r\n+                case 10: {\r\n+                    return new JSONToken(JSONToken.RSQUARE);\r\n+                }\r\n+                case 44:\r\n+                    break;\r\n+                case 17: {\r\n+                    sb.append('/');\r\n+                }\r\n+                case 45:\r\n+                    break;\r\n+                case 11: {\r\n+                    return new JSONToken(JSONToken.COMMA);\r\n+                }\r\n+                case 46:\r\n+                    break;\r\n+                case 15: {\r\n+                    sb.append('\"');\r\n+                }\r\n+                case 47:\r\n+                    break;\r\n+                case 24: {\r\n+                    Double val = Double.valueOf(yytext());\r\n+                    return new JSONToken(JSONToken.FLOAT, val);\r\n+                }\r\n+                case 48:\r\n+                    break;\r\n+                case 1: {\r\n+                    throw new ParseException(\"Unexpected char [\" + yytext() + \"]\");\r\n+                }\r\n+                case 49:\r\n+                    break;\r\n+                case 19: {\r\n+                    sb.append('\\f');\r\n+                }\r\n+                case 50:\r\n+                    break;\r\n+                case 7: {\r\n+                    return new JSONToken(JSONToken.LBRACE);\r\n+                }\r\n+                case 51:\r\n+                    break;\r\n+                case 14: {\r\n+                    yybegin(YYINITIAL);\r\n+                    return new JSONToken(JSONToken.STRING, sb.toString());\r\n+                }\r\n+                case 52:\r\n+                    break;\r\n+                case 22: {\r\n+                    sb.append('\\t');\r\n+                }\r\n+                case 53:\r\n+                    break;\r\n+                case 4: {\r\n+                    sb = new StringBuffer();\r\n+                    yybegin(STR1);\r\n+                }\r\n+                case 54:\r\n+                    break;\r\n+                case 20: {\r\n+                    sb.append('\\n');\r\n+                }\r\n+                case 55:\r\n+                    break;\r\n+                case 6: {\r\n+                }\r\n+                case 56:\r\n+                    break;\r\n+                default:\r\n+                    if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {\r\n+                        zzAtEOF = true;\r\n+                        return null;\r\n+                    } else {\r\n+                        zzScanError(ZZ_NO_MATCH);\r\n+                        break;\r\n+                    }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/common/lang/Prioritized.java", "source2": "org/apache/dubbo/common/lang/Prioritized.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,76 +1,76 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.lang;\n-\n-import java.util.Comparator;\n-\n-import static java.lang.Integer.compare;\n-\n-/**\n- * {@code Prioritized} interface can be implemented by objects that\n- * should be sorted, for example the tasks in executable queue.\n- *\n- * @since 2.7.5\n- */\n-public interface Prioritized extends Comparable<Prioritized> {\n-\n-    /**\n-     * The {@link Comparator} of {@link Prioritized}\n-     */\n-    Comparator<Object> COMPARATOR = (one, two) -> {\n-        boolean b1 = one instanceof Prioritized;\n-        boolean b2 = two instanceof Prioritized;\n-        if (b1 && !b2) {        // one is Prioritized, two is not\n-            return -1;\n-        } else if (b2 && !b1) { // two is Prioritized, one is not\n-            return 1;\n-        } else if (b1 && b2) {  //  one and two both are Prioritized\n-            return ((Prioritized) one).compareTo((Prioritized) two);\n-        } else {                // no different\n-            return 0;\n-        }\n-    };\n-\n-    /**\n-     * The maximum priority\n-     */\n-    int MAX_PRIORITY = Integer.MIN_VALUE;\n-\n-    /**\n-     * The minimum priority\n-     */\n-    int MIN_PRIORITY = Integer.MAX_VALUE;\n-\n-    /**\n-     * Normal Priority\n-     */\n-    int NORMAL_PRIORITY = 0;\n-\n-    /**\n-     * Get the priority\n-     *\n-     * @return the default is {@link #NORMAL_PRIORITY}\n-     */\n-    default int getPriority() {\n-        return NORMAL_PRIORITY;\n-    }\n-\n-    @Override\n-    default int compareTo(Prioritized that) {\n-        return compare(this.getPriority(), that.getPriority());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.lang;\r\n+\r\n+import java.util.Comparator;\r\n+\r\n+import static java.lang.Integer.compare;\r\n+\r\n+/**\r\n+ * {@code Prioritized} interface can be implemented by objects that\r\n+ * should be sorted, for example the tasks in executable queue.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface Prioritized extends Comparable<Prioritized> {\r\n+\r\n+    /**\r\n+     * The {@link Comparator} of {@link Prioritized}\r\n+     */\r\n+    Comparator<Object> COMPARATOR = (one, two) -> {\r\n+        boolean b1 = one instanceof Prioritized;\r\n+        boolean b2 = two instanceof Prioritized;\r\n+        if (b1 && !b2) {        // one is Prioritized, two is not\r\n+            return -1;\r\n+        } else if (b2 && !b1) { // two is Prioritized, one is not\r\n+            return 1;\r\n+        } else if (b1 && b2) {  //  one and two both are Prioritized\r\n+            return ((Prioritized) one).compareTo((Prioritized) two);\r\n+        } else {                // no different\r\n+            return 0;\r\n+        }\r\n+    };\r\n+\r\n+    /**\r\n+     * The maximum priority\r\n+     */\r\n+    int MAX_PRIORITY = Integer.MIN_VALUE;\r\n+\r\n+    /**\r\n+     * The minimum priority\r\n+     */\r\n+    int MIN_PRIORITY = Integer.MAX_VALUE;\r\n+\r\n+    /**\r\n+     * Normal Priority\r\n+     */\r\n+    int NORMAL_PRIORITY = 0;\r\n+\r\n+    /**\r\n+     * Get the priority\r\n+     *\r\n+     * @return the default is {@link #NORMAL_PRIORITY}\r\n+     */\r\n+    default int getPriority() {\r\n+        return NORMAL_PRIORITY;\r\n+    }\r\n+\r\n+    @Override\r\n+    default int compareTo(Prioritized that) {\r\n+        return compare(this.getPriority(), that.getPriority());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/lang/ShutdownHookCallback.java", "source2": "org/apache/dubbo/common/lang/ShutdownHookCallback.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.lang;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-/**\n- * Dubbo ShutdownHook callback interface\n- *\n- * @since 2.7.5\n- */\n-@SPI\n-public interface ShutdownHookCallback extends Prioritized {\n-\n-    /**\n-     * Callback execution\n-     *\n-     * @throws Throwable if met with some errors\n-     */\n-    void callback() throws Throwable;\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.lang;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+/**\r\n+ * Dubbo ShutdownHook callback interface\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface ShutdownHookCallback extends Prioritized {\r\n+\r\n+    /**\r\n+     * Callback execution\r\n+     *\r\n+     * @throws Throwable if met with some errors\r\n+     */\r\n+    void callback() throws Throwable;\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/lang/ShutdownHookCallbacks.java", "source2": "org/apache/dubbo/common/lang/ShutdownHookCallbacks.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,72 +1,72 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.lang;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-\n-import java.util.Collection;\n-import java.util.LinkedList;\n-import java.util.List;\n-\n-import static java.util.Collections.sort;\n-import static org.apache.dubbo.common.function.ThrowableAction.execute;\n-\n-/**\n- * The compose {@link ShutdownHookCallback} class to manipulate one and more {@link ShutdownHookCallback} instances\n- *\n- * @since 2.7.5\n- */\n-public class ShutdownHookCallbacks {\n-\n-    public static final ShutdownHookCallbacks INSTANCE = new ShutdownHookCallbacks();\n-\n-    private final List<ShutdownHookCallback> callbacks = new LinkedList<>();\n-\n-    ShutdownHookCallbacks() {\n-        loadCallbacks();\n-    }\n-\n-    public ShutdownHookCallbacks addCallback(ShutdownHookCallback callback) {\n-        synchronized (this) {\n-            this.callbacks.add(callback);\n-        }\n-        return this;\n-    }\n-\n-    public Collection<ShutdownHookCallback> getCallbacks() {\n-        synchronized (this) {\n-            sort(this.callbacks);\n-            return this.callbacks;\n-        }\n-    }\n-\n-    public void clear() {\n-        synchronized (this) {\n-            callbacks.clear();\n-        }\n-    }\n-\n-    private void loadCallbacks() {\n-        ExtensionLoader<ShutdownHookCallback> loader =\n-                ExtensionLoader.getExtensionLoader(ShutdownHookCallback.class);\n-        loader.getSupportedExtensionInstances().forEach(this::addCallback);\n-    }\n-\n-    public void callback() {\n-        getCallbacks().forEach(callback -> execute(callback::callback));\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.lang;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+\r\n+import static java.util.Collections.sort;\r\n+import static org.apache.dubbo.common.function.ThrowableAction.execute;\r\n+\r\n+/**\r\n+ * The compose {@link ShutdownHookCallback} class to manipulate one and more {@link ShutdownHookCallback} instances\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ShutdownHookCallbacks {\r\n+\r\n+    public static final ShutdownHookCallbacks INSTANCE = new ShutdownHookCallbacks();\r\n+\r\n+    private final List<ShutdownHookCallback> callbacks = new LinkedList<>();\r\n+\r\n+    ShutdownHookCallbacks() {\r\n+        loadCallbacks();\r\n+    }\r\n+\r\n+    public ShutdownHookCallbacks addCallback(ShutdownHookCallback callback) {\r\n+        synchronized (this) {\r\n+            this.callbacks.add(callback);\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    public Collection<ShutdownHookCallback> getCallbacks() {\r\n+        synchronized (this) {\r\n+            sort(this.callbacks);\r\n+            return this.callbacks;\r\n+        }\r\n+    }\r\n+\r\n+    public void clear() {\r\n+        synchronized (this) {\r\n+            callbacks.clear();\r\n+        }\r\n+    }\r\n+\r\n+    private void loadCallbacks() {\r\n+        ExtensionLoader<ShutdownHookCallback> loader =\r\n+                ExtensionLoader.getExtensionLoader(ShutdownHookCallback.class);\r\n+        loader.getSupportedExtensionInstances().forEach(this::addCallback);\r\n+    }\r\n+\r\n+    public void callback() {\r\n+        getCallbacks().forEach(callback -> execute(callback::callback));\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/logger/Logger.java", "source2": "org/apache/dubbo/common/logger/Logger.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,171 +1,171 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.logger;\n-\n-/**\n- * Logger interface\n- * <p>\n- * This interface is referred from commons-logging\n- */\n-public interface Logger {\n-\n-    /**\n-     * Logs a message with trace log level.\n-     *\n-     * @param msg log this message\n-     */\n-    void trace(String msg);\n-\n-    /**\n-     * Logs an error with trace log level.\n-     *\n-     * @param e log this cause\n-     */\n-    void trace(Throwable e);\n-\n-    /**\n-     * Logs an error with trace log level.\n-     *\n-     * @param msg log this message\n-     * @param e   log this cause\n-     */\n-    void trace(String msg, Throwable e);\n-\n-    /**\n-     * Logs a message with debug log level.\n-     *\n-     * @param msg log this message\n-     */\n-    void debug(String msg);\n-\n-    /**\n-     * Logs an error with debug log level.\n-     *\n-     * @param e log this cause\n-     */\n-    void debug(Throwable e);\n-\n-    /**\n-     * Logs an error with debug log level.\n-     *\n-     * @param msg log this message\n-     * @param e   log this cause\n-     */\n-    void debug(String msg, Throwable e);\n-\n-    /**\n-     * Logs a message with info log level.\n-     *\n-     * @param msg log this message\n-     */\n-    void info(String msg);\n-\n-    /**\n-     * Logs an error with info log level.\n-     *\n-     * @param e log this cause\n-     */\n-    void info(Throwable e);\n-\n-    /**\n-     * Logs an error with info log level.\n-     *\n-     * @param msg log this message\n-     * @param e   log this cause\n-     */\n-    void info(String msg, Throwable e);\n-\n-    /**\n-     * Logs a message with warn log level.\n-     *\n-     * @param msg log this message\n-     */\n-    void warn(String msg);\n-\n-    /**\n-     * Logs a message with warn log level.\n-     *\n-     * @param e log this message\n-     */\n-    void warn(Throwable e);\n-\n-    /**\n-     * Logs a message with warn log level.\n-     *\n-     * @param msg log this message\n-     * @param e   log this cause\n-     */\n-    void warn(String msg, Throwable e);\n-\n-    /**\n-     * Logs a message with error log level.\n-     *\n-     * @param msg log this message\n-     */\n-    void error(String msg);\n-\n-    /**\n-     * Logs an error with error log level.\n-     *\n-     * @param e log this cause\n-     */\n-    void error(Throwable e);\n-\n-    /**\n-     * Logs an error with error log level.\n-     *\n-     * @param msg log this message\n-     * @param e   log this cause\n-     */\n-    void error(String msg, Throwable e);\n-\n-    /**\n-     * Is trace logging currently enabled?\n-     *\n-     * @return true if trace is enabled\n-     */\n-    boolean isTraceEnabled();\n-\n-    /**\n-     * Is debug logging currently enabled?\n-     *\u00a0\n-     * @return true if debug is enabled\n-     */\n-    boolean isDebugEnabled();\n-\n-    /**\n-     * Is info logging currently enabled?\n-     *\n-     * @return true if info is enabled\n-     */\n-    boolean isInfoEnabled();\n-\n-    /**\n-     * Is warn logging currently enabled?\n-     *\n-     * @return true if warn is enabled\n-     */\n-    boolean isWarnEnabled();\n-\n-    /**\n-     * Is error logging currently enabled?\n-     *\n-     * @return true if error is enabled\n-     */\n-    boolean isErrorEnabled();\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.logger;\r\n+\r\n+/**\r\n+ * Logger interface\r\n+ * <p>\r\n+ * This interface is referred from commons-logging\r\n+ */\r\n+public interface Logger {\r\n+\r\n+    /**\r\n+     * Logs a message with trace log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     */\r\n+    void trace(String msg);\r\n+\r\n+    /**\r\n+     * Logs an error with trace log level.\r\n+     *\r\n+     * @param e log this cause\r\n+     */\r\n+    void trace(Throwable e);\r\n+\r\n+    /**\r\n+     * Logs an error with trace log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     * @param e   log this cause\r\n+     */\r\n+    void trace(String msg, Throwable e);\r\n+\r\n+    /**\r\n+     * Logs a message with debug log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     */\r\n+    void debug(String msg);\r\n+\r\n+    /**\r\n+     * Logs an error with debug log level.\r\n+     *\r\n+     * @param e log this cause\r\n+     */\r\n+    void debug(Throwable e);\r\n+\r\n+    /**\r\n+     * Logs an error with debug log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     * @param e   log this cause\r\n+     */\r\n+    void debug(String msg, Throwable e);\r\n+\r\n+    /**\r\n+     * Logs a message with info log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     */\r\n+    void info(String msg);\r\n+\r\n+    /**\r\n+     * Logs an error with info log level.\r\n+     *\r\n+     * @param e log this cause\r\n+     */\r\n+    void info(Throwable e);\r\n+\r\n+    /**\r\n+     * Logs an error with info log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     * @param e   log this cause\r\n+     */\r\n+    void info(String msg, Throwable e);\r\n+\r\n+    /**\r\n+     * Logs a message with warn log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     */\r\n+    void warn(String msg);\r\n+\r\n+    /**\r\n+     * Logs a message with warn log level.\r\n+     *\r\n+     * @param e log this message\r\n+     */\r\n+    void warn(Throwable e);\r\n+\r\n+    /**\r\n+     * Logs a message with warn log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     * @param e   log this cause\r\n+     */\r\n+    void warn(String msg, Throwable e);\r\n+\r\n+    /**\r\n+     * Logs a message with error log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     */\r\n+    void error(String msg);\r\n+\r\n+    /**\r\n+     * Logs an error with error log level.\r\n+     *\r\n+     * @param e log this cause\r\n+     */\r\n+    void error(Throwable e);\r\n+\r\n+    /**\r\n+     * Logs an error with error log level.\r\n+     *\r\n+     * @param msg log this message\r\n+     * @param e   log this cause\r\n+     */\r\n+    void error(String msg, Throwable e);\r\n+\r\n+    /**\r\n+     * Is trace logging currently enabled?\r\n+     *\r\n+     * @return true if trace is enabled\r\n+     */\r\n+    boolean isTraceEnabled();\r\n+\r\n+    /**\r\n+     * Is debug logging currently enabled?\r\n+     *\u00a0\r\n+     * @return true if debug is enabled\r\n+     */\r\n+    boolean isDebugEnabled();\r\n+\r\n+    /**\r\n+     * Is info logging currently enabled?\r\n+     *\r\n+     * @return true if info is enabled\r\n+     */\r\n+    boolean isInfoEnabled();\r\n+\r\n+    /**\r\n+     * Is warn logging currently enabled?\r\n+     *\r\n+     * @return true if warn is enabled\r\n+     */\r\n+    boolean isWarnEnabled();\r\n+\r\n+    /**\r\n+     * Is error logging currently enabled?\r\n+     *\r\n+     * @return true if error is enabled\r\n+     */\r\n+    boolean isErrorEnabled();\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/common/store/support/SimpleDataStore.java", "source2": "org/apache/dubbo/common/store/support/SimpleDataStore.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,65 +1,65 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.store.support;\n-\n-import org.apache.dubbo.common.store.DataStore;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-public class SimpleDataStore implements DataStore {\n-\n-    // <component name or id, <data-name, data-value>>\n-    private ConcurrentMap<String, ConcurrentMap<String, Object>> data =\n-            new ConcurrentHashMap<String, ConcurrentMap<String, Object>>();\n-\n-    @Override\n-    public Map<String, Object> get(String componentName) {\n-        ConcurrentMap<String, Object> value = data.get(componentName);\n-        if (value == null) {\n-            return new HashMap<String, Object>();\n-        }\n-\n-        return new HashMap<String, Object>(value);\n-    }\n-\n-    @Override\n-    public Object get(String componentName, String key) {\n-        if (!data.containsKey(componentName)) {\n-            return null;\n-        }\n-        return data.get(componentName).get(key);\n-    }\n-\n-    @Override\n-    public void put(String componentName, String key, Object value) {\n-        Map<String, Object> componentData = data.computeIfAbsent(componentName, k -> new ConcurrentHashMap<>());\n-        componentData.put(key, value);\n-    }\n-\n-    @Override\n-    public void remove(String componentName, String key) {\n-        if (!data.containsKey(componentName)) {\n-            return;\n-        }\n-        data.get(componentName).remove(key);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.store.support;\r\n+\r\n+import org.apache.dubbo.common.store.DataStore;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+public class SimpleDataStore implements DataStore {\r\n+\r\n+    // <component name or id, <data-name, data-value>>\r\n+    private ConcurrentMap<String, ConcurrentMap<String, Object>> data =\r\n+            new ConcurrentHashMap<String, ConcurrentMap<String, Object>>();\r\n+\r\n+    @Override\r\n+    public Map<String, Object> get(String componentName) {\r\n+        ConcurrentMap<String, Object> value = data.get(componentName);\r\n+        if (value == null) {\r\n+            return new HashMap<String, Object>();\r\n+        }\r\n+\r\n+        return new HashMap<String, Object>(value);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object get(String componentName, String key) {\r\n+        if (!data.containsKey(componentName)) {\r\n+            return null;\r\n+        }\r\n+        return data.get(componentName).get(key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void put(String componentName, String key, Object value) {\r\n+        Map<String, Object> componentData = data.computeIfAbsent(componentName, k -> new ConcurrentHashMap<>());\r\n+        componentData.put(key, value);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void remove(String componentName, String key) {\r\n+        if (!data.containsKey(componentName)) {\r\n+            return;\r\n+        }\r\n+        data.get(componentName).remove(key);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadlocal/InternalRunnable.java", "source2": "org/apache/dubbo/common/threadlocal/InternalRunnable.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,53 +1,53 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.threadlocal;\n-\n-\n-/**\n- * InternalRunnable\n- * There is a risk of memory leak when using {@link InternalThreadLocal} without calling\n- * {@link InternalThreadLocal#removeAll()}.\n- * This design is learning from {@see io.netty.util.concurrent.FastThreadLocalRunnable} which is in Netty.\n- */\n-public class InternalRunnable implements Runnable{\n-    private final Runnable runnable;\n-\n-    public InternalRunnable(Runnable runnable){\n-        this.runnable=runnable;\n-    }\n-\n-    /**\n-     * After the task execution is completed, it will call {@link InternalThreadLocal#removeAll()} to clear\n-     * unnecessary variables in the thread.\n-     */\n-    @Override\n-    public void run() {\n-        try{\n-            runnable.run();\n-        }finally {\n-            InternalThreadLocal.removeAll();\n-        }\n-    }\n-\n-    /**\n-     * Wrap ordinary Runnable into {@link InternalThreadLocal}.\n-     */\n-     static Runnable Wrap(Runnable runnable){\n-        return runnable instanceof InternalRunnable?runnable:new InternalRunnable(runnable);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.threadlocal;\r\n+\r\n+\r\n+/**\r\n+ * InternalRunnable\r\n+ * There is a risk of memory leak when using {@link InternalThreadLocal} without calling\r\n+ * {@link InternalThreadLocal#removeAll()}.\r\n+ * This design is learning from {@see io.netty.util.concurrent.FastThreadLocalRunnable} which is in Netty.\r\n+ */\r\n+public class InternalRunnable implements Runnable{\r\n+    private final Runnable runnable;\r\n+\r\n+    public InternalRunnable(Runnable runnable){\r\n+        this.runnable=runnable;\r\n+    }\r\n+\r\n+    /**\r\n+     * After the task execution is completed, it will call {@link InternalThreadLocal#removeAll()} to clear\r\n+     * unnecessary variables in the thread.\r\n+     */\r\n+    @Override\r\n+    public void run() {\r\n+        try{\r\n+            runnable.run();\r\n+        }finally {\r\n+            InternalThreadLocal.removeAll();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Wrap ordinary Runnable into {@link InternalThreadLocal}.\r\n+     */\r\n+     static Runnable Wrap(Runnable runnable){\r\n+        return runnable instanceof InternalRunnable?runnable:new InternalRunnable(runnable);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadlocal/InternalThreadLocal.java", "source2": "org/apache/dubbo/common/threadlocal/InternalThreadLocal.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,198 +1,198 @@\n-/*\n- * Copyright 2014 The Netty Project\n- *\n- * The Netty Project licenses this file to you under the Apache License,\n- * version 2.0 (the \"License\"); you may not use this file except in compliance\n- * with the License. You may obtain a copy of the License at:\n- *\n- *   http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n- * License for the specific language governing permissions and limitations\n- * under the License.\n- */\n-\n-package org.apache.dubbo.common.threadlocal;\n-\n-import java.util.Collections;\n-import java.util.IdentityHashMap;\n-import java.util.Set;\n-\n-/**\n- * InternalThreadLocal\n- * A special variant of {@link ThreadLocal} that yields higher access performance when accessed from a\n- * {@link InternalThread}.\n- * <p></p>\n- * Internally, a {@link InternalThread} uses a constant index in an array, instead of using hash code and hash table,\n- * to look for a variable.  Although seemingly very subtle, it yields slight performance advantage over using a hash\n- * table, and it is useful when accessed frequently.\n- * <p></p>\n- * This design is learning from {@see io.netty.util.concurrent.FastThreadLocal} which is in Netty.\n- */\n-public class InternalThreadLocal<V> {\n-\n-    private static final int VARIABLES_TO_REMOVE_INDEX = InternalThreadLocalMap.nextVariableIndex();\n-\n-    private final int index;\n-\n-    public InternalThreadLocal() {\n-        index = InternalThreadLocalMap.nextVariableIndex();\n-    }\n-\n-    /**\n-     * Removes all {@link InternalThreadLocal} variables bound to the current thread.  This operation is useful when you\n-     * are in a container environment, and you don't want to leave the thread local variables in the threads you do not\n-     * manage.\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public static void removeAll() {\n-        InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.getIfSet();\n-        if (threadLocalMap == null) {\n-            return;\n-        }\n-\n-        try {\n-            Object v = threadLocalMap.indexedVariable(VARIABLES_TO_REMOVE_INDEX);\n-            if (v != null && v != InternalThreadLocalMap.UNSET) {\n-                Set<InternalThreadLocal<?>> variablesToRemove = (Set<InternalThreadLocal<?>>) v;\n-                InternalThreadLocal<?>[] variablesToRemoveArray =\n-                        variablesToRemove.toArray(new InternalThreadLocal[0]);\n-                for (InternalThreadLocal<?> tlv : variablesToRemoveArray) {\n-                    tlv.remove(threadLocalMap);\n-                }\n-            }\n-        } finally {\n-            InternalThreadLocalMap.remove();\n-        }\n-    }\n-\n-    /**\n-     * Returns the number of thread local variables bound to the current thread.\n-     */\n-    public static int size() {\n-        InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.getIfSet();\n-        if (threadLocalMap == null) {\n-            return 0;\n-        } else {\n-            return threadLocalMap.size();\n-        }\n-    }\n-\n-    public static void destroy() {\n-        InternalThreadLocalMap.destroy();\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private static void addToVariablesToRemove(InternalThreadLocalMap threadLocalMap, InternalThreadLocal<?> variable) {\n-        Object v = threadLocalMap.indexedVariable(VARIABLES_TO_REMOVE_INDEX);\n-        Set<InternalThreadLocal<?>> variablesToRemove;\n-        if (v == InternalThreadLocalMap.UNSET || v == null) {\n-            variablesToRemove = Collections.newSetFromMap(new IdentityHashMap<InternalThreadLocal<?>, Boolean>());\n-            threadLocalMap.setIndexedVariable(VARIABLES_TO_REMOVE_INDEX, variablesToRemove);\n-        } else {\n-            variablesToRemove = (Set<InternalThreadLocal<?>>) v;\n-        }\n-\n-        variablesToRemove.add(variable);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private static void removeFromVariablesToRemove(InternalThreadLocalMap threadLocalMap, InternalThreadLocal<?> variable) {\n-\n-        Object v = threadLocalMap.indexedVariable(VARIABLES_TO_REMOVE_INDEX);\n-\n-        if (v == InternalThreadLocalMap.UNSET || v == null) {\n-            return;\n-        }\n-\n-        Set<InternalThreadLocal<?>> variablesToRemove = (Set<InternalThreadLocal<?>>) v;\n-        variablesToRemove.remove(variable);\n-    }\n-\n-    /**\n-     * Returns the current value for the current thread\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public final V get() {\n-        InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.get();\n-        Object v = threadLocalMap.indexedVariable(index);\n-        if (v != InternalThreadLocalMap.UNSET) {\n-            return (V) v;\n-        }\n-\n-        return initialize(threadLocalMap);\n-    }\n-\n-    private V initialize(InternalThreadLocalMap threadLocalMap) {\n-        V v = null;\n-        try {\n-            v = initialValue();\n-        } catch (Exception e) {\n-            throw new RuntimeException(e);\n-        }\n-\n-        threadLocalMap.setIndexedVariable(index, v);\n-        addToVariablesToRemove(threadLocalMap, this);\n-        return v;\n-    }\n-\n-    /**\n-     * Sets the value for the current thread.\n-     */\n-    public final void set(V value) {\n-        if (value == null || value == InternalThreadLocalMap.UNSET) {\n-            remove();\n-        } else {\n-            InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.get();\n-            if (threadLocalMap.setIndexedVariable(index, value)) {\n-                addToVariablesToRemove(threadLocalMap, this);\n-            }\n-        }\n-    }\n-\n-    /**\n-     * Sets the value to uninitialized; a proceeding call to get() will trigger a call to initialValue().\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public final void remove() {\n-        remove(InternalThreadLocalMap.getIfSet());\n-    }\n-\n-    /**\n-     * Sets the value to uninitialized for the specified thread local map;\n-     * a proceeding call to get() will trigger a call to initialValue().\n-     * The specified thread local map must be for the current thread.\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public final void remove(InternalThreadLocalMap threadLocalMap) {\n-        if (threadLocalMap == null) {\n-            return;\n-        }\n-\n-        Object v = threadLocalMap.removeIndexedVariable(index);\n-        removeFromVariablesToRemove(threadLocalMap, this);\n-\n-        if (v != InternalThreadLocalMap.UNSET) {\n-            try {\n-                onRemoval((V) v);\n-            } catch (Exception e) {\n-                throw new RuntimeException(e);\n-            }\n-        }\n-    }\n-\n-    /**\n-     * Returns the initial value for this thread-local variable.\n-     */\n-    protected V initialValue() throws Exception {\n-        return null;\n-    }\n-\n-    /**\n-     * Invoked when this thread local variable is removed by {@link #remove()}.\n-     */\n-    protected void onRemoval(@SuppressWarnings(\"unused\") V value) throws Exception {\n-    }\n-}\n+/*\r\n+ * Copyright 2014 The Netty Project\r\n+ *\r\n+ * The Netty Project licenses this file to you under the Apache License,\r\n+ * version 2.0 (the \"License\"); you may not use this file except in compliance\r\n+ * with the License. You may obtain a copy of the License at:\r\n+ *\r\n+ *   http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\r\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\r\n+ * License for the specific language governing permissions and limitations\r\n+ * under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.threadlocal;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.IdentityHashMap;\r\n+import java.util.Set;\r\n+\r\n+/**\r\n+ * InternalThreadLocal\r\n+ * A special variant of {@link ThreadLocal} that yields higher access performance when accessed from a\r\n+ * {@link InternalThread}.\r\n+ * <p></p>\r\n+ * Internally, a {@link InternalThread} uses a constant index in an array, instead of using hash code and hash table,\r\n+ * to look for a variable.  Although seemingly very subtle, it yields slight performance advantage over using a hash\r\n+ * table, and it is useful when accessed frequently.\r\n+ * <p></p>\r\n+ * This design is learning from {@see io.netty.util.concurrent.FastThreadLocal} which is in Netty.\r\n+ */\r\n+public class InternalThreadLocal<V> {\r\n+\r\n+    private static final int VARIABLES_TO_REMOVE_INDEX = InternalThreadLocalMap.nextVariableIndex();\r\n+\r\n+    private final int index;\r\n+\r\n+    public InternalThreadLocal() {\r\n+        index = InternalThreadLocalMap.nextVariableIndex();\r\n+    }\r\n+\r\n+    /**\r\n+     * Removes all {@link InternalThreadLocal} variables bound to the current thread.  This operation is useful when you\r\n+     * are in a container environment, and you don't want to leave the thread local variables in the threads you do not\r\n+     * manage.\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public static void removeAll() {\r\n+        InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.getIfSet();\r\n+        if (threadLocalMap == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        try {\r\n+            Object v = threadLocalMap.indexedVariable(VARIABLES_TO_REMOVE_INDEX);\r\n+            if (v != null && v != InternalThreadLocalMap.UNSET) {\r\n+                Set<InternalThreadLocal<?>> variablesToRemove = (Set<InternalThreadLocal<?>>) v;\r\n+                InternalThreadLocal<?>[] variablesToRemoveArray =\r\n+                        variablesToRemove.toArray(new InternalThreadLocal[0]);\r\n+                for (InternalThreadLocal<?> tlv : variablesToRemoveArray) {\r\n+                    tlv.remove(threadLocalMap);\r\n+                }\r\n+            }\r\n+        } finally {\r\n+            InternalThreadLocalMap.remove();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Returns the number of thread local variables bound to the current thread.\r\n+     */\r\n+    public static int size() {\r\n+        InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.getIfSet();\r\n+        if (threadLocalMap == null) {\r\n+            return 0;\r\n+        } else {\r\n+            return threadLocalMap.size();\r\n+        }\r\n+    }\r\n+\r\n+    public static void destroy() {\r\n+        InternalThreadLocalMap.destroy();\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private static void addToVariablesToRemove(InternalThreadLocalMap threadLocalMap, InternalThreadLocal<?> variable) {\r\n+        Object v = threadLocalMap.indexedVariable(VARIABLES_TO_REMOVE_INDEX);\r\n+        Set<InternalThreadLocal<?>> variablesToRemove;\r\n+        if (v == InternalThreadLocalMap.UNSET || v == null) {\r\n+            variablesToRemove = Collections.newSetFromMap(new IdentityHashMap<InternalThreadLocal<?>, Boolean>());\r\n+            threadLocalMap.setIndexedVariable(VARIABLES_TO_REMOVE_INDEX, variablesToRemove);\r\n+        } else {\r\n+            variablesToRemove = (Set<InternalThreadLocal<?>>) v;\r\n+        }\r\n+\r\n+        variablesToRemove.add(variable);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private static void removeFromVariablesToRemove(InternalThreadLocalMap threadLocalMap, InternalThreadLocal<?> variable) {\r\n+\r\n+        Object v = threadLocalMap.indexedVariable(VARIABLES_TO_REMOVE_INDEX);\r\n+\r\n+        if (v == InternalThreadLocalMap.UNSET || v == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        Set<InternalThreadLocal<?>> variablesToRemove = (Set<InternalThreadLocal<?>>) v;\r\n+        variablesToRemove.remove(variable);\r\n+    }\r\n+\r\n+    /**\r\n+     * Returns the current value for the current thread\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public final V get() {\r\n+        InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.get();\r\n+        Object v = threadLocalMap.indexedVariable(index);\r\n+        if (v != InternalThreadLocalMap.UNSET) {\r\n+            return (V) v;\r\n+        }\r\n+\r\n+        return initialize(threadLocalMap);\r\n+    }\r\n+\r\n+    private V initialize(InternalThreadLocalMap threadLocalMap) {\r\n+        V v = null;\r\n+        try {\r\n+            v = initialValue();\r\n+        } catch (Exception e) {\r\n+            throw new RuntimeException(e);\r\n+        }\r\n+\r\n+        threadLocalMap.setIndexedVariable(index, v);\r\n+        addToVariablesToRemove(threadLocalMap, this);\r\n+        return v;\r\n+    }\r\n+\r\n+    /**\r\n+     * Sets the value for the current thread.\r\n+     */\r\n+    public final void set(V value) {\r\n+        if (value == null || value == InternalThreadLocalMap.UNSET) {\r\n+            remove();\r\n+        } else {\r\n+            InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.get();\r\n+            if (threadLocalMap.setIndexedVariable(index, value)) {\r\n+                addToVariablesToRemove(threadLocalMap, this);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Sets the value to uninitialized; a proceeding call to get() will trigger a call to initialValue().\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public final void remove() {\r\n+        remove(InternalThreadLocalMap.getIfSet());\r\n+    }\r\n+\r\n+    /**\r\n+     * Sets the value to uninitialized for the specified thread local map;\r\n+     * a proceeding call to get() will trigger a call to initialValue().\r\n+     * The specified thread local map must be for the current thread.\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public final void remove(InternalThreadLocalMap threadLocalMap) {\r\n+        if (threadLocalMap == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        Object v = threadLocalMap.removeIndexedVariable(index);\r\n+        removeFromVariablesToRemove(threadLocalMap, this);\r\n+\r\n+        if (v != InternalThreadLocalMap.UNSET) {\r\n+            try {\r\n+                onRemoval((V) v);\r\n+            } catch (Exception e) {\r\n+                throw new RuntimeException(e);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Returns the initial value for this thread-local variable.\r\n+     */\r\n+    protected V initialValue() throws Exception {\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Invoked when this thread local variable is removed by {@link #remove()}.\r\n+     */\r\n+    protected void onRemoval(@SuppressWarnings(\"unused\") V value) throws Exception {\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadlocal/InternalThreadLocalMap.java", "source2": "org/apache/dubbo/common/threadlocal/InternalThreadLocalMap.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,167 +1,167 @@\n-/*\n- * Copyright 2014 The Netty Project\n- *\n- * The Netty Project licenses this file to you under the Apache License,\n- * version 2.0 (the \"License\"); you may not use this file except in compliance\n- * with the License. You may obtain a copy of the License at:\n- *\n- *   http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n- * License for the specific language governing permissions and limitations\n- * under the License.\n- */\n-\n-package org.apache.dubbo.common.threadlocal;\n-\n-import java.util.Arrays;\n-import java.util.concurrent.atomic.AtomicInteger;\n-\n-/**\n- * The internal data structure that stores the threadLocal variables for Netty and all {@link InternalThread}s.\n- * Note that this class is for internal use only. Use {@link InternalThread}\n- * unless you know what you are doing.\n- */\n-public final class InternalThreadLocalMap {\n-\n-    private Object[] indexedVariables;\n-\n-    private static ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = new ThreadLocal<InternalThreadLocalMap>();\n-\n-    private static final AtomicInteger NEXT_INDEX = new AtomicInteger();\n-\n-    public static final Object UNSET = new Object();\n-\n-    public static InternalThreadLocalMap getIfSet() {\n-        Thread thread = Thread.currentThread();\n-        if (thread instanceof InternalThread) {\n-            return ((InternalThread) thread).threadLocalMap();\n-        }\n-        return slowThreadLocalMap.get();\n-    }\n-\n-    public static InternalThreadLocalMap get() {\n-        Thread thread = Thread.currentThread();\n-        if (thread instanceof InternalThread) {\n-            return fastGet((InternalThread) thread);\n-        }\n-        return slowGet();\n-    }\n-\n-    public static void remove() {\n-        Thread thread = Thread.currentThread();\n-        if (thread instanceof InternalThread) {\n-            ((InternalThread) thread).setThreadLocalMap(null);\n-        } else {\n-            slowThreadLocalMap.remove();\n-        }\n-    }\n-\n-    public static void destroy() {\n-        slowThreadLocalMap = null;\n-    }\n-\n-    public static int nextVariableIndex() {\n-        int index = NEXT_INDEX.getAndIncrement();\n-        if (index < 0) {\n-            NEXT_INDEX.decrementAndGet();\n-            throw new IllegalStateException(\"Too many thread-local indexed variables\");\n-        }\n-        return index;\n-    }\n-\n-    public static int lastVariableIndex() {\n-        return NEXT_INDEX.get() - 1;\n-    }\n-\n-    private InternalThreadLocalMap() {\n-        indexedVariables = newIndexedVariableTable();\n-    }\n-\n-    public Object indexedVariable(int index) {\n-        Object[] lookup = indexedVariables;\n-        return index < lookup.length ? lookup[index] : UNSET;\n-    }\n-\n-    /**\n-     * @return {@code true} if and only if a new thread-local variable has been created\n-     */\n-    public boolean setIndexedVariable(int index, Object value) {\n-        Object[] lookup = indexedVariables;\n-        if (index < lookup.length) {\n-            Object oldValue = lookup[index];\n-            lookup[index] = value;\n-            return oldValue == UNSET;\n-        } else {\n-            expandIndexedVariableTableAndSet(index, value);\n-            return true;\n-        }\n-    }\n-\n-    public Object removeIndexedVariable(int index) {\n-        Object[] lookup = indexedVariables;\n-        if (index < lookup.length) {\n-            Object v = lookup[index];\n-            lookup[index] = UNSET;\n-            return v;\n-        } else {\n-            return UNSET;\n-        }\n-    }\n-\n-    public int size() {\n-        int count = 0;\n-        for (Object o : indexedVariables) {\n-            if (o != UNSET) {\n-                ++count;\n-            }\n-        }\n-\n-        //the fist element in `indexedVariables` is a set to keep all the InternalThreadLocal to remove\n-        //look at method `addToVariablesToRemove`\n-        return count - 1;\n-    }\n-\n-    private static Object[] newIndexedVariableTable() {\n-        Object[] array = new Object[32];\n-        Arrays.fill(array, UNSET);\n-        return array;\n-    }\n-\n-    private static InternalThreadLocalMap fastGet(InternalThread thread) {\n-        InternalThreadLocalMap threadLocalMap = thread.threadLocalMap();\n-        if (threadLocalMap == null) {\n-            thread.setThreadLocalMap(threadLocalMap = new InternalThreadLocalMap());\n-        }\n-        return threadLocalMap;\n-    }\n-\n-    private static InternalThreadLocalMap slowGet() {\n-        ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = InternalThreadLocalMap.slowThreadLocalMap;\n-        InternalThreadLocalMap ret = slowThreadLocalMap.get();\n-        if (ret == null) {\n-            ret = new InternalThreadLocalMap();\n-            slowThreadLocalMap.set(ret);\n-        }\n-        return ret;\n-    }\n-\n-    private void expandIndexedVariableTableAndSet(int index, Object value) {\n-        Object[] oldArray = indexedVariables;\n-        final int oldCapacity = oldArray.length;\n-        int newCapacity = index;\n-        newCapacity |= newCapacity >>> 1;\n-        newCapacity |= newCapacity >>> 2;\n-        newCapacity |= newCapacity >>> 4;\n-        newCapacity |= newCapacity >>> 8;\n-        newCapacity |= newCapacity >>> 16;\n-        newCapacity++;\n-\n-        Object[] newArray = Arrays.copyOf(oldArray, newCapacity);\n-        Arrays.fill(newArray, oldCapacity, newArray.length, UNSET);\n-        newArray[index] = value;\n-        indexedVariables = newArray;\n-    }\n-}\n+/*\r\n+ * Copyright 2014 The Netty Project\r\n+ *\r\n+ * The Netty Project licenses this file to you under the Apache License,\r\n+ * version 2.0 (the \"License\"); you may not use this file except in compliance\r\n+ * with the License. You may obtain a copy of the License at:\r\n+ *\r\n+ *   http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\r\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\r\n+ * License for the specific language governing permissions and limitations\r\n+ * under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.threadlocal;\r\n+\r\n+import java.util.Arrays;\r\n+import java.util.concurrent.atomic.AtomicInteger;\r\n+\r\n+/**\r\n+ * The internal data structure that stores the threadLocal variables for Netty and all {@link InternalThread}s.\r\n+ * Note that this class is for internal use only. Use {@link InternalThread}\r\n+ * unless you know what you are doing.\r\n+ */\r\n+public final class InternalThreadLocalMap {\r\n+\r\n+    private Object[] indexedVariables;\r\n+\r\n+    private static ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = new ThreadLocal<InternalThreadLocalMap>();\r\n+\r\n+    private static final AtomicInteger NEXT_INDEX = new AtomicInteger();\r\n+\r\n+    public static final Object UNSET = new Object();\r\n+\r\n+    public static InternalThreadLocalMap getIfSet() {\r\n+        Thread thread = Thread.currentThread();\r\n+        if (thread instanceof InternalThread) {\r\n+            return ((InternalThread) thread).threadLocalMap();\r\n+        }\r\n+        return slowThreadLocalMap.get();\r\n+    }\r\n+\r\n+    public static InternalThreadLocalMap get() {\r\n+        Thread thread = Thread.currentThread();\r\n+        if (thread instanceof InternalThread) {\r\n+            return fastGet((InternalThread) thread);\r\n+        }\r\n+        return slowGet();\r\n+    }\r\n+\r\n+    public static void remove() {\r\n+        Thread thread = Thread.currentThread();\r\n+        if (thread instanceof InternalThread) {\r\n+            ((InternalThread) thread).setThreadLocalMap(null);\r\n+        } else {\r\n+            slowThreadLocalMap.remove();\r\n+        }\r\n+    }\r\n+\r\n+    public static void destroy() {\r\n+        slowThreadLocalMap = null;\r\n+    }\r\n+\r\n+    public static int nextVariableIndex() {\r\n+        int index = NEXT_INDEX.getAndIncrement();\r\n+        if (index < 0) {\r\n+            NEXT_INDEX.decrementAndGet();\r\n+            throw new IllegalStateException(\"Too many thread-local indexed variables\");\r\n+        }\r\n+        return index;\r\n+    }\r\n+\r\n+    public static int lastVariableIndex() {\r\n+        return NEXT_INDEX.get() - 1;\r\n+    }\r\n+\r\n+    private InternalThreadLocalMap() {\r\n+        indexedVariables = newIndexedVariableTable();\r\n+    }\r\n+\r\n+    public Object indexedVariable(int index) {\r\n+        Object[] lookup = indexedVariables;\r\n+        return index < lookup.length ? lookup[index] : UNSET;\r\n+    }\r\n+\r\n+    /**\r\n+     * @return {@code true} if and only if a new thread-local variable has been created\r\n+     */\r\n+    public boolean setIndexedVariable(int index, Object value) {\r\n+        Object[] lookup = indexedVariables;\r\n+        if (index < lookup.length) {\r\n+            Object oldValue = lookup[index];\r\n+            lookup[index] = value;\r\n+            return oldValue == UNSET;\r\n+        } else {\r\n+            expandIndexedVariableTableAndSet(index, value);\r\n+            return true;\r\n+        }\r\n+    }\r\n+\r\n+    public Object removeIndexedVariable(int index) {\r\n+        Object[] lookup = indexedVariables;\r\n+        if (index < lookup.length) {\r\n+            Object v = lookup[index];\r\n+            lookup[index] = UNSET;\r\n+            return v;\r\n+        } else {\r\n+            return UNSET;\r\n+        }\r\n+    }\r\n+\r\n+    public int size() {\r\n+        int count = 0;\r\n+        for (Object o : indexedVariables) {\r\n+            if (o != UNSET) {\r\n+                ++count;\r\n+            }\r\n+        }\r\n+\r\n+        //the fist element in `indexedVariables` is a set to keep all the InternalThreadLocal to remove\r\n+        //look at method `addToVariablesToRemove`\r\n+        return count - 1;\r\n+    }\r\n+\r\n+    private static Object[] newIndexedVariableTable() {\r\n+        Object[] array = new Object[32];\r\n+        Arrays.fill(array, UNSET);\r\n+        return array;\r\n+    }\r\n+\r\n+    private static InternalThreadLocalMap fastGet(InternalThread thread) {\r\n+        InternalThreadLocalMap threadLocalMap = thread.threadLocalMap();\r\n+        if (threadLocalMap == null) {\r\n+            thread.setThreadLocalMap(threadLocalMap = new InternalThreadLocalMap());\r\n+        }\r\n+        return threadLocalMap;\r\n+    }\r\n+\r\n+    private static InternalThreadLocalMap slowGet() {\r\n+        ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = InternalThreadLocalMap.slowThreadLocalMap;\r\n+        InternalThreadLocalMap ret = slowThreadLocalMap.get();\r\n+        if (ret == null) {\r\n+            ret = new InternalThreadLocalMap();\r\n+            slowThreadLocalMap.set(ret);\r\n+        }\r\n+        return ret;\r\n+    }\r\n+\r\n+    private void expandIndexedVariableTableAndSet(int index, Object value) {\r\n+        Object[] oldArray = indexedVariables;\r\n+        final int oldCapacity = oldArray.length;\r\n+        int newCapacity = index;\r\n+        newCapacity |= newCapacity >>> 1;\r\n+        newCapacity |= newCapacity >>> 2;\r\n+        newCapacity |= newCapacity >>> 4;\r\n+        newCapacity |= newCapacity >>> 8;\r\n+        newCapacity |= newCapacity >>> 16;\r\n+        newCapacity++;\r\n+\r\n+        Object[] newArray = Arrays.copyOf(oldArray, newCapacity);\r\n+        Arrays.fill(newArray, oldCapacity, newArray.length, UNSET);\r\n+        newArray[index] = value;\r\n+        indexedVariables = newArray;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadlocal/NamedInternalThreadFactory.java", "source2": "org/apache/dubbo/common/threadlocal/NamedInternalThreadFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,47 +1,47 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.threadlocal;\n-\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-\n-/**\n- * NamedInternalThreadFactory\n- * This is a threadFactory which produce {@link InternalThread}\n- */\n-public class NamedInternalThreadFactory extends NamedThreadFactory {\n-\n-    public NamedInternalThreadFactory() {\n-        super();\n-    }\n-\n-    public NamedInternalThreadFactory(String prefix) {\n-        super(prefix, false);\n-    }\n-\n-    public NamedInternalThreadFactory(String prefix, boolean daemon) {\n-        super(prefix, daemon);\n-    }\n-\n-    @Override\n-    public Thread newThread(Runnable runnable) {\n-        String name = mPrefix + mThreadNum.getAndIncrement();\n-        InternalThread ret = new InternalThread(mGroup, InternalRunnable.Wrap(runnable), name, 0);\n-        ret.setDaemon(mDaemon);\n-        return ret;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.threadlocal;\r\n+\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+\r\n+/**\r\n+ * NamedInternalThreadFactory\r\n+ * This is a threadFactory which produce {@link InternalThread}\r\n+ */\r\n+public class NamedInternalThreadFactory extends NamedThreadFactory {\r\n+\r\n+    public NamedInternalThreadFactory() {\r\n+        super();\r\n+    }\r\n+\r\n+    public NamedInternalThreadFactory(String prefix) {\r\n+        super(prefix, false);\r\n+    }\r\n+\r\n+    public NamedInternalThreadFactory(String prefix, boolean daemon) {\r\n+        super(prefix, daemon);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Thread newThread(Runnable runnable) {\r\n+        String name = mPrefix + mThreadNum.getAndIncrement();\r\n+        InternalThread ret = new InternalThread(mGroup, InternalRunnable.Wrap(runnable), name, 0);\r\n+        ret.setDaemon(mDaemon);\r\n+        return ret;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/ThreadPool.java", "source2": "org/apache/dubbo/common/threadpool/ThreadPool.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,42 +1,42 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.Adaptive;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import java.util.concurrent.Executor;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;\n-\n-/**\n- * ThreadPool\n- */\n-@SPI(\"fixed\")\n-public interface ThreadPool {\n-\n-    /**\n-     * Thread pool\n-     *\n-     * @param url URL contains thread parameter\n-     * @return thread pool\n-     */\n-    @Adaptive({THREADPOOL_KEY})\n-    Executor getExecutor(URL url);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.Adaptive;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import java.util.concurrent.Executor;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;\r\n+\r\n+/**\r\n+ * ThreadPool\r\n+ */\r\n+@SPI(\"fixed\")\r\n+public interface ThreadPool {\r\n+\r\n+    /**\r\n+     * Thread pool\r\n+     *\r\n+     * @param url URL contains thread parameter\r\n+     * @return thread pool\r\n+     */\r\n+    @Adaptive({THREADPOOL_KEY})\r\n+    Executor getExecutor(URL url);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/ThreadlessExecutor.java", "source2": "org/apache/dubbo/common/threadpool/ThreadlessExecutor.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,202 +1,202 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.concurrent.AbstractExecutorService;\n-import java.util.concurrent.BlockingQueue;\n-import java.util.concurrent.CompletableFuture;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.LinkedBlockingQueue;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.TimeoutException;\n-\n-/**\n- * The most important difference between this Executor and other normal Executor is that this one doesn't manage\n- * any thread.\n- * <p>\n- * Tasks submitted to this executor through {@link #execute(Runnable)} will not get scheduled to a specific thread, though normal executors always do the schedule.\n- * Those tasks are stored in a blocking queue and will only be executed when a thread calls {@link #waitAndDrain()}, the thread executing the task\n- * is exactly the same as the one calling waitAndDrain.\n- */\n-public class ThreadlessExecutor extends AbstractExecutorService {\n-    private static final Logger logger = LoggerFactory.getLogger(ThreadlessExecutor.class.getName());\n-\n-    private final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();\n-\n-    private ExecutorService sharedExecutor;\n-\n-    private CompletableFuture<?> waitingFuture;\n-\n-    private boolean finished = false;\n-\n-    private volatile boolean waiting = true;\n-\n-    private final Object lock = new Object();\n-\n-    public ThreadlessExecutor(ExecutorService sharedExecutor) {\n-        this.sharedExecutor = sharedExecutor;\n-    }\n-\n-    public CompletableFuture<?> getWaitingFuture() {\n-        return waitingFuture;\n-    }\n-\n-    public void setWaitingFuture(CompletableFuture<?> waitingFuture) {\n-        this.waitingFuture = waitingFuture;\n-    }\n-\n-    public boolean isWaiting() {\n-        return waiting;\n-    }\n-\n-    /**\n-     * Waits until there is a task, executes the task and all queued tasks (if there're any). The task is either a normal\n-     * response or a timeout response.\n-     */\n-    public void waitAndDrain() throws InterruptedException {\n-        /**\n-         * Usually, {@link #waitAndDrain()} will only get called once. It blocks for the response for the first time,\n-         * once the response (the task) reached and being executed waitAndDrain will return, the whole request process\n-         * then finishes. Subsequent calls on {@link #waitAndDrain()} (if there're any) should return immediately.\n-         *\n-         * There's no need to worry that {@link #finished} is not thread-safe. Checking and updating of\n-         * 'finished' only appear in waitAndDrain, since waitAndDrain is binding to one RPC call (one thread), the call\n-         * of it is totally sequential.\n-         */\n-        if (finished) {\n-            return;\n-        }\n-\n-        Runnable runnable;\n-        try {\n-            runnable = queue.take();\n-        }catch (InterruptedException e){\n-            waiting = false;\n-            throw e;\n-        }\n-\n-        synchronized (lock) {\n-            waiting = false;\n-            runnable.run();\n-        }\n-\n-        runnable = queue.poll();\n-        while (runnable != null) {\n-            runnable.run();\n-            runnable = queue.poll();\n-        }\n-        // mark the status of ThreadlessExecutor as finished.\n-        finished = true;\n-    }\n-\n-    public long waitAndDrain(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {\n-        /*long startInMs = System.currentTimeMillis();\n-        Runnable runnable = queue.poll(timeout, unit);\n-        if (runnable == null) {\n-            throw new TimeoutException();\n-        }\n-        runnable.run();\n-        long elapsedInMs = System.currentTimeMillis() - startInMs;\n-        long timeLeft = timeout - elapsedInMs;\n-        if (timeLeft < 0) {\n-            throw new TimeoutException();\n-        }\n-        return timeLeft;*/\n-        throw new UnsupportedOperationException();\n-    }\n-\n-    /**\n-     * If the calling thread is still waiting for a callback task, add the task into the blocking queue to wait for schedule.\n-     * Otherwise, submit to shared callback executor directly.\n-     *\n-     * @param runnable\n-     */\n-    @Override\n-    public void execute(Runnable runnable) {\n-        runnable = new RunnableWrapper(runnable);\n-        synchronized (lock) {\n-            if (!waiting) {\n-                sharedExecutor.execute(runnable);\n-            } else {\n-                queue.add(runnable);\n-            }\n-        }\n-    }\n-\n-    /**\n-     * tells the thread blocking on {@link #waitAndDrain()} to return, despite of the current status, to avoid endless waiting.\n-     */\n-    public void notifyReturn(Throwable t) {\n-        // an empty runnable task.\n-        execute(() -> {\n-            waitingFuture.completeExceptionally(t);\n-        });\n-    }\n-\n-    /**\n-     * The following methods are still not supported\n-     */\n-\n-    @Override\n-    public void shutdown() {\n-        shutdownNow();\n-    }\n-\n-    @Override\n-    public List<Runnable> shutdownNow() {\n-        notifyReturn(new IllegalStateException(\"Consumer is shutting down and this call is going to be stopped without \" +\n-                \"receiving any result, usually this is called by a slow provider instance or bad service implementation.\"));\n-        return Collections.emptyList();\n-    }\n-\n-    @Override\n-    public boolean isShutdown() {\n-        return false;\n-    }\n-\n-    @Override\n-    public boolean isTerminated() {\n-        return false;\n-    }\n-\n-    @Override\n-    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {\n-        return false;\n-    }\n-\n-    private static class RunnableWrapper implements Runnable {\n-        private Runnable runnable;\n-\n-        public RunnableWrapper(Runnable runnable) {\n-            this.runnable = runnable;\n-        }\n-\n-        @Override\n-        public void run() {\n-            try {\n-                runnable.run();\n-            } catch (Throwable t) {\n-                logger.info(t);\n-            }\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.concurrent.AbstractExecutorService;\r\n+import java.util.concurrent.BlockingQueue;\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.LinkedBlockingQueue;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.TimeoutException;\r\n+\r\n+/**\r\n+ * The most important difference between this Executor and other normal Executor is that this one doesn't manage\r\n+ * any thread.\r\n+ * <p>\r\n+ * Tasks submitted to this executor through {@link #execute(Runnable)} will not get scheduled to a specific thread, though normal executors always do the schedule.\r\n+ * Those tasks are stored in a blocking queue and will only be executed when a thread calls {@link #waitAndDrain()}, the thread executing the task\r\n+ * is exactly the same as the one calling waitAndDrain.\r\n+ */\r\n+public class ThreadlessExecutor extends AbstractExecutorService {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ThreadlessExecutor.class.getName());\r\n+\r\n+    private final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();\r\n+\r\n+    private ExecutorService sharedExecutor;\r\n+\r\n+    private CompletableFuture<?> waitingFuture;\r\n+\r\n+    private boolean finished = false;\r\n+\r\n+    private volatile boolean waiting = true;\r\n+\r\n+    private final Object lock = new Object();\r\n+\r\n+    public ThreadlessExecutor(ExecutorService sharedExecutor) {\r\n+        this.sharedExecutor = sharedExecutor;\r\n+    }\r\n+\r\n+    public CompletableFuture<?> getWaitingFuture() {\r\n+        return waitingFuture;\r\n+    }\r\n+\r\n+    public void setWaitingFuture(CompletableFuture<?> waitingFuture) {\r\n+        this.waitingFuture = waitingFuture;\r\n+    }\r\n+\r\n+    public boolean isWaiting() {\r\n+        return waiting;\r\n+    }\r\n+\r\n+    /**\r\n+     * Waits until there is a task, executes the task and all queued tasks (if there're any). The task is either a normal\r\n+     * response or a timeout response.\r\n+     */\r\n+    public void waitAndDrain() throws InterruptedException {\r\n+        /**\r\n+         * Usually, {@link #waitAndDrain()} will only get called once. It blocks for the response for the first time,\r\n+         * once the response (the task) reached and being executed waitAndDrain will return, the whole request process\r\n+         * then finishes. Subsequent calls on {@link #waitAndDrain()} (if there're any) should return immediately.\r\n+         *\r\n+         * There's no need to worry that {@link #finished} is not thread-safe. Checking and updating of\r\n+         * 'finished' only appear in waitAndDrain, since waitAndDrain is binding to one RPC call (one thread), the call\r\n+         * of it is totally sequential.\r\n+         */\r\n+        if (finished) {\r\n+            return;\r\n+        }\r\n+\r\n+        Runnable runnable;\r\n+        try {\r\n+            runnable = queue.take();\r\n+        }catch (InterruptedException e){\r\n+            waiting = false;\r\n+            throw e;\r\n+        }\r\n+\r\n+        synchronized (lock) {\r\n+            waiting = false;\r\n+            runnable.run();\r\n+        }\r\n+\r\n+        runnable = queue.poll();\r\n+        while (runnable != null) {\r\n+            runnable.run();\r\n+            runnable = queue.poll();\r\n+        }\r\n+        // mark the status of ThreadlessExecutor as finished.\r\n+        finished = true;\r\n+    }\r\n+\r\n+    public long waitAndDrain(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {\r\n+        /*long startInMs = System.currentTimeMillis();\r\n+        Runnable runnable = queue.poll(timeout, unit);\r\n+        if (runnable == null) {\r\n+            throw new TimeoutException();\r\n+        }\r\n+        runnable.run();\r\n+        long elapsedInMs = System.currentTimeMillis() - startInMs;\r\n+        long timeLeft = timeout - elapsedInMs;\r\n+        if (timeLeft < 0) {\r\n+            throw new TimeoutException();\r\n+        }\r\n+        return timeLeft;*/\r\n+        throw new UnsupportedOperationException();\r\n+    }\r\n+\r\n+    /**\r\n+     * If the calling thread is still waiting for a callback task, add the task into the blocking queue to wait for schedule.\r\n+     * Otherwise, submit to shared callback executor directly.\r\n+     *\r\n+     * @param runnable\r\n+     */\r\n+    @Override\r\n+    public void execute(Runnable runnable) {\r\n+        runnable = new RunnableWrapper(runnable);\r\n+        synchronized (lock) {\r\n+            if (!waiting) {\r\n+                sharedExecutor.execute(runnable);\r\n+            } else {\r\n+                queue.add(runnable);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * tells the thread blocking on {@link #waitAndDrain()} to return, despite of the current status, to avoid endless waiting.\r\n+     */\r\n+    public void notifyReturn(Throwable t) {\r\n+        // an empty runnable task.\r\n+        execute(() -> {\r\n+            waitingFuture.completeExceptionally(t);\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * The following methods are still not supported\r\n+     */\r\n+\r\n+    @Override\r\n+    public void shutdown() {\r\n+        shutdownNow();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<Runnable> shutdownNow() {\r\n+        notifyReturn(new IllegalStateException(\"Consumer is shutting down and this call is going to be stopped without \" +\r\n+                \"receiving any result, usually this is called by a slow provider instance or bad service implementation.\"));\r\n+        return Collections.emptyList();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isShutdown() {\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isTerminated() {\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {\r\n+        return false;\r\n+    }\r\n+\r\n+    private static class RunnableWrapper implements Runnable {\r\n+        private Runnable runnable;\r\n+\r\n+        public RunnableWrapper(Runnable runnable) {\r\n+            this.runnable = runnable;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void run() {\r\n+            try {\r\n+                runnable.run();\r\n+            } catch (Throwable t) {\r\n+                logger.info(t);\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/concurrent/ScheduledCompletableFuture.java", "source2": "org/apache/dubbo/common/threadpool/concurrent/ScheduledCompletableFuture.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,65 +1,65 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool.concurrent;\n-\n-\n-import java.util.concurrent.CompletableFuture;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.TimeUnit;\n-import java.util.function.Supplier;\n-\n-public class ScheduledCompletableFuture {\n-\n-    public static <T> CompletableFuture<T> schedule(\n-            ScheduledExecutorService executor,\n-            Supplier<T> task,\n-            long delay,\n-            TimeUnit unit\n-    ) {\n-        CompletableFuture<T> completableFuture = new CompletableFuture<>();\n-        executor.schedule(\n-                () -> {\n-                    try {\n-                        return completableFuture.complete(task.get());\n-                    } catch (Throwable t) {\n-                        return completableFuture.completeExceptionally(t);\n-                    }\n-                },\n-                delay,\n-                unit\n-        );\n-        return completableFuture;\n-    }\n-\n-    public static <T> CompletableFuture<T> submit(\n-            ScheduledExecutorService executor,\n-            Supplier<T> task\n-    ) {\n-        CompletableFuture<T> completableFuture = new CompletableFuture<>();\n-        executor.submit(\n-                () -> {\n-                    try {\n-                        return completableFuture.complete(task.get());\n-                    } catch (Throwable t) {\n-                        return completableFuture.completeExceptionally(t);\n-                    }\n-                }\n-        );\n-        return completableFuture;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool.concurrent;\r\n+\r\n+\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.function.Supplier;\r\n+\r\n+public class ScheduledCompletableFuture {\r\n+\r\n+    public static <T> CompletableFuture<T> schedule(\r\n+            ScheduledExecutorService executor,\r\n+            Supplier<T> task,\r\n+            long delay,\r\n+            TimeUnit unit\r\n+    ) {\r\n+        CompletableFuture<T> completableFuture = new CompletableFuture<>();\r\n+        executor.schedule(\r\n+                () -> {\r\n+                    try {\r\n+                        return completableFuture.complete(task.get());\r\n+                    } catch (Throwable t) {\r\n+                        return completableFuture.completeExceptionally(t);\r\n+                    }\r\n+                },\r\n+                delay,\r\n+                unit\r\n+        );\r\n+        return completableFuture;\r\n+    }\r\n+\r\n+    public static <T> CompletableFuture<T> submit(\r\n+            ScheduledExecutorService executor,\r\n+            Supplier<T> task\r\n+    ) {\r\n+        CompletableFuture<T> completableFuture = new CompletableFuture<>();\r\n+        executor.submit(\r\n+                () -> {\r\n+                    try {\r\n+                        return completableFuture.complete(task.get());\r\n+                    } catch (Throwable t) {\r\n+                        return completableFuture.completeExceptionally(t);\r\n+                    }\r\n+                }\r\n+        );\r\n+        return completableFuture;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/event/ThreadPoolExhaustedEvent.java", "source2": "org/apache/dubbo/common/threadpool/event/ThreadPoolExhaustedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool.event;\n-\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An {@link Event Dubbo event} when the Dubbo thread pool is exhausted.\n- *\n- * @see Event\n- */\n-public class ThreadPoolExhaustedEvent extends Event {\n-\n-    final String msg;\n-\n-    public ThreadPoolExhaustedEvent(Object source, String msg) {\n-        super(source);\n-        this.msg = msg;\n-    }\n-\n-    public String getMsg() {\n-        return msg;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * An {@link Event Dubbo event} when the Dubbo thread pool is exhausted.\r\n+ *\r\n+ * @see Event\r\n+ */\r\n+public class ThreadPoolExhaustedEvent extends Event {\r\n+\r\n+    final String msg;\r\n+\r\n+    public ThreadPoolExhaustedEvent(Object source, String msg) {\r\n+        super(source);\r\n+        this.msg = msg;\r\n+    }\r\n+\r\n+    public String getMsg() {\r\n+        return msg;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java", "source2": "org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,175 +1,175 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool.manager;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.threadpool.ThreadPool;\n-import org.apache.dubbo.common.utils.ExecutorUtil;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.ThreadPoolExecutor;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.EXECUTOR_SERVICE_COMPONENT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;\n-\n-/**\n- * Consider implementing {@code Licycle} to enable executors shutdown when the process stops.\n- */\n-public class DefaultExecutorRepository implements ExecutorRepository {\n-    private static final Logger logger = LoggerFactory.getLogger(DefaultExecutorRepository.class);\n-\n-    private int DEFAULT_SCHEDULER_SIZE = Runtime.getRuntime().availableProcessors();\n-\n-    private final ExecutorService SHARED_EXECUTOR = Executors.newCachedThreadPool(new NamedThreadFactory(\"DubboSharedHandler\", true));\n-\n-    private Ring<ScheduledExecutorService> scheduledExecutors = new Ring<>();\n-\n-    private ScheduledExecutorService serviceExporterExecutor;\n-\n-    private ScheduledExecutorService reconnectScheduledExecutor;\n-\n-    private ConcurrentMap<String, ConcurrentMap<Integer, ExecutorService>> data = new ConcurrentHashMap<>();\n-\n-    public DefaultExecutorRepository() {\n-        for (int i = 0; i < DEFAULT_SCHEDULER_SIZE; i++) {\n-            ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"Dubbo-framework-scheduler\"));\n-            scheduledExecutors.addItem(scheduler);\n-        }\n-//\n-//        reconnectScheduledExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"Dubbo-reconnect-scheduler\"));\n-        serviceExporterExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory(\"Dubbo-exporter-scheduler\"));\n-    }\n-\n-    /**\n-     * Get called when the server or client instance initiating.\n-     *\n-     * @param url\n-     * @return\n-     */\n-    public synchronized ExecutorService createExecutorIfAbsent(URL url) {\n-        Map<Integer, ExecutorService> executors = data.computeIfAbsent(EXECUTOR_SERVICE_COMPONENT_KEY, k -> new ConcurrentHashMap<>());\n-        //issue-7054:Consumer's executor is sharing globally, key=Integer.MAX_VALUE. Provider's executor is sharing by protocol.\n-        Integer portKey = CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY)) ? Integer.MAX_VALUE : url.getPort();\n-        ExecutorService executor = executors.computeIfAbsent(portKey, k -> createExecutor(url));\n-        // If executor has been shut down, create a new one\n-        if (executor.isShutdown() || executor.isTerminated()) {\n-            executors.remove(portKey);\n-            executor = createExecutor(url);\n-            executors.put(portKey, executor);\n-        }\n-        return executor;\n-    }\n-\n-    public ExecutorService getExecutor(URL url) {\n-        Map<Integer, ExecutorService> executors = data.get(EXECUTOR_SERVICE_COMPONENT_KEY);\n-        /**\n-         * It's guaranteed that this method is called after {@link #createExecutorIfAbsent(URL)}, so data should already\n-         * have Executor instances generated and stored.\n-         */\n-        if (executors == null) {\n-            logger.warn(\"No available executors, this is not expected, framework should call createExecutorIfAbsent first \" +\n-                    \"before coming to here.\");\n-            return null;\n-        }\n-        //issue-7054:Consumer's executor is sharing globally, key=Integer.MAX_VALUE. Provider's executor is sharing by protocol.\n-        Integer portKey = CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY)) ? Integer.MAX_VALUE : url.getPort();\n-        ExecutorService executor = executors.get(portKey);\n-        if (executor != null && (executor.isShutdown() || executor.isTerminated())) {\n-            executors.remove(portKey);\n-            // Does not re-create a shutdown executor, use SHARED_EXECUTOR for downgrade.\n-            executor = null;\n-            logger.info(\"Executor for \" + url + \" is shutdown.\");\n-        }\n-        if (executor == null) {\n-            return SHARED_EXECUTOR;\n-        } else {\n-            return executor;\n-        }\n-    }\n-\n-    @Override\n-    public void updateThreadpool(URL url, ExecutorService executor) {\n-        try {\n-            if (url.hasParameter(THREADS_KEY)\n-                    && executor instanceof ThreadPoolExecutor && !executor.isShutdown()) {\n-                ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;\n-                int threads = url.getParameter(THREADS_KEY, 0);\n-                int max = threadPoolExecutor.getMaximumPoolSize();\n-                int core = threadPoolExecutor.getCorePoolSize();\n-                if (threads > 0 && (threads != max || threads != core)) {\n-                    if (threads < core) {\n-                        threadPoolExecutor.setCorePoolSize(threads);\n-                        if (core == max) {\n-                            threadPoolExecutor.setMaximumPoolSize(threads);\n-                        }\n-                    } else {\n-                        threadPoolExecutor.setMaximumPoolSize(threads);\n-                        if (core == max) {\n-                            threadPoolExecutor.setCorePoolSize(threads);\n-                        }\n-                    }\n-                }\n-            }\n-        } catch (Throwable t) {\n-            logger.error(t.getMessage(), t);\n-        }\n-    }\n-\n-    @Override\n-    public ScheduledExecutorService nextScheduledExecutor() {\n-        return scheduledExecutors.pollItem();\n-    }\n-\n-    @Override\n-    public ScheduledExecutorService getServiceExporterExecutor() {\n-        return serviceExporterExecutor;\n-    }\n-\n-    @Override\n-    public ExecutorService getSharedExecutor() {\n-        return SHARED_EXECUTOR;\n-    }\n-\n-    @Override\n-    public void destroyAll() {\n-        data.values().forEach(executors -> {\n-            if (executors != null) {\n-                executors.values().forEach(executor -> {\n-                    if (executor != null && !executor.isShutdown()) {\n-                        ExecutorUtil.shutdownNow(executor, 100);\n-                    }\n-                });\n-            }\n-        });\n-    }\n-\n-    private ExecutorService createExecutor(URL url) {\n-        return (ExecutorService) ExtensionLoader.getExtensionLoader(ThreadPool.class).getAdaptiveExtension().getExecutor(url);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool.manager;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.threadpool.ThreadPool;\r\n+import org.apache.dubbo.common.utils.ExecutorUtil;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.ThreadPoolExecutor;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.EXECUTOR_SERVICE_COMPONENT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;\r\n+\r\n+/**\r\n+ * Consider implementing {@code Licycle} to enable executors shutdown when the process stops.\r\n+ */\r\n+public class DefaultExecutorRepository implements ExecutorRepository {\r\n+    private static final Logger logger = LoggerFactory.getLogger(DefaultExecutorRepository.class);\r\n+\r\n+    private int DEFAULT_SCHEDULER_SIZE = Runtime.getRuntime().availableProcessors();\r\n+\r\n+    private final ExecutorService SHARED_EXECUTOR = Executors.newCachedThreadPool(new NamedThreadFactory(\"DubboSharedHandler\", true));\r\n+\r\n+    private Ring<ScheduledExecutorService> scheduledExecutors = new Ring<>();\r\n+\r\n+    private ScheduledExecutorService serviceExporterExecutor;\r\n+\r\n+    private ScheduledExecutorService reconnectScheduledExecutor;\r\n+\r\n+    private ConcurrentMap<String, ConcurrentMap<Integer, ExecutorService>> data = new ConcurrentHashMap<>();\r\n+\r\n+    public DefaultExecutorRepository() {\r\n+        for (int i = 0; i < DEFAULT_SCHEDULER_SIZE; i++) {\r\n+            ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"Dubbo-framework-scheduler\"));\r\n+            scheduledExecutors.addItem(scheduler);\r\n+        }\r\n+//\r\n+//        reconnectScheduledExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"Dubbo-reconnect-scheduler\"));\r\n+        serviceExporterExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory(\"Dubbo-exporter-scheduler\"));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get called when the server or client instance initiating.\r\n+     *\r\n+     * @param url\r\n+     * @return\r\n+     */\r\n+    public synchronized ExecutorService createExecutorIfAbsent(URL url) {\r\n+        Map<Integer, ExecutorService> executors = data.computeIfAbsent(EXECUTOR_SERVICE_COMPONENT_KEY, k -> new ConcurrentHashMap<>());\r\n+        //issue-7054:Consumer's executor is sharing globally, key=Integer.MAX_VALUE. Provider's executor is sharing by protocol.\r\n+        Integer portKey = CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY)) ? Integer.MAX_VALUE : url.getPort();\r\n+        ExecutorService executor = executors.computeIfAbsent(portKey, k -> createExecutor(url));\r\n+        // If executor has been shut down, create a new one\r\n+        if (executor.isShutdown() || executor.isTerminated()) {\r\n+            executors.remove(portKey);\r\n+            executor = createExecutor(url);\r\n+            executors.put(portKey, executor);\r\n+        }\r\n+        return executor;\r\n+    }\r\n+\r\n+    public ExecutorService getExecutor(URL url) {\r\n+        Map<Integer, ExecutorService> executors = data.get(EXECUTOR_SERVICE_COMPONENT_KEY);\r\n+        /**\r\n+         * It's guaranteed that this method is called after {@link #createExecutorIfAbsent(URL)}, so data should already\r\n+         * have Executor instances generated and stored.\r\n+         */\r\n+        if (executors == null) {\r\n+            logger.warn(\"No available executors, this is not expected, framework should call createExecutorIfAbsent first \" +\r\n+                    \"before coming to here.\");\r\n+            return null;\r\n+        }\r\n+        //issue-7054:Consumer's executor is sharing globally, key=Integer.MAX_VALUE. Provider's executor is sharing by protocol.\r\n+        Integer portKey = CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY)) ? Integer.MAX_VALUE : url.getPort();\r\n+        ExecutorService executor = executors.get(portKey);\r\n+        if (executor != null && (executor.isShutdown() || executor.isTerminated())) {\r\n+            executors.remove(portKey);\r\n+            // Does not re-create a shutdown executor, use SHARED_EXECUTOR for downgrade.\r\n+            executor = null;\r\n+            logger.info(\"Executor for \" + url + \" is shutdown.\");\r\n+        }\r\n+        if (executor == null) {\r\n+            return SHARED_EXECUTOR;\r\n+        } else {\r\n+            return executor;\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void updateThreadpool(URL url, ExecutorService executor) {\r\n+        try {\r\n+            if (url.hasParameter(THREADS_KEY)\r\n+                    && executor instanceof ThreadPoolExecutor && !executor.isShutdown()) {\r\n+                ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;\r\n+                int threads = url.getParameter(THREADS_KEY, 0);\r\n+                int max = threadPoolExecutor.getMaximumPoolSize();\r\n+                int core = threadPoolExecutor.getCorePoolSize();\r\n+                if (threads > 0 && (threads != max || threads != core)) {\r\n+                    if (threads < core) {\r\n+                        threadPoolExecutor.setCorePoolSize(threads);\r\n+                        if (core == max) {\r\n+                            threadPoolExecutor.setMaximumPoolSize(threads);\r\n+                        }\r\n+                    } else {\r\n+                        threadPoolExecutor.setMaximumPoolSize(threads);\r\n+                        if (core == max) {\r\n+                            threadPoolExecutor.setCorePoolSize(threads);\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.error(t.getMessage(), t);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public ScheduledExecutorService nextScheduledExecutor() {\r\n+        return scheduledExecutors.pollItem();\r\n+    }\r\n+\r\n+    @Override\r\n+    public ScheduledExecutorService getServiceExporterExecutor() {\r\n+        return serviceExporterExecutor;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ExecutorService getSharedExecutor() {\r\n+        return SHARED_EXECUTOR;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroyAll() {\r\n+        data.values().forEach(executors -> {\r\n+            if (executors != null) {\r\n+                executors.values().forEach(executor -> {\r\n+                    if (executor != null && !executor.isShutdown()) {\r\n+                        ExecutorUtil.shutdownNow(executor, 100);\r\n+                    }\r\n+                });\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private ExecutorService createExecutor(URL url) {\r\n+        return (ExecutorService) ExtensionLoader.getExtensionLoader(ThreadPool.class).getAdaptiveExtension().getExecutor(url);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java", "source2": "org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool.manager;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.ScheduledExecutorService;\n-\n-/**\n- *\n- */\n-@SPI(\"default\")\n-public interface ExecutorRepository {\n-\n-    /**\n-     * Called by both Client and Server. TODO, consider separate these two parts.\n-     * When the Client or Server starts for the first time, generate a new threadpool according to the parameters specified.\n-     *\n-     * @param url\n-     * @return\n-     */\n-    ExecutorService createExecutorIfAbsent(URL url);\n-\n-    ExecutorService getExecutor(URL url);\n-\n-    /**\n-     * Modify some of the threadpool's properties according to the url, for example, coreSize, maxSize, ...\n-     *\n-     * @param url\n-     * @param executor\n-     */\n-    void updateThreadpool(URL url, ExecutorService executor);\n-\n-    /**\n-     * Returns a scheduler from the scheduler list, call this method whenever you need a scheduler for a cron job.\n-     * If your cron cannot burden the possible schedule delay caused by sharing the same scheduler, please consider define a dedicate one.\n-     *\n-     * @return\n-     */\n-    ScheduledExecutorService nextScheduledExecutor();\n-\n-    ScheduledExecutorService getServiceExporterExecutor();\n-\n-    /**\n-     * Get the default shared threadpool.\n-     *\n-     * @return\n-     */\n-    ExecutorService getSharedExecutor();\n-\n-    /**\n-     * Destroy all executors that are not in shutdown state\n-     */\n-    void destroyAll();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool.manager;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+@SPI(\"default\")\r\n+public interface ExecutorRepository {\r\n+\r\n+    /**\r\n+     * Called by both Client and Server. TODO, consider separate these two parts.\r\n+     * When the Client or Server starts for the first time, generate a new threadpool according to the parameters specified.\r\n+     *\r\n+     * @param url\r\n+     * @return\r\n+     */\r\n+    ExecutorService createExecutorIfAbsent(URL url);\r\n+\r\n+    ExecutorService getExecutor(URL url);\r\n+\r\n+    /**\r\n+     * Modify some of the threadpool's properties according to the url, for example, coreSize, maxSize, ...\r\n+     *\r\n+     * @param url\r\n+     * @param executor\r\n+     */\r\n+    void updateThreadpool(URL url, ExecutorService executor);\r\n+\r\n+    /**\r\n+     * Returns a scheduler from the scheduler list, call this method whenever you need a scheduler for a cron job.\r\n+     * If your cron cannot burden the possible schedule delay caused by sharing the same scheduler, please consider define a dedicate one.\r\n+     *\r\n+     * @return\r\n+     */\r\n+    ScheduledExecutorService nextScheduledExecutor();\r\n+\r\n+    ScheduledExecutorService getServiceExporterExecutor();\r\n+\r\n+    /**\r\n+     * Get the default shared threadpool.\r\n+     *\r\n+     * @return\r\n+     */\r\n+    ExecutorService getSharedExecutor();\r\n+\r\n+    /**\r\n+     * Destroy all executors that are not in shutdown state\r\n+     */\r\n+    void destroyAll();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/manager/Ring.java", "source2": "org/apache/dubbo/common/threadpool/manager/Ring.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,66 +1,66 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.threadpool.manager;\n-\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.concurrent.CopyOnWriteArrayList;\n-import java.util.concurrent.atomic.AtomicInteger;\n-\n-public class Ring<T> {\n-\n-    AtomicInteger count = new AtomicInteger();\n-\n-    private List<T> itemList = new CopyOnWriteArrayList<T>();\n-\n-    public void addItem(T t) {\n-        if (t != null) {\n-            itemList.add(t);\n-        }\n-    }\n-\n-    public T pollItem() {\n-        if (itemList.isEmpty()) {\n-            return null;\n-        }\n-        if (itemList.size() == 1) {\n-            return itemList.get(0);\n-        }\n-\n-        if (count.intValue() > Integer.MAX_VALUE - 10000) {\n-            count.set(count.get() % itemList.size());\n-        }\n-\n-        int index = Math.abs(count.getAndIncrement()) % itemList.size();\n-        return itemList.get(index);\n-    }\n-\n-    public T peekItem() {\n-        if (itemList.isEmpty()) {\n-            return null;\n-        }\n-        if (itemList.size() == 1) {\n-            return itemList.get(0);\n-        }\n-        int index = Math.abs(count.get()) % itemList.size();\n-        return itemList.get(index);\n-    }\n-\n-    public List<T> listItems() {\n-        return Collections.unmodifiableList(itemList);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.threadpool.manager;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.concurrent.CopyOnWriteArrayList;\r\n+import java.util.concurrent.atomic.AtomicInteger;\r\n+\r\n+public class Ring<T> {\r\n+\r\n+    AtomicInteger count = new AtomicInteger();\r\n+\r\n+    private List<T> itemList = new CopyOnWriteArrayList<T>();\r\n+\r\n+    public void addItem(T t) {\r\n+        if (t != null) {\r\n+            itemList.add(t);\r\n+        }\r\n+    }\r\n+\r\n+    public T pollItem() {\r\n+        if (itemList.isEmpty()) {\r\n+            return null;\r\n+        }\r\n+        if (itemList.size() == 1) {\r\n+            return itemList.get(0);\r\n+        }\r\n+\r\n+        if (count.intValue() > Integer.MAX_VALUE - 10000) {\r\n+            count.set(count.get() % itemList.size());\r\n+        }\r\n+\r\n+        int index = Math.abs(count.getAndIncrement()) % itemList.size();\r\n+        return itemList.get(index);\r\n+    }\r\n+\r\n+    public T peekItem() {\r\n+        if (itemList.isEmpty()) {\r\n+            return null;\r\n+        }\r\n+        if (itemList.size() == 1) {\r\n+            return itemList.get(0);\r\n+        }\r\n+        int index = Math.abs(count.get()) % itemList.size();\r\n+        return itemList.get(index);\r\n+    }\r\n+\r\n+    public List<T> listItems() {\r\n+        return Collections.unmodifiableList(itemList);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/support/eager/EagerThreadPool.java", "source2": "org/apache/dubbo/common/threadpool/support/eager/EagerThreadPool.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,65 +1,65 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.threadpool.support.eager;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.threadlocal.NamedInternalThreadFactory;\n-import org.apache.dubbo.common.threadpool.ThreadPool;\n-import org.apache.dubbo.common.threadpool.support.AbortPolicyWithReport;\n-\n-import java.util.concurrent.Executor;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ALIVE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.CORE_THREADS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_ALIVE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CORE_THREADS;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_QUEUES;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_THREAD_NAME;\n-import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;\n-\n-/**\n- * EagerThreadPool\n- * When the core threads are all in busy,\n- * create new thread instead of putting task into blocking queue.\n- */\n-public class EagerThreadPool implements ThreadPool {\n-\n-    @Override\n-    public Executor getExecutor(URL url) {\n-        String name = url.getParameter(THREAD_NAME_KEY, DEFAULT_THREAD_NAME);\n-        int cores = url.getParameter(CORE_THREADS_KEY, DEFAULT_CORE_THREADS);\n-        int threads = url.getParameter(THREADS_KEY, Integer.MAX_VALUE);\n-        int queues = url.getParameter(QUEUES_KEY, DEFAULT_QUEUES);\n-        int alive = url.getParameter(ALIVE_KEY, DEFAULT_ALIVE);\n-\n-        // init queue and executor\n-        TaskQueue<Runnable> taskQueue = new TaskQueue<Runnable>(queues <= 0 ? 1 : queues);\n-        EagerThreadPoolExecutor executor = new EagerThreadPoolExecutor(cores,\n-                threads,\n-                alive,\n-                TimeUnit.MILLISECONDS,\n-                taskQueue,\n-                new NamedInternalThreadFactory(name, true),\n-                new AbortPolicyWithReport(name, url));\n-        taskQueue.setExecutor(executor);\n-        return executor;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.threadpool.support.eager;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.threadlocal.NamedInternalThreadFactory;\r\n+import org.apache.dubbo.common.threadpool.ThreadPool;\r\n+import org.apache.dubbo.common.threadpool.support.AbortPolicyWithReport;\r\n+\r\n+import java.util.concurrent.Executor;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ALIVE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CORE_THREADS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_ALIVE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CORE_THREADS;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_QUEUES;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_THREAD_NAME;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;\r\n+\r\n+/**\r\n+ * EagerThreadPool\r\n+ * When the core threads are all in busy,\r\n+ * create new thread instead of putting task into blocking queue.\r\n+ */\r\n+public class EagerThreadPool implements ThreadPool {\r\n+\r\n+    @Override\r\n+    public Executor getExecutor(URL url) {\r\n+        String name = url.getParameter(THREAD_NAME_KEY, DEFAULT_THREAD_NAME);\r\n+        int cores = url.getParameter(CORE_THREADS_KEY, DEFAULT_CORE_THREADS);\r\n+        int threads = url.getParameter(THREADS_KEY, Integer.MAX_VALUE);\r\n+        int queues = url.getParameter(QUEUES_KEY, DEFAULT_QUEUES);\r\n+        int alive = url.getParameter(ALIVE_KEY, DEFAULT_ALIVE);\r\n+\r\n+        // init queue and executor\r\n+        TaskQueue<Runnable> taskQueue = new TaskQueue<Runnable>(queues <= 0 ? 1 : queues);\r\n+        EagerThreadPoolExecutor executor = new EagerThreadPoolExecutor(cores,\r\n+                threads,\r\n+                alive,\r\n+                TimeUnit.MILLISECONDS,\r\n+                taskQueue,\r\n+                new NamedInternalThreadFactory(name, true),\r\n+                new AbortPolicyWithReport(name, url));\r\n+        taskQueue.setExecutor(executor);\r\n+        return executor;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/threadpool/support/limited/LimitedThreadPool.java", "source2": "org/apache/dubbo/common/threadpool/support/limited/LimitedThreadPool.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,59 +1,59 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.threadpool.support.limited;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.threadlocal.NamedInternalThreadFactory;\n-import org.apache.dubbo.common.threadpool.ThreadPool;\n-import org.apache.dubbo.common.threadpool.support.AbortPolicyWithReport;\n-\n-import java.util.concurrent.Executor;\n-import java.util.concurrent.LinkedBlockingQueue;\n-import java.util.concurrent.SynchronousQueue;\n-import java.util.concurrent.ThreadPoolExecutor;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.CORE_THREADS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CORE_THREADS;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_QUEUES;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_THREADS;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_THREAD_NAME;\n-import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;\n-\n-/**\n- * Creates a thread pool that creates new threads as needed until limits reaches. This thread pool will not shrink\n- * automatically.\n- */\n-public class LimitedThreadPool implements ThreadPool {\n-\n-    @Override\n-    public Executor getExecutor(URL url) {\n-        String name = url.getParameter(THREAD_NAME_KEY, DEFAULT_THREAD_NAME);\n-        int cores = url.getParameter(CORE_THREADS_KEY, DEFAULT_CORE_THREADS);\n-        int threads = url.getParameter(THREADS_KEY, DEFAULT_THREADS);\n-        int queues = url.getParameter(QUEUES_KEY, DEFAULT_QUEUES);\n-        return new ThreadPoolExecutor(cores, threads, Long.MAX_VALUE, TimeUnit.MILLISECONDS,\n-                queues == 0 ? new SynchronousQueue<Runnable>() :\n-                        (queues < 0 ? new LinkedBlockingQueue<Runnable>()\n-                                : new LinkedBlockingQueue<Runnable>(queues)),\n-                new NamedInternalThreadFactory(name, true), new AbortPolicyWithReport(name, url));\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.threadpool.support.limited;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.threadlocal.NamedInternalThreadFactory;\r\n+import org.apache.dubbo.common.threadpool.ThreadPool;\r\n+import org.apache.dubbo.common.threadpool.support.AbortPolicyWithReport;\r\n+\r\n+import java.util.concurrent.Executor;\r\n+import java.util.concurrent.LinkedBlockingQueue;\r\n+import java.util.concurrent.SynchronousQueue;\r\n+import java.util.concurrent.ThreadPoolExecutor;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CORE_THREADS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CORE_THREADS;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_QUEUES;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_THREADS;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_THREAD_NAME;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;\r\n+\r\n+/**\r\n+ * Creates a thread pool that creates new threads as needed until limits reaches. This thread pool will not shrink\r\n+ * automatically.\r\n+ */\r\n+public class LimitedThreadPool implements ThreadPool {\r\n+\r\n+    @Override\r\n+    public Executor getExecutor(URL url) {\r\n+        String name = url.getParameter(THREAD_NAME_KEY, DEFAULT_THREAD_NAME);\r\n+        int cores = url.getParameter(CORE_THREADS_KEY, DEFAULT_CORE_THREADS);\r\n+        int threads = url.getParameter(THREADS_KEY, DEFAULT_THREADS);\r\n+        int queues = url.getParameter(QUEUES_KEY, DEFAULT_QUEUES);\r\n+        return new ThreadPoolExecutor(cores, threads, Long.MAX_VALUE, TimeUnit.MILLISECONDS,\r\n+                queues == 0 ? new SynchronousQueue<Runnable>() :\r\n+                        (queues < 0 ? new LinkedBlockingQueue<Runnable>()\r\n+                                : new LinkedBlockingQueue<Runnable>(queues)),\r\n+                new NamedInternalThreadFactory(name, true), new AbortPolicyWithReport(name, url));\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/timer/HashedWheelTimer.java", "source2": "org/apache/dubbo/common/timer/HashedWheelTimer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,814 +1,814 @@\n-/*\n- * Copyright 2012 The Netty Project\n- *\n- * The Netty Project licenses this file to you under the Apache License,\n- * version 2.0 (the \"License\"); you may not use this file except in compliance\n- * with the License. You may obtain a copy of the License at:\n- *\n- *   http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n- * License for the specific language governing permissions and limitations\n- * under the License.\n- */\n-\n-package org.apache.dubbo.common.timer;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-\n-import java.util.Collections;\n-import java.util.HashSet;\n-import java.util.Locale;\n-import java.util.Queue;\n-import java.util.Set;\n-import java.util.concurrent.CountDownLatch;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.LinkedBlockingQueue;\n-import java.util.concurrent.RejectedExecutionException;\n-import java.util.concurrent.ThreadFactory;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-import java.util.concurrent.atomic.AtomicInteger;\n-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;\n-import java.util.concurrent.atomic.AtomicLong;\n-\n-/**\n- * A {@link Timer} optimized for approximated I/O timeout scheduling.\n- *\n- * <h3>Tick Duration</h3>\n- * <p>\n- * As described with 'approximated', this timer does not execute the scheduled\n- * {@link TimerTask} on time.  {@link HashedWheelTimer}, on every tick, will\n- * check if there are any {@link TimerTask}s behind the schedule and execute\n- * them.\n- * <p>\n- * You can increase or decrease the accuracy of the execution timing by\n- * specifying smaller or larger tick duration in the constructor.  In most\n- * network applications, I/O timeout does not need to be accurate.  Therefore,\n- * the default tick duration is 100 milliseconds and you will not need to try\n- * different configurations in most cases.\n- *\n- * <h3>Ticks per Wheel (Wheel Size)</h3>\n- * <p>\n- * {@link HashedWheelTimer} maintains a data structure called 'wheel'.\n- * To put simply, a wheel is a hash table of {@link TimerTask}s whose hash\n- * function is 'dead line of the task'.  The default number of ticks per wheel\n- * (i.e. the size of the wheel) is 512.  You could specify a larger value\n- * if you are going to schedule a lot of timeouts.\n- *\n- * <h3>Do not create many instances.</h3>\n- * <p>\n- * {@link HashedWheelTimer} creates a new thread whenever it is instantiated and\n- * started.  Therefore, you should make sure to create only one instance and\n- * share it across your application.  One of the common mistakes, that makes\n- * your application unresponsive, is to create a new instance for every connection.\n- *\n- * <h3>Implementation Details</h3>\n- * <p>\n- * {@link HashedWheelTimer} is based on\n- * <a href=\"http://cseweb.ucsd.edu/users/varghese/\">George Varghese</a> and\n- * Tony Lauck's paper,\n- * <a href=\"http://cseweb.ucsd.edu/users/varghese/PAPERS/twheel.ps.Z\">'Hashed\n- * and Hierarchical Timing Wheels: data structures to efficiently implement a\n- * timer facility'</a>.  More comprehensive slides are located\n- * <a href=\"http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt\">here</a>.\n- */\n-public class HashedWheelTimer implements Timer {\n-\n-    /**\n-     * may be in spi?\n-     */\n-    public static final String NAME = \"hased\";\n-\n-    private static final Logger logger = LoggerFactory.getLogger(HashedWheelTimer.class);\n-\n-    private static final AtomicInteger INSTANCE_COUNTER = new AtomicInteger();\n-    private static final AtomicBoolean WARNED_TOO_MANY_INSTANCES = new AtomicBoolean();\n-    private static final int INSTANCE_COUNT_LIMIT = 64;\n-    private static final AtomicIntegerFieldUpdater<HashedWheelTimer> WORKER_STATE_UPDATER =\n-            AtomicIntegerFieldUpdater.newUpdater(HashedWheelTimer.class, \"workerState\");\n-\n-    private final Worker worker = new Worker();\n-    private final Thread workerThread;\n-\n-    private static final int WORKER_STATE_INIT = 0;\n-    private static final int WORKER_STATE_STARTED = 1;\n-    private static final int WORKER_STATE_SHUTDOWN = 2;\n-\n-    /**\n-     * 0 - init, 1 - started, 2 - shut down\n-     */\n-    @SuppressWarnings({\"unused\", \"FieldMayBeFinal\"})\n-    private volatile int workerState;\n-\n-    private final long tickDuration;\n-    private final HashedWheelBucket[] wheel;\n-    private final int mask;\n-    private final CountDownLatch startTimeInitialized = new CountDownLatch(1);\n-    private final Queue<HashedWheelTimeout> timeouts = new LinkedBlockingQueue<>();\n-    private final Queue<HashedWheelTimeout> cancelledTimeouts = new LinkedBlockingQueue<>();\n-    private final AtomicLong pendingTimeouts = new AtomicLong(0);\n-    private final long maxPendingTimeouts;\n-\n-    private volatile long startTime;\n-\n-    /**\n-     * Creates a new timer with the default thread factory\n-     * ({@link Executors#defaultThreadFactory()}), default tick duration, and\n-     * default number of ticks per wheel.\n-     */\n-    public HashedWheelTimer() {\n-        this(Executors.defaultThreadFactory());\n-    }\n-\n-    /**\n-     * Creates a new timer with the default thread factory\n-     * ({@link Executors#defaultThreadFactory()}) and default number of ticks\n-     * per wheel.\n-     *\n-     * @param tickDuration the duration between tick\n-     * @param unit         the time unit of the {@code tickDuration}\n-     * @throws NullPointerException     if {@code unit} is {@code null}\n-     * @throws IllegalArgumentException if {@code tickDuration} is &lt;= 0\n-     */\n-    public HashedWheelTimer(long tickDuration, TimeUnit unit) {\n-        this(Executors.defaultThreadFactory(), tickDuration, unit);\n-    }\n-\n-    /**\n-     * Creates a new timer with the default thread factory\n-     * ({@link Executors#defaultThreadFactory()}).\n-     *\n-     * @param tickDuration  the duration between tick\n-     * @param unit          the time unit of the {@code tickDuration}\n-     * @param ticksPerWheel the size of the wheel\n-     * @throws NullPointerException     if {@code unit} is {@code null}\n-     * @throws IllegalArgumentException if either of {@code tickDuration} and {@code ticksPerWheel} is &lt;= 0\n-     */\n-    public HashedWheelTimer(long tickDuration, TimeUnit unit, int ticksPerWheel) {\n-        this(Executors.defaultThreadFactory(), tickDuration, unit, ticksPerWheel);\n-    }\n-\n-    /**\n-     * Creates a new timer with the default tick duration and default number of\n-     * ticks per wheel.\n-     *\n-     * @param threadFactory a {@link ThreadFactory} that creates a\n-     *                      background {@link Thread} which is dedicated to\n-     *                      {@link TimerTask} execution.\n-     * @throws NullPointerException if {@code threadFactory} is {@code null}\n-     */\n-    public HashedWheelTimer(ThreadFactory threadFactory) {\n-        this(threadFactory, 100, TimeUnit.MILLISECONDS);\n-    }\n-\n-    /**\n-     * Creates a new timer with the default number of ticks per wheel.\n-     *\n-     * @param threadFactory a {@link ThreadFactory} that creates a\n-     *                      background {@link Thread} which is dedicated to\n-     *                      {@link TimerTask} execution.\n-     * @param tickDuration  the duration between tick\n-     * @param unit          the time unit of the {@code tickDuration}\n-     * @throws NullPointerException     if either of {@code threadFactory} and {@code unit} is {@code null}\n-     * @throws IllegalArgumentException if {@code tickDuration} is &lt;= 0\n-     */\n-    public HashedWheelTimer(\n-            ThreadFactory threadFactory, long tickDuration, TimeUnit unit) {\n-        this(threadFactory, tickDuration, unit, 512);\n-    }\n-\n-    /**\n-     * Creates a new timer.\n-     *\n-     * @param threadFactory a {@link ThreadFactory} that creates a\n-     *                      background {@link Thread} which is dedicated to\n-     *                      {@link TimerTask} execution.\n-     * @param tickDuration  the duration between tick\n-     * @param unit          the time unit of the {@code tickDuration}\n-     * @param ticksPerWheel the size of the wheel\n-     * @throws NullPointerException     if either of {@code threadFactory} and {@code unit} is {@code null}\n-     * @throws IllegalArgumentException if either of {@code tickDuration} and {@code ticksPerWheel} is &lt;= 0\n-     */\n-    public HashedWheelTimer(\n-            ThreadFactory threadFactory,\n-            long tickDuration, TimeUnit unit, int ticksPerWheel) {\n-        this(threadFactory, tickDuration, unit, ticksPerWheel, -1);\n-    }\n-\n-    /**\n-     * Creates a new timer.\n-     *\n-     * @param threadFactory      a {@link ThreadFactory} that creates a\n-     *                           background {@link Thread} which is dedicated to\n-     *                           {@link TimerTask} execution.\n-     * @param tickDuration       the duration between tick\n-     * @param unit               the time unit of the {@code tickDuration}\n-     * @param ticksPerWheel      the size of the wheel\n-     * @param maxPendingTimeouts The maximum number of pending timeouts after which call to\n-     *                           {@code newTimeout} will result in\n-     *                           {@link java.util.concurrent.RejectedExecutionException}\n-     *                           being thrown. No maximum pending timeouts limit is assumed if\n-     *                           this value is 0 or negative.\n-     * @throws NullPointerException     if either of {@code threadFactory} and {@code unit} is {@code null}\n-     * @throws IllegalArgumentException if either of {@code tickDuration} and {@code ticksPerWheel} is &lt;= 0\n-     */\n-    public HashedWheelTimer(\n-            ThreadFactory threadFactory,\n-            long tickDuration, TimeUnit unit, int ticksPerWheel,\n-            long maxPendingTimeouts) {\n-\n-        if (threadFactory == null) {\n-            throw new NullPointerException(\"threadFactory\");\n-        }\n-        if (unit == null) {\n-            throw new NullPointerException(\"unit\");\n-        }\n-        if (tickDuration <= 0) {\n-            throw new IllegalArgumentException(\"tickDuration must be greater than 0: \" + tickDuration);\n-        }\n-        if (ticksPerWheel <= 0) {\n-            throw new IllegalArgumentException(\"ticksPerWheel must be greater than 0: \" + ticksPerWheel);\n-        }\n-\n-        // Normalize ticksPerWheel to power of two and initialize the wheel.\n-        wheel = createWheel(ticksPerWheel);\n-        mask = wheel.length - 1;\n-\n-        // Convert tickDuration to nanos.\n-        this.tickDuration = unit.toNanos(tickDuration);\n-\n-        // Prevent overflow.\n-        if (this.tickDuration >= Long.MAX_VALUE / wheel.length) {\n-            throw new IllegalArgumentException(String.format(\n-                    \"tickDuration: %d (expected: 0 < tickDuration in nanos < %d\",\n-                    tickDuration, Long.MAX_VALUE / wheel.length));\n-        }\n-        workerThread = threadFactory.newThread(worker);\n-\n-        this.maxPendingTimeouts = maxPendingTimeouts;\n-\n-        if (INSTANCE_COUNTER.incrementAndGet() > INSTANCE_COUNT_LIMIT &&\n-                WARNED_TOO_MANY_INSTANCES.compareAndSet(false, true)) {\n-            reportTooManyInstances();\n-        }\n-    }\n-\n-    @Override\n-    protected void finalize() throws Throwable {\n-        try {\n-            super.finalize();\n-        } finally {\n-            // This object is going to be GCed and it is assumed the ship has sailed to do a proper shutdown. If\n-            // we have not yet shutdown then we want to make sure we decrement the active instance count.\n-            if (WORKER_STATE_UPDATER.getAndSet(this, WORKER_STATE_SHUTDOWN) != WORKER_STATE_SHUTDOWN) {\n-                INSTANCE_COUNTER.decrementAndGet();\n-            }\n-        }\n-    }\n-\n-    private static HashedWheelBucket[] createWheel(int ticksPerWheel) {\n-        if (ticksPerWheel <= 0) {\n-            throw new IllegalArgumentException(\n-                    \"ticksPerWheel must be greater than 0: \" + ticksPerWheel);\n-        }\n-        if (ticksPerWheel > 1073741824) {\n-            throw new IllegalArgumentException(\n-                    \"ticksPerWheel may not be greater than 2^30: \" + ticksPerWheel);\n-        }\n-\n-        ticksPerWheel = normalizeTicksPerWheel(ticksPerWheel);\n-        HashedWheelBucket[] wheel = new HashedWheelBucket[ticksPerWheel];\n-        for (int i = 0; i < wheel.length; i++) {\n-            wheel[i] = new HashedWheelBucket();\n-        }\n-        return wheel;\n-    }\n-\n-    private static int normalizeTicksPerWheel(int ticksPerWheel) {\n-        int normalizedTicksPerWheel = ticksPerWheel - 1;\n-        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 1;\n-        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 2;\n-        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 4;\n-        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 8;\n-        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 16;\n-        return normalizedTicksPerWheel + 1;\n-    }\n-\n-    /**\n-     * Starts the background thread explicitly.  The background thread will\n-     * start automatically on demand even if you did not call this method.\n-     *\n-     * @throws IllegalStateException if this timer has been\n-     *                               {@linkplain #stop() stopped} already\n-     */\n-    public void start() {\n-        switch (WORKER_STATE_UPDATER.get(this)) {\n-            case WORKER_STATE_INIT:\n-                if (WORKER_STATE_UPDATER.compareAndSet(this, WORKER_STATE_INIT, WORKER_STATE_STARTED)) {\n-                    workerThread.start();\n-                }\n-                break;\n-            case WORKER_STATE_STARTED:\n-                break;\n-            case WORKER_STATE_SHUTDOWN:\n-                throw new IllegalStateException(\"cannot be started once stopped\");\n-            default:\n-                throw new Error(\"Invalid WorkerState\");\n-        }\n-\n-        // Wait until the startTime is initialized by the worker.\n-        while (startTime == 0) {\n-            try {\n-                startTimeInitialized.await();\n-            } catch (InterruptedException ignore) {\n-                // Ignore - it will be ready very soon.\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public Set<Timeout> stop() {\n-        if (Thread.currentThread() == workerThread) {\n-            throw new IllegalStateException(\n-                    HashedWheelTimer.class.getSimpleName() +\n-                            \".stop() cannot be called from \" +\n-                            TimerTask.class.getSimpleName());\n-        }\n-\n-        if (!WORKER_STATE_UPDATER.compareAndSet(this, WORKER_STATE_STARTED, WORKER_STATE_SHUTDOWN)) {\n-            // workerState can be 0 or 2 at this moment - let it always be 2.\n-            if (WORKER_STATE_UPDATER.getAndSet(this, WORKER_STATE_SHUTDOWN) != WORKER_STATE_SHUTDOWN) {\n-                INSTANCE_COUNTER.decrementAndGet();\n-            }\n-\n-            return Collections.emptySet();\n-        }\n-\n-        try {\n-            boolean interrupted = false;\n-            while (workerThread.isAlive()) {\n-                workerThread.interrupt();\n-                try {\n-                    workerThread.join(100);\n-                } catch (InterruptedException ignored) {\n-                    interrupted = true;\n-                }\n-            }\n-\n-            if (interrupted) {\n-                Thread.currentThread().interrupt();\n-            }\n-        } finally {\n-            INSTANCE_COUNTER.decrementAndGet();\n-        }\n-        return worker.unprocessedTimeouts();\n-    }\n-\n-    @Override\n-    public boolean isStop() {\n-        return WORKER_STATE_SHUTDOWN == WORKER_STATE_UPDATER.get(this);\n-    }\n-\n-    @Override\n-    public Timeout newTimeout(TimerTask task, long delay, TimeUnit unit) {\n-        if (task == null) {\n-            throw new NullPointerException(\"task\");\n-        }\n-        if (unit == null) {\n-            throw new NullPointerException(\"unit\");\n-        }\n-\n-        long pendingTimeoutsCount = pendingTimeouts.incrementAndGet();\n-\n-        if (maxPendingTimeouts > 0 && pendingTimeoutsCount > maxPendingTimeouts) {\n-            pendingTimeouts.decrementAndGet();\n-            throw new RejectedExecutionException(\"Number of pending timeouts (\"\n-                    + pendingTimeoutsCount + \") is greater than or equal to maximum allowed pending \"\n-                    + \"timeouts (\" + maxPendingTimeouts + \")\");\n-        }\n-\n-        start();\n-\n-        // Add the timeout to the timeout queue which will be processed on the next tick.\n-        // During processing all the queued HashedWheelTimeouts will be added to the correct HashedWheelBucket.\n-        long deadline = System.nanoTime() + unit.toNanos(delay) - startTime;\n-\n-        // Guard against overflow.\n-        if (delay > 0 && deadline < 0) {\n-            deadline = Long.MAX_VALUE;\n-        }\n-        HashedWheelTimeout timeout = new HashedWheelTimeout(this, task, deadline);\n-        timeouts.add(timeout);\n-        return timeout;\n-    }\n-\n-    /**\n-     * Returns the number of pending timeouts of this {@link Timer}.\n-     */\n-    public long pendingTimeouts() {\n-        return pendingTimeouts.get();\n-    }\n-\n-    private static void reportTooManyInstances() {\n-        String resourceType = ClassUtils.simpleClassName(HashedWheelTimer.class);\n-        logger.error(\"You are creating too many \" + resourceType + \" instances. \" +\n-                resourceType + \" is a shared resource that must be reused across the JVM,\" +\n-                \"so that only a few instances are created.\");\n-    }\n-\n-    private final class Worker implements Runnable {\n-        private final Set<Timeout> unprocessedTimeouts = new HashSet<Timeout>();\n-\n-        private long tick;\n-\n-        @Override\n-        public void run() {\n-            // Initialize the startTime.\n-            startTime = System.nanoTime();\n-            if (startTime == 0) {\n-                // We use 0 as an indicator for the uninitialized value here, so make sure it's not 0 when initialized.\n-                startTime = 1;\n-            }\n-\n-            // Notify the other threads waiting for the initialization at start().\n-            startTimeInitialized.countDown();\n-\n-            do {\n-                final long deadline = waitForNextTick();\n-                if (deadline > 0) {\n-                    int idx = (int) (tick & mask);\n-                    processCancelledTasks();\n-                    HashedWheelBucket bucket =\n-                            wheel[idx];\n-                    transferTimeoutsToBuckets();\n-                    bucket.expireTimeouts(deadline);\n-                    tick++;\n-                }\n-            } while (WORKER_STATE_UPDATER.get(HashedWheelTimer.this) == WORKER_STATE_STARTED);\n-\n-            // Fill the unprocessedTimeouts so we can return them from stop() method.\n-            for (HashedWheelBucket bucket : wheel) {\n-                bucket.clearTimeouts(unprocessedTimeouts);\n-            }\n-            for (; ; ) {\n-                HashedWheelTimeout timeout = timeouts.poll();\n-                if (timeout == null) {\n-                    break;\n-                }\n-                if (!timeout.isCancelled()) {\n-                    unprocessedTimeouts.add(timeout);\n-                }\n-            }\n-            processCancelledTasks();\n-        }\n-\n-        private void transferTimeoutsToBuckets() {\n-            // transfer only max. 100000 timeouts per tick to prevent a thread to stale the workerThread when it just\n-            // adds new timeouts in a loop.\n-            for (int i = 0; i < 100000; i++) {\n-                HashedWheelTimeout timeout = timeouts.poll();\n-                if (timeout == null) {\n-                    // all processed\n-                    break;\n-                }\n-                if (timeout.state() == HashedWheelTimeout.ST_CANCELLED) {\n-                    // Was cancelled in the meantime.\n-                    continue;\n-                }\n-\n-                long calculated = timeout.deadline / tickDuration;\n-                timeout.remainingRounds = (calculated - tick) / wheel.length;\n-\n-                // Ensure we don't schedule for past.\n-                final long ticks = Math.max(calculated, tick);\n-                int stopIndex = (int) (ticks & mask);\n-\n-                HashedWheelBucket bucket = wheel[stopIndex];\n-                bucket.addTimeout(timeout);\n-            }\n-        }\n-\n-        private void processCancelledTasks() {\n-            for (; ; ) {\n-                HashedWheelTimeout timeout = cancelledTimeouts.poll();\n-                if (timeout == null) {\n-                    // all processed\n-                    break;\n-                }\n-                try {\n-                    timeout.remove();\n-                } catch (Throwable t) {\n-                    if (logger.isWarnEnabled()) {\n-                        logger.warn(\"An exception was thrown while process a cancellation task\", t);\n-                    }\n-                }\n-            }\n-        }\n-\n-        /**\n-         * calculate goal nanoTime from startTime and current tick number,\n-         * then wait until that goal has been reached.\n-         *\n-         * @return Long.MIN_VALUE if received a shutdown request,\n-         * current time otherwise (with Long.MIN_VALUE changed by +1)\n-         */\n-        private long waitForNextTick() {\n-            long deadline = tickDuration * (tick + 1);\n-\n-            for (; ; ) {\n-                final long currentTime = System.nanoTime() - startTime;\n-                long sleepTimeMs = (deadline - currentTime + 999999) / 1000000;\n-\n-                if (sleepTimeMs <= 0) {\n-                    if (currentTime == Long.MIN_VALUE) {\n-                        return -Long.MAX_VALUE;\n-                    } else {\n-                        return currentTime;\n-                    }\n-                }\n-                if (isWindows()) {\n-                    sleepTimeMs = sleepTimeMs / 10 * 10;\n-                }\n-\n-                try {\n-                    Thread.sleep(sleepTimeMs);\n-                } catch (InterruptedException ignored) {\n-                    if (WORKER_STATE_UPDATER.get(HashedWheelTimer.this) == WORKER_STATE_SHUTDOWN) {\n-                        return Long.MIN_VALUE;\n-                    }\n-                }\n-            }\n-        }\n-\n-        Set<Timeout> unprocessedTimeouts() {\n-            return Collections.unmodifiableSet(unprocessedTimeouts);\n-        }\n-    }\n-\n-    private static final class HashedWheelTimeout implements Timeout {\n-\n-        private static final int ST_INIT = 0;\n-        private static final int ST_CANCELLED = 1;\n-        private static final int ST_EXPIRED = 2;\n-        private static final AtomicIntegerFieldUpdater<HashedWheelTimeout> STATE_UPDATER =\n-                AtomicIntegerFieldUpdater.newUpdater(HashedWheelTimeout.class, \"state\");\n-\n-        private final HashedWheelTimer timer;\n-        private final TimerTask task;\n-        private final long deadline;\n-\n-        @SuppressWarnings({\"unused\", \"FieldMayBeFinal\", \"RedundantFieldInitialization\"})\n-        private volatile int state = ST_INIT;\n-\n-        /**\n-         * RemainingRounds will be calculated and set by Worker.transferTimeoutsToBuckets() before the\n-         * HashedWheelTimeout will be added to the correct HashedWheelBucket.\n-         */\n-        long remainingRounds;\n-\n-        /**\n-         * This will be used to chain timeouts in HashedWheelTimerBucket via a double-linked-list.\n-         * As only the workerThread will act on it there is no need for synchronization / volatile.\n-         */\n-        HashedWheelTimeout next;\n-        HashedWheelTimeout prev;\n-\n-        /**\n-         * The bucket to which the timeout was added\n-         */\n-        HashedWheelBucket bucket;\n-\n-        HashedWheelTimeout(HashedWheelTimer timer, TimerTask task, long deadline) {\n-            this.timer = timer;\n-            this.task = task;\n-            this.deadline = deadline;\n-        }\n-\n-        @Override\n-        public Timer timer() {\n-            return timer;\n-        }\n-\n-        @Override\n-        public TimerTask task() {\n-            return task;\n-        }\n-\n-        @Override\n-        public boolean cancel() {\n-            // only update the state it will be removed from HashedWheelBucket on next tick.\n-            if (!compareAndSetState(ST_INIT, ST_CANCELLED)) {\n-                return false;\n-            }\n-            // If a task should be canceled we put this to another queue which will be processed on each tick.\n-            // So this means that we will have a GC latency of max. 1 tick duration which is good enough. This way\n-            // we can make again use of our MpscLinkedQueue and so minimize the locking / overhead as much as possible.\n-            timer.cancelledTimeouts.add(this);\n-            return true;\n-        }\n-\n-        void remove() {\n-            HashedWheelBucket bucket = this.bucket;\n-            if (bucket != null) {\n-                bucket.remove(this);\n-            } else {\n-                timer.pendingTimeouts.decrementAndGet();\n-            }\n-        }\n-\n-        public boolean compareAndSetState(int expected, int state) {\n-            return STATE_UPDATER.compareAndSet(this, expected, state);\n-        }\n-\n-        public int state() {\n-            return state;\n-        }\n-\n-        @Override\n-        public boolean isCancelled() {\n-            return state() == ST_CANCELLED;\n-        }\n-\n-        @Override\n-        public boolean isExpired() {\n-            return state() == ST_EXPIRED;\n-        }\n-\n-        public void expire() {\n-            if (!compareAndSetState(ST_INIT, ST_EXPIRED)) {\n-                return;\n-            }\n-\n-            try {\n-                task.run(this);\n-            } catch (Throwable t) {\n-                if (logger.isWarnEnabled()) {\n-                    logger.warn(\"An exception was thrown by \" + TimerTask.class.getSimpleName() + '.', t);\n-                }\n-            }\n-        }\n-\n-        @Override\n-        public String toString() {\n-            final long currentTime = System.nanoTime();\n-            long remaining = deadline - currentTime + timer.startTime;\n-            String simpleClassName = ClassUtils.simpleClassName(this.getClass());\n-\n-            StringBuilder buf = new StringBuilder(192)\n-                    .append(simpleClassName)\n-                    .append('(')\n-                    .append(\"deadline: \");\n-            if (remaining > 0) {\n-                buf.append(remaining)\n-                        .append(\" ns later\");\n-            } else if (remaining < 0) {\n-                buf.append(-remaining)\n-                        .append(\" ns ago\");\n-            } else {\n-                buf.append(\"now\");\n-            }\n-\n-            if (isCancelled()) {\n-                buf.append(\", cancelled\");\n-            }\n-\n-            return buf.append(\", task: \")\n-                    .append(task())\n-                    .append(')')\n-                    .toString();\n-        }\n-    }\n-\n-    /**\n-     * Bucket that stores HashedWheelTimeouts. These are stored in a linked-list like datastructure to allow easy\n-     * removal of HashedWheelTimeouts in the middle. Also the HashedWheelTimeout act as nodes themself and so no\n-     * extra object creation is needed.\n-     */\n-    private static final class HashedWheelBucket {\n-\n-        /**\n-         * Used for the linked-list datastructure\n-         */\n-        private HashedWheelTimeout head;\n-        private HashedWheelTimeout tail;\n-\n-        /**\n-         * Add {@link HashedWheelTimeout} to this bucket.\n-         */\n-        void addTimeout(HashedWheelTimeout timeout) {\n-            assert timeout.bucket == null;\n-            timeout.bucket = this;\n-            if (head == null) {\n-                head = tail = timeout;\n-            } else {\n-                tail.next = timeout;\n-                timeout.prev = tail;\n-                tail = timeout;\n-            }\n-        }\n-\n-        /**\n-         * Expire all {@link HashedWheelTimeout}s for the given {@code deadline}.\n-         */\n-        void expireTimeouts(long deadline) {\n-            HashedWheelTimeout timeout = head;\n-\n-            // process all timeouts\n-            while (timeout != null) {\n-                HashedWheelTimeout next = timeout.next;\n-                if (timeout.remainingRounds <= 0) {\n-                    next = remove(timeout);\n-                    if (timeout.deadline <= deadline) {\n-                        timeout.expire();\n-                    } else {\n-                        // The timeout was placed into a wrong slot. This should never happen.\n-                        throw new IllegalStateException(String.format(\n-                                \"timeout.deadline (%d) > deadline (%d)\", timeout.deadline, deadline));\n-                    }\n-                } else if (timeout.isCancelled()) {\n-                    next = remove(timeout);\n-                } else {\n-                    timeout.remainingRounds--;\n-                }\n-                timeout = next;\n-            }\n-        }\n-\n-        public HashedWheelTimeout remove(HashedWheelTimeout timeout) {\n-            HashedWheelTimeout next = timeout.next;\n-            // remove timeout that was either processed or cancelled by updating the linked-list\n-            if (timeout.prev != null) {\n-                timeout.prev.next = next;\n-            }\n-            if (timeout.next != null) {\n-                timeout.next.prev = timeout.prev;\n-            }\n-\n-            if (timeout == head) {\n-                // if timeout is also the tail we need to adjust the entry too\n-                if (timeout == tail) {\n-                    tail = null;\n-                    head = null;\n-                } else {\n-                    head = next;\n-                }\n-            } else if (timeout == tail) {\n-                // if the timeout is the tail modify the tail to be the prev node.\n-                tail = timeout.prev;\n-            }\n-            // null out prev, next and bucket to allow for GC.\n-            timeout.prev = null;\n-            timeout.next = null;\n-            timeout.bucket = null;\n-            timeout.timer.pendingTimeouts.decrementAndGet();\n-            return next;\n-        }\n-\n-        /**\n-         * Clear this bucket and return all not expired / cancelled {@link Timeout}s.\n-         */\n-        void clearTimeouts(Set<Timeout> set) {\n-            for (; ; ) {\n-                HashedWheelTimeout timeout = pollTimeout();\n-                if (timeout == null) {\n-                    return;\n-                }\n-                if (timeout.isExpired() || timeout.isCancelled()) {\n-                    continue;\n-                }\n-                set.add(timeout);\n-            }\n-        }\n-\n-        private HashedWheelTimeout pollTimeout() {\n-            HashedWheelTimeout head = this.head;\n-            if (head == null) {\n-                return null;\n-            }\n-            HashedWheelTimeout next = head.next;\n-            if (next == null) {\n-                tail = this.head = null;\n-            } else {\n-                this.head = next;\n-                next.prev = null;\n-            }\n-\n-            // null out prev and next to allow for GC.\n-            head.next = null;\n-            head.prev = null;\n-            head.bucket = null;\n-            return head;\n-        }\n-    }\n-    \n-    private static final boolean IS_OS_WINDOWS = System.getProperty(\"os.name\", \"\").toLowerCase(Locale.US).contains(\"win\");\n-    \n-    private boolean isWindows() {\n-    \treturn IS_OS_WINDOWS;\n-    }\n-}\n+/*\r\n+ * Copyright 2012 The Netty Project\r\n+ *\r\n+ * The Netty Project licenses this file to you under the Apache License,\r\n+ * version 2.0 (the \"License\"); you may not use this file except in compliance\r\n+ * with the License. You may obtain a copy of the License at:\r\n+ *\r\n+ *   http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\r\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\r\n+ * License for the specific language governing permissions and limitations\r\n+ * under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.timer;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.HashSet;\r\n+import java.util.Locale;\r\n+import java.util.Queue;\r\n+import java.util.Set;\r\n+import java.util.concurrent.CountDownLatch;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.LinkedBlockingQueue;\r\n+import java.util.concurrent.RejectedExecutionException;\r\n+import java.util.concurrent.ThreadFactory;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+import java.util.concurrent.atomic.AtomicInteger;\r\n+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;\r\n+import java.util.concurrent.atomic.AtomicLong;\r\n+\r\n+/**\r\n+ * A {@link Timer} optimized for approximated I/O timeout scheduling.\r\n+ *\r\n+ * <h3>Tick Duration</h3>\r\n+ * <p>\r\n+ * As described with 'approximated', this timer does not execute the scheduled\r\n+ * {@link TimerTask} on time.  {@link HashedWheelTimer}, on every tick, will\r\n+ * check if there are any {@link TimerTask}s behind the schedule and execute\r\n+ * them.\r\n+ * <p>\r\n+ * You can increase or decrease the accuracy of the execution timing by\r\n+ * specifying smaller or larger tick duration in the constructor.  In most\r\n+ * network applications, I/O timeout does not need to be accurate.  Therefore,\r\n+ * the default tick duration is 100 milliseconds and you will not need to try\r\n+ * different configurations in most cases.\r\n+ *\r\n+ * <h3>Ticks per Wheel (Wheel Size)</h3>\r\n+ * <p>\r\n+ * {@link HashedWheelTimer} maintains a data structure called 'wheel'.\r\n+ * To put simply, a wheel is a hash table of {@link TimerTask}s whose hash\r\n+ * function is 'dead line of the task'.  The default number of ticks per wheel\r\n+ * (i.e. the size of the wheel) is 512.  You could specify a larger value\r\n+ * if you are going to schedule a lot of timeouts.\r\n+ *\r\n+ * <h3>Do not create many instances.</h3>\r\n+ * <p>\r\n+ * {@link HashedWheelTimer} creates a new thread whenever it is instantiated and\r\n+ * started.  Therefore, you should make sure to create only one instance and\r\n+ * share it across your application.  One of the common mistakes, that makes\r\n+ * your application unresponsive, is to create a new instance for every connection.\r\n+ *\r\n+ * <h3>Implementation Details</h3>\r\n+ * <p>\r\n+ * {@link HashedWheelTimer} is based on\r\n+ * <a href=\"http://cseweb.ucsd.edu/users/varghese/\">George Varghese</a> and\r\n+ * Tony Lauck's paper,\r\n+ * <a href=\"http://cseweb.ucsd.edu/users/varghese/PAPERS/twheel.ps.Z\">'Hashed\r\n+ * and Hierarchical Timing Wheels: data structures to efficiently implement a\r\n+ * timer facility'</a>.  More comprehensive slides are located\r\n+ * <a href=\"http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt\">here</a>.\r\n+ */\r\n+public class HashedWheelTimer implements Timer {\r\n+\r\n+    /**\r\n+     * may be in spi?\r\n+     */\r\n+    public static final String NAME = \"hased\";\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(HashedWheelTimer.class);\r\n+\r\n+    private static final AtomicInteger INSTANCE_COUNTER = new AtomicInteger();\r\n+    private static final AtomicBoolean WARNED_TOO_MANY_INSTANCES = new AtomicBoolean();\r\n+    private static final int INSTANCE_COUNT_LIMIT = 64;\r\n+    private static final AtomicIntegerFieldUpdater<HashedWheelTimer> WORKER_STATE_UPDATER =\r\n+            AtomicIntegerFieldUpdater.newUpdater(HashedWheelTimer.class, \"workerState\");\r\n+\r\n+    private final Worker worker = new Worker();\r\n+    private final Thread workerThread;\r\n+\r\n+    private static final int WORKER_STATE_INIT = 0;\r\n+    private static final int WORKER_STATE_STARTED = 1;\r\n+    private static final int WORKER_STATE_SHUTDOWN = 2;\r\n+\r\n+    /**\r\n+     * 0 - init, 1 - started, 2 - shut down\r\n+     */\r\n+    @SuppressWarnings({\"unused\", \"FieldMayBeFinal\"})\r\n+    private volatile int workerState;\r\n+\r\n+    private final long tickDuration;\r\n+    private final HashedWheelBucket[] wheel;\r\n+    private final int mask;\r\n+    private final CountDownLatch startTimeInitialized = new CountDownLatch(1);\r\n+    private final Queue<HashedWheelTimeout> timeouts = new LinkedBlockingQueue<>();\r\n+    private final Queue<HashedWheelTimeout> cancelledTimeouts = new LinkedBlockingQueue<>();\r\n+    private final AtomicLong pendingTimeouts = new AtomicLong(0);\r\n+    private final long maxPendingTimeouts;\r\n+\r\n+    private volatile long startTime;\r\n+\r\n+    /**\r\n+     * Creates a new timer with the default thread factory\r\n+     * ({@link Executors#defaultThreadFactory()}), default tick duration, and\r\n+     * default number of ticks per wheel.\r\n+     */\r\n+    public HashedWheelTimer() {\r\n+        this(Executors.defaultThreadFactory());\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new timer with the default thread factory\r\n+     * ({@link Executors#defaultThreadFactory()}) and default number of ticks\r\n+     * per wheel.\r\n+     *\r\n+     * @param tickDuration the duration between tick\r\n+     * @param unit         the time unit of the {@code tickDuration}\r\n+     * @throws NullPointerException     if {@code unit} is {@code null}\r\n+     * @throws IllegalArgumentException if {@code tickDuration} is &lt;= 0\r\n+     */\r\n+    public HashedWheelTimer(long tickDuration, TimeUnit unit) {\r\n+        this(Executors.defaultThreadFactory(), tickDuration, unit);\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new timer with the default thread factory\r\n+     * ({@link Executors#defaultThreadFactory()}).\r\n+     *\r\n+     * @param tickDuration  the duration between tick\r\n+     * @param unit          the time unit of the {@code tickDuration}\r\n+     * @param ticksPerWheel the size of the wheel\r\n+     * @throws NullPointerException     if {@code unit} is {@code null}\r\n+     * @throws IllegalArgumentException if either of {@code tickDuration} and {@code ticksPerWheel} is &lt;= 0\r\n+     */\r\n+    public HashedWheelTimer(long tickDuration, TimeUnit unit, int ticksPerWheel) {\r\n+        this(Executors.defaultThreadFactory(), tickDuration, unit, ticksPerWheel);\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new timer with the default tick duration and default number of\r\n+     * ticks per wheel.\r\n+     *\r\n+     * @param threadFactory a {@link ThreadFactory} that creates a\r\n+     *                      background {@link Thread} which is dedicated to\r\n+     *                      {@link TimerTask} execution.\r\n+     * @throws NullPointerException if {@code threadFactory} is {@code null}\r\n+     */\r\n+    public HashedWheelTimer(ThreadFactory threadFactory) {\r\n+        this(threadFactory, 100, TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new timer with the default number of ticks per wheel.\r\n+     *\r\n+     * @param threadFactory a {@link ThreadFactory} that creates a\r\n+     *                      background {@link Thread} which is dedicated to\r\n+     *                      {@link TimerTask} execution.\r\n+     * @param tickDuration  the duration between tick\r\n+     * @param unit          the time unit of the {@code tickDuration}\r\n+     * @throws NullPointerException     if either of {@code threadFactory} and {@code unit} is {@code null}\r\n+     * @throws IllegalArgumentException if {@code tickDuration} is &lt;= 0\r\n+     */\r\n+    public HashedWheelTimer(\r\n+            ThreadFactory threadFactory, long tickDuration, TimeUnit unit) {\r\n+        this(threadFactory, tickDuration, unit, 512);\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new timer.\r\n+     *\r\n+     * @param threadFactory a {@link ThreadFactory} that creates a\r\n+     *                      background {@link Thread} which is dedicated to\r\n+     *                      {@link TimerTask} execution.\r\n+     * @param tickDuration  the duration between tick\r\n+     * @param unit          the time unit of the {@code tickDuration}\r\n+     * @param ticksPerWheel the size of the wheel\r\n+     * @throws NullPointerException     if either of {@code threadFactory} and {@code unit} is {@code null}\r\n+     * @throws IllegalArgumentException if either of {@code tickDuration} and {@code ticksPerWheel} is &lt;= 0\r\n+     */\r\n+    public HashedWheelTimer(\r\n+            ThreadFactory threadFactory,\r\n+            long tickDuration, TimeUnit unit, int ticksPerWheel) {\r\n+        this(threadFactory, tickDuration, unit, ticksPerWheel, -1);\r\n+    }\r\n+\r\n+    /**\r\n+     * Creates a new timer.\r\n+     *\r\n+     * @param threadFactory      a {@link ThreadFactory} that creates a\r\n+     *                           background {@link Thread} which is dedicated to\r\n+     *                           {@link TimerTask} execution.\r\n+     * @param tickDuration       the duration between tick\r\n+     * @param unit               the time unit of the {@code tickDuration}\r\n+     * @param ticksPerWheel      the size of the wheel\r\n+     * @param maxPendingTimeouts The maximum number of pending timeouts after which call to\r\n+     *                           {@code newTimeout} will result in\r\n+     *                           {@link java.util.concurrent.RejectedExecutionException}\r\n+     *                           being thrown. No maximum pending timeouts limit is assumed if\r\n+     *                           this value is 0 or negative.\r\n+     * @throws NullPointerException     if either of {@code threadFactory} and {@code unit} is {@code null}\r\n+     * @throws IllegalArgumentException if either of {@code tickDuration} and {@code ticksPerWheel} is &lt;= 0\r\n+     */\r\n+    public HashedWheelTimer(\r\n+            ThreadFactory threadFactory,\r\n+            long tickDuration, TimeUnit unit, int ticksPerWheel,\r\n+            long maxPendingTimeouts) {\r\n+\r\n+        if (threadFactory == null) {\r\n+            throw new NullPointerException(\"threadFactory\");\r\n+        }\r\n+        if (unit == null) {\r\n+            throw new NullPointerException(\"unit\");\r\n+        }\r\n+        if (tickDuration <= 0) {\r\n+            throw new IllegalArgumentException(\"tickDuration must be greater than 0: \" + tickDuration);\r\n+        }\r\n+        if (ticksPerWheel <= 0) {\r\n+            throw new IllegalArgumentException(\"ticksPerWheel must be greater than 0: \" + ticksPerWheel);\r\n+        }\r\n+\r\n+        // Normalize ticksPerWheel to power of two and initialize the wheel.\r\n+        wheel = createWheel(ticksPerWheel);\r\n+        mask = wheel.length - 1;\r\n+\r\n+        // Convert tickDuration to nanos.\r\n+        this.tickDuration = unit.toNanos(tickDuration);\r\n+\r\n+        // Prevent overflow.\r\n+        if (this.tickDuration >= Long.MAX_VALUE / wheel.length) {\r\n+            throw new IllegalArgumentException(String.format(\r\n+                    \"tickDuration: %d (expected: 0 < tickDuration in nanos < %d\",\r\n+                    tickDuration, Long.MAX_VALUE / wheel.length));\r\n+        }\r\n+        workerThread = threadFactory.newThread(worker);\r\n+\r\n+        this.maxPendingTimeouts = maxPendingTimeouts;\r\n+\r\n+        if (INSTANCE_COUNTER.incrementAndGet() > INSTANCE_COUNT_LIMIT &&\r\n+                WARNED_TOO_MANY_INSTANCES.compareAndSet(false, true)) {\r\n+            reportTooManyInstances();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void finalize() throws Throwable {\r\n+        try {\r\n+            super.finalize();\r\n+        } finally {\r\n+            // This object is going to be GCed and it is assumed the ship has sailed to do a proper shutdown. If\r\n+            // we have not yet shutdown then we want to make sure we decrement the active instance count.\r\n+            if (WORKER_STATE_UPDATER.getAndSet(this, WORKER_STATE_SHUTDOWN) != WORKER_STATE_SHUTDOWN) {\r\n+                INSTANCE_COUNTER.decrementAndGet();\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private static HashedWheelBucket[] createWheel(int ticksPerWheel) {\r\n+        if (ticksPerWheel <= 0) {\r\n+            throw new IllegalArgumentException(\r\n+                    \"ticksPerWheel must be greater than 0: \" + ticksPerWheel);\r\n+        }\r\n+        if (ticksPerWheel > 1073741824) {\r\n+            throw new IllegalArgumentException(\r\n+                    \"ticksPerWheel may not be greater than 2^30: \" + ticksPerWheel);\r\n+        }\r\n+\r\n+        ticksPerWheel = normalizeTicksPerWheel(ticksPerWheel);\r\n+        HashedWheelBucket[] wheel = new HashedWheelBucket[ticksPerWheel];\r\n+        for (int i = 0; i < wheel.length; i++) {\r\n+            wheel[i] = new HashedWheelBucket();\r\n+        }\r\n+        return wheel;\r\n+    }\r\n+\r\n+    private static int normalizeTicksPerWheel(int ticksPerWheel) {\r\n+        int normalizedTicksPerWheel = ticksPerWheel - 1;\r\n+        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 1;\r\n+        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 2;\r\n+        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 4;\r\n+        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 8;\r\n+        normalizedTicksPerWheel |= normalizedTicksPerWheel >>> 16;\r\n+        return normalizedTicksPerWheel + 1;\r\n+    }\r\n+\r\n+    /**\r\n+     * Starts the background thread explicitly.  The background thread will\r\n+     * start automatically on demand even if you did not call this method.\r\n+     *\r\n+     * @throws IllegalStateException if this timer has been\r\n+     *                               {@linkplain #stop() stopped} already\r\n+     */\r\n+    public void start() {\r\n+        switch (WORKER_STATE_UPDATER.get(this)) {\r\n+            case WORKER_STATE_INIT:\r\n+                if (WORKER_STATE_UPDATER.compareAndSet(this, WORKER_STATE_INIT, WORKER_STATE_STARTED)) {\r\n+                    workerThread.start();\r\n+                }\r\n+                break;\r\n+            case WORKER_STATE_STARTED:\r\n+                break;\r\n+            case WORKER_STATE_SHUTDOWN:\r\n+                throw new IllegalStateException(\"cannot be started once stopped\");\r\n+            default:\r\n+                throw new Error(\"Invalid WorkerState\");\r\n+        }\r\n+\r\n+        // Wait until the startTime is initialized by the worker.\r\n+        while (startTime == 0) {\r\n+            try {\r\n+                startTimeInitialized.await();\r\n+            } catch (InterruptedException ignore) {\r\n+                // Ignore - it will be ready very soon.\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<Timeout> stop() {\r\n+        if (Thread.currentThread() == workerThread) {\r\n+            throw new IllegalStateException(\r\n+                    HashedWheelTimer.class.getSimpleName() +\r\n+                            \".stop() cannot be called from \" +\r\n+                            TimerTask.class.getSimpleName());\r\n+        }\r\n+\r\n+        if (!WORKER_STATE_UPDATER.compareAndSet(this, WORKER_STATE_STARTED, WORKER_STATE_SHUTDOWN)) {\r\n+            // workerState can be 0 or 2 at this moment - let it always be 2.\r\n+            if (WORKER_STATE_UPDATER.getAndSet(this, WORKER_STATE_SHUTDOWN) != WORKER_STATE_SHUTDOWN) {\r\n+                INSTANCE_COUNTER.decrementAndGet();\r\n+            }\r\n+\r\n+            return Collections.emptySet();\r\n+        }\r\n+\r\n+        try {\r\n+            boolean interrupted = false;\r\n+            while (workerThread.isAlive()) {\r\n+                workerThread.interrupt();\r\n+                try {\r\n+                    workerThread.join(100);\r\n+                } catch (InterruptedException ignored) {\r\n+                    interrupted = true;\r\n+                }\r\n+            }\r\n+\r\n+            if (interrupted) {\r\n+                Thread.currentThread().interrupt();\r\n+            }\r\n+        } finally {\r\n+            INSTANCE_COUNTER.decrementAndGet();\r\n+        }\r\n+        return worker.unprocessedTimeouts();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isStop() {\r\n+        return WORKER_STATE_SHUTDOWN == WORKER_STATE_UPDATER.get(this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Timeout newTimeout(TimerTask task, long delay, TimeUnit unit) {\r\n+        if (task == null) {\r\n+            throw new NullPointerException(\"task\");\r\n+        }\r\n+        if (unit == null) {\r\n+            throw new NullPointerException(\"unit\");\r\n+        }\r\n+\r\n+        long pendingTimeoutsCount = pendingTimeouts.incrementAndGet();\r\n+\r\n+        if (maxPendingTimeouts > 0 && pendingTimeoutsCount > maxPendingTimeouts) {\r\n+            pendingTimeouts.decrementAndGet();\r\n+            throw new RejectedExecutionException(\"Number of pending timeouts (\"\r\n+                    + pendingTimeoutsCount + \") is greater than or equal to maximum allowed pending \"\r\n+                    + \"timeouts (\" + maxPendingTimeouts + \")\");\r\n+        }\r\n+\r\n+        start();\r\n+\r\n+        // Add the timeout to the timeout queue which will be processed on the next tick.\r\n+        // During processing all the queued HashedWheelTimeouts will be added to the correct HashedWheelBucket.\r\n+        long deadline = System.nanoTime() + unit.toNanos(delay) - startTime;\r\n+\r\n+        // Guard against overflow.\r\n+        if (delay > 0 && deadline < 0) {\r\n+            deadline = Long.MAX_VALUE;\r\n+        }\r\n+        HashedWheelTimeout timeout = new HashedWheelTimeout(this, task, deadline);\r\n+        timeouts.add(timeout);\r\n+        return timeout;\r\n+    }\r\n+\r\n+    /**\r\n+     * Returns the number of pending timeouts of this {@link Timer}.\r\n+     */\r\n+    public long pendingTimeouts() {\r\n+        return pendingTimeouts.get();\r\n+    }\r\n+\r\n+    private static void reportTooManyInstances() {\r\n+        String resourceType = ClassUtils.simpleClassName(HashedWheelTimer.class);\r\n+        logger.error(\"You are creating too many \" + resourceType + \" instances. \" +\r\n+                resourceType + \" is a shared resource that must be reused across the JVM,\" +\r\n+                \"so that only a few instances are created.\");\r\n+    }\r\n+\r\n+    private final class Worker implements Runnable {\r\n+        private final Set<Timeout> unprocessedTimeouts = new HashSet<Timeout>();\r\n+\r\n+        private long tick;\r\n+\r\n+        @Override\r\n+        public void run() {\r\n+            // Initialize the startTime.\r\n+            startTime = System.nanoTime();\r\n+            if (startTime == 0) {\r\n+                // We use 0 as an indicator for the uninitialized value here, so make sure it's not 0 when initialized.\r\n+                startTime = 1;\r\n+            }\r\n+\r\n+            // Notify the other threads waiting for the initialization at start().\r\n+            startTimeInitialized.countDown();\r\n+\r\n+            do {\r\n+                final long deadline = waitForNextTick();\r\n+                if (deadline > 0) {\r\n+                    int idx = (int) (tick & mask);\r\n+                    processCancelledTasks();\r\n+                    HashedWheelBucket bucket =\r\n+                            wheel[idx];\r\n+                    transferTimeoutsToBuckets();\r\n+                    bucket.expireTimeouts(deadline);\r\n+                    tick++;\r\n+                }\r\n+            } while (WORKER_STATE_UPDATER.get(HashedWheelTimer.this) == WORKER_STATE_STARTED);\r\n+\r\n+            // Fill the unprocessedTimeouts so we can return them from stop() method.\r\n+            for (HashedWheelBucket bucket : wheel) {\r\n+                bucket.clearTimeouts(unprocessedTimeouts);\r\n+            }\r\n+            for (; ; ) {\r\n+                HashedWheelTimeout timeout = timeouts.poll();\r\n+                if (timeout == null) {\r\n+                    break;\r\n+                }\r\n+                if (!timeout.isCancelled()) {\r\n+                    unprocessedTimeouts.add(timeout);\r\n+                }\r\n+            }\r\n+            processCancelledTasks();\r\n+        }\r\n+\r\n+        private void transferTimeoutsToBuckets() {\r\n+            // transfer only max. 100000 timeouts per tick to prevent a thread to stale the workerThread when it just\r\n+            // adds new timeouts in a loop.\r\n+            for (int i = 0; i < 100000; i++) {\r\n+                HashedWheelTimeout timeout = timeouts.poll();\r\n+                if (timeout == null) {\r\n+                    // all processed\r\n+                    break;\r\n+                }\r\n+                if (timeout.state() == HashedWheelTimeout.ST_CANCELLED) {\r\n+                    // Was cancelled in the meantime.\r\n+                    continue;\r\n+                }\r\n+\r\n+                long calculated = timeout.deadline / tickDuration;\r\n+                timeout.remainingRounds = (calculated - tick) / wheel.length;\r\n+\r\n+                // Ensure we don't schedule for past.\r\n+                final long ticks = Math.max(calculated, tick);\r\n+                int stopIndex = (int) (ticks & mask);\r\n+\r\n+                HashedWheelBucket bucket = wheel[stopIndex];\r\n+                bucket.addTimeout(timeout);\r\n+            }\r\n+        }\r\n+\r\n+        private void processCancelledTasks() {\r\n+            for (; ; ) {\r\n+                HashedWheelTimeout timeout = cancelledTimeouts.poll();\r\n+                if (timeout == null) {\r\n+                    // all processed\r\n+                    break;\r\n+                }\r\n+                try {\r\n+                    timeout.remove();\r\n+                } catch (Throwable t) {\r\n+                    if (logger.isWarnEnabled()) {\r\n+                        logger.warn(\"An exception was thrown while process a cancellation task\", t);\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        /**\r\n+         * calculate goal nanoTime from startTime and current tick number,\r\n+         * then wait until that goal has been reached.\r\n+         *\r\n+         * @return Long.MIN_VALUE if received a shutdown request,\r\n+         * current time otherwise (with Long.MIN_VALUE changed by +1)\r\n+         */\r\n+        private long waitForNextTick() {\r\n+            long deadline = tickDuration * (tick + 1);\r\n+\r\n+            for (; ; ) {\r\n+                final long currentTime = System.nanoTime() - startTime;\r\n+                long sleepTimeMs = (deadline - currentTime + 999999) / 1000000;\r\n+\r\n+                if (sleepTimeMs <= 0) {\r\n+                    if (currentTime == Long.MIN_VALUE) {\r\n+                        return -Long.MAX_VALUE;\r\n+                    } else {\r\n+                        return currentTime;\r\n+                    }\r\n+                }\r\n+                if (isWindows()) {\r\n+                    sleepTimeMs = sleepTimeMs / 10 * 10;\r\n+                }\r\n+\r\n+                try {\r\n+                    Thread.sleep(sleepTimeMs);\r\n+                } catch (InterruptedException ignored) {\r\n+                    if (WORKER_STATE_UPDATER.get(HashedWheelTimer.this) == WORKER_STATE_SHUTDOWN) {\r\n+                        return Long.MIN_VALUE;\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        Set<Timeout> unprocessedTimeouts() {\r\n+            return Collections.unmodifiableSet(unprocessedTimeouts);\r\n+        }\r\n+    }\r\n+\r\n+    private static final class HashedWheelTimeout implements Timeout {\r\n+\r\n+        private static final int ST_INIT = 0;\r\n+        private static final int ST_CANCELLED = 1;\r\n+        private static final int ST_EXPIRED = 2;\r\n+        private static final AtomicIntegerFieldUpdater<HashedWheelTimeout> STATE_UPDATER =\r\n+                AtomicIntegerFieldUpdater.newUpdater(HashedWheelTimeout.class, \"state\");\r\n+\r\n+        private final HashedWheelTimer timer;\r\n+        private final TimerTask task;\r\n+        private final long deadline;\r\n+\r\n+        @SuppressWarnings({\"unused\", \"FieldMayBeFinal\", \"RedundantFieldInitialization\"})\r\n+        private volatile int state = ST_INIT;\r\n+\r\n+        /**\r\n+         * RemainingRounds will be calculated and set by Worker.transferTimeoutsToBuckets() before the\r\n+         * HashedWheelTimeout will be added to the correct HashedWheelBucket.\r\n+         */\r\n+        long remainingRounds;\r\n+\r\n+        /**\r\n+         * This will be used to chain timeouts in HashedWheelTimerBucket via a double-linked-list.\r\n+         * As only the workerThread will act on it there is no need for synchronization / volatile.\r\n+         */\r\n+        HashedWheelTimeout next;\r\n+        HashedWheelTimeout prev;\r\n+\r\n+        /**\r\n+         * The bucket to which the timeout was added\r\n+         */\r\n+        HashedWheelBucket bucket;\r\n+\r\n+        HashedWheelTimeout(HashedWheelTimer timer, TimerTask task, long deadline) {\r\n+            this.timer = timer;\r\n+            this.task = task;\r\n+            this.deadline = deadline;\r\n+        }\r\n+\r\n+        @Override\r\n+        public Timer timer() {\r\n+            return timer;\r\n+        }\r\n+\r\n+        @Override\r\n+        public TimerTask task() {\r\n+            return task;\r\n+        }\r\n+\r\n+        @Override\r\n+        public boolean cancel() {\r\n+            // only update the state it will be removed from HashedWheelBucket on next tick.\r\n+            if (!compareAndSetState(ST_INIT, ST_CANCELLED)) {\r\n+                return false;\r\n+            }\r\n+            // If a task should be canceled we put this to another queue which will be processed on each tick.\r\n+            // So this means that we will have a GC latency of max. 1 tick duration which is good enough. This way\r\n+            // we can make again use of our MpscLinkedQueue and so minimize the locking / overhead as much as possible.\r\n+            timer.cancelledTimeouts.add(this);\r\n+            return true;\r\n+        }\r\n+\r\n+        void remove() {\r\n+            HashedWheelBucket bucket = this.bucket;\r\n+            if (bucket != null) {\r\n+                bucket.remove(this);\r\n+            } else {\r\n+                timer.pendingTimeouts.decrementAndGet();\r\n+            }\r\n+        }\r\n+\r\n+        public boolean compareAndSetState(int expected, int state) {\r\n+            return STATE_UPDATER.compareAndSet(this, expected, state);\r\n+        }\r\n+\r\n+        public int state() {\r\n+            return state;\r\n+        }\r\n+\r\n+        @Override\r\n+        public boolean isCancelled() {\r\n+            return state() == ST_CANCELLED;\r\n+        }\r\n+\r\n+        @Override\r\n+        public boolean isExpired() {\r\n+            return state() == ST_EXPIRED;\r\n+        }\r\n+\r\n+        public void expire() {\r\n+            if (!compareAndSetState(ST_INIT, ST_EXPIRED)) {\r\n+                return;\r\n+            }\r\n+\r\n+            try {\r\n+                task.run(this);\r\n+            } catch (Throwable t) {\r\n+                if (logger.isWarnEnabled()) {\r\n+                    logger.warn(\"An exception was thrown by \" + TimerTask.class.getSimpleName() + '.', t);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        @Override\r\n+        public String toString() {\r\n+            final long currentTime = System.nanoTime();\r\n+            long remaining = deadline - currentTime + timer.startTime;\r\n+            String simpleClassName = ClassUtils.simpleClassName(this.getClass());\r\n+\r\n+            StringBuilder buf = new StringBuilder(192)\r\n+                    .append(simpleClassName)\r\n+                    .append('(')\r\n+                    .append(\"deadline: \");\r\n+            if (remaining > 0) {\r\n+                buf.append(remaining)\r\n+                        .append(\" ns later\");\r\n+            } else if (remaining < 0) {\r\n+                buf.append(-remaining)\r\n+                        .append(\" ns ago\");\r\n+            } else {\r\n+                buf.append(\"now\");\r\n+            }\r\n+\r\n+            if (isCancelled()) {\r\n+                buf.append(\", cancelled\");\r\n+            }\r\n+\r\n+            return buf.append(\", task: \")\r\n+                    .append(task())\r\n+                    .append(')')\r\n+                    .toString();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Bucket that stores HashedWheelTimeouts. These are stored in a linked-list like datastructure to allow easy\r\n+     * removal of HashedWheelTimeouts in the middle. Also the HashedWheelTimeout act as nodes themself and so no\r\n+     * extra object creation is needed.\r\n+     */\r\n+    private static final class HashedWheelBucket {\r\n+\r\n+        /**\r\n+         * Used for the linked-list datastructure\r\n+         */\r\n+        private HashedWheelTimeout head;\r\n+        private HashedWheelTimeout tail;\r\n+\r\n+        /**\r\n+         * Add {@link HashedWheelTimeout} to this bucket.\r\n+         */\r\n+        void addTimeout(HashedWheelTimeout timeout) {\r\n+            assert timeout.bucket == null;\r\n+            timeout.bucket = this;\r\n+            if (head == null) {\r\n+                head = tail = timeout;\r\n+            } else {\r\n+                tail.next = timeout;\r\n+                timeout.prev = tail;\r\n+                tail = timeout;\r\n+            }\r\n+        }\r\n+\r\n+        /**\r\n+         * Expire all {@link HashedWheelTimeout}s for the given {@code deadline}.\r\n+         */\r\n+        void expireTimeouts(long deadline) {\r\n+            HashedWheelTimeout timeout = head;\r\n+\r\n+            // process all timeouts\r\n+            while (timeout != null) {\r\n+                HashedWheelTimeout next = timeout.next;\r\n+                if (timeout.remainingRounds <= 0) {\r\n+                    next = remove(timeout);\r\n+                    if (timeout.deadline <= deadline) {\r\n+                        timeout.expire();\r\n+                    } else {\r\n+                        // The timeout was placed into a wrong slot. This should never happen.\r\n+                        throw new IllegalStateException(String.format(\r\n+                                \"timeout.deadline (%d) > deadline (%d)\", timeout.deadline, deadline));\r\n+                    }\r\n+                } else if (timeout.isCancelled()) {\r\n+                    next = remove(timeout);\r\n+                } else {\r\n+                    timeout.remainingRounds--;\r\n+                }\r\n+                timeout = next;\r\n+            }\r\n+        }\r\n+\r\n+        public HashedWheelTimeout remove(HashedWheelTimeout timeout) {\r\n+            HashedWheelTimeout next = timeout.next;\r\n+            // remove timeout that was either processed or cancelled by updating the linked-list\r\n+            if (timeout.prev != null) {\r\n+                timeout.prev.next = next;\r\n+            }\r\n+            if (timeout.next != null) {\r\n+                timeout.next.prev = timeout.prev;\r\n+            }\r\n+\r\n+            if (timeout == head) {\r\n+                // if timeout is also the tail we need to adjust the entry too\r\n+                if (timeout == tail) {\r\n+                    tail = null;\r\n+                    head = null;\r\n+                } else {\r\n+                    head = next;\r\n+                }\r\n+            } else if (timeout == tail) {\r\n+                // if the timeout is the tail modify the tail to be the prev node.\r\n+                tail = timeout.prev;\r\n+            }\r\n+            // null out prev, next and bucket to allow for GC.\r\n+            timeout.prev = null;\r\n+            timeout.next = null;\r\n+            timeout.bucket = null;\r\n+            timeout.timer.pendingTimeouts.decrementAndGet();\r\n+            return next;\r\n+        }\r\n+\r\n+        /**\r\n+         * Clear this bucket and return all not expired / cancelled {@link Timeout}s.\r\n+         */\r\n+        void clearTimeouts(Set<Timeout> set) {\r\n+            for (; ; ) {\r\n+                HashedWheelTimeout timeout = pollTimeout();\r\n+                if (timeout == null) {\r\n+                    return;\r\n+                }\r\n+                if (timeout.isExpired() || timeout.isCancelled()) {\r\n+                    continue;\r\n+                }\r\n+                set.add(timeout);\r\n+            }\r\n+        }\r\n+\r\n+        private HashedWheelTimeout pollTimeout() {\r\n+            HashedWheelTimeout head = this.head;\r\n+            if (head == null) {\r\n+                return null;\r\n+            }\r\n+            HashedWheelTimeout next = head.next;\r\n+            if (next == null) {\r\n+                tail = this.head = null;\r\n+            } else {\r\n+                this.head = next;\r\n+                next.prev = null;\r\n+            }\r\n+\r\n+            // null out prev and next to allow for GC.\r\n+            head.next = null;\r\n+            head.prev = null;\r\n+            head.bucket = null;\r\n+            return head;\r\n+        }\r\n+    }\r\n+    \r\n+    private static final boolean IS_OS_WINDOWS = System.getProperty(\"os.name\", \"\").toLowerCase(Locale.US).contains(\"win\");\r\n+    \r\n+    private boolean isWindows() {\r\n+    \treturn IS_OS_WINDOWS;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/AnnotationUtils.java", "source2": "org/apache/dubbo/common/utils/AnnotationUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,482 +1,482 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.annotation.Annotation;\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.Target;\n-import java.lang.reflect.AnnotatedElement;\n-import java.lang.reflect.Method;\n-import java.util.Collection;\n-import java.util.Collections;\n-import java.util.LinkedHashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.function.Predicate;\n-\n-import static java.util.Arrays.asList;\n-import static java.util.Collections.emptyList;\n-import static java.util.Collections.unmodifiableList;\n-import static org.apache.dubbo.common.function.Predicates.and;\n-import static org.apache.dubbo.common.function.Streams.filterAll;\n-import static org.apache.dubbo.common.function.Streams.filterFirst;\n-import static org.apache.dubbo.common.utils.ClassUtils.getAllInheritedTypes;\n-import static org.apache.dubbo.common.utils.ClassUtils.resolveClass;\n-import static org.apache.dubbo.common.utils.CollectionUtils.first;\n-import static org.apache.dubbo.common.utils.MethodUtils.findMethod;\n-import static org.apache.dubbo.common.utils.MethodUtils.invokeMethod;\n-\n-/**\n- * Commons Annotation Utilities class\n- *\n- * @since 2.7.6\n- */\n-public interface AnnotationUtils {\n-\n-    /**\n-     * Resolve the annotation type by the annotated element and resolved class name\n-     *\n-     * @param annotatedElement    the annotated element\n-     * @param annotationClassName the class name of annotation\n-     * @param <A>                 the type of annotation\n-     * @return If resolved, return the type of annotation, or <code>null</code>\n-     */\n-    static <A extends Annotation> Class<A> resolveAnnotationType(AnnotatedElement annotatedElement,\n-                                                                 String annotationClassName) {\n-        ClassLoader classLoader = annotatedElement.getClass().getClassLoader();\n-        Class<?> annotationType = resolveClass(annotationClassName, classLoader);\n-        if (annotationType == null || !Annotation.class.isAssignableFrom(annotationType)) {\n-            return null;\n-        }\n-        return (Class<A>) annotationType;\n-    }\n-\n-    /**\n-     * Is the specified type a generic {@link Class type}\n-     *\n-     * @param annotatedElement the annotated element\n-     * @return if <code>annotatedElement</code> is the {@link Class}, return <code>true</code>, or <code>false</code>\n-     * @see ElementType#TYPE\n-     */\n-    static boolean isType(AnnotatedElement annotatedElement) {\n-        return annotatedElement instanceof Class;\n-    }\n-\n-    /**\n-     * Is the type of specified annotation same to the expected type?\n-     *\n-     * @param annotation     the specified {@link Annotation}\n-     * @param annotationType the expected annotation type\n-     * @return if same, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isSameType(Annotation annotation, Class<? extends Annotation> annotationType) {\n-        if (annotation == null || annotationType == null) {\n-            return false;\n-        }\n-        return Objects.equals(annotation.annotationType(), annotationType);\n-    }\n-\n-    /**\n-     * Build an instance of {@link Predicate} to excluded annotation type\n-     *\n-     * @param excludedAnnotationType excluded annotation type\n-     * @return non-null\n-     */\n-    static Predicate<Annotation> excludedType(Class<? extends Annotation> excludedAnnotationType) {\n-        return annotation -> !isSameType(annotation, excludedAnnotationType);\n-    }\n-\n-    /**\n-     * Get the attribute from the specified {@link Annotation annotation}\n-     *\n-     * @param annotation    the specified {@link Annotation annotation}\n-     * @param attributeName the attribute name\n-     * @param <T>           the type of attribute\n-     * @return the attribute value\n-     * @throws IllegalArgumentException If the attribute name can't be found\n-     */\n-    static <T> T getAttribute(Annotation annotation, String attributeName) throws IllegalArgumentException {\n-        return annotation == null ? null : invokeMethod(annotation, attributeName);\n-    }\n-\n-    /**\n-     * Get the \"value\" attribute from the specified {@link Annotation annotation}\n-     *\n-     * @param annotation the specified {@link Annotation annotation}\n-     * @param <T>        the type of attribute\n-     * @return the value of \"value\" attribute\n-     * @throws IllegalArgumentException If the attribute name can't be found\n-     */\n-    static <T> T getValue(Annotation annotation) throws IllegalArgumentException {\n-        return getAttribute(annotation, \"value\");\n-    }\n-\n-    /**\n-     * Get the {@link Annotation} from the specified {@link AnnotatedElement the annotated element} and\n-     * {@link Annotation annotation} class name\n-     *\n-     * @param annotatedElement    {@link AnnotatedElement}\n-     * @param annotationClassName the class name of annotation\n-     * @param <A>                 The type of {@link Annotation}\n-     * @return the {@link Annotation} if found\n-     * @throws ClassCastException If the {@link Annotation annotation} type that client requires can't match actual type\n-     */\n-    static <A extends Annotation> A getAnnotation(AnnotatedElement annotatedElement, String annotationClassName)\n-            throws ClassCastException {\n-        Class<? extends Annotation> annotationType = resolveAnnotationType(annotatedElement, annotationClassName);\n-        if (annotationType == null) {\n-            return null;\n-        }\n-        return (A) annotatedElement.getAnnotation(annotationType);\n-    }\n-\n-    /**\n-     * Get annotations that are <em>directly present</em> on this element.\n-     * This method ignores inherited annotations.\n-     *\n-     * @param annotatedElement    the annotated element\n-     * @param annotationsToFilter the annotations to filter\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<Annotation> getDeclaredAnnotations(AnnotatedElement annotatedElement,\n-                                                   Predicate<Annotation>... annotationsToFilter) {\n-        if (annotatedElement == null) {\n-            return emptyList();\n-        }\n-\n-        return unmodifiableList(filterAll(asList(annotatedElement.getDeclaredAnnotations()), annotationsToFilter));\n-    }\n-\n-    /**\n-     * Get all directly declared annotations of the the annotated element, not including\n-     * meta annotations.\n-     *\n-     * @param annotatedElement    the annotated element\n-     * @param annotationsToFilter the annotations to filter\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<Annotation> getAllDeclaredAnnotations(AnnotatedElement annotatedElement,\n-                                                      Predicate<Annotation>... annotationsToFilter) {\n-        if (isType(annotatedElement)) {\n-            return getAllDeclaredAnnotations((Class) annotatedElement, annotationsToFilter);\n-        } else {\n-            return getDeclaredAnnotations(annotatedElement, annotationsToFilter);\n-        }\n-    }\n-\n-    /**\n-     * Get all directly declared annotations of the specified type and its' all hierarchical types, not including\n-     * meta annotations.\n-     *\n-     * @param type                the specified type\n-     * @param annotationsToFilter the annotations to filter\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<Annotation> getAllDeclaredAnnotations(Class<?> type, Predicate<Annotation>... annotationsToFilter) {\n-\n-        if (type == null) {\n-            return emptyList();\n-        }\n-\n-        List<Annotation> allAnnotations = new LinkedList<>();\n-\n-        // All types\n-        Set<Class<?>> allTypes = new LinkedHashSet<>();\n-        // Add current type\n-        allTypes.add(type);\n-        // Add all inherited types\n-        allTypes.addAll(getAllInheritedTypes(type, t -> !Object.class.equals(t)));\n-\n-        for (Class<?> t : allTypes) {\n-            allAnnotations.addAll(getDeclaredAnnotations(t, annotationsToFilter));\n-        }\n-\n-        return unmodifiableList(allAnnotations);\n-    }\n-\n-\n-    /**\n-     * Get the meta-annotated {@link Annotation annotations} directly, excluding {@link Target}, {@link Retention}\n-     * and {@link Documented}\n-     *\n-     * @param annotationType          the {@link Annotation annotation} type\n-     * @param metaAnnotationsToFilter the meta annotations to filter\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<Annotation> getMetaAnnotations(Class<? extends Annotation> annotationType,\n-                                               Predicate<Annotation>... metaAnnotationsToFilter) {\n-        return getDeclaredAnnotations(annotationType,\n-                // Excludes the Java native annotation types or it causes the stack overflow, e.g,\n-                // @Target annotates itself\n-                excludedType(Target.class),\n-                excludedType(Retention.class),\n-                excludedType(Documented.class),\n-                // Add other predicates\n-                and(metaAnnotationsToFilter)\n-        );\n-    }\n-\n-    /**\n-     * Get all meta annotations from the specified {@link Annotation annotation} type\n-     *\n-     * @param annotationType      the {@link Annotation annotation} type\n-     * @param annotationsToFilter the annotations to filter\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<Annotation> getAllMetaAnnotations(Class<? extends Annotation> annotationType,\n-                                                  Predicate<Annotation>... annotationsToFilter) {\n-\n-        List<Annotation> allMetaAnnotations = new LinkedList<>();\n-\n-        List<Annotation> metaAnnotations = getMetaAnnotations(annotationType);\n-\n-        allMetaAnnotations.addAll(metaAnnotations);\n-\n-        for (Annotation metaAnnotation : metaAnnotations) {\n-            // Get the nested meta annotations recursively\n-            allMetaAnnotations.addAll(getAllMetaAnnotations(metaAnnotation.annotationType()));\n-        }\n-\n-        return unmodifiableList(filterAll(allMetaAnnotations, annotationsToFilter));\n-    }\n-\n-    /**\n-     * Find the annotation that is annotated on the specified element may be a meta-annotation\n-     *\n-     * @param annotatedElement    the annotated element\n-     * @param annotationClassName the class name of annotation\n-     * @param <A>                 the required type of annotation\n-     * @return If found, return first matched-type {@link Annotation annotation}, or <code>null</code>\n-     */\n-    static <A extends Annotation> A findAnnotation(AnnotatedElement annotatedElement, String annotationClassName) {\n-        return findAnnotation(annotatedElement, resolveAnnotationType(annotatedElement, annotationClassName));\n-    }\n-\n-    /**\n-     * Find the annotation that is annotated on the specified element may be a meta-annotation\n-     *\n-     * @param annotatedElement the annotated element\n-     * @param annotationType   the type of annotation\n-     * @param <A>              the required type of annotation\n-     * @return If found, return first matched-type {@link Annotation annotation}, or <code>null</code>\n-     */\n-    static <A extends Annotation> A findAnnotation(AnnotatedElement annotatedElement, Class<A> annotationType) {\n-        return (A) filterFirst(getAllDeclaredAnnotations(annotatedElement), a -> isSameType(a, annotationType));\n-    }\n-\n-    /**\n-     * Find the meta annotations from the the {@link Annotation annotation} type by meta annotation type\n-     *\n-     * @param annotationType     the {@link Annotation annotation} type\n-     * @param metaAnnotationType the meta annotation type\n-     * @param <A>                the type of required annotation\n-     * @return if found, return all matched results, or get an {@link Collections#emptyList() empty list}\n-     */\n-    static <A extends Annotation> List<A> findMetaAnnotations(Class<? extends Annotation> annotationType,\n-                                                              Class<A> metaAnnotationType) {\n-        return (List<A>) getAllMetaAnnotations(annotationType, a -> isSameType(a, metaAnnotationType));\n-    }\n-\n-    /**\n-     * Find the meta annotations from the the the annotated element by meta annotation type\n-     *\n-     * @param annotatedElement   the annotated element\n-     * @param metaAnnotationType the meta annotation type\n-     * @param <A>                the type of required annotation\n-     * @return if found, return all matched results, or get an {@link Collections#emptyList() empty list}\n-     */\n-    static <A extends Annotation> List<A> findMetaAnnotations(AnnotatedElement annotatedElement,\n-                                                              Class<A> metaAnnotationType) {\n-        List<A> metaAnnotations = new LinkedList<>();\n-\n-        for (Annotation annotation : getAllDeclaredAnnotations(annotatedElement)) {\n-            metaAnnotations.addAll(findMetaAnnotations(annotation.annotationType(), metaAnnotationType));\n-        }\n-\n-        return unmodifiableList(metaAnnotations);\n-    }\n-\n-    /**\n-     * Find the meta annotation from the annotated element by meta annotation type\n-     *\n-     * @param annotatedElement        the annotated element\n-     * @param metaAnnotationClassName the class name of meta annotation\n-     * @param <A>                     the type of required annotation\n-     * @return {@link #findMetaAnnotation(Class, Class)}\n-     */\n-    static <A extends Annotation> A findMetaAnnotation(AnnotatedElement annotatedElement,\n-                                                       String metaAnnotationClassName) {\n-        return findMetaAnnotation(annotatedElement, resolveAnnotationType(annotatedElement, metaAnnotationClassName));\n-    }\n-\n-    /**\n-     * Find the meta annotation from the annotation type by meta annotation type\n-     *\n-     * @param annotationType     the {@link Annotation annotation} type\n-     * @param metaAnnotationType the meta annotation type\n-     * @param <A>                the type of required annotation\n-     * @return If found, return the {@link CollectionUtils#first(Collection)} matched result, return <code>null</code>.\n-     * If it requires more result, please consider to use {@link #findMetaAnnotations(Class, Class)}\n-     * @see #findMetaAnnotations(Class, Class)\n-     */\n-    static <A extends Annotation> A findMetaAnnotation(Class<? extends Annotation> annotationType,\n-                                                       Class<A> metaAnnotationType) {\n-        return first(findMetaAnnotations(annotationType, metaAnnotationType));\n-    }\n-\n-    /**\n-     * Find the meta annotation from the annotated element by meta annotation type\n-     *\n-     * @param annotatedElement   the annotated element\n-     * @param metaAnnotationType the meta annotation type\n-     * @param <A>                the type of required annotation\n-     * @return If found, return the {@link CollectionUtils#first(Collection)} matched result, return <code>null</code>.\n-     * If it requires more result, please consider to use {@link #findMetaAnnotations(AnnotatedElement, Class)}\n-     * @see #findMetaAnnotations(AnnotatedElement, Class)\n-     */\n-    static <A extends Annotation> A findMetaAnnotation(AnnotatedElement annotatedElement, Class<A> metaAnnotationType) {\n-        return first(findMetaAnnotations(annotatedElement, metaAnnotationType));\n-    }\n-\n-    /**\n-     * Tests the annotated element is annotated the specified annotations or not\n-     *\n-     * @param type            the annotated type\n-     * @param matchAll        If <code>true</code>, checking all annotation types are present or not, or match any\n-     * @param annotationTypes the specified annotation types\n-     * @return If the specified annotation types are present, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isAnnotationPresent(Class<?> type,\n-                                       boolean matchAll,\n-                                       Class<? extends Annotation>... annotationTypes) {\n-\n-        int size = annotationTypes == null ? 0 : annotationTypes.length;\n-\n-        if (size < 1) {\n-            return false;\n-        }\n-\n-        int presentCount = 0;\n-\n-        for (int i = 0; i < size; i++) {\n-            Class<? extends Annotation> annotationType = annotationTypes[i];\n-            if (findAnnotation(type, annotationType) != null || findMetaAnnotation(type, annotationType) != null) {\n-                presentCount++;\n-            }\n-        }\n-\n-        return matchAll ? presentCount == size : presentCount > 0;\n-    }\n-\n-    /**\n-     * Tests the annotated element is annotated the specified annotation or not\n-     *\n-     * @param type           the annotated type\n-     * @param annotationType the class of annotation\n-     * @return If the specified annotation type is present, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isAnnotationPresent(Class<?> type, Class<? extends Annotation> annotationType) {\n-        return isAnnotationPresent(type, true, annotationType);\n-    }\n-\n-    /**\n-     * Tests the annotated element is present any specified annotation types\n-     *\n-     * @param annotatedElement    the annotated element\n-     * @param annotationClassName the class name of annotation\n-     * @return If any specified annotation types are present, return <code>true</code>\n-     */\n-    static boolean isAnnotationPresent(AnnotatedElement annotatedElement, String annotationClassName) {\n-        ClassLoader classLoader = annotatedElement.getClass().getClassLoader();\n-        Class<?> resolvedType = resolveClass(annotationClassName, classLoader);\n-        if (!Annotation.class.isAssignableFrom(resolvedType)) {\n-            return false;\n-        }\n-        return isAnnotationPresent(annotatedElement, (Class<? extends Annotation>) resolvedType);\n-    }\n-\n-    /**\n-     * Tests the annotated element is present any specified annotation types\n-     *\n-     * @param annotatedElement the annotated element\n-     * @param annotationType   the class of annotation\n-     * @return If any specified annotation types are present, return <code>true</code>\n-     */\n-    static boolean isAnnotationPresent(AnnotatedElement annotatedElement, Class<? extends Annotation> annotationType) {\n-        if (isType(annotatedElement)) {\n-            return isAnnotationPresent((Class) annotatedElement, annotationType);\n-        } else {\n-            return annotatedElement.isAnnotationPresent(annotationType) ||\n-                    findMetaAnnotation(annotatedElement, annotationType) != null; // to find meta-annotation\n-        }\n-    }\n-\n-    /**\n-     * Tests the annotated element is annotated all specified annotations or not\n-     *\n-     * @param type            the annotated type\n-     * @param annotationTypes the specified annotation types\n-     * @return If the specified annotation types are present, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isAllAnnotationPresent(Class<?> type, Class<? extends Annotation>... annotationTypes) {\n-        return isAnnotationPresent(type, true, annotationTypes);\n-    }\n-\n-    /**\n-     * Tests the annotated element is present any specified annotation types\n-     *\n-     * @param type            the annotated type\n-     * @param annotationTypes the specified annotation types\n-     * @return If any specified annotation types are present, return <code>true</code>\n-     */\n-    static boolean isAnyAnnotationPresent(Class<?> type,\n-                                          Class<? extends Annotation>... annotationTypes) {\n-        return isAnnotationPresent(type, false, annotationTypes);\n-    }\n-\n-\n-    /**\n-     * Get the default value of attribute on the specified annotation\n-     *\n-     * @param annotation    {@link Annotation} object\n-     * @param attributeName the name of attribute\n-     * @param <T>           the type of value\n-     * @return <code>null</code> if not found\n-     * @since 2.7.9\n-     */\n-    static <T> T getDefaultValue(Annotation annotation, String attributeName) {\n-        return getDefaultValue(annotation.annotationType(), attributeName);\n-    }\n-\n-    /**\n-     * Get the default value of attribute on the specified annotation\n-     *\n-     * @param annotationType the type of {@link Annotation}\n-     * @param attributeName  the name of attribute\n-     * @param <T>            the type of value\n-     * @return <code>null</code> if not found\n-     * @since 2.7.9\n-     */\n-    static <T> T getDefaultValue(Class<? extends Annotation> annotationType, String attributeName) {\n-        Method method = findMethod(annotationType, attributeName);\n-        return (T) (method == null ? null : method.getDefaultValue());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.annotation.Annotation;\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.Target;\r\n+import java.lang.reflect.AnnotatedElement;\r\n+import java.lang.reflect.Method;\r\n+import java.util.Collection;\r\n+import java.util.Collections;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.function.Predicate;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static java.util.Collections.emptyList;\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static org.apache.dubbo.common.function.Predicates.and;\r\n+import static org.apache.dubbo.common.function.Streams.filterAll;\r\n+import static org.apache.dubbo.common.function.Streams.filterFirst;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.getAllInheritedTypes;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.resolveClass;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.first;\r\n+import static org.apache.dubbo.common.utils.MethodUtils.findMethod;\r\n+import static org.apache.dubbo.common.utils.MethodUtils.invokeMethod;\r\n+\r\n+/**\r\n+ * Commons Annotation Utilities class\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public interface AnnotationUtils {\r\n+\r\n+    /**\r\n+     * Resolve the annotation type by the annotated element and resolved class name\r\n+     *\r\n+     * @param annotatedElement    the annotated element\r\n+     * @param annotationClassName the class name of annotation\r\n+     * @param <A>                 the type of annotation\r\n+     * @return If resolved, return the type of annotation, or <code>null</code>\r\n+     */\r\n+    static <A extends Annotation> Class<A> resolveAnnotationType(AnnotatedElement annotatedElement,\r\n+                                                                 String annotationClassName) {\r\n+        ClassLoader classLoader = annotatedElement.getClass().getClassLoader();\r\n+        Class<?> annotationType = resolveClass(annotationClassName, classLoader);\r\n+        if (annotationType == null || !Annotation.class.isAssignableFrom(annotationType)) {\r\n+            return null;\r\n+        }\r\n+        return (Class<A>) annotationType;\r\n+    }\r\n+\r\n+    /**\r\n+     * Is the specified type a generic {@link Class type}\r\n+     *\r\n+     * @param annotatedElement the annotated element\r\n+     * @return if <code>annotatedElement</code> is the {@link Class}, return <code>true</code>, or <code>false</code>\r\n+     * @see ElementType#TYPE\r\n+     */\r\n+    static boolean isType(AnnotatedElement annotatedElement) {\r\n+        return annotatedElement instanceof Class;\r\n+    }\r\n+\r\n+    /**\r\n+     * Is the type of specified annotation same to the expected type?\r\n+     *\r\n+     * @param annotation     the specified {@link Annotation}\r\n+     * @param annotationType the expected annotation type\r\n+     * @return if same, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isSameType(Annotation annotation, Class<? extends Annotation> annotationType) {\r\n+        if (annotation == null || annotationType == null) {\r\n+            return false;\r\n+        }\r\n+        return Objects.equals(annotation.annotationType(), annotationType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Build an instance of {@link Predicate} to excluded annotation type\r\n+     *\r\n+     * @param excludedAnnotationType excluded annotation type\r\n+     * @return non-null\r\n+     */\r\n+    static Predicate<Annotation> excludedType(Class<? extends Annotation> excludedAnnotationType) {\r\n+        return annotation -> !isSameType(annotation, excludedAnnotationType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the attribute from the specified {@link Annotation annotation}\r\n+     *\r\n+     * @param annotation    the specified {@link Annotation annotation}\r\n+     * @param attributeName the attribute name\r\n+     * @param <T>           the type of attribute\r\n+     * @return the attribute value\r\n+     * @throws IllegalArgumentException If the attribute name can't be found\r\n+     */\r\n+    static <T> T getAttribute(Annotation annotation, String attributeName) throws IllegalArgumentException {\r\n+        return annotation == null ? null : invokeMethod(annotation, attributeName);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the \"value\" attribute from the specified {@link Annotation annotation}\r\n+     *\r\n+     * @param annotation the specified {@link Annotation annotation}\r\n+     * @param <T>        the type of attribute\r\n+     * @return the value of \"value\" attribute\r\n+     * @throws IllegalArgumentException If the attribute name can't be found\r\n+     */\r\n+    static <T> T getValue(Annotation annotation) throws IllegalArgumentException {\r\n+        return getAttribute(annotation, \"value\");\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link Annotation} from the specified {@link AnnotatedElement the annotated element} and\r\n+     * {@link Annotation annotation} class name\r\n+     *\r\n+     * @param annotatedElement    {@link AnnotatedElement}\r\n+     * @param annotationClassName the class name of annotation\r\n+     * @param <A>                 The type of {@link Annotation}\r\n+     * @return the {@link Annotation} if found\r\n+     * @throws ClassCastException If the {@link Annotation annotation} type that client requires can't match actual type\r\n+     */\r\n+    static <A extends Annotation> A getAnnotation(AnnotatedElement annotatedElement, String annotationClassName)\r\n+            throws ClassCastException {\r\n+        Class<? extends Annotation> annotationType = resolveAnnotationType(annotatedElement, annotationClassName);\r\n+        if (annotationType == null) {\r\n+            return null;\r\n+        }\r\n+        return (A) annotatedElement.getAnnotation(annotationType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get annotations that are <em>directly present</em> on this element.\r\n+     * This method ignores inherited annotations.\r\n+     *\r\n+     * @param annotatedElement    the annotated element\r\n+     * @param annotationsToFilter the annotations to filter\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<Annotation> getDeclaredAnnotations(AnnotatedElement annotatedElement,\r\n+                                                   Predicate<Annotation>... annotationsToFilter) {\r\n+        if (annotatedElement == null) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        return unmodifiableList(filterAll(asList(annotatedElement.getDeclaredAnnotations()), annotationsToFilter));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all directly declared annotations of the the annotated element, not including\r\n+     * meta annotations.\r\n+     *\r\n+     * @param annotatedElement    the annotated element\r\n+     * @param annotationsToFilter the annotations to filter\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<Annotation> getAllDeclaredAnnotations(AnnotatedElement annotatedElement,\r\n+                                                      Predicate<Annotation>... annotationsToFilter) {\r\n+        if (isType(annotatedElement)) {\r\n+            return getAllDeclaredAnnotations((Class) annotatedElement, annotationsToFilter);\r\n+        } else {\r\n+            return getDeclaredAnnotations(annotatedElement, annotationsToFilter);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all directly declared annotations of the specified type and its' all hierarchical types, not including\r\n+     * meta annotations.\r\n+     *\r\n+     * @param type                the specified type\r\n+     * @param annotationsToFilter the annotations to filter\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<Annotation> getAllDeclaredAnnotations(Class<?> type, Predicate<Annotation>... annotationsToFilter) {\r\n+\r\n+        if (type == null) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        List<Annotation> allAnnotations = new LinkedList<>();\r\n+\r\n+        // All types\r\n+        Set<Class<?>> allTypes = new LinkedHashSet<>();\r\n+        // Add current type\r\n+        allTypes.add(type);\r\n+        // Add all inherited types\r\n+        allTypes.addAll(getAllInheritedTypes(type, t -> !Object.class.equals(t)));\r\n+\r\n+        for (Class<?> t : allTypes) {\r\n+            allAnnotations.addAll(getDeclaredAnnotations(t, annotationsToFilter));\r\n+        }\r\n+\r\n+        return unmodifiableList(allAnnotations);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Get the meta-annotated {@link Annotation annotations} directly, excluding {@link Target}, {@link Retention}\r\n+     * and {@link Documented}\r\n+     *\r\n+     * @param annotationType          the {@link Annotation annotation} type\r\n+     * @param metaAnnotationsToFilter the meta annotations to filter\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<Annotation> getMetaAnnotations(Class<? extends Annotation> annotationType,\r\n+                                               Predicate<Annotation>... metaAnnotationsToFilter) {\r\n+        return getDeclaredAnnotations(annotationType,\r\n+                // Excludes the Java native annotation types or it causes the stack overflow, e.g,\r\n+                // @Target annotates itself\r\n+                excludedType(Target.class),\r\n+                excludedType(Retention.class),\r\n+                excludedType(Documented.class),\r\n+                // Add other predicates\r\n+                and(metaAnnotationsToFilter)\r\n+        );\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all meta annotations from the specified {@link Annotation annotation} type\r\n+     *\r\n+     * @param annotationType      the {@link Annotation annotation} type\r\n+     * @param annotationsToFilter the annotations to filter\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<Annotation> getAllMetaAnnotations(Class<? extends Annotation> annotationType,\r\n+                                                  Predicate<Annotation>... annotationsToFilter) {\r\n+\r\n+        List<Annotation> allMetaAnnotations = new LinkedList<>();\r\n+\r\n+        List<Annotation> metaAnnotations = getMetaAnnotations(annotationType);\r\n+\r\n+        allMetaAnnotations.addAll(metaAnnotations);\r\n+\r\n+        for (Annotation metaAnnotation : metaAnnotations) {\r\n+            // Get the nested meta annotations recursively\r\n+            allMetaAnnotations.addAll(getAllMetaAnnotations(metaAnnotation.annotationType()));\r\n+        }\r\n+\r\n+        return unmodifiableList(filterAll(allMetaAnnotations, annotationsToFilter));\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the annotation that is annotated on the specified element may be a meta-annotation\r\n+     *\r\n+     * @param annotatedElement    the annotated element\r\n+     * @param annotationClassName the class name of annotation\r\n+     * @param <A>                 the required type of annotation\r\n+     * @return If found, return first matched-type {@link Annotation annotation}, or <code>null</code>\r\n+     */\r\n+    static <A extends Annotation> A findAnnotation(AnnotatedElement annotatedElement, String annotationClassName) {\r\n+        return findAnnotation(annotatedElement, resolveAnnotationType(annotatedElement, annotationClassName));\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the annotation that is annotated on the specified element may be a meta-annotation\r\n+     *\r\n+     * @param annotatedElement the annotated element\r\n+     * @param annotationType   the type of annotation\r\n+     * @param <A>              the required type of annotation\r\n+     * @return If found, return first matched-type {@link Annotation annotation}, or <code>null</code>\r\n+     */\r\n+    static <A extends Annotation> A findAnnotation(AnnotatedElement annotatedElement, Class<A> annotationType) {\r\n+        return (A) filterFirst(getAllDeclaredAnnotations(annotatedElement), a -> isSameType(a, annotationType));\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the meta annotations from the the {@link Annotation annotation} type by meta annotation type\r\n+     *\r\n+     * @param annotationType     the {@link Annotation annotation} type\r\n+     * @param metaAnnotationType the meta annotation type\r\n+     * @param <A>                the type of required annotation\r\n+     * @return if found, return all matched results, or get an {@link Collections#emptyList() empty list}\r\n+     */\r\n+    static <A extends Annotation> List<A> findMetaAnnotations(Class<? extends Annotation> annotationType,\r\n+                                                              Class<A> metaAnnotationType) {\r\n+        return (List<A>) getAllMetaAnnotations(annotationType, a -> isSameType(a, metaAnnotationType));\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the meta annotations from the the the annotated element by meta annotation type\r\n+     *\r\n+     * @param annotatedElement   the annotated element\r\n+     * @param metaAnnotationType the meta annotation type\r\n+     * @param <A>                the type of required annotation\r\n+     * @return if found, return all matched results, or get an {@link Collections#emptyList() empty list}\r\n+     */\r\n+    static <A extends Annotation> List<A> findMetaAnnotations(AnnotatedElement annotatedElement,\r\n+                                                              Class<A> metaAnnotationType) {\r\n+        List<A> metaAnnotations = new LinkedList<>();\r\n+\r\n+        for (Annotation annotation : getAllDeclaredAnnotations(annotatedElement)) {\r\n+            metaAnnotations.addAll(findMetaAnnotations(annotation.annotationType(), metaAnnotationType));\r\n+        }\r\n+\r\n+        return unmodifiableList(metaAnnotations);\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the meta annotation from the annotated element by meta annotation type\r\n+     *\r\n+     * @param annotatedElement        the annotated element\r\n+     * @param metaAnnotationClassName the class name of meta annotation\r\n+     * @param <A>                     the type of required annotation\r\n+     * @return {@link #findMetaAnnotation(Class, Class)}\r\n+     */\r\n+    static <A extends Annotation> A findMetaAnnotation(AnnotatedElement annotatedElement,\r\n+                                                       String metaAnnotationClassName) {\r\n+        return findMetaAnnotation(annotatedElement, resolveAnnotationType(annotatedElement, metaAnnotationClassName));\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the meta annotation from the annotation type by meta annotation type\r\n+     *\r\n+     * @param annotationType     the {@link Annotation annotation} type\r\n+     * @param metaAnnotationType the meta annotation type\r\n+     * @param <A>                the type of required annotation\r\n+     * @return If found, return the {@link CollectionUtils#first(Collection)} matched result, return <code>null</code>.\r\n+     * If it requires more result, please consider to use {@link #findMetaAnnotations(Class, Class)}\r\n+     * @see #findMetaAnnotations(Class, Class)\r\n+     */\r\n+    static <A extends Annotation> A findMetaAnnotation(Class<? extends Annotation> annotationType,\r\n+                                                       Class<A> metaAnnotationType) {\r\n+        return first(findMetaAnnotations(annotationType, metaAnnotationType));\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the meta annotation from the annotated element by meta annotation type\r\n+     *\r\n+     * @param annotatedElement   the annotated element\r\n+     * @param metaAnnotationType the meta annotation type\r\n+     * @param <A>                the type of required annotation\r\n+     * @return If found, return the {@link CollectionUtils#first(Collection)} matched result, return <code>null</code>.\r\n+     * If it requires more result, please consider to use {@link #findMetaAnnotations(AnnotatedElement, Class)}\r\n+     * @see #findMetaAnnotations(AnnotatedElement, Class)\r\n+     */\r\n+    static <A extends Annotation> A findMetaAnnotation(AnnotatedElement annotatedElement, Class<A> metaAnnotationType) {\r\n+        return first(findMetaAnnotations(annotatedElement, metaAnnotationType));\r\n+    }\r\n+\r\n+    /**\r\n+     * Tests the annotated element is annotated the specified annotations or not\r\n+     *\r\n+     * @param type            the annotated type\r\n+     * @param matchAll        If <code>true</code>, checking all annotation types are present or not, or match any\r\n+     * @param annotationTypes the specified annotation types\r\n+     * @return If the specified annotation types are present, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isAnnotationPresent(Class<?> type,\r\n+                                       boolean matchAll,\r\n+                                       Class<? extends Annotation>... annotationTypes) {\r\n+\r\n+        int size = annotationTypes == null ? 0 : annotationTypes.length;\r\n+\r\n+        if (size < 1) {\r\n+            return false;\r\n+        }\r\n+\r\n+        int presentCount = 0;\r\n+\r\n+        for (int i = 0; i < size; i++) {\r\n+            Class<? extends Annotation> annotationType = annotationTypes[i];\r\n+            if (findAnnotation(type, annotationType) != null || findMetaAnnotation(type, annotationType) != null) {\r\n+                presentCount++;\r\n+            }\r\n+        }\r\n+\r\n+        return matchAll ? presentCount == size : presentCount > 0;\r\n+    }\r\n+\r\n+    /**\r\n+     * Tests the annotated element is annotated the specified annotation or not\r\n+     *\r\n+     * @param type           the annotated type\r\n+     * @param annotationType the class of annotation\r\n+     * @return If the specified annotation type is present, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isAnnotationPresent(Class<?> type, Class<? extends Annotation> annotationType) {\r\n+        return isAnnotationPresent(type, true, annotationType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Tests the annotated element is present any specified annotation types\r\n+     *\r\n+     * @param annotatedElement    the annotated element\r\n+     * @param annotationClassName the class name of annotation\r\n+     * @return If any specified annotation types are present, return <code>true</code>\r\n+     */\r\n+    static boolean isAnnotationPresent(AnnotatedElement annotatedElement, String annotationClassName) {\r\n+        ClassLoader classLoader = annotatedElement.getClass().getClassLoader();\r\n+        Class<?> resolvedType = resolveClass(annotationClassName, classLoader);\r\n+        if (!Annotation.class.isAssignableFrom(resolvedType)) {\r\n+            return false;\r\n+        }\r\n+        return isAnnotationPresent(annotatedElement, (Class<? extends Annotation>) resolvedType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Tests the annotated element is present any specified annotation types\r\n+     *\r\n+     * @param annotatedElement the annotated element\r\n+     * @param annotationType   the class of annotation\r\n+     * @return If any specified annotation types are present, return <code>true</code>\r\n+     */\r\n+    static boolean isAnnotationPresent(AnnotatedElement annotatedElement, Class<? extends Annotation> annotationType) {\r\n+        if (isType(annotatedElement)) {\r\n+            return isAnnotationPresent((Class) annotatedElement, annotationType);\r\n+        } else {\r\n+            return annotatedElement.isAnnotationPresent(annotationType) ||\r\n+                    findMetaAnnotation(annotatedElement, annotationType) != null; // to find meta-annotation\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Tests the annotated element is annotated all specified annotations or not\r\n+     *\r\n+     * @param type            the annotated type\r\n+     * @param annotationTypes the specified annotation types\r\n+     * @return If the specified annotation types are present, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isAllAnnotationPresent(Class<?> type, Class<? extends Annotation>... annotationTypes) {\r\n+        return isAnnotationPresent(type, true, annotationTypes);\r\n+    }\r\n+\r\n+    /**\r\n+     * Tests the annotated element is present any specified annotation types\r\n+     *\r\n+     * @param type            the annotated type\r\n+     * @param annotationTypes the specified annotation types\r\n+     * @return If any specified annotation types are present, return <code>true</code>\r\n+     */\r\n+    static boolean isAnyAnnotationPresent(Class<?> type,\r\n+                                          Class<? extends Annotation>... annotationTypes) {\r\n+        return isAnnotationPresent(type, false, annotationTypes);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Get the default value of attribute on the specified annotation\r\n+     *\r\n+     * @param annotation    {@link Annotation} object\r\n+     * @param attributeName the name of attribute\r\n+     * @param <T>           the type of value\r\n+     * @return <code>null</code> if not found\r\n+     * @since 2.7.9\r\n+     */\r\n+    static <T> T getDefaultValue(Annotation annotation, String attributeName) {\r\n+        return getDefaultValue(annotation.annotationType(), attributeName);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the default value of attribute on the specified annotation\r\n+     *\r\n+     * @param annotationType the type of {@link Annotation}\r\n+     * @param attributeName  the name of attribute\r\n+     * @param <T>            the type of value\r\n+     * @return <code>null</code> if not found\r\n+     * @since 2.7.9\r\n+     */\r\n+    static <T> T getDefaultValue(Class<? extends Annotation> annotationType, String attributeName) {\r\n+        Method method = findMethod(annotationType, attributeName);\r\n+        return (T) (method == null ? null : method.getDefaultValue());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/ArrayUtils.java", "source2": "org/apache/dubbo/common/utils/ArrayUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,79 +1,79 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.common.utils;\n-\n-/**\n- * Contains some methods to check array.\n- */\n-public final class ArrayUtils {\n-\n-    private ArrayUtils() {\n-    }\n-\n-    /**\n-     * <p>Checks if the array is null or empty. <p/>\n-     *\n-     * @param array th array to check\n-     * @return {@code true} if the array is null or empty.\n-     */\n-    public static boolean isEmpty(final Object[] array) {\n-        return array == null || array.length == 0;\n-    }\n-\n-    /**\n-     * <p>Checks if the array is not null or empty. <p/>\n-     *\n-     * @param array th array to check\n-     * @return {@code true} if the array is not null or empty.\n-     */\n-    public static boolean isNotEmpty(final Object[] array) {\n-        return !isEmpty(array);\n-    }\n-\n-    public static boolean contains(final String[] array, String valueToFind) {\n-        return indexOf(array, valueToFind, 0) != -1;\n-    }\n-\n-    public static int indexOf(String[] array, String valueToFind, int startIndex) {\n-        if (!isEmpty(array) && valueToFind != null) {\n-            if (startIndex < 0) {\n-                startIndex = 0;\n-            }\n-\n-            for (int i = startIndex; i < array.length; ++i) {\n-                if (valueToFind.equals(array[i])) {\n-                    return i;\n-                }\n-            }\n-\n-        }\n-        return -1;\n-    }\n-\n-    /**\n-     * Convert from variable arguments to array\n-     *\n-     * @param values variable arguments\n-     * @param <T>    The class\n-     * @return array\n-     * @since 2.7.9\n-     */\n-    public static <T> T[] of(T... values) {\n-        return values;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+/**\r\n+ * Contains some methods to check array.\r\n+ */\r\n+public final class ArrayUtils {\r\n+\r\n+    private ArrayUtils() {\r\n+    }\r\n+\r\n+    /**\r\n+     * <p>Checks if the array is null or empty. <p/>\r\n+     *\r\n+     * @param array th array to check\r\n+     * @return {@code true} if the array is null or empty.\r\n+     */\r\n+    public static boolean isEmpty(final Object[] array) {\r\n+        return array == null || array.length == 0;\r\n+    }\r\n+\r\n+    /**\r\n+     * <p>Checks if the array is not null or empty. <p/>\r\n+     *\r\n+     * @param array th array to check\r\n+     * @return {@code true} if the array is not null or empty.\r\n+     */\r\n+    public static boolean isNotEmpty(final Object[] array) {\r\n+        return !isEmpty(array);\r\n+    }\r\n+\r\n+    public static boolean contains(final String[] array, String valueToFind) {\r\n+        return indexOf(array, valueToFind, 0) != -1;\r\n+    }\r\n+\r\n+    public static int indexOf(String[] array, String valueToFind, int startIndex) {\r\n+        if (!isEmpty(array) && valueToFind != null) {\r\n+            if (startIndex < 0) {\r\n+                startIndex = 0;\r\n+            }\r\n+\r\n+            for (int i = startIndex; i < array.length; ++i) {\r\n+                if (valueToFind.equals(array[i])) {\r\n+                    return i;\r\n+                }\r\n+            }\r\n+\r\n+        }\r\n+        return -1;\r\n+    }\r\n+\r\n+    /**\r\n+     * Convert from variable arguments to array\r\n+     *\r\n+     * @param values variable arguments\r\n+     * @param <T>    The class\r\n+     * @return array\r\n+     * @since 2.7.9\r\n+     */\r\n+    public static <T> T[] of(T... values) {\r\n+        return values;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/CharSequenceComparator.java", "source2": "org/apache/dubbo/common/utils/CharSequenceComparator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,37 +1,37 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.util.Comparator;\n-\n-/**\n- * The {@link Comparator} for {@link CharSequence}\n- *\n- * @since 2.7.6\n- */\n-public class CharSequenceComparator implements Comparator<CharSequence> {\n-\n-    public final static CharSequenceComparator INSTANCE = new CharSequenceComparator();\n-\n-    private CharSequenceComparator() {\n-    }\n-\n-    @Override\n-    public int compare(CharSequence c1, CharSequence c2) {\n-        return c1.toString().compareTo(c2.toString());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.util.Comparator;\r\n+\r\n+/**\r\n+ * The {@link Comparator} for {@link CharSequence}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class CharSequenceComparator implements Comparator<CharSequence> {\r\n+\r\n+    public final static CharSequenceComparator INSTANCE = new CharSequenceComparator();\r\n+\r\n+    private CharSequenceComparator() {\r\n+    }\r\n+\r\n+    @Override\r\n+    public int compare(CharSequence c1, CharSequence c2) {\r\n+        return c1.toString().compareTo(c2.toString());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/ClassHelper.java", "source2": "org/apache/dubbo/common/utils/ClassHelper.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,153 +1,153 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-\n-import java.lang.reflect.Method;\n-\n-/**\n- * @see org.apache.dubbo.common.utils.ClassUtils\n- * @deprecated Replace to <code>ClassUtils</code>\n- */\n-public class ClassHelper {\n-    public static Class<?> forNameWithThreadContextClassLoader(String name) throws ClassNotFoundException {\n-        return ClassUtils.forName(name, Thread.currentThread().getContextClassLoader());\n-    }\n-\n-    public static Class<?> forNameWithCallerClassLoader(String name, Class<?> caller) throws ClassNotFoundException {\n-        return ClassUtils.forName(name, caller.getClassLoader());\n-    }\n-\n-    public static ClassLoader getCallerClassLoader(Class<?> caller) {\n-        return caller.getClassLoader();\n-    }\n-\n-    /**\n-     * get class loader\n-     *\n-     * @param clazz\n-     * @return class loader\n-     */\n-    public static ClassLoader getClassLoader(Class<?> clazz) {\n-        return ClassUtils.getClassLoader(clazz);\n-    }\n-\n-    /**\n-     * Return the default ClassLoader to use: typically the thread context\n-     * ClassLoader, if available; the ClassLoader that loaded the ClassUtils\n-     * class will be used as fallback.\n-     * <p>\n-     * Call this method if you intend to use the thread context ClassLoader in a\n-     * scenario where you absolutely need a non-null ClassLoader reference: for\n-     * example, for class path resource loading (but not necessarily for\n-     * <code>Class.forName</code>, which accepts a <code>null</code> ClassLoader\n-     * reference as well).\n-     *\n-     * @return the default ClassLoader (never <code>null</code>)\n-     * @see java.lang.Thread#getContextClassLoader()\n-     */\n-    public static ClassLoader getClassLoader() {\n-        return getClassLoader(ClassHelper.class);\n-    }\n-\n-    /**\n-     * Same as <code>Class.forName()</code>, except that it works for primitive\n-     * types.\n-     */\n-    public static Class<?> forName(String name) throws ClassNotFoundException {\n-        return forName(name, getClassLoader());\n-    }\n-\n-    /**\n-     * Replacement for <code>Class.forName()</code> that also returns Class\n-     * instances for primitives (like \"int\") and array class names (like\n-     * \"String[]\").\n-     *\n-     * @param name        the name of the Class\n-     * @param classLoader the class loader to use (may be <code>null</code>,\n-     *                    which indicates the default class loader)\n-     * @return Class instance for the supplied name\n-     * @throws ClassNotFoundException if the class was not found\n-     * @throws LinkageError           if the class file could not be loaded\n-     * @see Class#forName(String, boolean, ClassLoader)\n-     */\n-    public static Class<?> forName(String name, ClassLoader classLoader)\n-            throws ClassNotFoundException, LinkageError {\n-        return ClassUtils.forName(name, classLoader);\n-    }\n-\n-    /**\n-     * Resolve the given class name as primitive class, if appropriate,\n-     * according to the JVM's naming rules for primitive classes.\n-     * <p>\n-     * Also supports the JVM's internal class names for primitive arrays. Does\n-     * <i>not</i> support the \"[]\" suffix notation for primitive arrays; this is\n-     * only supported by {@link #forName}.\n-     *\n-     * @param name the name of the potentially primitive class\n-     * @return the primitive class, or <code>null</code> if the name does not\n-     * denote a primitive class or primitive array class\n-     */\n-    public static Class<?> resolvePrimitiveClassName(String name) {\n-        return ClassUtils.resolvePrimitiveClassName(name);\n-    }\n-\n-    public static String toShortString(Object obj) {\n-        return ClassUtils.toShortString(obj);\n-\n-    }\n-\n-    public static String simpleClassName(Class<?> clazz) {\n-        return ClassUtils.simpleClassName(clazz);\n-    }\n-\n-    /**\n-     * @see org.apache.dubbo.common.utils.MethodUtils#isSetter(Method)\n-     * @deprecated Replace to <code>MethodUtils#isSetter(Method)</code>\n-     */\n-    public static boolean isSetter(Method method) {\n-        return MethodUtils.isSetter(method);\n-    }\n-\n-    /**\n-     * @see org.apache.dubbo.common.utils.MethodUtils#isGetter(Method) (Method)\n-     * @deprecated Replace to <code>MethodUtils#isGetter(Method)</code>\n-     */\n-    public static boolean isGetter(Method method) {\n-        return MethodUtils.isGetter(method);\n-    }\n-\n-    public static boolean isPrimitive(Class<?> type) {\n-        return ClassUtils.isPrimitive(type);\n-    }\n-\n-    public static Object convertPrimitive(Class<?> type, String value) {\n-        return ClassUtils.convertPrimitive(type,value);\n-    }\n-\n-\n-    /**\n-     * We only check boolean value at this moment.\n-     *\n-     * @param type\n-     * @param value\n-     * @return\n-     */\n-    public static boolean isTypeMatch(Class<?> type, String value) {\n-    return ClassUtils.isTypeMatch(type,value);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+\r\n+import java.lang.reflect.Method;\r\n+\r\n+/**\r\n+ * @see org.apache.dubbo.common.utils.ClassUtils\r\n+ * @deprecated Replace to <code>ClassUtils</code>\r\n+ */\r\n+public class ClassHelper {\r\n+    public static Class<?> forNameWithThreadContextClassLoader(String name) throws ClassNotFoundException {\r\n+        return ClassUtils.forName(name, Thread.currentThread().getContextClassLoader());\r\n+    }\r\n+\r\n+    public static Class<?> forNameWithCallerClassLoader(String name, Class<?> caller) throws ClassNotFoundException {\r\n+        return ClassUtils.forName(name, caller.getClassLoader());\r\n+    }\r\n+\r\n+    public static ClassLoader getCallerClassLoader(Class<?> caller) {\r\n+        return caller.getClassLoader();\r\n+    }\r\n+\r\n+    /**\r\n+     * get class loader\r\n+     *\r\n+     * @param clazz\r\n+     * @return class loader\r\n+     */\r\n+    public static ClassLoader getClassLoader(Class<?> clazz) {\r\n+        return ClassUtils.getClassLoader(clazz);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return the default ClassLoader to use: typically the thread context\r\n+     * ClassLoader, if available; the ClassLoader that loaded the ClassUtils\r\n+     * class will be used as fallback.\r\n+     * <p>\r\n+     * Call this method if you intend to use the thread context ClassLoader in a\r\n+     * scenario where you absolutely need a non-null ClassLoader reference: for\r\n+     * example, for class path resource loading (but not necessarily for\r\n+     * <code>Class.forName</code>, which accepts a <code>null</code> ClassLoader\r\n+     * reference as well).\r\n+     *\r\n+     * @return the default ClassLoader (never <code>null</code>)\r\n+     * @see java.lang.Thread#getContextClassLoader()\r\n+     */\r\n+    public static ClassLoader getClassLoader() {\r\n+        return getClassLoader(ClassHelper.class);\r\n+    }\r\n+\r\n+    /**\r\n+     * Same as <code>Class.forName()</code>, except that it works for primitive\r\n+     * types.\r\n+     */\r\n+    public static Class<?> forName(String name) throws ClassNotFoundException {\r\n+        return forName(name, getClassLoader());\r\n+    }\r\n+\r\n+    /**\r\n+     * Replacement for <code>Class.forName()</code> that also returns Class\r\n+     * instances for primitives (like \"int\") and array class names (like\r\n+     * \"String[]\").\r\n+     *\r\n+     * @param name        the name of the Class\r\n+     * @param classLoader the class loader to use (may be <code>null</code>,\r\n+     *                    which indicates the default class loader)\r\n+     * @return Class instance for the supplied name\r\n+     * @throws ClassNotFoundException if the class was not found\r\n+     * @throws LinkageError           if the class file could not be loaded\r\n+     * @see Class#forName(String, boolean, ClassLoader)\r\n+     */\r\n+    public static Class<?> forName(String name, ClassLoader classLoader)\r\n+            throws ClassNotFoundException, LinkageError {\r\n+        return ClassUtils.forName(name, classLoader);\r\n+    }\r\n+\r\n+    /**\r\n+     * Resolve the given class name as primitive class, if appropriate,\r\n+     * according to the JVM's naming rules for primitive classes.\r\n+     * <p>\r\n+     * Also supports the JVM's internal class names for primitive arrays. Does\r\n+     * <i>not</i> support the \"[]\" suffix notation for primitive arrays; this is\r\n+     * only supported by {@link #forName}.\r\n+     *\r\n+     * @param name the name of the potentially primitive class\r\n+     * @return the primitive class, or <code>null</code> if the name does not\r\n+     * denote a primitive class or primitive array class\r\n+     */\r\n+    public static Class<?> resolvePrimitiveClassName(String name) {\r\n+        return ClassUtils.resolvePrimitiveClassName(name);\r\n+    }\r\n+\r\n+    public static String toShortString(Object obj) {\r\n+        return ClassUtils.toShortString(obj);\r\n+\r\n+    }\r\n+\r\n+    public static String simpleClassName(Class<?> clazz) {\r\n+        return ClassUtils.simpleClassName(clazz);\r\n+    }\r\n+\r\n+    /**\r\n+     * @see org.apache.dubbo.common.utils.MethodUtils#isSetter(Method)\r\n+     * @deprecated Replace to <code>MethodUtils#isSetter(Method)</code>\r\n+     */\r\n+    public static boolean isSetter(Method method) {\r\n+        return MethodUtils.isSetter(method);\r\n+    }\r\n+\r\n+    /**\r\n+     * @see org.apache.dubbo.common.utils.MethodUtils#isGetter(Method) (Method)\r\n+     * @deprecated Replace to <code>MethodUtils#isGetter(Method)</code>\r\n+     */\r\n+    public static boolean isGetter(Method method) {\r\n+        return MethodUtils.isGetter(method);\r\n+    }\r\n+\r\n+    public static boolean isPrimitive(Class<?> type) {\r\n+        return ClassUtils.isPrimitive(type);\r\n+    }\r\n+\r\n+    public static Object convertPrimitive(Class<?> type, String value) {\r\n+        return ClassUtils.convertPrimitive(type,value);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * We only check boolean value at this moment.\r\n+     *\r\n+     * @param type\r\n+     * @param value\r\n+     * @return\r\n+     */\r\n+    public static boolean isTypeMatch(Class<?> type, String value) {\r\n+    return ClassUtils.isTypeMatch(type,value);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/ClassUtils.java", "source2": "org/apache/dubbo/common/utils/ClassUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,496 +1,496 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-\n-import java.lang.reflect.Array;\n-import java.math.BigDecimal;\n-import java.math.BigInteger;\n-import java.util.Arrays;\n-import java.util.Date;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.LinkedHashSet;\n-import java.util.LinkedList;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Queue;\n-import java.util.Set;\n-import java.util.function.Predicate;\n-\n-import static java.util.Collections.emptySet;\n-import static java.util.Collections.unmodifiableSet;\n-import static org.apache.dubbo.common.function.Streams.filterAll;\n-import static org.apache.dubbo.common.utils.ArrayUtils.isNotEmpty;\n-import static org.apache.dubbo.common.utils.CollectionUtils.ofSet;\n-\n-public class ClassUtils {\n-    /**\n-     * Suffix for array class names: \"[]\"\n-     */\n-    public static final String ARRAY_SUFFIX = \"[]\";\n-    /**\n-     * Simple Types including:\n-     * <ul>\n-     *     <li>{@link Void}</li>\n-     *     <li>{@link Boolean}</li>\n-     *     <li>{@link Character}</li>\n-     *     <li>{@link Byte}</li>\n-     *     <li>{@link Integer}</li>\n-     *     <li>{@link Float}</li>\n-     *     <li>{@link Double}</li>\n-     *     <li>{@link String}</li>\n-     *     <li>{@link BigDecimal}</li>\n-     *     <li>{@link BigInteger}</li>\n-     *     <li>{@link Date}</li>\n-     *     <li>{@link Object}</li>\n-     * </ul>\n-     *\n-     * @see javax.management.openmbean.SimpleType\n-     * @since 2.7.6\n-     */\n-    public static final Set<Class<?>> SIMPLE_TYPES = ofSet(\n-            Void.class,\n-            Boolean.class,\n-            Character.class,\n-            Byte.class,\n-            Short.class,\n-            Integer.class,\n-            Long.class,\n-            Float.class,\n-            Double.class,\n-            String.class,\n-            BigDecimal.class,\n-            BigInteger.class,\n-            Date.class,\n-            Object.class\n-    );\n-    /**\n-     * Prefix for internal array class names: \"[L\"\n-     */\n-    private static final String INTERNAL_ARRAY_PREFIX = \"[L\";\n-    /**\n-     * Map with primitive type name as key and corresponding primitive type as\n-     * value, for example: \"int\" -> \"int.class\".\n-     */\n-    private static final Map<String, Class<?>> PRIMITIVE_TYPE_NAME_MAP = new HashMap<String, Class<?>>(32);\n-    /**\n-     * Map with primitive wrapper type as key and corresponding primitive type\n-     * as value, for example: Integer.class -> int.class.\n-     */\n-    private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_TYPE_MAP = new HashMap<Class<?>, Class<?>>(16);\n-    private static final char PACKAGE_SEPARATOR_CHAR = '.';\n-\n-    static {\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Boolean.class, boolean.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Byte.class, byte.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Character.class, char.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Double.class, double.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Float.class, float.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Integer.class, int.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Long.class, long.class);\n-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Short.class, short.class);\n-\n-        Set<Class<?>> primitiveTypeNames = new HashSet<>(32);\n-        primitiveTypeNames.addAll(PRIMITIVE_WRAPPER_TYPE_MAP.values());\n-        primitiveTypeNames.addAll(Arrays\n-                .asList(boolean[].class, byte[].class, char[].class, double[].class,\n-                        float[].class, int[].class, long[].class, short[].class));\n-        for (Class<?> primitiveTypeName : primitiveTypeNames) {\n-            PRIMITIVE_TYPE_NAME_MAP.put(primitiveTypeName.getName(), primitiveTypeName);\n-        }\n-    }\n-\n-    public static Class<?> forNameWithThreadContextClassLoader(String name)\n-            throws ClassNotFoundException {\n-        return forName(name, Thread.currentThread().getContextClassLoader());\n-    }\n-\n-    public static Class<?> forNameWithCallerClassLoader(String name, Class<?> caller)\n-            throws ClassNotFoundException {\n-        return forName(name, caller.getClassLoader());\n-    }\n-\n-    public static ClassLoader getCallerClassLoader(Class<?> caller) {\n-        return caller.getClassLoader();\n-    }\n-\n-    /**\n-     * get class loader\n-     *\n-     * @param clazz\n-     * @return class loader\n-     */\n-    public static ClassLoader getClassLoader(Class<?> clazz) {\n-        ClassLoader cl = null;\n-        try {\n-            cl = Thread.currentThread().getContextClassLoader();\n-        } catch (Throwable ex) {\n-            // Cannot access thread context ClassLoader - falling back to system class loader...\n-        }\n-        if (cl == null) {\n-            // No thread context class loader -> use class loader of this class.\n-            cl = clazz.getClassLoader();\n-            if (cl == null) {\n-                // getClassLoader() returning null indicates the bootstrap ClassLoader\n-                try {\n-                    cl = ClassLoader.getSystemClassLoader();\n-                } catch (Throwable ex) {\n-                    // Cannot access system ClassLoader - oh well, maybe the caller can live with null...\n-                }\n-            }\n-        }\n-\n-        return cl;\n-    }\n-\n-    /**\n-     * Return the default ClassLoader to use: typically the thread context\n-     * ClassLoader, if available; the ClassLoader that loaded the ClassUtils\n-     * class will be used as fallback.\n-     * <p>\n-     * Call this method if you intend to use the thread context ClassLoader in a\n-     * scenario where you absolutely need a non-null ClassLoader reference: for\n-     * example, for class path resource loading (but not necessarily for\n-     * <code>Class.forName</code>, which accepts a <code>null</code> ClassLoader\n-     * reference as well).\n-     *\n-     * @return the default ClassLoader (never <code>null</code>)\n-     * @see java.lang.Thread#getContextClassLoader()\n-     */\n-    public static ClassLoader getClassLoader() {\n-        return getClassLoader(ClassUtils.class);\n-    }\n-\n-    /**\n-     * Same as <code>Class.forName()</code>, except that it works for primitive\n-     * types.\n-     */\n-    public static Class<?> forName(String name) throws ClassNotFoundException {\n-        return forName(name, getClassLoader());\n-    }\n-\n-    /**\n-     * Replacement for <code>Class.forName()</code> that also returns Class\n-     * instances for primitives (like \"int\") and array class names (like\n-     * \"String[]\").\n-     *\n-     * @param name        the name of the Class\n-     * @param classLoader the class loader to use (may be <code>null</code>,\n-     *                    which indicates the default class loader)\n-     * @return Class instance for the supplied name\n-     * @throws ClassNotFoundException if the class was not found\n-     * @throws LinkageError           if the class file could not be loaded\n-     * @see Class#forName(String, boolean, ClassLoader)\n-     */\n-    public static Class<?> forName(String name, ClassLoader classLoader)\n-            throws ClassNotFoundException, LinkageError {\n-\n-        Class<?> clazz = resolvePrimitiveClassName(name);\n-        if (clazz != null) {\n-            return clazz;\n-        }\n-\n-        // \"java.lang.String[]\" style arrays\n-        if (name.endsWith(ARRAY_SUFFIX)) {\n-            String elementClassName = name.substring(0, name.length() - ARRAY_SUFFIX.length());\n-            Class<?> elementClass = forName(elementClassName, classLoader);\n-            return Array.newInstance(elementClass, 0).getClass();\n-        }\n-\n-        // \"[Ljava.lang.String;\" style arrays\n-        int internalArrayMarker = name.indexOf(INTERNAL_ARRAY_PREFIX);\n-        if (internalArrayMarker != -1 && name.endsWith(\";\")) {\n-            String elementClassName = null;\n-            if (internalArrayMarker == 0) {\n-                elementClassName = name\n-                        .substring(INTERNAL_ARRAY_PREFIX.length(), name.length() - 1);\n-            } else if (name.startsWith(\"[\")) {\n-                elementClassName = name.substring(1);\n-            }\n-            Class<?> elementClass = forName(elementClassName, classLoader);\n-            return Array.newInstance(elementClass, 0).getClass();\n-        }\n-\n-        ClassLoader classLoaderToUse = classLoader;\n-        if (classLoaderToUse == null) {\n-            classLoaderToUse = getClassLoader();\n-        }\n-        return classLoaderToUse.loadClass(name);\n-    }\n-\n-    /**\n-     * Resolve the given class name as primitive class, if appropriate,\n-     * according to the JVM's naming rules for primitive classes.\n-     * <p>\n-     * Also supports the JVM's internal class names for primitive arrays. Does\n-     * <i>not</i> support the \"[]\" suffix notation for primitive arrays; this is\n-     * only supported by {@link #forName}.\n-     *\n-     * @param name the name of the potentially primitive class\n-     * @return the primitive class, or <code>null</code> if the name does not\n-     * denote a primitive class or primitive array class\n-     */\n-    public static Class<?> resolvePrimitiveClassName(String name) {\n-        Class<?> result = null;\n-        // Most class names will be quite long, considering that they\n-        // SHOULD sit in a package, so a length check is worthwhile.\n-        if (name != null && name.length() <= 8) {\n-            // Could be a primitive - likely.\n-            result = (Class<?>) PRIMITIVE_TYPE_NAME_MAP.get(name);\n-        }\n-        return result;\n-    }\n-\n-    public static String toShortString(Object obj) {\n-        if (obj == null) {\n-            return \"null\";\n-        }\n-        return obj.getClass().getSimpleName() + \"@\" + System.identityHashCode(obj);\n-\n-    }\n-\n-    public static String simpleClassName(Class<?> clazz) {\n-        if (clazz == null) {\n-            throw new NullPointerException(\"clazz\");\n-        }\n-        String className = clazz.getName();\n-        final int lastDotIdx = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR);\n-        if (lastDotIdx > -1) {\n-            return className.substring(lastDotIdx + 1);\n-        }\n-        return className;\n-    }\n-\n-\n-    /**\n-     * The specified type is primitive type or simple type\n-     *\n-     * @param type the type to test\n-     * @return\n-     * @deprecated as 2.7.6, use {@link Class#isPrimitive()} plus {@link #isSimpleType(Class)} instead\n-     */\n-    public static boolean isPrimitive(Class<?> type) {\n-        return type != null && (type.isPrimitive() || isSimpleType(type));\n-    }\n-\n-    /**\n-     * The specified type is simple type or not\n-     *\n-     * @param type the type to test\n-     * @return if <code>type</code> is one element of {@link #SIMPLE_TYPES}, return <code>true</code>, or <code>false</code>\n-     * @see #SIMPLE_TYPES\n-     * @since 2.7.6\n-     */\n-    public static boolean isSimpleType(Class<?> type) {\n-        return SIMPLE_TYPES.contains(type);\n-    }\n-\n-    public static Object convertPrimitive(Class<?> type, String value) {\n-        if (value == null) {\n-            return null;\n-        } else if (type == char.class || type == Character.class) {\n-            return value.length() > 0 ? value.charAt(0) : '\\0';\n-        } else if (type == boolean.class || type == Boolean.class) {\n-            return Boolean.valueOf(value);\n-        }\n-        try {\n-            if (type == byte.class || type == Byte.class) {\n-                return Byte.valueOf(value);\n-            } else if (type == short.class || type == Short.class) {\n-                return Short.valueOf(value);\n-            } else if (type == int.class || type == Integer.class) {\n-                return Integer.valueOf(value);\n-            } else if (type == long.class || type == Long.class) {\n-                return Long.valueOf(value);\n-            } else if (type == float.class || type == Float.class) {\n-                return Float.valueOf(value);\n-            } else if (type == double.class || type == Double.class) {\n-                return Double.valueOf(value);\n-            }\n-        } catch (NumberFormatException e) {\n-            return null;\n-        }\n-        return value;\n-    }\n-\n-\n-    /**\n-     * We only check boolean value at this moment.\n-     *\n-     * @param type\n-     * @param value\n-     * @return\n-     */\n-    public static boolean isTypeMatch(Class<?> type, String value) {\n-        if ((type == boolean.class || type == Boolean.class)\n-                && !(\"true\".equals(value) || \"false\".equals(value))) {\n-            return false;\n-        }\n-        return true;\n-    }\n-\n-    /**\n-     * Get all super classes from the specified type\n-     *\n-     * @param type         the specified type\n-     * @param classFilters the filters for classes\n-     * @return non-null read-only {@link Set}\n-     * @since 2.7.6\n-     */\n-    public static Set<Class<?>> getAllSuperClasses(Class<?> type, Predicate<Class<?>>... classFilters) {\n-\n-        Set<Class<?>> allSuperClasses = new LinkedHashSet<>();\n-\n-        Class<?> superClass = type.getSuperclass();\n-        while (superClass != null) {\n-            // add current super class\n-            allSuperClasses.add(superClass);\n-            superClass = superClass.getSuperclass();\n-        }\n-\n-        return unmodifiableSet(filterAll(allSuperClasses, classFilters));\n-    }\n-\n-    /**\n-     * Get all interfaces from the specified type\n-     *\n-     * @param type             the specified type\n-     * @param interfaceFilters the filters for interfaces\n-     * @return non-null read-only {@link Set}\n-     * @since 2.7.6\n-     */\n-    public static Set<Class<?>> getAllInterfaces(Class<?> type, Predicate<Class<?>>... interfaceFilters) {\n-        if (type == null || type.isPrimitive()) {\n-            return emptySet();\n-        }\n-\n-        Set<Class<?>> allInterfaces = new LinkedHashSet<>();\n-        Set<Class<?>> resolved = new LinkedHashSet<>();\n-        Queue<Class<?>> waitResolve = new LinkedList<>();\n-\n-        resolved.add(type);\n-        Class<?> clazz = type;\n-        while (clazz != null) {\n-\n-            Class<?>[] interfaces = clazz.getInterfaces();\n-\n-            if (isNotEmpty(interfaces)) {\n-                // add current interfaces\n-                Arrays.stream(interfaces)\n-                        .filter(resolved::add)\n-                        .forEach(cls -> {\n-                            allInterfaces.add(cls);\n-                            waitResolve.add(cls);\n-                        });\n-            }\n-\n-            // add all super classes to waitResolve\n-            getAllSuperClasses(clazz)\n-                    .stream()\n-                    .filter(resolved::add)\n-                    .forEach(waitResolve::add);\n-\n-            clazz = waitResolve.poll();\n-        }\n-\n-        return filterAll(allInterfaces, interfaceFilters);\n-    }\n-\n-    /**\n-     * Get all inherited types from the specified type\n-     *\n-     * @param type        the specified type\n-     * @param typeFilters the filters for types\n-     * @return non-null read-only {@link Set}\n-     * @since 2.7.6\n-     */\n-    public static Set<Class<?>> getAllInheritedTypes(Class<?> type, Predicate<Class<?>>... typeFilters) {\n-        // Add all super classes\n-        Set<Class<?>> types = new LinkedHashSet<>(getAllSuperClasses(type, typeFilters));\n-        // Add all interface classes\n-        types.addAll(getAllInterfaces(type, typeFilters));\n-        return unmodifiableSet(types);\n-    }\n-\n-\n-    /**\n-     * the semantics is same as {@link Class#isAssignableFrom(Class)}\n-     *\n-     * @param superType  the super type\n-     * @param targetType the target type\n-     * @return see {@link Class#isAssignableFrom(Class)}\n-     * @since 2.7.6\n-     */\n-    public static boolean isAssignableFrom(Class<?> superType, Class<?> targetType) {\n-        // any argument is null\n-        if (superType == null || targetType == null) {\n-            return false;\n-        }\n-        // equals\n-        if (Objects.equals(superType, targetType)) {\n-            return true;\n-        }\n-        // isAssignableFrom\n-        return superType.isAssignableFrom(targetType);\n-    }\n-\n-    /**\n-     * Test the specified class name is present in the {@link ClassLoader}\n-     *\n-     * @param className   the name of {@link Class}\n-     * @param classLoader {@link ClassLoader}\n-     * @return If found, return <code>true</code>\n-     * @since 2.7.6\n-     */\n-    public static boolean isPresent(String className, ClassLoader classLoader) {\n-        try {\n-            forName(className, classLoader);\n-        } catch (Throwable ignored) { // Ignored\n-            return false;\n-        }\n-        return true;\n-    }\n-\n-    /**\n-     * Resolve the {@link Class} by the specified name and {@link ClassLoader}\n-     *\n-     * @param className   the name of {@link Class}\n-     * @param classLoader {@link ClassLoader}\n-     * @return If can't be resolved , return <code>null</code>\n-     * @since 2.7.6\n-     */\n-    public static Class<?> resolveClass(String className, ClassLoader classLoader) {\n-        Class<?> targetClass = null;\n-        try {\n-            targetClass = forName(className, classLoader);\n-        } catch (Throwable ignored) { // Ignored\n-        }\n-        return targetClass;\n-    }\n-\n-    /**\n-     * Is generic class or not?\n-     *\n-     * @param type the target type\n-     * @return if the target type is not null or <code>void</code> or Void.class, return <code>true</code>, or false\n-     * @since 2.7.6\n-     */\n-    public static boolean isGenericClass(Class<?> type) {\n-        return type != null && !void.class.equals(type) && !Void.class.equals(type);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+\r\n+import java.lang.reflect.Array;\r\n+import java.math.BigDecimal;\r\n+import java.math.BigInteger;\r\n+import java.util.Arrays;\r\n+import java.util.Date;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.Queue;\r\n+import java.util.Set;\r\n+import java.util.function.Predicate;\r\n+\r\n+import static java.util.Collections.emptySet;\r\n+import static java.util.Collections.unmodifiableSet;\r\n+import static org.apache.dubbo.common.function.Streams.filterAll;\r\n+import static org.apache.dubbo.common.utils.ArrayUtils.isNotEmpty;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.ofSet;\r\n+\r\n+public class ClassUtils {\r\n+    /**\r\n+     * Suffix for array class names: \"[]\"\r\n+     */\r\n+    public static final String ARRAY_SUFFIX = \"[]\";\r\n+    /**\r\n+     * Simple Types including:\r\n+     * <ul>\r\n+     *     <li>{@link Void}</li>\r\n+     *     <li>{@link Boolean}</li>\r\n+     *     <li>{@link Character}</li>\r\n+     *     <li>{@link Byte}</li>\r\n+     *     <li>{@link Integer}</li>\r\n+     *     <li>{@link Float}</li>\r\n+     *     <li>{@link Double}</li>\r\n+     *     <li>{@link String}</li>\r\n+     *     <li>{@link BigDecimal}</li>\r\n+     *     <li>{@link BigInteger}</li>\r\n+     *     <li>{@link Date}</li>\r\n+     *     <li>{@link Object}</li>\r\n+     * </ul>\r\n+     *\r\n+     * @see javax.management.openmbean.SimpleType\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static final Set<Class<?>> SIMPLE_TYPES = ofSet(\r\n+            Void.class,\r\n+            Boolean.class,\r\n+            Character.class,\r\n+            Byte.class,\r\n+            Short.class,\r\n+            Integer.class,\r\n+            Long.class,\r\n+            Float.class,\r\n+            Double.class,\r\n+            String.class,\r\n+            BigDecimal.class,\r\n+            BigInteger.class,\r\n+            Date.class,\r\n+            Object.class\r\n+    );\r\n+    /**\r\n+     * Prefix for internal array class names: \"[L\"\r\n+     */\r\n+    private static final String INTERNAL_ARRAY_PREFIX = \"[L\";\r\n+    /**\r\n+     * Map with primitive type name as key and corresponding primitive type as\r\n+     * value, for example: \"int\" -> \"int.class\".\r\n+     */\r\n+    private static final Map<String, Class<?>> PRIMITIVE_TYPE_NAME_MAP = new HashMap<String, Class<?>>(32);\r\n+    /**\r\n+     * Map with primitive wrapper type as key and corresponding primitive type\r\n+     * as value, for example: Integer.class -> int.class.\r\n+     */\r\n+    private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_TYPE_MAP = new HashMap<Class<?>, Class<?>>(16);\r\n+    private static final char PACKAGE_SEPARATOR_CHAR = '.';\r\n+\r\n+    static {\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Boolean.class, boolean.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Byte.class, byte.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Character.class, char.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Double.class, double.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Float.class, float.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Integer.class, int.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Long.class, long.class);\r\n+        PRIMITIVE_WRAPPER_TYPE_MAP.put(Short.class, short.class);\r\n+\r\n+        Set<Class<?>> primitiveTypeNames = new HashSet<>(32);\r\n+        primitiveTypeNames.addAll(PRIMITIVE_WRAPPER_TYPE_MAP.values());\r\n+        primitiveTypeNames.addAll(Arrays\r\n+                .asList(boolean[].class, byte[].class, char[].class, double[].class,\r\n+                        float[].class, int[].class, long[].class, short[].class));\r\n+        for (Class<?> primitiveTypeName : primitiveTypeNames) {\r\n+            PRIMITIVE_TYPE_NAME_MAP.put(primitiveTypeName.getName(), primitiveTypeName);\r\n+        }\r\n+    }\r\n+\r\n+    public static Class<?> forNameWithThreadContextClassLoader(String name)\r\n+            throws ClassNotFoundException {\r\n+        return forName(name, Thread.currentThread().getContextClassLoader());\r\n+    }\r\n+\r\n+    public static Class<?> forNameWithCallerClassLoader(String name, Class<?> caller)\r\n+            throws ClassNotFoundException {\r\n+        return forName(name, caller.getClassLoader());\r\n+    }\r\n+\r\n+    public static ClassLoader getCallerClassLoader(Class<?> caller) {\r\n+        return caller.getClassLoader();\r\n+    }\r\n+\r\n+    /**\r\n+     * get class loader\r\n+     *\r\n+     * @param clazz\r\n+     * @return class loader\r\n+     */\r\n+    public static ClassLoader getClassLoader(Class<?> clazz) {\r\n+        ClassLoader cl = null;\r\n+        try {\r\n+            cl = Thread.currentThread().getContextClassLoader();\r\n+        } catch (Throwable ex) {\r\n+            // Cannot access thread context ClassLoader - falling back to system class loader...\r\n+        }\r\n+        if (cl == null) {\r\n+            // No thread context class loader -> use class loader of this class.\r\n+            cl = clazz.getClassLoader();\r\n+            if (cl == null) {\r\n+                // getClassLoader() returning null indicates the bootstrap ClassLoader\r\n+                try {\r\n+                    cl = ClassLoader.getSystemClassLoader();\r\n+                } catch (Throwable ex) {\r\n+                    // Cannot access system ClassLoader - oh well, maybe the caller can live with null...\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return cl;\r\n+    }\r\n+\r\n+    /**\r\n+     * Return the default ClassLoader to use: typically the thread context\r\n+     * ClassLoader, if available; the ClassLoader that loaded the ClassUtils\r\n+     * class will be used as fallback.\r\n+     * <p>\r\n+     * Call this method if you intend to use the thread context ClassLoader in a\r\n+     * scenario where you absolutely need a non-null ClassLoader reference: for\r\n+     * example, for class path resource loading (but not necessarily for\r\n+     * <code>Class.forName</code>, which accepts a <code>null</code> ClassLoader\r\n+     * reference as well).\r\n+     *\r\n+     * @return the default ClassLoader (never <code>null</code>)\r\n+     * @see java.lang.Thread#getContextClassLoader()\r\n+     */\r\n+    public static ClassLoader getClassLoader() {\r\n+        return getClassLoader(ClassUtils.class);\r\n+    }\r\n+\r\n+    /**\r\n+     * Same as <code>Class.forName()</code>, except that it works for primitive\r\n+     * types.\r\n+     */\r\n+    public static Class<?> forName(String name) throws ClassNotFoundException {\r\n+        return forName(name, getClassLoader());\r\n+    }\r\n+\r\n+    /**\r\n+     * Replacement for <code>Class.forName()</code> that also returns Class\r\n+     * instances for primitives (like \"int\") and array class names (like\r\n+     * \"String[]\").\r\n+     *\r\n+     * @param name        the name of the Class\r\n+     * @param classLoader the class loader to use (may be <code>null</code>,\r\n+     *                    which indicates the default class loader)\r\n+     * @return Class instance for the supplied name\r\n+     * @throws ClassNotFoundException if the class was not found\r\n+     * @throws LinkageError           if the class file could not be loaded\r\n+     * @see Class#forName(String, boolean, ClassLoader)\r\n+     */\r\n+    public static Class<?> forName(String name, ClassLoader classLoader)\r\n+            throws ClassNotFoundException, LinkageError {\r\n+\r\n+        Class<?> clazz = resolvePrimitiveClassName(name);\r\n+        if (clazz != null) {\r\n+            return clazz;\r\n+        }\r\n+\r\n+        // \"java.lang.String[]\" style arrays\r\n+        if (name.endsWith(ARRAY_SUFFIX)) {\r\n+            String elementClassName = name.substring(0, name.length() - ARRAY_SUFFIX.length());\r\n+            Class<?> elementClass = forName(elementClassName, classLoader);\r\n+            return Array.newInstance(elementClass, 0).getClass();\r\n+        }\r\n+\r\n+        // \"[Ljava.lang.String;\" style arrays\r\n+        int internalArrayMarker = name.indexOf(INTERNAL_ARRAY_PREFIX);\r\n+        if (internalArrayMarker != -1 && name.endsWith(\";\")) {\r\n+            String elementClassName = null;\r\n+            if (internalArrayMarker == 0) {\r\n+                elementClassName = name\r\n+                        .substring(INTERNAL_ARRAY_PREFIX.length(), name.length() - 1);\r\n+            } else if (name.startsWith(\"[\")) {\r\n+                elementClassName = name.substring(1);\r\n+            }\r\n+            Class<?> elementClass = forName(elementClassName, classLoader);\r\n+            return Array.newInstance(elementClass, 0).getClass();\r\n+        }\r\n+\r\n+        ClassLoader classLoaderToUse = classLoader;\r\n+        if (classLoaderToUse == null) {\r\n+            classLoaderToUse = getClassLoader();\r\n+        }\r\n+        return classLoaderToUse.loadClass(name);\r\n+    }\r\n+\r\n+    /**\r\n+     * Resolve the given class name as primitive class, if appropriate,\r\n+     * according to the JVM's naming rules for primitive classes.\r\n+     * <p>\r\n+     * Also supports the JVM's internal class names for primitive arrays. Does\r\n+     * <i>not</i> support the \"[]\" suffix notation for primitive arrays; this is\r\n+     * only supported by {@link #forName}.\r\n+     *\r\n+     * @param name the name of the potentially primitive class\r\n+     * @return the primitive class, or <code>null</code> if the name does not\r\n+     * denote a primitive class or primitive array class\r\n+     */\r\n+    public static Class<?> resolvePrimitiveClassName(String name) {\r\n+        Class<?> result = null;\r\n+        // Most class names will be quite long, considering that they\r\n+        // SHOULD sit in a package, so a length check is worthwhile.\r\n+        if (name != null && name.length() <= 8) {\r\n+            // Could be a primitive - likely.\r\n+            result = (Class<?>) PRIMITIVE_TYPE_NAME_MAP.get(name);\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    public static String toShortString(Object obj) {\r\n+        if (obj == null) {\r\n+            return \"null\";\r\n+        }\r\n+        return obj.getClass().getSimpleName() + \"@\" + System.identityHashCode(obj);\r\n+\r\n+    }\r\n+\r\n+    public static String simpleClassName(Class<?> clazz) {\r\n+        if (clazz == null) {\r\n+            throw new NullPointerException(\"clazz\");\r\n+        }\r\n+        String className = clazz.getName();\r\n+        final int lastDotIdx = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR);\r\n+        if (lastDotIdx > -1) {\r\n+            return className.substring(lastDotIdx + 1);\r\n+        }\r\n+        return className;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * The specified type is primitive type or simple type\r\n+     *\r\n+     * @param type the type to test\r\n+     * @return\r\n+     * @deprecated as 2.7.6, use {@link Class#isPrimitive()} plus {@link #isSimpleType(Class)} instead\r\n+     */\r\n+    public static boolean isPrimitive(Class<?> type) {\r\n+        return type != null && (type.isPrimitive() || isSimpleType(type));\r\n+    }\r\n+\r\n+    /**\r\n+     * The specified type is simple type or not\r\n+     *\r\n+     * @param type the type to test\r\n+     * @return if <code>type</code> is one element of {@link #SIMPLE_TYPES}, return <code>true</code>, or <code>false</code>\r\n+     * @see #SIMPLE_TYPES\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static boolean isSimpleType(Class<?> type) {\r\n+        return SIMPLE_TYPES.contains(type);\r\n+    }\r\n+\r\n+    public static Object convertPrimitive(Class<?> type, String value) {\r\n+        if (value == null) {\r\n+            return null;\r\n+        } else if (type == char.class || type == Character.class) {\r\n+            return value.length() > 0 ? value.charAt(0) : '\\0';\r\n+        } else if (type == boolean.class || type == Boolean.class) {\r\n+            return Boolean.valueOf(value);\r\n+        }\r\n+        try {\r\n+            if (type == byte.class || type == Byte.class) {\r\n+                return Byte.valueOf(value);\r\n+            } else if (type == short.class || type == Short.class) {\r\n+                return Short.valueOf(value);\r\n+            } else if (type == int.class || type == Integer.class) {\r\n+                return Integer.valueOf(value);\r\n+            } else if (type == long.class || type == Long.class) {\r\n+                return Long.valueOf(value);\r\n+            } else if (type == float.class || type == Float.class) {\r\n+                return Float.valueOf(value);\r\n+            } else if (type == double.class || type == Double.class) {\r\n+                return Double.valueOf(value);\r\n+            }\r\n+        } catch (NumberFormatException e) {\r\n+            return null;\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * We only check boolean value at this moment.\r\n+     *\r\n+     * @param type\r\n+     * @param value\r\n+     * @return\r\n+     */\r\n+    public static boolean isTypeMatch(Class<?> type, String value) {\r\n+        if ((type == boolean.class || type == Boolean.class)\r\n+                && !(\"true\".equals(value) || \"false\".equals(value))) {\r\n+            return false;\r\n+        }\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all super classes from the specified type\r\n+     *\r\n+     * @param type         the specified type\r\n+     * @param classFilters the filters for classes\r\n+     * @return non-null read-only {@link Set}\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static Set<Class<?>> getAllSuperClasses(Class<?> type, Predicate<Class<?>>... classFilters) {\r\n+\r\n+        Set<Class<?>> allSuperClasses = new LinkedHashSet<>();\r\n+\r\n+        Class<?> superClass = type.getSuperclass();\r\n+        while (superClass != null) {\r\n+            // add current super class\r\n+            allSuperClasses.add(superClass);\r\n+            superClass = superClass.getSuperclass();\r\n+        }\r\n+\r\n+        return unmodifiableSet(filterAll(allSuperClasses, classFilters));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all interfaces from the specified type\r\n+     *\r\n+     * @param type             the specified type\r\n+     * @param interfaceFilters the filters for interfaces\r\n+     * @return non-null read-only {@link Set}\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static Set<Class<?>> getAllInterfaces(Class<?> type, Predicate<Class<?>>... interfaceFilters) {\r\n+        if (type == null || type.isPrimitive()) {\r\n+            return emptySet();\r\n+        }\r\n+\r\n+        Set<Class<?>> allInterfaces = new LinkedHashSet<>();\r\n+        Set<Class<?>> resolved = new LinkedHashSet<>();\r\n+        Queue<Class<?>> waitResolve = new LinkedList<>();\r\n+\r\n+        resolved.add(type);\r\n+        Class<?> clazz = type;\r\n+        while (clazz != null) {\r\n+\r\n+            Class<?>[] interfaces = clazz.getInterfaces();\r\n+\r\n+            if (isNotEmpty(interfaces)) {\r\n+                // add current interfaces\r\n+                Arrays.stream(interfaces)\r\n+                        .filter(resolved::add)\r\n+                        .forEach(cls -> {\r\n+                            allInterfaces.add(cls);\r\n+                            waitResolve.add(cls);\r\n+                        });\r\n+            }\r\n+\r\n+            // add all super classes to waitResolve\r\n+            getAllSuperClasses(clazz)\r\n+                    .stream()\r\n+                    .filter(resolved::add)\r\n+                    .forEach(waitResolve::add);\r\n+\r\n+            clazz = waitResolve.poll();\r\n+        }\r\n+\r\n+        return filterAll(allInterfaces, interfaceFilters);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all inherited types from the specified type\r\n+     *\r\n+     * @param type        the specified type\r\n+     * @param typeFilters the filters for types\r\n+     * @return non-null read-only {@link Set}\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static Set<Class<?>> getAllInheritedTypes(Class<?> type, Predicate<Class<?>>... typeFilters) {\r\n+        // Add all super classes\r\n+        Set<Class<?>> types = new LinkedHashSet<>(getAllSuperClasses(type, typeFilters));\r\n+        // Add all interface classes\r\n+        types.addAll(getAllInterfaces(type, typeFilters));\r\n+        return unmodifiableSet(types);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * the semantics is same as {@link Class#isAssignableFrom(Class)}\r\n+     *\r\n+     * @param superType  the super type\r\n+     * @param targetType the target type\r\n+     * @return see {@link Class#isAssignableFrom(Class)}\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static boolean isAssignableFrom(Class<?> superType, Class<?> targetType) {\r\n+        // any argument is null\r\n+        if (superType == null || targetType == null) {\r\n+            return false;\r\n+        }\r\n+        // equals\r\n+        if (Objects.equals(superType, targetType)) {\r\n+            return true;\r\n+        }\r\n+        // isAssignableFrom\r\n+        return superType.isAssignableFrom(targetType);\r\n+    }\r\n+\r\n+    /**\r\n+     * Test the specified class name is present in the {@link ClassLoader}\r\n+     *\r\n+     * @param className   the name of {@link Class}\r\n+     * @param classLoader {@link ClassLoader}\r\n+     * @return If found, return <code>true</code>\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static boolean isPresent(String className, ClassLoader classLoader) {\r\n+        try {\r\n+            forName(className, classLoader);\r\n+        } catch (Throwable ignored) { // Ignored\r\n+            return false;\r\n+        }\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * Resolve the {@link Class} by the specified name and {@link ClassLoader}\r\n+     *\r\n+     * @param className   the name of {@link Class}\r\n+     * @param classLoader {@link ClassLoader}\r\n+     * @return If can't be resolved , return <code>null</code>\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static Class<?> resolveClass(String className, ClassLoader classLoader) {\r\n+        Class<?> targetClass = null;\r\n+        try {\r\n+            targetClass = forName(className, classLoader);\r\n+        } catch (Throwable ignored) { // Ignored\r\n+        }\r\n+        return targetClass;\r\n+    }\r\n+\r\n+    /**\r\n+     * Is generic class or not?\r\n+     *\r\n+     * @param type the target type\r\n+     * @return if the target type is not null or <code>void</code> or Void.class, return <code>true</code>, or false\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static boolean isGenericClass(Class<?> type) {\r\n+        return type != null && !void.class.equals(type) && !Void.class.equals(type);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/CompatibleTypeUtils.java", "source2": "org/apache/dubbo/common/utils/CompatibleTypeUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,229 +1,229 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.reflect.Array;\n-import java.math.BigDecimal;\n-import java.math.BigInteger;\n-import java.text.ParseException;\n-import java.text.SimpleDateFormat;\n-import java.time.LocalDateTime;\n-import java.util.ArrayList;\n-import java.util.Collection;\n-import java.util.Date;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Set;\n-\n-public class CompatibleTypeUtils {\n-\n-    private static final String DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n-\n-    private CompatibleTypeUtils() {\n-    }\n-\n-    /**\n-     * Compatible type convert. Null value is allowed to pass in. If no conversion is needed, then the original value\n-     * will be returned.\n-     * <p>\n-     * Supported compatible type conversions include (primary types and corresponding wrappers are not listed):\n-     * <ul>\n-     * <li> String -> char, enum, Date\n-     * <li> byte, short, int, long -> byte, short, int, long\n-     * <li> float, double -> float, double\n-     * </ul>\n-     */\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n-    public static Object compatibleTypeConvert(Object value, Class<?> type) {\n-        if (value == null || type == null || type.isAssignableFrom(value.getClass())) {\n-            return value;\n-        }\n-\n-        if (value instanceof String) {\n-            String string = (String) value;\n-            if (char.class.equals(type) || Character.class.equals(type)) {\n-                if (string.length() != 1) {\n-                    throw new IllegalArgumentException(String.format(\"CAN NOT convert String(%s) to char!\" +\n-                            \" when convert String to char, the String MUST only 1 char.\", string));\n-                }\n-                return string.charAt(0);\n-            }\n-            if (type.isEnum()) {\n-                return Enum.valueOf((Class<Enum>) type, string);\n-            }\n-            if (type == BigInteger.class) {\n-                return new BigInteger(string);\n-            }\n-            if (type == BigDecimal.class) {\n-                return new BigDecimal(string);\n-            }\n-            if (type == Short.class || type == short.class) {\n-                return new Short(string);\n-            }\n-            if (type == Integer.class || type == int.class) {\n-                return new Integer(string);\n-            }\n-            if (type == Long.class || type == long.class) {\n-                return new Long(string);\n-            }\n-            if (type == Double.class || type == double.class) {\n-                return new Double(string);\n-            }\n-            if (type == Float.class || type == float.class) {\n-                return new Float(string);\n-            }\n-            if (type == Byte.class || type == byte.class) {\n-                return new Byte(string);\n-            }\n-            if (type == Boolean.class || type == boolean.class) {\n-                return Boolean.valueOf(string);\n-            }\n-            if (type == Date.class || type == java.sql.Date.class || type == java.sql.Timestamp.class\n-                    || type == java.sql.Time.class) {\n-                try {\n-                    Date date = new SimpleDateFormat(DATE_FORMAT).parse(string);\n-                    if (type == java.sql.Date.class) {\n-                        return new java.sql.Date(date.getTime());\n-                    }\n-                    if (type == java.sql.Timestamp.class) {\n-                        return new java.sql.Timestamp(date.getTime());\n-                    }\n-                    if (type == java.sql.Time.class) {\n-                        return new java.sql.Time(date.getTime());\n-                    }\n-                    return date;\n-                } catch (ParseException e) {\n-                    throw new IllegalStateException(\"Failed to parse date \" + value + \" by format \"\n-                            + DATE_FORMAT + \", cause: \" + e.getMessage(), e);\n-                }\n-            }\n-            if (type == java.time.LocalDateTime.class) {\n-                if (StringUtils.isEmpty(string)) {\n-                    return null;\n-                }\n-                return LocalDateTime.parse(string);\n-            }\n-            if (type == java.time.LocalDate.class) {\n-                if (StringUtils.isEmpty(string)) {\n-                    return null;\n-                }\n-                return java.time.LocalDate.parse(string);\n-            }\n-            if (type == java.time.LocalTime.class) {\n-                if (StringUtils.isEmpty(string)) {\n-                    return null;\n-                }\n-                return LocalDateTime.parse(string).toLocalTime();\n-            }\n-            if (type == Class.class) {\n-                try {\n-                    return ReflectUtils.name2class(string);\n-                } catch (ClassNotFoundException e) {\n-                    throw new RuntimeException(e.getMessage(), e);\n-                }\n-            }\n-            if (char[].class.equals(type)) {\n-                // Process string to char array for generic invoke\n-                // See\n-                // - https://github.com/apache/dubbo/issues/2003\n-                int len = string.length();\n-                char[] chars = new char[len];\n-                string.getChars(0, len, chars, 0);\n-                return chars;\n-            }\n-        }\n-        if (value instanceof Number) {\n-            Number number = (Number) value;\n-            if (type == byte.class || type == Byte.class) {\n-                return number.byteValue();\n-            }\n-            if (type == short.class || type == Short.class) {\n-                return number.shortValue();\n-            }\n-            if (type == int.class || type == Integer.class) {\n-                return number.intValue();\n-            }\n-            if (type == long.class || type == Long.class) {\n-                return number.longValue();\n-            }\n-            if (type == float.class || type == Float.class) {\n-                return number.floatValue();\n-            }\n-            if (type == double.class || type == Double.class) {\n-                return number.doubleValue();\n-            }\n-            if (type == BigInteger.class) {\n-                return BigInteger.valueOf(number.longValue());\n-            }\n-            if (type == BigDecimal.class) {\n-                return BigDecimal.valueOf(number.doubleValue());\n-            }\n-            if (type == Date.class) {\n-                return new Date(number.longValue());\n-            }\n-            if (type == boolean.class || type == Boolean.class) {\n-                return 0 != number.intValue();\n-            }\n-        }\n-        if (value instanceof Collection) {\n-            Collection collection = (Collection) value;\n-            if (type.isArray()) {\n-                int length = collection.size();\n-                Object array = Array.newInstance(type.getComponentType(), length);\n-                int i = 0;\n-                for (Object item : collection) {\n-                    Array.set(array, i++, item);\n-                }\n-                return array;\n-            }\n-            if (!type.isInterface()) {\n-                try {\n-                    Collection result = (Collection) type.newInstance();\n-                    result.addAll(collection);\n-                    return result;\n-                } catch (Throwable ignored) {\n-                }\n-            }\n-            if (type == List.class) {\n-                return new ArrayList<Object>(collection);\n-            }\n-            if (type == Set.class) {\n-                return new HashSet<Object>(collection);\n-            }\n-        }\n-        if (value.getClass().isArray() && Collection.class.isAssignableFrom(type)) {\n-            Collection collection;\n-            if (!type.isInterface()) {\n-                try {\n-                    collection = (Collection) type.newInstance();\n-                } catch (Throwable e) {\n-                    collection = new ArrayList<Object>();\n-                }\n-            } else if (type == Set.class) {\n-                collection = new HashSet<Object>();\n-            } else {\n-                collection = new ArrayList<Object>();\n-            }\n-            int length = Array.getLength(value);\n-            for (int i = 0; i < length; i++) {\n-                collection.add(Array.get(value, i));\n-            }\n-            return collection;\n-        }\n-        return value;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.reflect.Array;\r\n+import java.math.BigDecimal;\r\n+import java.math.BigInteger;\r\n+import java.text.ParseException;\r\n+import java.text.SimpleDateFormat;\r\n+import java.time.LocalDateTime;\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+import java.util.Date;\r\n+import java.util.HashSet;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+\r\n+public class CompatibleTypeUtils {\r\n+\r\n+    private static final String DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\r\n+\r\n+    private CompatibleTypeUtils() {\r\n+    }\r\n+\r\n+    /**\r\n+     * Compatible type convert. Null value is allowed to pass in. If no conversion is needed, then the original value\r\n+     * will be returned.\r\n+     * <p>\r\n+     * Supported compatible type conversions include (primary types and corresponding wrappers are not listed):\r\n+     * <ul>\r\n+     * <li> String -> char, enum, Date\r\n+     * <li> byte, short, int, long -> byte, short, int, long\r\n+     * <li> float, double -> float, double\r\n+     * </ul>\r\n+     */\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\r\n+    public static Object compatibleTypeConvert(Object value, Class<?> type) {\r\n+        if (value == null || type == null || type.isAssignableFrom(value.getClass())) {\r\n+            return value;\r\n+        }\r\n+\r\n+        if (value instanceof String) {\r\n+            String string = (String) value;\r\n+            if (char.class.equals(type) || Character.class.equals(type)) {\r\n+                if (string.length() != 1) {\r\n+                    throw new IllegalArgumentException(String.format(\"CAN NOT convert String(%s) to char!\" +\r\n+                            \" when convert String to char, the String MUST only 1 char.\", string));\r\n+                }\r\n+                return string.charAt(0);\r\n+            }\r\n+            if (type.isEnum()) {\r\n+                return Enum.valueOf((Class<Enum>) type, string);\r\n+            }\r\n+            if (type == BigInteger.class) {\r\n+                return new BigInteger(string);\r\n+            }\r\n+            if (type == BigDecimal.class) {\r\n+                return new BigDecimal(string);\r\n+            }\r\n+            if (type == Short.class || type == short.class) {\r\n+                return new Short(string);\r\n+            }\r\n+            if (type == Integer.class || type == int.class) {\r\n+                return new Integer(string);\r\n+            }\r\n+            if (type == Long.class || type == long.class) {\r\n+                return new Long(string);\r\n+            }\r\n+            if (type == Double.class || type == double.class) {\r\n+                return new Double(string);\r\n+            }\r\n+            if (type == Float.class || type == float.class) {\r\n+                return new Float(string);\r\n+            }\r\n+            if (type == Byte.class || type == byte.class) {\r\n+                return new Byte(string);\r\n+            }\r\n+            if (type == Boolean.class || type == boolean.class) {\r\n+                return Boolean.valueOf(string);\r\n+            }\r\n+            if (type == Date.class || type == java.sql.Date.class || type == java.sql.Timestamp.class\r\n+                    || type == java.sql.Time.class) {\r\n+                try {\r\n+                    Date date = new SimpleDateFormat(DATE_FORMAT).parse(string);\r\n+                    if (type == java.sql.Date.class) {\r\n+                        return new java.sql.Date(date.getTime());\r\n+                    }\r\n+                    if (type == java.sql.Timestamp.class) {\r\n+                        return new java.sql.Timestamp(date.getTime());\r\n+                    }\r\n+                    if (type == java.sql.Time.class) {\r\n+                        return new java.sql.Time(date.getTime());\r\n+                    }\r\n+                    return date;\r\n+                } catch (ParseException e) {\r\n+                    throw new IllegalStateException(\"Failed to parse date \" + value + \" by format \"\r\n+                            + DATE_FORMAT + \", cause: \" + e.getMessage(), e);\r\n+                }\r\n+            }\r\n+            if (type == java.time.LocalDateTime.class) {\r\n+                if (StringUtils.isEmpty(string)) {\r\n+                    return null;\r\n+                }\r\n+                return LocalDateTime.parse(string);\r\n+            }\r\n+            if (type == java.time.LocalDate.class) {\r\n+                if (StringUtils.isEmpty(string)) {\r\n+                    return null;\r\n+                }\r\n+                return java.time.LocalDate.parse(string);\r\n+            }\r\n+            if (type == java.time.LocalTime.class) {\r\n+                if (StringUtils.isEmpty(string)) {\r\n+                    return null;\r\n+                }\r\n+                return LocalDateTime.parse(string).toLocalTime();\r\n+            }\r\n+            if (type == Class.class) {\r\n+                try {\r\n+                    return ReflectUtils.name2class(string);\r\n+                } catch (ClassNotFoundException e) {\r\n+                    throw new RuntimeException(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+            if (char[].class.equals(type)) {\r\n+                // Process string to char array for generic invoke\r\n+                // See\r\n+                // - https://github.com/apache/dubbo/issues/2003\r\n+                int len = string.length();\r\n+                char[] chars = new char[len];\r\n+                string.getChars(0, len, chars, 0);\r\n+                return chars;\r\n+            }\r\n+        }\r\n+        if (value instanceof Number) {\r\n+            Number number = (Number) value;\r\n+            if (type == byte.class || type == Byte.class) {\r\n+                return number.byteValue();\r\n+            }\r\n+            if (type == short.class || type == Short.class) {\r\n+                return number.shortValue();\r\n+            }\r\n+            if (type == int.class || type == Integer.class) {\r\n+                return number.intValue();\r\n+            }\r\n+            if (type == long.class || type == Long.class) {\r\n+                return number.longValue();\r\n+            }\r\n+            if (type == float.class || type == Float.class) {\r\n+                return number.floatValue();\r\n+            }\r\n+            if (type == double.class || type == Double.class) {\r\n+                return number.doubleValue();\r\n+            }\r\n+            if (type == BigInteger.class) {\r\n+                return BigInteger.valueOf(number.longValue());\r\n+            }\r\n+            if (type == BigDecimal.class) {\r\n+                return BigDecimal.valueOf(number.doubleValue());\r\n+            }\r\n+            if (type == Date.class) {\r\n+                return new Date(number.longValue());\r\n+            }\r\n+            if (type == boolean.class || type == Boolean.class) {\r\n+                return 0 != number.intValue();\r\n+            }\r\n+        }\r\n+        if (value instanceof Collection) {\r\n+            Collection collection = (Collection) value;\r\n+            if (type.isArray()) {\r\n+                int length = collection.size();\r\n+                Object array = Array.newInstance(type.getComponentType(), length);\r\n+                int i = 0;\r\n+                for (Object item : collection) {\r\n+                    Array.set(array, i++, item);\r\n+                }\r\n+                return array;\r\n+            }\r\n+            if (!type.isInterface()) {\r\n+                try {\r\n+                    Collection result = (Collection) type.newInstance();\r\n+                    result.addAll(collection);\r\n+                    return result;\r\n+                } catch (Throwable ignored) {\r\n+                }\r\n+            }\r\n+            if (type == List.class) {\r\n+                return new ArrayList<Object>(collection);\r\n+            }\r\n+            if (type == Set.class) {\r\n+                return new HashSet<Object>(collection);\r\n+            }\r\n+        }\r\n+        if (value.getClass().isArray() && Collection.class.isAssignableFrom(type)) {\r\n+            Collection collection;\r\n+            if (!type.isInterface()) {\r\n+                try {\r\n+                    collection = (Collection) type.newInstance();\r\n+                } catch (Throwable e) {\r\n+                    collection = new ArrayList<Object>();\r\n+                }\r\n+            } else if (type == Set.class) {\r\n+                collection = new HashSet<Object>();\r\n+            } else {\r\n+                collection = new ArrayList<Object>();\r\n+            }\r\n+            int length = Array.getLength(value);\r\n+            for (int i = 0; i < length; i++) {\r\n+                collection.add(Array.get(value, i));\r\n+            }\r\n+            return collection;\r\n+        }\r\n+        return value;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/DefaultPage.java", "source2": "org/apache/dubbo/common/utils/DefaultPage.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,82 +1,82 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.io.Serializable;\n-import java.util.List;\n-\n-/**\n- * The default implementation of {@link Page}\n- *\n- * @since 2.7.5\n- */\n-public class DefaultPage<T> implements Page<T>, Serializable {\n-\n-    private static final long serialVersionUID = 1099331838954070419L;\n-\n-    private final int requestOffset;\n-\n-    private final int pageSize;\n-\n-    private final int totalSize;\n-\n-    private final List<T> data;\n-\n-    private final int totalPages;\n-\n-    private final boolean hasNext;\n-\n-    public DefaultPage(int requestOffset, int pageSize, List<T> data, int totalSize) {\n-        this.requestOffset = requestOffset;\n-        this.pageSize = pageSize;\n-        this.data = data;\n-        this.totalSize = totalSize;\n-        int remain = totalSize % pageSize;\n-        this.totalPages = remain > 0 ? (totalSize / pageSize) + 1 : totalSize / pageSize;\n-        this.hasNext = totalSize - requestOffset - pageSize > 0;\n-    }\n-\n-    @Override\n-    public int getOffset() {\n-        return requestOffset;\n-    }\n-\n-    @Override\n-    public int getPageSize() {\n-        return pageSize;\n-    }\n-\n-    @Override\n-    public int getTotalSize() {\n-        return totalSize;\n-    }\n-\n-    @Override\n-    public int getTotalPages() {\n-        return totalPages;\n-    }\n-\n-    @Override\n-    public List<T> getData() {\n-        return data;\n-    }\n-\n-    @Override\n-    public boolean hasNext() {\n-        return hasNext;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.io.Serializable;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The default implementation of {@link Page}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DefaultPage<T> implements Page<T>, Serializable {\r\n+\r\n+    private static final long serialVersionUID = 1099331838954070419L;\r\n+\r\n+    private final int requestOffset;\r\n+\r\n+    private final int pageSize;\r\n+\r\n+    private final int totalSize;\r\n+\r\n+    private final List<T> data;\r\n+\r\n+    private final int totalPages;\r\n+\r\n+    private final boolean hasNext;\r\n+\r\n+    public DefaultPage(int requestOffset, int pageSize, List<T> data, int totalSize) {\r\n+        this.requestOffset = requestOffset;\r\n+        this.pageSize = pageSize;\r\n+        this.data = data;\r\n+        this.totalSize = totalSize;\r\n+        int remain = totalSize % pageSize;\r\n+        this.totalPages = remain > 0 ? (totalSize / pageSize) + 1 : totalSize / pageSize;\r\n+        this.hasNext = totalSize - requestOffset - pageSize > 0;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getOffset() {\r\n+        return requestOffset;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getPageSize() {\r\n+        return pageSize;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getTotalSize() {\r\n+        return totalSize;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getTotalPages() {\r\n+        return totalPages;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<T> getData() {\r\n+        return data;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean hasNext() {\r\n+        return hasNext;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/ExecutorUtil.java", "source2": "org/apache/dubbo/common/utils/ExecutorUtil.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,140 +1,140 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-\n-import java.util.concurrent.Executor;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.LinkedBlockingQueue;\n-import java.util.concurrent.ScheduledFuture;\n-import java.util.concurrent.ThreadPoolExecutor;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;\n-\n-public class ExecutorUtil {\n-    private static final Logger logger = LoggerFactory.getLogger(ExecutorUtil.class);\n-    private static final ThreadPoolExecutor SHUTDOWN_EXECUTOR = new ThreadPoolExecutor(0, 1,\n-            0L, TimeUnit.MILLISECONDS,\n-            new LinkedBlockingQueue<Runnable>(100),\n-            new NamedThreadFactory(\"Close-ExecutorService-Timer\", true));\n-\n-    public static boolean isTerminated(Executor executor) {\n-        if (executor instanceof ExecutorService) {\n-            if (((ExecutorService) executor).isTerminated()) {\n-                return true;\n-            }\n-        }\n-        return false;\n-    }\n-\n-    /**\n-     * Use the shutdown pattern from:\n-     * https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html\n-     *\n-     * @param executor the Executor to shutdown\n-     * @param timeout  the timeout in milliseconds before termination\n-     */\n-    public static void gracefulShutdown(Executor executor, int timeout) {\n-        if (!(executor instanceof ExecutorService) || isTerminated(executor)) {\n-            return;\n-        }\n-        final ExecutorService es = (ExecutorService) executor;\n-        try {\n-            // Disable new tasks from being submitted\n-            es.shutdown();\n-        } catch (SecurityException | NullPointerException ex2) {\n-            return;\n-        }\n-        try {\n-            // Wait a while for existing tasks to terminate\n-            if (!es.awaitTermination(timeout, TimeUnit.MILLISECONDS)) {\n-                es.shutdownNow();\n-            }\n-        } catch (InterruptedException ex) {\n-            es.shutdownNow();\n-            Thread.currentThread().interrupt();\n-        }\n-        if (!isTerminated(es)) {\n-            newThreadToCloseExecutor(es);\n-        }\n-    }\n-\n-    public static void shutdownNow(Executor executor, final int timeout) {\n-        if (!(executor instanceof ExecutorService) || isTerminated(executor)) {\n-            return;\n-        }\n-        final ExecutorService es = (ExecutorService) executor;\n-        try {\n-            es.shutdownNow();\n-        } catch (SecurityException | NullPointerException ex2) {\n-            return;\n-        }\n-        try {\n-            es.awaitTermination(timeout, TimeUnit.MILLISECONDS);\n-        } catch (InterruptedException ex) {\n-            Thread.currentThread().interrupt();\n-        }\n-        if (!isTerminated(es)) {\n-            newThreadToCloseExecutor(es);\n-        }\n-    }\n-\n-    private static void newThreadToCloseExecutor(final ExecutorService es) {\n-        if (!isTerminated(es)) {\n-            SHUTDOWN_EXECUTOR.execute(new Runnable() {\n-                @Override\n-                public void run() {\n-                    try {\n-                        for (int i = 0; i < 1000; i++) {\n-                            es.shutdownNow();\n-                            if (es.awaitTermination(10, TimeUnit.MILLISECONDS)) {\n-                                break;\n-                            }\n-                        }\n-                    } catch (InterruptedException ex) {\n-                        Thread.currentThread().interrupt();\n-                    } catch (Throwable e) {\n-                        logger.warn(e.getMessage(), e);\n-                    }\n-                }\n-            });\n-        }\n-    }\n-\n-    /**\n-     * append thread name with url address\n-     *\n-     * @return new url with updated thread name\n-     */\n-    public static URL setThreadName(URL url, String defaultName) {\n-        String name = url.getParameter(THREAD_NAME_KEY, defaultName);\n-        name = name + \"-\" + url.getAddress();\n-        url = url.addParameter(THREAD_NAME_KEY, name);\n-        return url;\n-    }\n-\n-    public static void cancelScheduledFuture(ScheduledFuture<?> scheduledFuture) {\n-        ScheduledFuture<?> future = scheduledFuture;\n-        if (future != null && !future.isCancelled()) {\n-            future.cancel(true);\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+\r\n+import java.util.concurrent.Executor;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.LinkedBlockingQueue;\r\n+import java.util.concurrent.ScheduledFuture;\r\n+import java.util.concurrent.ThreadPoolExecutor;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;\r\n+\r\n+public class ExecutorUtil {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ExecutorUtil.class);\r\n+    private static final ThreadPoolExecutor SHUTDOWN_EXECUTOR = new ThreadPoolExecutor(0, 1,\r\n+            0L, TimeUnit.MILLISECONDS,\r\n+            new LinkedBlockingQueue<Runnable>(100),\r\n+            new NamedThreadFactory(\"Close-ExecutorService-Timer\", true));\r\n+\r\n+    public static boolean isTerminated(Executor executor) {\r\n+        if (executor instanceof ExecutorService) {\r\n+            if (((ExecutorService) executor).isTerminated()) {\r\n+                return true;\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    /**\r\n+     * Use the shutdown pattern from:\r\n+     * https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html\r\n+     *\r\n+     * @param executor the Executor to shutdown\r\n+     * @param timeout  the timeout in milliseconds before termination\r\n+     */\r\n+    public static void gracefulShutdown(Executor executor, int timeout) {\r\n+        if (!(executor instanceof ExecutorService) || isTerminated(executor)) {\r\n+            return;\r\n+        }\r\n+        final ExecutorService es = (ExecutorService) executor;\r\n+        try {\r\n+            // Disable new tasks from being submitted\r\n+            es.shutdown();\r\n+        } catch (SecurityException | NullPointerException ex2) {\r\n+            return;\r\n+        }\r\n+        try {\r\n+            // Wait a while for existing tasks to terminate\r\n+            if (!es.awaitTermination(timeout, TimeUnit.MILLISECONDS)) {\r\n+                es.shutdownNow();\r\n+            }\r\n+        } catch (InterruptedException ex) {\r\n+            es.shutdownNow();\r\n+            Thread.currentThread().interrupt();\r\n+        }\r\n+        if (!isTerminated(es)) {\r\n+            newThreadToCloseExecutor(es);\r\n+        }\r\n+    }\r\n+\r\n+    public static void shutdownNow(Executor executor, final int timeout) {\r\n+        if (!(executor instanceof ExecutorService) || isTerminated(executor)) {\r\n+            return;\r\n+        }\r\n+        final ExecutorService es = (ExecutorService) executor;\r\n+        try {\r\n+            es.shutdownNow();\r\n+        } catch (SecurityException | NullPointerException ex2) {\r\n+            return;\r\n+        }\r\n+        try {\r\n+            es.awaitTermination(timeout, TimeUnit.MILLISECONDS);\r\n+        } catch (InterruptedException ex) {\r\n+            Thread.currentThread().interrupt();\r\n+        }\r\n+        if (!isTerminated(es)) {\r\n+            newThreadToCloseExecutor(es);\r\n+        }\r\n+    }\r\n+\r\n+    private static void newThreadToCloseExecutor(final ExecutorService es) {\r\n+        if (!isTerminated(es)) {\r\n+            SHUTDOWN_EXECUTOR.execute(new Runnable() {\r\n+                @Override\r\n+                public void run() {\r\n+                    try {\r\n+                        for (int i = 0; i < 1000; i++) {\r\n+                            es.shutdownNow();\r\n+                            if (es.awaitTermination(10, TimeUnit.MILLISECONDS)) {\r\n+                                break;\r\n+                            }\r\n+                        }\r\n+                    } catch (InterruptedException ex) {\r\n+                        Thread.currentThread().interrupt();\r\n+                    } catch (Throwable e) {\r\n+                        logger.warn(e.getMessage(), e);\r\n+                    }\r\n+                }\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * append thread name with url address\r\n+     *\r\n+     * @return new url with updated thread name\r\n+     */\r\n+    public static URL setThreadName(URL url, String defaultName) {\r\n+        String name = url.getParameter(THREAD_NAME_KEY, defaultName);\r\n+        name = name + \"-\" + url.getAddress();\r\n+        url = url.addParameter(THREAD_NAME_KEY, name);\r\n+        return url;\r\n+    }\r\n+\r\n+    public static void cancelScheduledFuture(ScheduledFuture<?> scheduledFuture) {\r\n+        ScheduledFuture<?> future = scheduledFuture;\r\n+        if (future != null && !future.isCancelled()) {\r\n+            future.cancel(true);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/FieldUtils.java", "source2": "org/apache/dubbo/common/utils/FieldUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,142 +1,142 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.reflect.Field;\n-\n-import static org.apache.dubbo.common.utils.ClassUtils.getAllInheritedTypes;\n-\n-/**\n- * The utilities class for Java Reflection {@link Field}\n- *\n- * @since 2.7.6\n- */\n-public interface FieldUtils {\n-\n-    /**\n-     * Like the {@link Class#getDeclaredField(String)} method without throwing any {@link Exception}\n-     *\n-     * @param declaredClass the declared class\n-     * @param fieldName     the name of {@link Field}\n-     * @return if can't be found, return <code>null</code>\n-     */\n-    static Field getDeclaredField(Class<?> declaredClass, String fieldName) {\n-        Field field = null;\n-        try {\n-            field = declaredClass.getDeclaredField(fieldName);\n-        } catch (NoSuchFieldException ignored) {\n-            field = null;\n-        }\n-        return field;\n-    }\n-\n-    /**\n-     * Find the {@link Field} by the name in the specified class and its inherited types\n-     *\n-     * @param declaredClass the declared class\n-     * @param fieldName     the name of {@link Field}\n-     * @return if can't be found, return <code>null</code>\n-     */\n-    static Field findField(Class<?> declaredClass, String fieldName) {\n-        Field field = getDeclaredField(declaredClass, fieldName);\n-        if (field != null) {\n-            return field;\n-        }\n-        for (Class superType : getAllInheritedTypes(declaredClass)) {\n-            field = getDeclaredField(superType, fieldName);\n-            if (field != null) {\n-                break;\n-            }\n-        }\n-        return field;\n-    }\n-\n-    /**\n-     * Find the {@link Field} by the name in the specified class and its inherited types\n-     *\n-     * @param object    the object whose field should be modified\n-     * @param fieldName the name of {@link Field}\n-     * @return if can't be found, return <code>null</code>\n-     */\n-    static Field findField(Object object, String fieldName) {\n-        return findField(object.getClass(), fieldName);\n-    }\n-\n-    /**\n-     * Get the value of the specified {@link Field}\n-     *\n-     * @param object    the object whose field should be modified\n-     * @param fieldName the name of {@link Field}\n-     * @return the value of  the specified {@link Field}\n-     */\n-    static Object getFieldValue(Object object, String fieldName) {\n-        return getFieldValue(object, findField(object, fieldName));\n-    }\n-\n-    /**\n-     * Get the value of the specified {@link Field}\n-     *\n-     * @param object the object whose field should be modified\n-     * @param field  {@link Field}\n-     * @return the value of  the specified {@link Field}\n-     */\n-    static <T> T getFieldValue(Object object, Field field) {\n-        Object value = null;\n-        try {\n-            ReflectUtils.makeAccessible(field);\n-            value = field.get(object);\n-        } catch (IllegalAccessException ignored) {\n-        } finally {\n-            ReflectUtils.makeAccessible(field);\n-        }\n-        return (T) value;\n-    }\n-\n-    /**\n-     * Set the value for the specified {@link Field}\n-     *\n-     * @param object    the object whose field should be modified\n-     * @param fieldName the name of {@link Field}\n-     * @param value     the value of field to be set\n-     * @return the previous value of the specified {@link Field}\n-     */\n-    static <T> T setFieldValue(Object object, String fieldName, T value) {\n-        return setFieldValue(object, findField(object, fieldName), value);\n-    }\n-\n-    /**\n-     * Set the value for the specified {@link Field}\n-     *\n-     * @param object the object whose field should be modified\n-     * @param field  {@link Field}\n-     * @param value  the value of field to be set\n-     * @return the previous value of the specified {@link Field}\n-     */\n-    static <T> T setFieldValue(Object object, Field field, T value) {\n-        Object previousValue = null;\n-        try {\n-            ReflectUtils.makeAccessible(field);\n-            previousValue = field.get(object);\n-            field.set(object, value);\n-        } catch (IllegalAccessException ignored) {\n-        } finally {\n-            ReflectUtils.makeAccessible(field);\n-        }\n-        return (T) previousValue;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.reflect.Field;\r\n+\r\n+import static org.apache.dubbo.common.utils.ClassUtils.getAllInheritedTypes;\r\n+\r\n+/**\r\n+ * The utilities class for Java Reflection {@link Field}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public interface FieldUtils {\r\n+\r\n+    /**\r\n+     * Like the {@link Class#getDeclaredField(String)} method without throwing any {@link Exception}\r\n+     *\r\n+     * @param declaredClass the declared class\r\n+     * @param fieldName     the name of {@link Field}\r\n+     * @return if can't be found, return <code>null</code>\r\n+     */\r\n+    static Field getDeclaredField(Class<?> declaredClass, String fieldName) {\r\n+        Field field = null;\r\n+        try {\r\n+            field = declaredClass.getDeclaredField(fieldName);\r\n+        } catch (NoSuchFieldException ignored) {\r\n+            field = null;\r\n+        }\r\n+        return field;\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link Field} by the name in the specified class and its inherited types\r\n+     *\r\n+     * @param declaredClass the declared class\r\n+     * @param fieldName     the name of {@link Field}\r\n+     * @return if can't be found, return <code>null</code>\r\n+     */\r\n+    static Field findField(Class<?> declaredClass, String fieldName) {\r\n+        Field field = getDeclaredField(declaredClass, fieldName);\r\n+        if (field != null) {\r\n+            return field;\r\n+        }\r\n+        for (Class superType : getAllInheritedTypes(declaredClass)) {\r\n+            field = getDeclaredField(superType, fieldName);\r\n+            if (field != null) {\r\n+                break;\r\n+            }\r\n+        }\r\n+        return field;\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link Field} by the name in the specified class and its inherited types\r\n+     *\r\n+     * @param object    the object whose field should be modified\r\n+     * @param fieldName the name of {@link Field}\r\n+     * @return if can't be found, return <code>null</code>\r\n+     */\r\n+    static Field findField(Object object, String fieldName) {\r\n+        return findField(object.getClass(), fieldName);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the value of the specified {@link Field}\r\n+     *\r\n+     * @param object    the object whose field should be modified\r\n+     * @param fieldName the name of {@link Field}\r\n+     * @return the value of  the specified {@link Field}\r\n+     */\r\n+    static Object getFieldValue(Object object, String fieldName) {\r\n+        return getFieldValue(object, findField(object, fieldName));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the value of the specified {@link Field}\r\n+     *\r\n+     * @param object the object whose field should be modified\r\n+     * @param field  {@link Field}\r\n+     * @return the value of  the specified {@link Field}\r\n+     */\r\n+    static <T> T getFieldValue(Object object, Field field) {\r\n+        Object value = null;\r\n+        try {\r\n+            ReflectUtils.makeAccessible(field);\r\n+            value = field.get(object);\r\n+        } catch (IllegalAccessException ignored) {\r\n+        } finally {\r\n+            ReflectUtils.makeAccessible(field);\r\n+        }\r\n+        return (T) value;\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the value for the specified {@link Field}\r\n+     *\r\n+     * @param object    the object whose field should be modified\r\n+     * @param fieldName the name of {@link Field}\r\n+     * @param value     the value of field to be set\r\n+     * @return the previous value of the specified {@link Field}\r\n+     */\r\n+    static <T> T setFieldValue(Object object, String fieldName, T value) {\r\n+        return setFieldValue(object, findField(object, fieldName), value);\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the value for the specified {@link Field}\r\n+     *\r\n+     * @param object the object whose field should be modified\r\n+     * @param field  {@link Field}\r\n+     * @param value  the value of field to be set\r\n+     * @return the previous value of the specified {@link Field}\r\n+     */\r\n+    static <T> T setFieldValue(Object object, Field field, T value) {\r\n+        Object previousValue = null;\r\n+        try {\r\n+            ReflectUtils.makeAccessible(field);\r\n+            previousValue = field.get(object);\r\n+            field.set(object, value);\r\n+        } catch (IllegalAccessException ignored) {\r\n+        } finally {\r\n+            ReflectUtils.makeAccessible(field);\r\n+        }\r\n+        return (T) previousValue;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/LFUCache.java", "source2": "org/apache/dubbo/common/utils/LFUCache.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,286 +1,286 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.concurrent.locks.ReentrantLock;\n-\n-public class LFUCache<K, V> {\n-\n-    private Map<K, CacheNode<K, V>> map;\n-    private CacheDeque<K, V>[] freqTable;\n-\n-    private final int capacity;\n-    private int evictionCount;\n-    private int curSize = 0;\n-\n-    private final ReentrantLock lock = new ReentrantLock();\n-    private static final int DEFAULT_INITIAL_CAPACITY = 1000;\n-\n-    private static final float DEFAULT_EVICTION_FACTOR = 0.75f;\n-\n-    public LFUCache() {\n-        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_EVICTION_FACTOR);\n-    }\n-\n-    /**\n-     * Constructs and initializes cache with specified capacity and eviction\n-     * factor. Unacceptable parameter values followed with\n-     * {@link IllegalArgumentException}.\n-     *\n-     * @param maxCapacity    cache max capacity\n-     * @param evictionFactor cache proceedEviction factor\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public LFUCache(final int maxCapacity, final float evictionFactor) {\n-        if (maxCapacity <= 0) {\n-            throw new IllegalArgumentException(\"Illegal initial capacity: \" +\n-                    maxCapacity);\n-        }\n-        boolean factorInRange = evictionFactor <= 1 && evictionFactor > 0;\n-        if (!factorInRange || Float.isNaN(evictionFactor)) {\n-            throw new IllegalArgumentException(\"Illegal eviction factor value:\"\n-                    + evictionFactor);\n-        }\n-        this.capacity = maxCapacity;\n-        this.evictionCount = (int) (capacity * evictionFactor);\n-        this.map = new HashMap<>();\n-        this.freqTable = new CacheDeque[capacity + 1];\n-        for (int i = 0; i <= capacity; i++) {\n-            freqTable[i] = new CacheDeque<>();\n-        }\n-        for (int i = 0; i < capacity; i++) {\n-            freqTable[i].nextDeque = freqTable[i + 1];\n-        }\n-        freqTable[capacity].nextDeque = freqTable[capacity];\n-    }\n-\n-    public int getCapacity() {\n-        return capacity;\n-    }\n-\n-    public V put(final K key, final V value) {\n-        CacheNode<K, V> node;\n-        lock.lock();\n-        try {\n-            node = map.get(key);\n-            if (node != null) {\n-                CacheNode.withdrawNode(node);\n-                node.value = value;\n-                freqTable[0].addLastNode(node);\n-                map.put(key, node);\n-            } else {\n-                node = freqTable[0].addLast(key, value);\n-                map.put(key, node);\n-                curSize++;\n-                if (curSize > capacity) {\n-                    proceedEviction();\n-                }\n-            }\n-        } finally {\n-            lock.unlock();\n-        }\n-        return node.value;\n-    }\n-\n-    public V remove(final K key) {\n-        CacheNode<K, V> node = null;\n-        lock.lock();\n-        try {\n-            if (map.containsKey(key)) {\n-                node = map.remove(key);\n-                if (node != null) {\n-                    CacheNode.withdrawNode(node);\n-                }\n-                curSize--;\n-            }\n-        } finally {\n-            lock.unlock();\n-        }\n-        return (node != null) ? node.value : null;\n-    }\n-\n-    public V get(final K key) {\n-        CacheNode<K, V> node = null;\n-        lock.lock();\n-        try {\n-            if (map.containsKey(key)) {\n-                node = map.get(key);\n-                CacheNode.withdrawNode(node);\n-                node.owner.nextDeque.addLastNode(node);\n-            }\n-        } finally {\n-            lock.unlock();\n-        }\n-        return (node != null) ? node.value : null;\n-    }\n-\n-    /**\n-     * Evicts less frequently used elements corresponding to eviction factor,\n-     * specified at instantiation step.\n-     *\n-     * @return number of evicted elements\n-     */\n-    private int proceedEviction() {\n-        int targetSize = capacity - evictionCount;\n-        int evictedElements = 0;\n-\n-        FREQ_TABLE_ITER_LOOP:\n-        for (int i = 0; i <= capacity; i++) {\n-            CacheNode<K, V> node;\n-            while (!freqTable[i].isEmpty()) {\n-                node = freqTable[i].pollFirst();\n-                remove(node.key);\n-                if (targetSize >= curSize) {\n-                    break FREQ_TABLE_ITER_LOOP;\n-                }\n-                evictedElements++;\n-            }\n-        }\n-        return evictedElements;\n-    }\n-\n-    /**\n-     * Returns cache current size.\n-     *\n-     * @return cache size\n-     */\n-    public int getSize() {\n-        return curSize;\n-    }\n-\n-    static class CacheNode<K, V> {\n-\n-        CacheNode<K, V> prev;\n-        CacheNode<K, V> next;\n-        K key;\n-        V value;\n-        CacheDeque<K, V> owner;\n-\n-        CacheNode() {\n-        }\n-\n-        CacheNode(final K key, final V value) {\n-            this.key = key;\n-            this.value = value;\n-        }\n-\n-        /**\n-         * This method takes specified node and reattaches it neighbors nodes\n-         * links to each other, so specified node will no longer tied with them.\n-         * Returns united node, returns null if argument is null.\n-         *\n-         * @param node note to retrieve\n-         * @param <K>  key\n-         * @param <V>  value\n-         * @return retrieved node\n-         */\n-        static <K, V> CacheNode<K, V> withdrawNode(\n-                final CacheNode<K, V> node) {\n-            if (node != null && node.prev != null) {\n-                node.prev.next = node.next;\n-                if (node.next != null) {\n-                    node.next.prev = node.prev;\n-                }\n-            }\n-            return node;\n-        }\n-\n-    }\n-\n-    /**\n-     * Custom deque implementation of LIFO type. Allows to place element at top\n-     * of deque and poll very last added elements. An arbitrary node from the\n-     * deque can be removed with {@link CacheNode#withdrawNode(CacheNode)}\n-     * method.\n-     *\n-     * @param <K> key\n-     * @param <V> value\n-     */\n-    static class CacheDeque<K, V> {\n-\n-        CacheNode<K, V> last;\n-        CacheNode<K, V> first;\n-        CacheDeque<K, V> nextDeque;\n-\n-        /**\n-         * Constructs list and initializes last and first pointers.\n-         */\n-        CacheDeque() {\n-            last = new CacheNode<>();\n-            first = new CacheNode<>();\n-            last.next = first;\n-            first.prev = last;\n-        }\n-\n-        /**\n-         * Puts the node with specified key and value at the end of the deque\n-         * and returns node.\n-         *\n-         * @param key   key\n-         * @param value value\n-         * @return added node\n-         */\n-        CacheNode<K, V> addLast(final K key, final V value) {\n-            CacheNode<K, V> node = new CacheNode<>(key, value);\n-            node.owner = this;\n-            node.next = last.next;\n-            node.prev = last;\n-            node.next.prev = node;\n-            last.next = node;\n-            return node;\n-        }\n-\n-        CacheNode<K, V> addLastNode(final CacheNode<K, V> node) {\n-            node.owner = this;\n-            node.next = last.next;\n-            node.prev = last;\n-            node.next.prev = node;\n-            last.next = node;\n-            return node;\n-        }\n-\n-        /**\n-         * Retrieves and removes the first node of this deque.\n-         *\n-         * @return removed node\n-         */\n-        CacheNode<K, V> pollFirst() {\n-            CacheNode<K, V> node = null;\n-            if (first.prev != last) {\n-                node = first.prev;\n-                first.prev = node.prev;\n-                first.prev.next = first;\n-                node.prev = null;\n-                node.next = null;\n-            }\n-            return node;\n-        }\n-\n-        /**\n-         * Checks if link to the last node points to link to the first node.\n-         *\n-         * @return is deque empty\n-         */\n-        boolean isEmpty() {\n-            return last.next == first;\n-        }\n-\n-    }\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+\r\n+public class LFUCache<K, V> {\r\n+\r\n+    private Map<K, CacheNode<K, V>> map;\r\n+    private CacheDeque<K, V>[] freqTable;\r\n+\r\n+    private final int capacity;\r\n+    private int evictionCount;\r\n+    private int curSize = 0;\r\n+\r\n+    private final ReentrantLock lock = new ReentrantLock();\r\n+    private static final int DEFAULT_INITIAL_CAPACITY = 1000;\r\n+\r\n+    private static final float DEFAULT_EVICTION_FACTOR = 0.75f;\r\n+\r\n+    public LFUCache() {\r\n+        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_EVICTION_FACTOR);\r\n+    }\r\n+\r\n+    /**\r\n+     * Constructs and initializes cache with specified capacity and eviction\r\n+     * factor. Unacceptable parameter values followed with\r\n+     * {@link IllegalArgumentException}.\r\n+     *\r\n+     * @param maxCapacity    cache max capacity\r\n+     * @param evictionFactor cache proceedEviction factor\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public LFUCache(final int maxCapacity, final float evictionFactor) {\r\n+        if (maxCapacity <= 0) {\r\n+            throw new IllegalArgumentException(\"Illegal initial capacity: \" +\r\n+                    maxCapacity);\r\n+        }\r\n+        boolean factorInRange = evictionFactor <= 1 && evictionFactor > 0;\r\n+        if (!factorInRange || Float.isNaN(evictionFactor)) {\r\n+            throw new IllegalArgumentException(\"Illegal eviction factor value:\"\r\n+                    + evictionFactor);\r\n+        }\r\n+        this.capacity = maxCapacity;\r\n+        this.evictionCount = (int) (capacity * evictionFactor);\r\n+        this.map = new HashMap<>();\r\n+        this.freqTable = new CacheDeque[capacity + 1];\r\n+        for (int i = 0; i <= capacity; i++) {\r\n+            freqTable[i] = new CacheDeque<>();\r\n+        }\r\n+        for (int i = 0; i < capacity; i++) {\r\n+            freqTable[i].nextDeque = freqTable[i + 1];\r\n+        }\r\n+        freqTable[capacity].nextDeque = freqTable[capacity];\r\n+    }\r\n+\r\n+    public int getCapacity() {\r\n+        return capacity;\r\n+    }\r\n+\r\n+    public V put(final K key, final V value) {\r\n+        CacheNode<K, V> node;\r\n+        lock.lock();\r\n+        try {\r\n+            node = map.get(key);\r\n+            if (node != null) {\r\n+                CacheNode.withdrawNode(node);\r\n+                node.value = value;\r\n+                freqTable[0].addLastNode(node);\r\n+                map.put(key, node);\r\n+            } else {\r\n+                node = freqTable[0].addLast(key, value);\r\n+                map.put(key, node);\r\n+                curSize++;\r\n+                if (curSize > capacity) {\r\n+                    proceedEviction();\r\n+                }\r\n+            }\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+        return node.value;\r\n+    }\r\n+\r\n+    public V remove(final K key) {\r\n+        CacheNode<K, V> node = null;\r\n+        lock.lock();\r\n+        try {\r\n+            if (map.containsKey(key)) {\r\n+                node = map.remove(key);\r\n+                if (node != null) {\r\n+                    CacheNode.withdrawNode(node);\r\n+                }\r\n+                curSize--;\r\n+            }\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+        return (node != null) ? node.value : null;\r\n+    }\r\n+\r\n+    public V get(final K key) {\r\n+        CacheNode<K, V> node = null;\r\n+        lock.lock();\r\n+        try {\r\n+            if (map.containsKey(key)) {\r\n+                node = map.get(key);\r\n+                CacheNode.withdrawNode(node);\r\n+                node.owner.nextDeque.addLastNode(node);\r\n+            }\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+        return (node != null) ? node.value : null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Evicts less frequently used elements corresponding to eviction factor,\r\n+     * specified at instantiation step.\r\n+     *\r\n+     * @return number of evicted elements\r\n+     */\r\n+    private int proceedEviction() {\r\n+        int targetSize = capacity - evictionCount;\r\n+        int evictedElements = 0;\r\n+\r\n+        FREQ_TABLE_ITER_LOOP:\r\n+        for (int i = 0; i <= capacity; i++) {\r\n+            CacheNode<K, V> node;\r\n+            while (!freqTable[i].isEmpty()) {\r\n+                node = freqTable[i].pollFirst();\r\n+                remove(node.key);\r\n+                if (targetSize >= curSize) {\r\n+                    break FREQ_TABLE_ITER_LOOP;\r\n+                }\r\n+                evictedElements++;\r\n+            }\r\n+        }\r\n+        return evictedElements;\r\n+    }\r\n+\r\n+    /**\r\n+     * Returns cache current size.\r\n+     *\r\n+     * @return cache size\r\n+     */\r\n+    public int getSize() {\r\n+        return curSize;\r\n+    }\r\n+\r\n+    static class CacheNode<K, V> {\r\n+\r\n+        CacheNode<K, V> prev;\r\n+        CacheNode<K, V> next;\r\n+        K key;\r\n+        V value;\r\n+        CacheDeque<K, V> owner;\r\n+\r\n+        CacheNode() {\r\n+        }\r\n+\r\n+        CacheNode(final K key, final V value) {\r\n+            this.key = key;\r\n+            this.value = value;\r\n+        }\r\n+\r\n+        /**\r\n+         * This method takes specified node and reattaches it neighbors nodes\r\n+         * links to each other, so specified node will no longer tied with them.\r\n+         * Returns united node, returns null if argument is null.\r\n+         *\r\n+         * @param node note to retrieve\r\n+         * @param <K>  key\r\n+         * @param <V>  value\r\n+         * @return retrieved node\r\n+         */\r\n+        static <K, V> CacheNode<K, V> withdrawNode(\r\n+                final CacheNode<K, V> node) {\r\n+            if (node != null && node.prev != null) {\r\n+                node.prev.next = node.next;\r\n+                if (node.next != null) {\r\n+                    node.next.prev = node.prev;\r\n+                }\r\n+            }\r\n+            return node;\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * Custom deque implementation of LIFO type. Allows to place element at top\r\n+     * of deque and poll very last added elements. An arbitrary node from the\r\n+     * deque can be removed with {@link CacheNode#withdrawNode(CacheNode)}\r\n+     * method.\r\n+     *\r\n+     * @param <K> key\r\n+     * @param <V> value\r\n+     */\r\n+    static class CacheDeque<K, V> {\r\n+\r\n+        CacheNode<K, V> last;\r\n+        CacheNode<K, V> first;\r\n+        CacheDeque<K, V> nextDeque;\r\n+\r\n+        /**\r\n+         * Constructs list and initializes last and first pointers.\r\n+         */\r\n+        CacheDeque() {\r\n+            last = new CacheNode<>();\r\n+            first = new CacheNode<>();\r\n+            last.next = first;\r\n+            first.prev = last;\r\n+        }\r\n+\r\n+        /**\r\n+         * Puts the node with specified key and value at the end of the deque\r\n+         * and returns node.\r\n+         *\r\n+         * @param key   key\r\n+         * @param value value\r\n+         * @return added node\r\n+         */\r\n+        CacheNode<K, V> addLast(final K key, final V value) {\r\n+            CacheNode<K, V> node = new CacheNode<>(key, value);\r\n+            node.owner = this;\r\n+            node.next = last.next;\r\n+            node.prev = last;\r\n+            node.next.prev = node;\r\n+            last.next = node;\r\n+            return node;\r\n+        }\r\n+\r\n+        CacheNode<K, V> addLastNode(final CacheNode<K, V> node) {\r\n+            node.owner = this;\r\n+            node.next = last.next;\r\n+            node.prev = last;\r\n+            node.next.prev = node;\r\n+            last.next = node;\r\n+            return node;\r\n+        }\r\n+\r\n+        /**\r\n+         * Retrieves and removes the first node of this deque.\r\n+         *\r\n+         * @return removed node\r\n+         */\r\n+        CacheNode<K, V> pollFirst() {\r\n+            CacheNode<K, V> node = null;\r\n+            if (first.prev != last) {\r\n+                node = first.prev;\r\n+                first.prev = node.prev;\r\n+                first.prev.next = first;\r\n+                node.prev = null;\r\n+                node.next = null;\r\n+            }\r\n+            return node;\r\n+        }\r\n+\r\n+        /**\r\n+         * Checks if link to the last node points to link to the first node.\r\n+         *\r\n+         * @return is deque empty\r\n+         */\r\n+        boolean isEmpty() {\r\n+            return last.next == first;\r\n+        }\r\n+\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/common/utils/MemberUtils.java", "source2": "org/apache/dubbo/common/utils/MemberUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,62 +1,62 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.reflect.Constructor;\n-import java.lang.reflect.Field;\n-import java.lang.reflect.Member;\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-\n-/**\n- * Java Reflection {@link Member} Utilities class\n- *\n- * @since 2.7.6\n- */\n-public interface MemberUtils {\n-\n-    /**\n-     * check the specified {@link Member member} is static or not ?\n-     *\n-     * @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}\n-     * @return Iff <code>member</code> is static one, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isStatic(Member member) {\n-        return member != null && Modifier.isStatic(member.getModifiers());\n-    }\n-\n-    /**\n-     * check the specified {@link Member member} is private or not ?\n-     *\n-     * @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}\n-     * @return Iff <code>member</code> is private one, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isPrivate(Member member) {\n-        return member != null && Modifier.isPrivate(member.getModifiers());\n-    }\n-\n-    /**\n-     * check the specified {@link Member member} is public or not ?\n-     *\n-     * @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}\n-     * @return Iff <code>member</code> is public one, return <code>true</code>, or <code>false</code>\n-     */\n-    static boolean isPublic(Member member) {\n-        return member != null && Modifier.isPublic(member.getModifiers());\n-    }\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.reflect.Constructor;\r\n+import java.lang.reflect.Field;\r\n+import java.lang.reflect.Member;\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+\r\n+/**\r\n+ * Java Reflection {@link Member} Utilities class\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public interface MemberUtils {\r\n+\r\n+    /**\r\n+     * check the specified {@link Member member} is static or not ?\r\n+     *\r\n+     * @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}\r\n+     * @return Iff <code>member</code> is static one, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isStatic(Member member) {\r\n+        return member != null && Modifier.isStatic(member.getModifiers());\r\n+    }\r\n+\r\n+    /**\r\n+     * check the specified {@link Member member} is private or not ?\r\n+     *\r\n+     * @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}\r\n+     * @return Iff <code>member</code> is private one, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isPrivate(Member member) {\r\n+        return member != null && Modifier.isPrivate(member.getModifiers());\r\n+    }\r\n+\r\n+    /**\r\n+     * check the specified {@link Member member} is public or not ?\r\n+     *\r\n+     * @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}\r\n+     * @return Iff <code>member</code> is public one, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    static boolean isPublic(Member member) {\r\n+        return member != null && Modifier.isPublic(member.getModifiers());\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/common/utils/MethodComparator.java", "source2": "org/apache/dubbo/common/utils/MethodComparator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.reflect.Method;\n-import java.util.Comparator;\n-\n-/**\n- * The Comparator class for {@link Method}, the comparison rule :\n- * <ol>\n- *     <li>Comparing to two {@link Method#getName() method names} {@link String#compareTo(String) lexicographically}.\n- *     If equals, go to step 2</li>\n- *     <li>Comparing to the count of two method parameters. If equals, go to step 3</li>\n- *     <li>Comparing to the type names of methods parameter {@link String#compareTo(String) lexicographically}</li>\n- * </ol>\n- *\n- * @since 2.7.6\n- */\n-public class MethodComparator implements Comparator<Method> {\n-\n-    public final static MethodComparator INSTANCE = new MethodComparator();\n-\n-    private MethodComparator() {\n-    }\n-\n-    @Override\n-    public int compare(Method m1, Method m2) {\n-\n-        if (m1.equals(m2)) {\n-            return 0;\n-        }\n-\n-        // Step 1\n-        String n1 = m1.getName();\n-        String n2 = m2.getName();\n-        int value = n1.compareTo(n2);\n-\n-        if (value == 0) { // Step 2\n-\n-            Class[] types1 = m1.getParameterTypes();\n-            Class[] types2 = m2.getParameterTypes();\n-\n-            value = types1.length - types2.length;\n-\n-            if (value == 0) { // Step 3\n-                for (int i = 0; i < types1.length; i++) {\n-                    value = types1[i].getName().compareTo(types2[i].getName());\n-                    if (value != 0) {\n-                        break;\n-                    }\n-                }\n-            }\n-        }\n-\n-        return Integer.compare(value, 0);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.util.Comparator;\r\n+\r\n+/**\r\n+ * The Comparator class for {@link Method}, the comparison rule :\r\n+ * <ol>\r\n+ *     <li>Comparing to two {@link Method#getName() method names} {@link String#compareTo(String) lexicographically}.\r\n+ *     If equals, go to step 2</li>\r\n+ *     <li>Comparing to the count of two method parameters. If equals, go to step 3</li>\r\n+ *     <li>Comparing to the type names of methods parameter {@link String#compareTo(String) lexicographically}</li>\r\n+ * </ol>\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public class MethodComparator implements Comparator<Method> {\r\n+\r\n+    public final static MethodComparator INSTANCE = new MethodComparator();\r\n+\r\n+    private MethodComparator() {\r\n+    }\r\n+\r\n+    @Override\r\n+    public int compare(Method m1, Method m2) {\r\n+\r\n+        if (m1.equals(m2)) {\r\n+            return 0;\r\n+        }\r\n+\r\n+        // Step 1\r\n+        String n1 = m1.getName();\r\n+        String n2 = m2.getName();\r\n+        int value = n1.compareTo(n2);\r\n+\r\n+        if (value == 0) { // Step 2\r\n+\r\n+            Class[] types1 = m1.getParameterTypes();\r\n+            Class[] types2 = m2.getParameterTypes();\r\n+\r\n+            value = types1.length - types2.length;\r\n+\r\n+            if (value == 0) { // Step 3\r\n+                for (int i = 0; i < types1.length; i++) {\r\n+                    value = types1[i].getName().compareTo(types2[i].getName());\r\n+                    if (value != 0) {\r\n+                        break;\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return Integer.compare(value, 0);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/MethodUtils.java", "source2": "org/apache/dubbo/common/utils/MethodUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,389 +1,389 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import javax.lang.model.element.ExecutableElement;\n-import javax.lang.model.element.TypeElement;\n-import javax.lang.model.util.Elements;\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Objects;\n-import java.util.function.Predicate;\n-\n-import static java.util.Collections.emptyList;\n-import static java.util.Collections.unmodifiableList;\n-import static org.apache.dubbo.common.function.Streams.filterAll;\n-import static org.apache.dubbo.common.utils.ClassUtils.getAllInheritedTypes;\n-import static org.apache.dubbo.common.utils.MemberUtils.isPrivate;\n-import static org.apache.dubbo.common.utils.MemberUtils.isStatic;\n-import static org.apache.dubbo.common.utils.ReflectUtils.EMPTY_CLASS_ARRAY;\n-import static org.apache.dubbo.common.utils.ReflectUtils.resolveTypes;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-\n-/**\n- * Miscellaneous method utility methods.\n- * Mainly for internal use within the framework.\n- *\n- * @since 2.7.2\n- */\n-public interface MethodUtils {\n-\n-    /**\n-     * Return {@code true} if the provided method is a set method.\n-     * Otherwise, return {@code false}.\n-     *\n-     * @param method the method to check\n-     * @return whether the given method is setter method\n-     */\n-    public static boolean isSetter(Method method) {\n-        return method.getName().startsWith(\"set\")\n-                && !\"set\".equals(method.getName())\n-                && Modifier.isPublic(method.getModifiers())\n-                && method.getParameterCount() == 1\n-                && ClassUtils.isPrimitive(method.getParameterTypes()[0]);\n-    }\n-\n-    /**\n-     * Return {@code true} if the provided method is a get method.\n-     * Otherwise, return {@code false}.\n-     *\n-     * @param method the method to check\n-     * @return whether the given method is getter method\n-     */\n-    public static boolean isGetter(Method method) {\n-        String name = method.getName();\n-        return (name.startsWith(\"get\") || name.startsWith(\"is\"))\n-                && !\"get\".equals(name) && !\"is\".equals(name)\n-                && !\"getClass\".equals(name) && !\"getObject\".equals(name)\n-                && Modifier.isPublic(method.getModifiers())\n-                && method.getParameterTypes().length == 0\n-                && ClassUtils.isPrimitive(method.getReturnType());\n-    }\n-\n-    /**\n-     * Return {@code true} If this method is a meta method.\n-     * Otherwise, return {@code false}.\n-     *\n-     * @param method the method to check\n-     * @return whether the given method is meta method\n-     */\n-    public static boolean isMetaMethod(Method method) {\n-        String name = method.getName();\n-        if (!(name.startsWith(\"get\") || name.startsWith(\"is\"))) {\n-            return false;\n-        }\n-        if (\"get\".equals(name)) {\n-            return false;\n-        }\n-        if (\"getClass\".equals(name)) {\n-            return false;\n-        }\n-        if (!Modifier.isPublic(method.getModifiers())) {\n-            return false;\n-        }\n-        if (method.getParameterTypes().length != 0) {\n-            return false;\n-        }\n-        if (!ClassUtils.isPrimitive(method.getReturnType())) {\n-            return false;\n-        }\n-        return true;\n-    }\n-\n-    /**\n-     * Check if the method is a deprecated method. The standard is whether the {@link java.lang.Deprecated} annotation is declared on the class.\n-     * Return {@code true} if this annotation is present.\n-     * Otherwise, return {@code false}.\n-     *\n-     * @param method the method to check\n-     * @return whether the given method is deprecated method\n-     */\n-    public static boolean isDeprecated(Method method) {\n-        return method.getAnnotation(Deprecated.class) != null;\n-    }\n-\n-\n-    /**\n-     * Create an instance of {@link Predicate} for {@link Method} to exclude the specified declared class\n-     *\n-     * @param declaredClass the declared class to exclude\n-     * @return non-null\n-     * @since 2.7.6\n-     */\n-    static Predicate<Method> excludedDeclaredClass(Class<?> declaredClass) {\n-        return method -> !Objects.equals(declaredClass, method.getDeclaringClass());\n-    }\n-\n-    /**\n-     * Get all {@link Method methods} of the declared class\n-     *\n-     * @param declaringClass        the declared class\n-     * @param includeInheritedTypes include the inherited types, e,g. super classes or interfaces\n-     * @param publicOnly            only public method\n-     * @param methodsToFilter       (optional) the methods to be filtered\n-     * @return non-null read-only {@link List}\n-     * @since 2.7.6\n-     */\n-    static List<Method> getMethods(Class<?> declaringClass, boolean includeInheritedTypes, boolean publicOnly,\n-                                   Predicate<Method>... methodsToFilter) {\n-\n-        if (declaringClass == null || declaringClass.isPrimitive()) {\n-            return emptyList();\n-        }\n-\n-        // All declared classes\n-        List<Class<?>> declaredClasses = new LinkedList<>();\n-        // Add the top declaring class\n-        declaredClasses.add(declaringClass);\n-        // If the super classes are resolved, all them into declaredClasses\n-        if (includeInheritedTypes) {\n-            declaredClasses.addAll(getAllInheritedTypes(declaringClass));\n-        }\n-\n-        // All methods\n-        List<Method> allMethods = new LinkedList<>();\n-\n-        for (Class<?> classToSearch : declaredClasses) {\n-            Method[] methods = publicOnly ? classToSearch.getMethods() : classToSearch.getDeclaredMethods();\n-            // Add the declared methods or public methods\n-            for (Method method : methods) {\n-                allMethods.add(method);\n-            }\n-        }\n-\n-        return unmodifiableList(filterAll(allMethods, methodsToFilter));\n-    }\n-\n-    /**\n-     * Get all declared {@link Method methods} of the declared class, excluding the inherited methods\n-     *\n-     * @param declaringClass  the declared class\n-     * @param methodsToFilter (optional) the methods to be filtered\n-     * @return non-null read-only {@link List}\n-     * @see #getMethods(Class, boolean, boolean, Predicate[])\n-     * @since 2.7.6\n-     */\n-    static List<Method> getDeclaredMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\n-        return getMethods(declaringClass, false, false, methodsToFilter);\n-    }\n-\n-    /**\n-     * Get all public {@link Method methods} of the declared class, including the inherited methods.\n-     *\n-     * @param declaringClass  the declared class\n-     * @param methodsToFilter (optional) the methods to be filtered\n-     * @return non-null read-only {@link List}\n-     * @see #getMethods(Class, boolean, boolean, Predicate[])\n-     * @since 2.7.6\n-     */\n-    static List<Method> getMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\n-        return getMethods(declaringClass, false, true, methodsToFilter);\n-    }\n-\n-    /**\n-     * Get all declared {@link Method methods} of the declared class, including the inherited methods.\n-     *\n-     * @param declaringClass  the declared class\n-     * @param methodsToFilter (optional) the methods to be filtered\n-     * @return non-null read-only {@link List}\n-     * @see #getMethods(Class, boolean, boolean, Predicate[])\n-     * @since 2.7.6\n-     */\n-    static List<Method> getAllDeclaredMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\n-        return getMethods(declaringClass, true, false, methodsToFilter);\n-    }\n-\n-    /**\n-     * Get all public {@link Method methods} of the declared class, including the inherited methods.\n-     *\n-     * @param declaringClass  the declared class\n-     * @param methodsToFilter (optional) the methods to be filtered\n-     * @return non-null read-only {@link List}\n-     * @see #getMethods(Class, boolean, boolean, Predicate[])\n-     * @since 2.7.6\n-     */\n-    static List<Method> getAllMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\n-        return getMethods(declaringClass, true, true, methodsToFilter);\n-    }\n-\n-//    static List<Method> getOverriderMethods(Class<?> implementationClass, Class<?>... superTypes) {\n-\n-//\n-\n-//    }\n-\n-    /**\n-     * Find the {@link Method} by the the specified type and method name without the parameter types\n-     *\n-     * @param type       the target type\n-     * @param methodName the specified method name\n-     * @return if not found, return <code>null</code>\n-     * @since 2.7.6\n-     */\n-    static Method findMethod(Class type, String methodName) {\n-        return findMethod(type, methodName, EMPTY_CLASS_ARRAY);\n-    }\n-\n-    /**\n-     * Find the {@link Method} by the the specified type, method name and parameter types\n-     *\n-     * @param type           the target type\n-     * @param methodName     the method name\n-     * @param parameterTypes the parameter types\n-     * @return if not found, return <code>null</code>\n-     * @since 2.7.6\n-     */\n-    static Method findMethod(Class type, String methodName, Class<?>... parameterTypes) {\n-        Method method = null;\n-        try {\n-            if (type != null && isNotEmpty(methodName)) {\n-                method = type.getDeclaredMethod(methodName, parameterTypes);\n-            }\n-        } catch (NoSuchMethodException e) {\n-        }\n-        return method;\n-    }\n-\n-    /**\n-     * Invoke the target object and method\n-     *\n-     * @param object           the target object\n-     * @param methodName       the method name\n-     * @param methodParameters the method parameters\n-     * @param <T>              the return type\n-     * @return the target method's execution result\n-     * @since 2.7.6\n-     */\n-    static <T> T invokeMethod(Object object, String methodName, Object... methodParameters) {\n-        Class type = object.getClass();\n-        Class[] parameterTypes = resolveTypes(methodParameters);\n-        Method method = findMethod(type, methodName, parameterTypes);\n-        T value = null;\n-\n-        try {\n-            ReflectUtils.makeAccessible(method);\n-            value = (T) method.invoke(object, methodParameters);\n-        } catch (Exception e) {\n-            throw new IllegalArgumentException(e);\n-        }\n-\n-        return value;\n-    }\n-\n-\n-    /**\n-     * Tests whether one method, as a member of a given type,\n-     * overrides another method.\n-     *\n-     * @param overrider  the first method, possible overrider\n-     * @param overridden the second method, possibly being overridden\n-     * @return {@code true} if and only if the first method overrides\n-     * the second\n-     * @jls 8.4.8 Inheritance, Overriding, and Hiding\n-     * @jls 9.4.1 Inheritance and Overriding\n-     * @see Elements#overrides(ExecutableElement, ExecutableElement, TypeElement)\n-     */\n-    static boolean overrides(Method overrider, Method overridden) {\n-\n-        if (overrider == null || overridden == null) {\n-            return false;\n-        }\n-\n-        // equality comparison: If two methods are same\n-        if (Objects.equals(overrider, overridden)) {\n-            return false;\n-        }\n-\n-        // Modifiers comparison: Any method must be non-static method\n-        if (isStatic(overrider) || isStatic(overridden)) { //\n-            return false;\n-        }\n-\n-        // Modifiers comparison: the accessibility of any method must not be private\n-        if (isPrivate(overrider) || isPrivate(overridden)) {\n-            return false;\n-        }\n-\n-        // Inheritance comparison: The declaring class of overrider must be inherit from the overridden's\n-        if (!overridden.getDeclaringClass().isAssignableFrom(overrider.getDeclaringClass())) {\n-            return false;\n-        }\n-\n-        // Method comparison: must not be \"default\" method\n-        if (overrider.isDefault()) {\n-            return false;\n-        }\n-\n-        // Method comparison: The method name must be equal\n-        if (!Objects.equals(overrider.getName(), overridden.getName())) {\n-            return false;\n-        }\n-\n-        // Method comparison: The count of method parameters must be equal\n-        if (!Objects.equals(overrider.getParameterCount(), overridden.getParameterCount())) {\n-            return false;\n-        }\n-\n-        // Method comparison: Any parameter type of overrider must equal the overridden's\n-        for (int i = 0; i < overrider.getParameterCount(); i++) {\n-            if (!Objects.equals(overridden.getParameterTypes()[i], overrider.getParameterTypes()[i])) {\n-                return false;\n-            }\n-        }\n-\n-        // Method comparison: The return type of overrider must be inherit from the overridden's\n-        if (!overridden.getReturnType().isAssignableFrom(overrider.getReturnType())) {\n-            return false;\n-        }\n-\n-        // Throwable comparison: \"throws\" Throwable list will be ignored, trust the compiler verify\n-\n-        return true;\n-    }\n-\n-    /**\n-     * Find the nearest overridden {@link Method method} from the inherited class\n-     *\n-     * @param overrider the overrider {@link Method method}\n-     * @return if found, the overrider <code>method</code>, or <code>null</code>\n-     */\n-    static Method findNearestOverriddenMethod(Method overrider) {\n-        Class<?> declaringClass = overrider.getDeclaringClass();\n-        Method overriddenMethod = null;\n-        for (Class<?> inheritedType : getAllInheritedTypes(declaringClass)) {\n-            overriddenMethod = findOverriddenMethod(overrider, inheritedType);\n-            if (overriddenMethod != null) {\n-                break;\n-            }\n-        }\n-        return overriddenMethod;\n-    }\n-\n-    /**\n-     * Find the overridden {@link Method method} from the declaring class\n-     *\n-     * @param overrider      the overrider {@link Method method}\n-     * @param declaringClass the class that is declaring the overridden {@link Method method}\n-     * @return if found, the overrider <code>method</code>, or <code>null</code>\n-     */\n-    static Method findOverriddenMethod(Method overrider, Class<?> declaringClass) {\n-        List<Method> matchedMethods = getAllMethods(declaringClass, method -> overrides(overrider, method));\n-        return matchedMethods.isEmpty() ? null : matchedMethods.get(0);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import javax.lang.model.element.ExecutableElement;\r\n+import javax.lang.model.element.TypeElement;\r\n+import javax.lang.model.util.Elements;\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Objects;\r\n+import java.util.function.Predicate;\r\n+\r\n+import static java.util.Collections.emptyList;\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static org.apache.dubbo.common.function.Streams.filterAll;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.getAllInheritedTypes;\r\n+import static org.apache.dubbo.common.utils.MemberUtils.isPrivate;\r\n+import static org.apache.dubbo.common.utils.MemberUtils.isStatic;\r\n+import static org.apache.dubbo.common.utils.ReflectUtils.EMPTY_CLASS_ARRAY;\r\n+import static org.apache.dubbo.common.utils.ReflectUtils.resolveTypes;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+\r\n+/**\r\n+ * Miscellaneous method utility methods.\r\n+ * Mainly for internal use within the framework.\r\n+ *\r\n+ * @since 2.7.2\r\n+ */\r\n+public interface MethodUtils {\r\n+\r\n+    /**\r\n+     * Return {@code true} if the provided method is a set method.\r\n+     * Otherwise, return {@code false}.\r\n+     *\r\n+     * @param method the method to check\r\n+     * @return whether the given method is setter method\r\n+     */\r\n+    public static boolean isSetter(Method method) {\r\n+        return method.getName().startsWith(\"set\")\r\n+                && !\"set\".equals(method.getName())\r\n+                && Modifier.isPublic(method.getModifiers())\r\n+                && method.getParameterCount() == 1\r\n+                && ClassUtils.isPrimitive(method.getParameterTypes()[0]);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return {@code true} if the provided method is a get method.\r\n+     * Otherwise, return {@code false}.\r\n+     *\r\n+     * @param method the method to check\r\n+     * @return whether the given method is getter method\r\n+     */\r\n+    public static boolean isGetter(Method method) {\r\n+        String name = method.getName();\r\n+        return (name.startsWith(\"get\") || name.startsWith(\"is\"))\r\n+                && !\"get\".equals(name) && !\"is\".equals(name)\r\n+                && !\"getClass\".equals(name) && !\"getObject\".equals(name)\r\n+                && Modifier.isPublic(method.getModifiers())\r\n+                && method.getParameterTypes().length == 0\r\n+                && ClassUtils.isPrimitive(method.getReturnType());\r\n+    }\r\n+\r\n+    /**\r\n+     * Return {@code true} If this method is a meta method.\r\n+     * Otherwise, return {@code false}.\r\n+     *\r\n+     * @param method the method to check\r\n+     * @return whether the given method is meta method\r\n+     */\r\n+    public static boolean isMetaMethod(Method method) {\r\n+        String name = method.getName();\r\n+        if (!(name.startsWith(\"get\") || name.startsWith(\"is\"))) {\r\n+            return false;\r\n+        }\r\n+        if (\"get\".equals(name)) {\r\n+            return false;\r\n+        }\r\n+        if (\"getClass\".equals(name)) {\r\n+            return false;\r\n+        }\r\n+        if (!Modifier.isPublic(method.getModifiers())) {\r\n+            return false;\r\n+        }\r\n+        if (method.getParameterTypes().length != 0) {\r\n+            return false;\r\n+        }\r\n+        if (!ClassUtils.isPrimitive(method.getReturnType())) {\r\n+            return false;\r\n+        }\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check if the method is a deprecated method. The standard is whether the {@link java.lang.Deprecated} annotation is declared on the class.\r\n+     * Return {@code true} if this annotation is present.\r\n+     * Otherwise, return {@code false}.\r\n+     *\r\n+     * @param method the method to check\r\n+     * @return whether the given method is deprecated method\r\n+     */\r\n+    public static boolean isDeprecated(Method method) {\r\n+        return method.getAnnotation(Deprecated.class) != null;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Create an instance of {@link Predicate} for {@link Method} to exclude the specified declared class\r\n+     *\r\n+     * @param declaredClass the declared class to exclude\r\n+     * @return non-null\r\n+     * @since 2.7.6\r\n+     */\r\n+    static Predicate<Method> excludedDeclaredClass(Class<?> declaredClass) {\r\n+        return method -> !Objects.equals(declaredClass, method.getDeclaringClass());\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all {@link Method methods} of the declared class\r\n+     *\r\n+     * @param declaringClass        the declared class\r\n+     * @param includeInheritedTypes include the inherited types, e,g. super classes or interfaces\r\n+     * @param publicOnly            only public method\r\n+     * @param methodsToFilter       (optional) the methods to be filtered\r\n+     * @return non-null read-only {@link List}\r\n+     * @since 2.7.6\r\n+     */\r\n+    static List<Method> getMethods(Class<?> declaringClass, boolean includeInheritedTypes, boolean publicOnly,\r\n+                                   Predicate<Method>... methodsToFilter) {\r\n+\r\n+        if (declaringClass == null || declaringClass.isPrimitive()) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        // All declared classes\r\n+        List<Class<?>> declaredClasses = new LinkedList<>();\r\n+        // Add the top declaring class\r\n+        declaredClasses.add(declaringClass);\r\n+        // If the super classes are resolved, all them into declaredClasses\r\n+        if (includeInheritedTypes) {\r\n+            declaredClasses.addAll(getAllInheritedTypes(declaringClass));\r\n+        }\r\n+\r\n+        // All methods\r\n+        List<Method> allMethods = new LinkedList<>();\r\n+\r\n+        for (Class<?> classToSearch : declaredClasses) {\r\n+            Method[] methods = publicOnly ? classToSearch.getMethods() : classToSearch.getDeclaredMethods();\r\n+            // Add the declared methods or public methods\r\n+            for (Method method : methods) {\r\n+                allMethods.add(method);\r\n+            }\r\n+        }\r\n+\r\n+        return unmodifiableList(filterAll(allMethods, methodsToFilter));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all declared {@link Method methods} of the declared class, excluding the inherited methods\r\n+     *\r\n+     * @param declaringClass  the declared class\r\n+     * @param methodsToFilter (optional) the methods to be filtered\r\n+     * @return non-null read-only {@link List}\r\n+     * @see #getMethods(Class, boolean, boolean, Predicate[])\r\n+     * @since 2.7.6\r\n+     */\r\n+    static List<Method> getDeclaredMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\r\n+        return getMethods(declaringClass, false, false, methodsToFilter);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all public {@link Method methods} of the declared class, including the inherited methods.\r\n+     *\r\n+     * @param declaringClass  the declared class\r\n+     * @param methodsToFilter (optional) the methods to be filtered\r\n+     * @return non-null read-only {@link List}\r\n+     * @see #getMethods(Class, boolean, boolean, Predicate[])\r\n+     * @since 2.7.6\r\n+     */\r\n+    static List<Method> getMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\r\n+        return getMethods(declaringClass, false, true, methodsToFilter);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all declared {@link Method methods} of the declared class, including the inherited methods.\r\n+     *\r\n+     * @param declaringClass  the declared class\r\n+     * @param methodsToFilter (optional) the methods to be filtered\r\n+     * @return non-null read-only {@link List}\r\n+     * @see #getMethods(Class, boolean, boolean, Predicate[])\r\n+     * @since 2.7.6\r\n+     */\r\n+    static List<Method> getAllDeclaredMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\r\n+        return getMethods(declaringClass, true, false, methodsToFilter);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all public {@link Method methods} of the declared class, including the inherited methods.\r\n+     *\r\n+     * @param declaringClass  the declared class\r\n+     * @param methodsToFilter (optional) the methods to be filtered\r\n+     * @return non-null read-only {@link List}\r\n+     * @see #getMethods(Class, boolean, boolean, Predicate[])\r\n+     * @since 2.7.6\r\n+     */\r\n+    static List<Method> getAllMethods(Class<?> declaringClass, Predicate<Method>... methodsToFilter) {\r\n+        return getMethods(declaringClass, true, true, methodsToFilter);\r\n+    }\r\n+\r\n+//    static List<Method> getOverriderMethods(Class<?> implementationClass, Class<?>... superTypes) {\r\n+\r\n+//\r\n+\r\n+//    }\r\n+\r\n+    /**\r\n+     * Find the {@link Method} by the the specified type and method name without the parameter types\r\n+     *\r\n+     * @param type       the target type\r\n+     * @param methodName the specified method name\r\n+     * @return if not found, return <code>null</code>\r\n+     * @since 2.7.6\r\n+     */\r\n+    static Method findMethod(Class type, String methodName) {\r\n+        return findMethod(type, methodName, EMPTY_CLASS_ARRAY);\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link Method} by the the specified type, method name and parameter types\r\n+     *\r\n+     * @param type           the target type\r\n+     * @param methodName     the method name\r\n+     * @param parameterTypes the parameter types\r\n+     * @return if not found, return <code>null</code>\r\n+     * @since 2.7.6\r\n+     */\r\n+    static Method findMethod(Class type, String methodName, Class<?>... parameterTypes) {\r\n+        Method method = null;\r\n+        try {\r\n+            if (type != null && isNotEmpty(methodName)) {\r\n+                method = type.getDeclaredMethod(methodName, parameterTypes);\r\n+            }\r\n+        } catch (NoSuchMethodException e) {\r\n+        }\r\n+        return method;\r\n+    }\r\n+\r\n+    /**\r\n+     * Invoke the target object and method\r\n+     *\r\n+     * @param object           the target object\r\n+     * @param methodName       the method name\r\n+     * @param methodParameters the method parameters\r\n+     * @param <T>              the return type\r\n+     * @return the target method's execution result\r\n+     * @since 2.7.6\r\n+     */\r\n+    static <T> T invokeMethod(Object object, String methodName, Object... methodParameters) {\r\n+        Class type = object.getClass();\r\n+        Class[] parameterTypes = resolveTypes(methodParameters);\r\n+        Method method = findMethod(type, methodName, parameterTypes);\r\n+        T value = null;\r\n+\r\n+        try {\r\n+            ReflectUtils.makeAccessible(method);\r\n+            value = (T) method.invoke(object, methodParameters);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalArgumentException(e);\r\n+        }\r\n+\r\n+        return value;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Tests whether one method, as a member of a given type,\r\n+     * overrides another method.\r\n+     *\r\n+     * @param overrider  the first method, possible overrider\r\n+     * @param overridden the second method, possibly being overridden\r\n+     * @return {@code true} if and only if the first method overrides\r\n+     * the second\r\n+     * @jls 8.4.8 Inheritance, Overriding, and Hiding\r\n+     * @jls 9.4.1 Inheritance and Overriding\r\n+     * @see Elements#overrides(ExecutableElement, ExecutableElement, TypeElement)\r\n+     */\r\n+    static boolean overrides(Method overrider, Method overridden) {\r\n+\r\n+        if (overrider == null || overridden == null) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // equality comparison: If two methods are same\r\n+        if (Objects.equals(overrider, overridden)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Modifiers comparison: Any method must be non-static method\r\n+        if (isStatic(overrider) || isStatic(overridden)) { //\r\n+            return false;\r\n+        }\r\n+\r\n+        // Modifiers comparison: the accessibility of any method must not be private\r\n+        if (isPrivate(overrider) || isPrivate(overridden)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Inheritance comparison: The declaring class of overrider must be inherit from the overridden's\r\n+        if (!overridden.getDeclaringClass().isAssignableFrom(overrider.getDeclaringClass())) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Method comparison: must not be \"default\" method\r\n+        if (overrider.isDefault()) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Method comparison: The method name must be equal\r\n+        if (!Objects.equals(overrider.getName(), overridden.getName())) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Method comparison: The count of method parameters must be equal\r\n+        if (!Objects.equals(overrider.getParameterCount(), overridden.getParameterCount())) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Method comparison: Any parameter type of overrider must equal the overridden's\r\n+        for (int i = 0; i < overrider.getParameterCount(); i++) {\r\n+            if (!Objects.equals(overridden.getParameterTypes()[i], overrider.getParameterTypes()[i])) {\r\n+                return false;\r\n+            }\r\n+        }\r\n+\r\n+        // Method comparison: The return type of overrider must be inherit from the overridden's\r\n+        if (!overridden.getReturnType().isAssignableFrom(overrider.getReturnType())) {\r\n+            return false;\r\n+        }\r\n+\r\n+        // Throwable comparison: \"throws\" Throwable list will be ignored, trust the compiler verify\r\n+\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the nearest overridden {@link Method method} from the inherited class\r\n+     *\r\n+     * @param overrider the overrider {@link Method method}\r\n+     * @return if found, the overrider <code>method</code>, or <code>null</code>\r\n+     */\r\n+    static Method findNearestOverriddenMethod(Method overrider) {\r\n+        Class<?> declaringClass = overrider.getDeclaringClass();\r\n+        Method overriddenMethod = null;\r\n+        for (Class<?> inheritedType : getAllInheritedTypes(declaringClass)) {\r\n+            overriddenMethod = findOverriddenMethod(overrider, inheritedType);\r\n+            if (overriddenMethod != null) {\r\n+                break;\r\n+            }\r\n+        }\r\n+        return overriddenMethod;\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the overridden {@link Method method} from the declaring class\r\n+     *\r\n+     * @param overrider      the overrider {@link Method method}\r\n+     * @param declaringClass the class that is declaring the overridden {@link Method method}\r\n+     * @return if found, the overrider <code>method</code>, or <code>null</code>\r\n+     */\r\n+    static Method findOverriddenMethod(Method overrider, Class<?> declaringClass) {\r\n+        List<Method> matchedMethods = getAllMethods(declaringClass, method -> overrides(overrider, method));\r\n+        return matchedMethods.isEmpty() ? null : matchedMethods.get(0);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/Page.java", "source2": "org/apache/dubbo/common/utils/Page.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,87 +1,87 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.util.List;\n-\n-/**\n- * The model class of pagination\n- *\n- * @since 2.7.5\n- */\n-public interface Page<T> {\n-\n-    /**\n-     * Gets the offset of request\n-     *\n-     * @return positive integer\n-     */\n-    int getOffset();\n-\n-    /**\n-     * Gets the size of request for pagination query\n-     *\n-     * @return positive integer\n-     */\n-    int getPageSize();\n-\n-    /**\n-     * Gets the total amount of elements.\n-     *\n-     * @return the total amount of elements\n-     */\n-    int getTotalSize();\n-\n-    /**\n-     * Get the number of total pages.\n-     *\n-     * @return the number of total pages.\n-     */\n-    int getTotalPages();\n-\n-    /**\n-     * The data of current page\n-     *\n-     * @return non-null {@link List}\n-     */\n-    List<T> getData();\n-\n-    /**\n-     * The size of {@link #getData() data}\n-     *\n-     * @return positive integer\n-     */\n-    default int getDataSize() {\n-        return getData().size();\n-    }\n-\n-    /**\n-     * It indicates has next page or not\n-     *\n-     * @return if has , return <code>true</code>, or <code>false</code>\n-     */\n-    boolean hasNext();\n-\n-    /**\n-     * Returns whether the page has data at all.\n-     *\n-     * @return\n-     */\n-    default boolean hasData() {\n-        return getDataSize() > 0;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The model class of pagination\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface Page<T> {\r\n+\r\n+    /**\r\n+     * Gets the offset of request\r\n+     *\r\n+     * @return positive integer\r\n+     */\r\n+    int getOffset();\r\n+\r\n+    /**\r\n+     * Gets the size of request for pagination query\r\n+     *\r\n+     * @return positive integer\r\n+     */\r\n+    int getPageSize();\r\n+\r\n+    /**\r\n+     * Gets the total amount of elements.\r\n+     *\r\n+     * @return the total amount of elements\r\n+     */\r\n+    int getTotalSize();\r\n+\r\n+    /**\r\n+     * Get the number of total pages.\r\n+     *\r\n+     * @return the number of total pages.\r\n+     */\r\n+    int getTotalPages();\r\n+\r\n+    /**\r\n+     * The data of current page\r\n+     *\r\n+     * @return non-null {@link List}\r\n+     */\r\n+    List<T> getData();\r\n+\r\n+    /**\r\n+     * The size of {@link #getData() data}\r\n+     *\r\n+     * @return positive integer\r\n+     */\r\n+    default int getDataSize() {\r\n+        return getData().size();\r\n+    }\r\n+\r\n+    /**\r\n+     * It indicates has next page or not\r\n+     *\r\n+     * @return if has , return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean hasNext();\r\n+\r\n+    /**\r\n+     * Returns whether the page has data at all.\r\n+     *\r\n+     * @return\r\n+     */\r\n+    default boolean hasData() {\r\n+        return getDataSize() > 0;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/PathUtils.java", "source2": "org/apache/dubbo/common/utils/PathUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,74 +1,74 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.util.LinkedHashSet;\n-import java.util.Set;\n-import java.util.stream.Collectors;\n-\n-import static java.util.Arrays.asList;\n-import static org.apache.dubbo.common.utils.StringUtils.QUESTION_MASK;\n-import static org.apache.dubbo.common.utils.StringUtils.SLASH;\n-import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.StringUtils.replace;\n-\n-/**\n- * Path Utilities class\n- *\n- * @since 2.7.6\n- */\n-public interface PathUtils {\n-\n-    static String buildPath(String rootPath, String... subPaths) {\n-\n-        Set<String> paths = new LinkedHashSet<>();\n-        paths.add(rootPath);\n-        paths.addAll(asList(subPaths));\n-\n-        return normalize(paths.stream()\n-                .filter(StringUtils::isNotEmpty)\n-                .collect(Collectors.joining(SLASH)));\n-    }\n-\n-    /**\n-     * Normalize path:\n-     * <ol>\n-     * <li>To remove query string if presents</li>\n-     * <li>To remove duplicated slash(\"/\") if exists</li>\n-     * </ol>\n-     *\n-     * @param path path to be normalized\n-     * @return a normalized path if required\n-     */\n-    static String normalize(String path) {\n-        if (isEmpty(path)) {\n-            return SLASH;\n-        }\n-        String normalizedPath = path;\n-        int index = normalizedPath.indexOf(QUESTION_MASK);\n-        if (index > -1) {\n-            normalizedPath = normalizedPath.substring(0, index);\n-        }\n-\n-        while (normalizedPath.contains(\"//\")) {\n-            normalizedPath = replace(normalizedPath, \"//\", \"/\");\n-        }\n-\n-        return normalizedPath;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.util.LinkedHashSet;\r\n+import java.util.Set;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static org.apache.dubbo.common.utils.StringUtils.QUESTION_MASK;\r\n+import static org.apache.dubbo.common.utils.StringUtils.SLASH;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.replace;\r\n+\r\n+/**\r\n+ * Path Utilities class\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public interface PathUtils {\r\n+\r\n+    static String buildPath(String rootPath, String... subPaths) {\r\n+\r\n+        Set<String> paths = new LinkedHashSet<>();\r\n+        paths.add(rootPath);\r\n+        paths.addAll(asList(subPaths));\r\n+\r\n+        return normalize(paths.stream()\r\n+                .filter(StringUtils::isNotEmpty)\r\n+                .collect(Collectors.joining(SLASH)));\r\n+    }\r\n+\r\n+    /**\r\n+     * Normalize path:\r\n+     * <ol>\r\n+     * <li>To remove query string if presents</li>\r\n+     * <li>To remove duplicated slash(\"/\") if exists</li>\r\n+     * </ol>\r\n+     *\r\n+     * @param path path to be normalized\r\n+     * @return a normalized path if required\r\n+     */\r\n+    static String normalize(String path) {\r\n+        if (isEmpty(path)) {\r\n+            return SLASH;\r\n+        }\r\n+        String normalizedPath = path;\r\n+        int index = normalizedPath.indexOf(QUESTION_MASK);\r\n+        if (index > -1) {\r\n+            normalizedPath = normalizedPath.substring(0, index);\r\n+        }\r\n+\r\n+        while (normalizedPath.contains(\"//\")) {\r\n+            normalizedPath = replace(normalizedPath, \"//\", \"/\");\r\n+        }\r\n+\r\n+        return normalizedPath;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/ReflectUtils.java", "source2": "org/apache/dubbo/common/utils/ReflectUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,1395 +1,1395 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import javassist.CtClass;\n-import javassist.CtConstructor;\n-import javassist.CtMethod;\n-import javassist.NotFoundException;\n-\n-import java.beans.BeanInfo;\n-import java.beans.Introspector;\n-import java.lang.reflect.Array;\n-import java.lang.reflect.Constructor;\n-import java.lang.reflect.Field;\n-import java.lang.reflect.GenericArrayType;\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.lang.reflect.ParameterizedType;\n-import java.lang.reflect.Type;\n-import java.lang.reflect.TypeVariable;\n-import java.net.URL;\n-import java.security.CodeSource;\n-import java.security.ProtectionDomain;\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.Date;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.LinkedHashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.Future;\n-import java.util.regex.Matcher;\n-import java.util.regex.Pattern;\n-import java.util.stream.Collectors;\n-import java.util.stream.Stream;\n-\n-import static java.util.Arrays.asList;\n-import static java.util.Collections.unmodifiableSet;\n-import static org.apache.dubbo.common.utils.ArrayUtils.isEmpty;\n-\n-/**\n- * ReflectUtils\n- */\n-public final class ReflectUtils {\n-\n-    /**\n-     * void(V).\n-     */\n-    public static final char JVM_VOID = 'V';\n-\n-    /**\n-     * boolean(Z).\n-     */\n-    public static final char JVM_BOOLEAN = 'Z';\n-\n-    /**\n-     * byte(B).\n-     */\n-    public static final char JVM_BYTE = 'B';\n-\n-    /**\n-     * char(C).\n-     */\n-    public static final char JVM_CHAR = 'C';\n-\n-    /**\n-     * double(D).\n-     */\n-    public static final char JVM_DOUBLE = 'D';\n-\n-    /**\n-     * float(F).\n-     */\n-    public static final char JVM_FLOAT = 'F';\n-\n-    /**\n-     * int(I).\n-     */\n-    public static final char JVM_INT = 'I';\n-\n-    /**\n-     * long(J).\n-     */\n-    public static final char JVM_LONG = 'J';\n-\n-    /**\n-     * short(S).\n-     */\n-    public static final char JVM_SHORT = 'S';\n-\n-    public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0];\n-\n-    public static final String JAVA_IDENT_REGEX = \"(?:[_$a-zA-Z][_$a-zA-Z0-9]*)\";\n-\n-    public static final String JAVA_NAME_REGEX = \"(?:\" + JAVA_IDENT_REGEX + \"(?:\\\\.\" + JAVA_IDENT_REGEX + \")*)\";\n-\n-    public static final String CLASS_DESC = \"(?:L\" + JAVA_IDENT_REGEX + \"(?:\\\\/\" + JAVA_IDENT_REGEX + \")*;)\";\n-\n-    public static final String ARRAY_DESC = \"(?:\\\\[+(?:(?:[VZBCDFIJS])|\" + CLASS_DESC + \"))\";\n-\n-    public static final String DESC_REGEX = \"(?:(?:[VZBCDFIJS])|\" + CLASS_DESC + \"|\" + ARRAY_DESC + \")\";\n-\n-    public static final Pattern DESC_PATTERN = Pattern.compile(DESC_REGEX);\n-\n-    public static final String METHOD_DESC_REGEX = \"(?:(\" + JAVA_IDENT_REGEX + \")?\\\\((\" + DESC_REGEX + \"*)\\\\)(\" + DESC_REGEX + \")?)\";\n-\n-    public static final Pattern METHOD_DESC_PATTERN = Pattern.compile(METHOD_DESC_REGEX);\n-\n-    public static final Pattern GETTER_METHOD_DESC_PATTERN = Pattern.compile(\"get([A-Z][_a-zA-Z0-9]*)\\\\(\\\\)(\" + DESC_REGEX + \")\");\n-\n-    public static final Pattern SETTER_METHOD_DESC_PATTERN = Pattern.compile(\"set([A-Z][_a-zA-Z0-9]*)\\\\((\" + DESC_REGEX + \")\\\\)V\");\n-\n-    public static final Pattern IS_HAS_CAN_METHOD_DESC_PATTERN = Pattern.compile(\"(?:is|has|can)([A-Z][_a-zA-Z0-9]*)\\\\(\\\\)Z\");\n-\n-    private static final ConcurrentMap<String, Class<?>> DESC_CLASS_CACHE = new ConcurrentHashMap<String, Class<?>>();\n-\n-    private static final ConcurrentMap<String, Class<?>> NAME_CLASS_CACHE = new ConcurrentHashMap<String, Class<?>>();\n-\n-    private static final ConcurrentMap<String, Method> SIGNATURE_METHODS_CACHE = new ConcurrentHashMap<String, Method>();\n-\n-    private static Map<Class<?>, Object> primitiveDefaults = new HashMap<>();\n-\n-    static {\n-        primitiveDefaults.put(int.class, 0);\n-        primitiveDefaults.put(long.class, 0L);\n-        primitiveDefaults.put(byte.class, (byte) 0);\n-        primitiveDefaults.put(char.class, (char) 0);\n-        primitiveDefaults.put(short.class, (short) 0);\n-        primitiveDefaults.put(float.class, (float) 0);\n-        primitiveDefaults.put(double.class, (double) 0);\n-        primitiveDefaults.put(boolean.class, false);\n-        primitiveDefaults.put(void.class, null);\n-    }\n-\n-    private ReflectUtils() {\n-    }\n-\n-    public static boolean isPrimitives(Class<?> cls) {\n-        while (cls.isArray()) {\n-            cls = cls.getComponentType();\n-        }\n-        return isPrimitive(cls);\n-    }\n-\n-    public static boolean isPrimitive(Class<?> cls) {\n-        return cls.isPrimitive() || cls == String.class || cls == Boolean.class || cls == Character.class\n-                || Number.class.isAssignableFrom(cls) || Date.class.isAssignableFrom(cls);\n-    }\n-\n-    public static Class<?> getBoxedClass(Class<?> c) {\n-        if (c == int.class) {\n-            c = Integer.class;\n-        } else if (c == boolean.class) {\n-            c = Boolean.class;\n-        } else if (c == long.class) {\n-            c = Long.class;\n-        } else if (c == float.class) {\n-            c = Float.class;\n-        } else if (c == double.class) {\n-            c = Double.class;\n-        } else if (c == char.class) {\n-            c = Character.class;\n-        } else if (c == byte.class) {\n-            c = Byte.class;\n-        } else if (c == short.class) {\n-            c = Short.class;\n-        }\n-        return c;\n-    }\n-\n-    /**\n-     * is compatible.\n-     *\n-     * @param c class.\n-     * @param o instance.\n-     * @return compatible or not.\n-     */\n-    public static boolean isCompatible(Class<?> c, Object o) {\n-        boolean pt = c.isPrimitive();\n-        if (o == null) {\n-            return !pt;\n-        }\n-\n-        if (pt) {\n-            c = getBoxedClass(c);\n-        }\n-\n-        return c == o.getClass() || c.isInstance(o);\n-    }\n-\n-    /**\n-     * is compatible.\n-     *\n-     * @param cs class array.\n-     * @param os object array.\n-     * @return compatible or not.\n-     */\n-    public static boolean isCompatible(Class<?>[] cs, Object[] os) {\n-        int len = cs.length;\n-        if (len != os.length) {\n-            return false;\n-        }\n-        if (len == 0) {\n-            return true;\n-        }\n-        for (int i = 0; i < len; i++) {\n-            if (!isCompatible(cs[i], os[i])) {\n-                return false;\n-            }\n-        }\n-        return true;\n-    }\n-\n-    public static String getCodeBase(Class<?> cls) {\n-        if (cls == null) {\n-            return null;\n-        }\n-        ProtectionDomain domain = cls.getProtectionDomain();\n-        if (domain == null) {\n-            return null;\n-        }\n-        CodeSource source = domain.getCodeSource();\n-        if (source == null) {\n-            return null;\n-        }\n-        URL location = source.getLocation();\n-        if (location == null) {\n-            return null;\n-        }\n-        return location.getFile();\n-    }\n-\n-    /**\n-     * get name.\n-     * java.lang.Object[][].class => \"java.lang.Object[][]\"\n-     *\n-     * @param c class.\n-     * @return name.\n-     */\n-    public static String getName(Class<?> c) {\n-        if (c.isArray()) {\n-            StringBuilder sb = new StringBuilder();\n-            do {\n-                sb.append(\"[]\");\n-                c = c.getComponentType();\n-            }\n-            while (c.isArray());\n-\n-            return c.getName() + sb.toString();\n-        }\n-        return c.getName();\n-    }\n-\n-    public static Class<?> getGenericClass(Class<?> cls) {\n-        return getGenericClass(cls, 0);\n-    }\n-\n-    public static Class<?> getGenericClass(Class<?> cls, int i) {\n-        try {\n-            ParameterizedType parameterizedType = ((ParameterizedType) cls.getGenericInterfaces()[0]);\n-            Object genericClass = parameterizedType.getActualTypeArguments()[i];\n-\n-            // handle nested generic type\n-            if (genericClass instanceof ParameterizedType) {\n-                return (Class<?>) ((ParameterizedType) genericClass).getRawType();\n-            }\n-\n-            // handle array generic type\n-            if (genericClass instanceof GenericArrayType) {\n-                return (Class<?>) ((GenericArrayType) genericClass).getGenericComponentType();\n-            }\n-\n-            // Requires JDK 7 or higher, Foo<int[]> is no longer GenericArrayType\n-            if (((Class) genericClass).isArray()) {\n-                return ((Class) genericClass).getComponentType();\n-            }\n-            return (Class<?>) genericClass;\n-        } catch (Throwable e) {\n-            throw new IllegalArgumentException(cls.getName() + \" generic type undefined!\", e);\n-        }\n-    }\n-\n-    /**\n-     * get method name.\n-     * \"void do(int)\", \"void do()\", \"int do(java.lang.String,boolean)\"\n-     *\n-     * @param m method.\n-     * @return name.\n-     */\n-    public static String getName(final Method m) {\n-        StringBuilder ret = new StringBuilder();\n-        ret.append(getName(m.getReturnType())).append(' ');\n-        ret.append(m.getName()).append('(');\n-        Class<?>[] parameterTypes = m.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            if (i > 0) {\n-                ret.append(',');\n-            }\n-            ret.append(getName(parameterTypes[i]));\n-        }\n-        ret.append(')');\n-        return ret.toString();\n-    }\n-\n-    public static String getSignature(String methodName, Class<?>[] parameterTypes) {\n-        StringBuilder sb = new StringBuilder(methodName);\n-        sb.append(\"(\");\n-        if (parameterTypes != null && parameterTypes.length > 0) {\n-            boolean first = true;\n-            for (Class<?> type : parameterTypes) {\n-                if (first) {\n-                    first = false;\n-                } else {\n-                    sb.append(\",\");\n-                }\n-                sb.append(type.getName());\n-            }\n-        }\n-        sb.append(\")\");\n-        return sb.toString();\n-    }\n-\n-    /**\n-     * get constructor name.\n-     * \"()\", \"(java.lang.String,int)\"\n-     *\n-     * @param c constructor.\n-     * @return name.\n-     */\n-    public static String getName(final Constructor<?> c) {\n-        StringBuilder ret = new StringBuilder(\"(\");\n-        Class<?>[] parameterTypes = c.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            if (i > 0) {\n-                ret.append(',');\n-            }\n-            ret.append(getName(parameterTypes[i]));\n-        }\n-        ret.append(')');\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get class desc.\n-     * boolean[].class => \"[Z\"\n-     * Object.class => \"Ljava/lang/Object;\"\n-     *\n-     * @param c class.\n-     * @return desc.\n-     * @throws NotFoundException\n-     */\n-    public static String getDesc(Class<?> c) {\n-        StringBuilder ret = new StringBuilder();\n-\n-        while (c.isArray()) {\n-            ret.append('[');\n-            c = c.getComponentType();\n-        }\n-\n-        if (c.isPrimitive()) {\n-            String t = c.getName();\n-            if (\"void\".equals(t)) {\n-                ret.append(JVM_VOID);\n-            } else if (\"boolean\".equals(t)) {\n-                ret.append(JVM_BOOLEAN);\n-            } else if (\"byte\".equals(t)) {\n-                ret.append(JVM_BYTE);\n-            } else if (\"char\".equals(t)) {\n-                ret.append(JVM_CHAR);\n-            } else if (\"double\".equals(t)) {\n-                ret.append(JVM_DOUBLE);\n-            } else if (\"float\".equals(t)) {\n-                ret.append(JVM_FLOAT);\n-            } else if (\"int\".equals(t)) {\n-                ret.append(JVM_INT);\n-            } else if (\"long\".equals(t)) {\n-                ret.append(JVM_LONG);\n-            } else if (\"short\".equals(t)) {\n-                ret.append(JVM_SHORT);\n-            }\n-        } else {\n-            ret.append('L');\n-            ret.append(c.getName().replace('.', '/'));\n-            ret.append(';');\n-        }\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get class array desc.\n-     * [int.class, boolean[].class, Object.class] => \"I[ZLjava/lang/Object;\"\n-     *\n-     * @param cs class array.\n-     * @return desc.\n-     * @throws NotFoundException\n-     */\n-    public static String getDesc(final Class<?>[] cs) {\n-        if (cs.length == 0) {\n-            return \"\";\n-        }\n-\n-        StringBuilder sb = new StringBuilder(64);\n-        for (Class<?> c : cs) {\n-            sb.append(getDesc(c));\n-        }\n-        return sb.toString();\n-    }\n-\n-    /**\n-     * get method desc.\n-     * int do(int arg1) => \"do(I)I\"\n-     * void do(String arg1,boolean arg2) => \"do(Ljava/lang/String;Z)V\"\n-     *\n-     * @param m method.\n-     * @return desc.\n-     */\n-    public static String getDesc(final Method m) {\n-        StringBuilder ret = new StringBuilder(m.getName()).append('(');\n-        Class<?>[] parameterTypes = m.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            ret.append(getDesc(parameterTypes[i]));\n-        }\n-        ret.append(')').append(getDesc(m.getReturnType()));\n-        return ret.toString();\n-    }\n-\n-    public static String[] getDescArray(final Method m) {\n-        Class<?>[] parameterTypes = m.getParameterTypes();\n-        String[] arr = new String[parameterTypes.length];\n-\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            arr[i] = getDesc(parameterTypes[i]);\n-        }\n-        return arr;\n-    }\n-\n-    /**\n-     * get constructor desc.\n-     * \"()V\", \"(Ljava/lang/String;I)V\"\n-     *\n-     * @param c constructor.\n-     * @return desc\n-     */\n-    public static String getDesc(final Constructor<?> c) {\n-        StringBuilder ret = new StringBuilder(\"(\");\n-        Class<?>[] parameterTypes = c.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            ret.append(getDesc(parameterTypes[i]));\n-        }\n-        ret.append(')').append('V');\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get method desc.\n-     * \"(I)I\", \"()V\", \"(Ljava/lang/String;Z)V\"\n-     *\n-     * @param m method.\n-     * @return desc.\n-     */\n-    public static String getDescWithoutMethodName(Method m) {\n-        StringBuilder ret = new StringBuilder();\n-        ret.append('(');\n-        Class<?>[] parameterTypes = m.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            ret.append(getDesc(parameterTypes[i]));\n-        }\n-        ret.append(')').append(getDesc(m.getReturnType()));\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get class desc.\n-     * Object.class => \"Ljava/lang/Object;\"\n-     * boolean[].class => \"[Z\"\n-     *\n-     * @param c class.\n-     * @return desc.\n-     * @throws NotFoundException\n-     */\n-    public static String getDesc(final CtClass c) throws NotFoundException {\n-        StringBuilder ret = new StringBuilder();\n-        if (c.isArray()) {\n-            ret.append('[');\n-            ret.append(getDesc(c.getComponentType()));\n-        } else if (c.isPrimitive()) {\n-            String t = c.getName();\n-            if (\"void\".equals(t)) {\n-                ret.append(JVM_VOID);\n-            } else if (\"boolean\".equals(t)) {\n-                ret.append(JVM_BOOLEAN);\n-            } else if (\"byte\".equals(t)) {\n-                ret.append(JVM_BYTE);\n-            } else if (\"char\".equals(t)) {\n-                ret.append(JVM_CHAR);\n-            } else if (\"double\".equals(t)) {\n-                ret.append(JVM_DOUBLE);\n-            } else if (\"float\".equals(t)) {\n-                ret.append(JVM_FLOAT);\n-            } else if (\"int\".equals(t)) {\n-                ret.append(JVM_INT);\n-            } else if (\"long\".equals(t)) {\n-                ret.append(JVM_LONG);\n-            } else if (\"short\".equals(t)) {\n-                ret.append(JVM_SHORT);\n-            }\n-        } else {\n-            ret.append('L');\n-            ret.append(c.getName().replace('.', '/'));\n-            ret.append(';');\n-        }\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get method desc.\n-     * \"do(I)I\", \"do()V\", \"do(Ljava/lang/String;Z)V\"\n-     *\n-     * @param m method.\n-     * @return desc.\n-     */\n-    public static String getDesc(final CtMethod m) throws NotFoundException {\n-        StringBuilder ret = new StringBuilder(m.getName()).append('(');\n-        CtClass[] parameterTypes = m.getParameterTypes();\n-        for (CtClass parameterType : parameterTypes) {\n-            ret.append(getDesc(parameterType));\n-        }\n-        ret.append(')').append(getDesc(m.getReturnType()));\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get constructor desc.\n-     * \"()V\", \"(Ljava/lang/String;I)V\"\n-     *\n-     * @param c constructor.\n-     * @return desc\n-     */\n-    public static String getDesc(final CtConstructor c) throws NotFoundException {\n-        StringBuilder ret = new StringBuilder(\"(\");\n-        CtClass[] parameterTypes = c.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            ret.append(getDesc(parameterTypes[i]));\n-        }\n-        ret.append(')').append('V');\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * get method desc.\n-     * \"(I)I\", \"()V\", \"(Ljava/lang/String;Z)V\".\n-     *\n-     * @param m method.\n-     * @return desc.\n-     */\n-    public static String getDescWithoutMethodName(final CtMethod m) throws NotFoundException {\n-        StringBuilder ret = new StringBuilder();\n-        ret.append('(');\n-        CtClass[] parameterTypes = m.getParameterTypes();\n-        for (int i = 0; i < parameterTypes.length; i++) {\n-            ret.append(getDesc(parameterTypes[i]));\n-        }\n-        ret.append(')').append(getDesc(m.getReturnType()));\n-        return ret.toString();\n-    }\n-\n-    /**\n-     * name to desc.\n-     * java.util.Map[][] => \"[[Ljava/util/Map;\"\n-     *\n-     * @param name name.\n-     * @return desc.\n-     */\n-    public static String name2desc(String name) {\n-        StringBuilder sb = new StringBuilder();\n-        int c = 0, index = name.indexOf('[');\n-        if (index > 0) {\n-            c = (name.length() - index) / 2;\n-            name = name.substring(0, index);\n-        }\n-        while (c-- > 0) {\n-            sb.append(\"[\");\n-        }\n-        if (\"void\".equals(name)) {\n-            sb.append(JVM_VOID);\n-        } else if (\"boolean\".equals(name)) {\n-            sb.append(JVM_BOOLEAN);\n-        } else if (\"byte\".equals(name)) {\n-            sb.append(JVM_BYTE);\n-        } else if (\"char\".equals(name)) {\n-            sb.append(JVM_CHAR);\n-        } else if (\"double\".equals(name)) {\n-            sb.append(JVM_DOUBLE);\n-        } else if (\"float\".equals(name)) {\n-            sb.append(JVM_FLOAT);\n-        } else if (\"int\".equals(name)) {\n-            sb.append(JVM_INT);\n-        } else if (\"long\".equals(name)) {\n-            sb.append(JVM_LONG);\n-        } else if (\"short\".equals(name)) {\n-            sb.append(JVM_SHORT);\n-        } else {\n-            sb.append('L').append(name.replace('.', '/')).append(';');\n-        }\n-        return sb.toString();\n-    }\n-\n-    /**\n-     * desc to name.\n-     * \"[[I\" => \"int[][]\"\n-     *\n-     * @param desc desc.\n-     * @return name.\n-     */\n-    public static String desc2name(String desc) {\n-        StringBuilder sb = new StringBuilder();\n-        int c = desc.lastIndexOf('[') + 1;\n-        if (desc.length() == c + 1) {\n-            switch (desc.charAt(c)) {\n-                case JVM_VOID: {\n-                    sb.append(\"void\");\n-                    break;\n-                }\n-                case JVM_BOOLEAN: {\n-                    sb.append(\"boolean\");\n-                    break;\n-                }\n-                case JVM_BYTE: {\n-                    sb.append(\"byte\");\n-                    break;\n-                }\n-                case JVM_CHAR: {\n-                    sb.append(\"char\");\n-                    break;\n-                }\n-                case JVM_DOUBLE: {\n-                    sb.append(\"double\");\n-                    break;\n-                }\n-                case JVM_FLOAT: {\n-                    sb.append(\"float\");\n-                    break;\n-                }\n-                case JVM_INT: {\n-                    sb.append(\"int\");\n-                    break;\n-                }\n-                case JVM_LONG: {\n-                    sb.append(\"long\");\n-                    break;\n-                }\n-                case JVM_SHORT: {\n-                    sb.append(\"short\");\n-                    break;\n-                }\n-                default:\n-                    throw new RuntimeException();\n-            }\n-        } else {\n-            sb.append(desc.substring(c + 1, desc.length() - 1).replace('/', '.'));\n-        }\n-        while (c-- > 0) {\n-            sb.append(\"[]\");\n-        }\n-        return sb.toString();\n-    }\n-\n-    public static Class<?> forName(String name) {\n-        try {\n-            return name2class(name);\n-        } catch (ClassNotFoundException e) {\n-            throw new IllegalStateException(\"Not found class \" + name + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    public static Class<?> forName(ClassLoader cl, String name) {\n-        try {\n-            return name2class(cl, name);\n-        } catch (ClassNotFoundException e) {\n-            throw new IllegalStateException(\"Not found class \" + name + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    /**\n-     * name to class.\n-     * \"boolean\" => boolean.class\n-     * \"java.util.Map[][]\" => java.util.Map[][].class\n-     *\n-     * @param name name.\n-     * @return Class instance.\n-     */\n-    public static Class<?> name2class(String name) throws ClassNotFoundException {\n-        return name2class(ClassUtils.getClassLoader(), name);\n-    }\n-\n-    /**\n-     * name to class.\n-     * \"boolean\" => boolean.class\n-     * \"java.util.Map[][]\" => java.util.Map[][].class\n-     *\n-     * @param cl   ClassLoader instance.\n-     * @param name name.\n-     * @return Class instance.\n-     */\n-    private static Class<?> name2class(ClassLoader cl, String name) throws ClassNotFoundException {\n-        int c = 0, index = name.indexOf('[');\n-        if (index > 0) {\n-            c = (name.length() - index) / 2;\n-            name = name.substring(0, index);\n-        }\n-        if (c > 0) {\n-            StringBuilder sb = new StringBuilder();\n-            while (c-- > 0) {\n-                sb.append(\"[\");\n-            }\n-\n-            if (\"void\".equals(name)) {\n-                sb.append(JVM_VOID);\n-            } else if (\"boolean\".equals(name)) {\n-                sb.append(JVM_BOOLEAN);\n-            } else if (\"byte\".equals(name)) {\n-                sb.append(JVM_BYTE);\n-            } else if (\"char\".equals(name)) {\n-                sb.append(JVM_CHAR);\n-            } else if (\"double\".equals(name)) {\n-                sb.append(JVM_DOUBLE);\n-            } else if (\"float\".equals(name)) {\n-                sb.append(JVM_FLOAT);\n-            } else if (\"int\".equals(name)) {\n-                sb.append(JVM_INT);\n-            } else if (\"long\".equals(name)) {\n-                sb.append(JVM_LONG);\n-            } else if (\"short\".equals(name)) {\n-                sb.append(JVM_SHORT);\n-            } else {\n-                // \"java.lang.Object\" ==> \"Ljava.lang.Object;\"\n-                sb.append('L').append(name).append(';');\n-            }\n-            name = sb.toString();\n-        } else {\n-            if (\"void\".equals(name)) {\n-                return void.class;\n-            }\n-            if (\"boolean\".equals(name)) {\n-                return boolean.class;\n-            }\n-            if (\"byte\".equals(name)) {\n-                return byte.class;\n-            }\n-            if (\"char\".equals(name)) {\n-                return char.class;\n-            }\n-            if (\"double\".equals(name)) {\n-                return double.class;\n-            }\n-            if (\"float\".equals(name)) {\n-                return float.class;\n-            }\n-            if (\"int\".equals(name)) {\n-                return int.class;\n-            }\n-            if (\"long\".equals(name)) {\n-                return long.class;\n-            }\n-            if (\"short\".equals(name)) {\n-                return short.class;\n-            }\n-        }\n-\n-        if (cl == null) {\n-            cl = ClassUtils.getClassLoader();\n-        }\n-        Class<?> clazz = NAME_CLASS_CACHE.get(name);\n-        if (clazz == null) {\n-            clazz = Class.forName(name, true, cl);\n-            NAME_CLASS_CACHE.put(name, clazz);\n-        }\n-        return clazz;\n-    }\n-\n-    /**\n-     * desc to class.\n-     * \"[Z\" => boolean[].class\n-     * \"[[Ljava/util/Map;\" => java.util.Map[][].class\n-     *\n-     * @param desc desc.\n-     * @return Class instance.\n-     * @throws ClassNotFoundException\n-     */\n-    public static Class<?> desc2class(String desc) throws ClassNotFoundException {\n-        return desc2class(ClassUtils.getClassLoader(), desc);\n-    }\n-\n-    /**\n-     * desc to class.\n-     * \"[Z\" => boolean[].class\n-     * \"[[Ljava/util/Map;\" => java.util.Map[][].class\n-     *\n-     * @param cl   ClassLoader instance.\n-     * @param desc desc.\n-     * @return Class instance.\n-     * @throws ClassNotFoundException\n-     */\n-    private static Class<?> desc2class(ClassLoader cl, String desc) throws ClassNotFoundException {\n-        switch (desc.charAt(0)) {\n-            case JVM_VOID:\n-                return void.class;\n-            case JVM_BOOLEAN:\n-                return boolean.class;\n-            case JVM_BYTE:\n-                return byte.class;\n-            case JVM_CHAR:\n-                return char.class;\n-            case JVM_DOUBLE:\n-                return double.class;\n-            case JVM_FLOAT:\n-                return float.class;\n-            case JVM_INT:\n-                return int.class;\n-            case JVM_LONG:\n-                return long.class;\n-            case JVM_SHORT:\n-                return short.class;\n-            case 'L':\n-                // \"Ljava/lang/Object;\" ==> \"java.lang.Object\"\n-                desc = desc.substring(1, desc.length() - 1).replace('/', '.');\n-                break;\n-            case '[':\n-                // \"[[Ljava/lang/Object;\" ==> \"[[Ljava.lang.Object;\"\n-                desc = desc.replace('/', '.');\n-                break;\n-            default:\n-                throw new ClassNotFoundException(\"Class not found: \" + desc);\n-        }\n-\n-        if (cl == null) {\n-            cl = ClassUtils.getClassLoader();\n-        }\n-        Class<?> clazz = DESC_CLASS_CACHE.get(desc);\n-        if (clazz == null) {\n-            clazz = Class.forName(desc, true, cl);\n-            DESC_CLASS_CACHE.put(desc, clazz);\n-        }\n-        return clazz;\n-    }\n-\n-    /**\n-     * get class array instance.\n-     *\n-     * @param desc desc.\n-     * @return Class class array.\n-     * @throws ClassNotFoundException\n-     */\n-    public static Class<?>[] desc2classArray(String desc) throws ClassNotFoundException {\n-        Class<?>[] ret = desc2classArray(ClassUtils.getClassLoader(), desc);\n-        return ret;\n-    }\n-\n-    /**\n-     * get class array instance.\n-     *\n-     * @param cl   ClassLoader instance.\n-     * @param desc desc.\n-     * @return Class[] class array.\n-     * @throws ClassNotFoundException\n-     */\n-    private static Class<?>[] desc2classArray(ClassLoader cl, String desc) throws ClassNotFoundException {\n-        if (desc.length() == 0) {\n-            return EMPTY_CLASS_ARRAY;\n-        }\n-\n-        List<Class<?>> cs = new ArrayList<Class<?>>();\n-        Matcher m = DESC_PATTERN.matcher(desc);\n-        while (m.find()) {\n-            cs.add(desc2class(cl, m.group()));\n-        }\n-        return cs.toArray(EMPTY_CLASS_ARRAY);\n-    }\n-\n-    /**\n-     * Find method from method signature\n-     *\n-     * @param clazz      Target class to find method\n-     * @param methodName Method signature, e.g.: method1(int, String). It is allowed to provide method name only, e.g.: method2\n-     * @return target method\n-     * @throws NoSuchMethodException\n-     * @throws ClassNotFoundException\n-     * @throws IllegalStateException  when multiple methods are found (overridden method when parameter info is not provided)\n-     * @deprecated Recommend {@link MethodUtils#findMethod(Class, String, Class[])}\n-     */\n-    @Deprecated\n-    public static Method findMethodByMethodSignature(Class<?> clazz, String methodName, String[] parameterTypes)\n-            throws NoSuchMethodException, ClassNotFoundException {\n-        String signature = clazz.getName() + \".\" + methodName;\n-        if (parameterTypes != null && parameterTypes.length > 0) {\n-            signature += StringUtils.join(parameterTypes);\n-        }\n-        Method method = SIGNATURE_METHODS_CACHE.get(signature);\n-        if (method != null) {\n-            return method;\n-        }\n-        if (parameterTypes == null) {\n-            List<Method> finded = new ArrayList<Method>();\n-            for (Method m : clazz.getMethods()) {\n-                if (m.getName().equals(methodName)) {\n-                    finded.add(m);\n-                }\n-            }\n-            if (finded.isEmpty()) {\n-                throw new NoSuchMethodException(\"No such method \" + methodName + \" in class \" + clazz);\n-            }\n-            if (finded.size() > 1) {\n-                String msg = String.format(\"Not unique method for method name(%s) in class(%s), find %d methods.\",\n-                        methodName, clazz.getName(), finded.size());\n-                throw new IllegalStateException(msg);\n-            }\n-            method = finded.get(0);\n-        } else {\n-            Class<?>[] types = new Class<?>[parameterTypes.length];\n-            for (int i = 0; i < parameterTypes.length; i++) {\n-                types[i] = ReflectUtils.name2class(parameterTypes[i]);\n-            }\n-            method = clazz.getMethod(methodName, types);\n-\n-        }\n-        SIGNATURE_METHODS_CACHE.put(signature, method);\n-        return method;\n-    }\n-\n-    /**\n-     * @param clazz      Target class to find method\n-     * @param methodName Method signature, e.g.: method1(int, String). It is allowed to provide method name only, e.g.: method2\n-     * @return target method\n-     * @throws NoSuchMethodException\n-     * @throws ClassNotFoundException\n-     * @throws IllegalStateException  when multiple methods are found (overridden method when parameter info is not provided)\n-     * @deprecated Recommend {@link MethodUtils#findMethod(Class, String, Class[])}\n-     */\n-    @Deprecated\n-    public static Method findMethodByMethodName(Class<?> clazz, String methodName)\n-            throws NoSuchMethodException, ClassNotFoundException {\n-        return findMethodByMethodSignature(clazz, methodName, null);\n-    }\n-\n-    public static Constructor<?> findConstructor(Class<?> clazz, Class<?> paramType) throws NoSuchMethodException {\n-        Constructor<?> targetConstructor;\n-        try {\n-            targetConstructor = clazz.getConstructor(new Class<?>[]{paramType});\n-        } catch (NoSuchMethodException e) {\n-            targetConstructor = null;\n-            Constructor<?>[] constructors = clazz.getConstructors();\n-            for (Constructor<?> constructor : constructors) {\n-                if (Modifier.isPublic(constructor.getModifiers())\n-                        && constructor.getParameterTypes().length == 1\n-                        && constructor.getParameterTypes()[0].isAssignableFrom(paramType)) {\n-                    targetConstructor = constructor;\n-                    break;\n-                }\n-            }\n-            if (targetConstructor == null) {\n-                throw e;\n-            }\n-        }\n-        return targetConstructor;\n-    }\n-\n-    /**\n-     * Check if one object is the implementation for a given interface.\n-     * <p>\n-     * This method will not trigger classloading for the given interface, therefore it will not lead to error when\n-     * the given interface is not visible by the classloader\n-     *\n-     * @param obj                Object to examine\n-     * @param interfaceClazzName The given interface\n-     * @return true if the object implements the given interface, otherwise return false\n-     */\n-    public static boolean isInstance(Object obj, String interfaceClazzName) {\n-        for (Class<?> clazz = obj.getClass();\n-             clazz != null && !clazz.equals(Object.class);\n-             clazz = clazz.getSuperclass()) {\n-            Class<?>[] interfaces = clazz.getInterfaces();\n-            for (Class<?> itf : interfaces) {\n-                if (itf.getName().equals(interfaceClazzName)) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return false;\n-    }\n-\n-    public static Object getEmptyObject(Class<?> returnType) {\n-        return getEmptyObject(returnType, new HashMap<>(), 0);\n-    }\n-\n-    private static Object getEmptyObject(Class<?> returnType, Map<Class<?>, Object> emptyInstances, int level) {\n-        if (level > 2) {\n-            return null;\n-        }\n-        if (returnType == null) {\n-            return null;\n-        }\n-        if (returnType == boolean.class || returnType == Boolean.class) {\n-            return false;\n-        }\n-        if (returnType == char.class || returnType == Character.class) {\n-            return '\\0';\n-        }\n-        if (returnType == byte.class || returnType == Byte.class) {\n-            return (byte) 0;\n-        }\n-        if (returnType == short.class || returnType == Short.class) {\n-            return (short) 0;\n-        }\n-        if (returnType == int.class || returnType == Integer.class) {\n-            return 0;\n-        }\n-        if (returnType == long.class || returnType == Long.class) {\n-            return 0L;\n-        }\n-        if (returnType == float.class || returnType == Float.class) {\n-            return 0F;\n-        }\n-        if (returnType == double.class || returnType == Double.class) {\n-            return 0D;\n-        }\n-        if (returnType.isArray()) {\n-            return Array.newInstance(returnType.getComponentType(), 0);\n-        }\n-        if (returnType.isAssignableFrom(ArrayList.class)) {\n-            return new ArrayList<>(0);\n-        }\n-        if (returnType.isAssignableFrom(HashSet.class)) {\n-            return new HashSet<>(0);\n-        }\n-        if (returnType.isAssignableFrom(HashMap.class)) {\n-            return new HashMap<>(0);\n-        }\n-        if (String.class.equals(returnType)) {\n-            return \"\";\n-        }\n-        if (returnType.isInterface()) {\n-            return null;\n-        }\n-\n-        try {\n-            Object value = emptyInstances.get(returnType);\n-            if (value == null) {\n-                value = returnType.getDeclaredConstructor().newInstance();\n-                emptyInstances.put(returnType, value);\n-            }\n-            Class<?> cls = value.getClass();\n-            while (cls != null && cls != Object.class) {\n-                Field[] fields = cls.getDeclaredFields();\n-                for (Field field : fields) {\n-                    if (field.isSynthetic()) {\n-                        continue;\n-                    }\n-                    Object property = getEmptyObject(field.getType(), emptyInstances, level + 1);\n-                    if (property != null) {\n-                        try {\n-                            ReflectUtils.makeAccessible(field);\n-                            field.set(value, property);\n-                        } catch (Throwable ignored) {\n-                        }\n-                    }\n-                }\n-                cls = cls.getSuperclass();\n-            }\n-            return value;\n-        } catch (Throwable e) {\n-            return null;\n-        }\n-    }\n-\n-    public static Object defaultReturn(Method m) {\n-        if (m.getReturnType().isPrimitive()) {\n-            return primitiveDefaults.get(m.getReturnType());\n-        } else {\n-            return null;\n-        }\n-    }\n-\n-    public static Object defaultReturn(Class<?> classType) {\n-        if (classType != null && classType.isPrimitive()) {\n-            return primitiveDefaults.get(classType);\n-        } else {\n-            return null;\n-        }\n-    }\n-\n-    public static boolean isBeanPropertyReadMethod(Method method) {\n-        return method != null\n-                && Modifier.isPublic(method.getModifiers())\n-                && !Modifier.isStatic(method.getModifiers())\n-                && method.getReturnType() != void.class\n-                && method.getDeclaringClass() != Object.class\n-                && method.getParameterTypes().length == 0\n-                && ((method.getName().startsWith(\"get\") && method.getName().length() > 3)\n-                || (method.getName().startsWith(\"is\") && method.getName().length() > 2));\n-    }\n-\n-    public static String getPropertyNameFromBeanReadMethod(Method method) {\n-        if (isBeanPropertyReadMethod(method)) {\n-            if (method.getName().startsWith(\"get\")) {\n-                return method.getName().substring(3, 4).toLowerCase()\n-                        + method.getName().substring(4);\n-            }\n-            if (method.getName().startsWith(\"is\")) {\n-                return method.getName().substring(2, 3).toLowerCase()\n-                        + method.getName().substring(3);\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public static boolean isBeanPropertyWriteMethod(Method method) {\n-        return method != null\n-                && Modifier.isPublic(method.getModifiers())\n-                && !Modifier.isStatic(method.getModifiers())\n-                && method.getDeclaringClass() != Object.class\n-                && method.getParameterTypes().length == 1\n-                && method.getName().startsWith(\"set\")\n-                && method.getName().length() > 3;\n-    }\n-\n-    public static String getPropertyNameFromBeanWriteMethod(Method method) {\n-        if (isBeanPropertyWriteMethod(method)) {\n-            return method.getName().substring(3, 4).toLowerCase()\n-                    + method.getName().substring(4);\n-        }\n-        return null;\n-    }\n-\n-    public static boolean isPublicInstanceField(Field field) {\n-        return Modifier.isPublic(field.getModifiers())\n-                && !Modifier.isStatic(field.getModifiers())\n-                && !Modifier.isFinal(field.getModifiers())\n-                && !field.isSynthetic();\n-    }\n-\n-    public static Map<String, Field> getBeanPropertyFields(Class cl) {\n-        Map<String, Field> properties = new HashMap<String, Field>();\n-        for (; cl != null; cl = cl.getSuperclass()) {\n-            Field[] fields = cl.getDeclaredFields();\n-            for (Field field : fields) {\n-                if (Modifier.isTransient(field.getModifiers())\n-                        || Modifier.isStatic(field.getModifiers())) {\n-                    continue;\n-                }\n-                ReflectUtils.makeAccessible(field);\n-\n-                properties.put(field.getName(), field);\n-            }\n-        }\n-\n-        return properties;\n-    }\n-\n-    public static Map<String, Method> getBeanPropertyReadMethods(Class cl) {\n-        Map<String, Method> properties = new HashMap<String, Method>();\n-        for (; cl != null; cl = cl.getSuperclass()) {\n-            Method[] methods = cl.getDeclaredMethods();\n-            for (Method method : methods) {\n-                if (isBeanPropertyReadMethod(method)) {\n-                    ReflectUtils.makeAccessible(method);\n-                    String property = getPropertyNameFromBeanReadMethod(method);\n-                    properties.put(property, method);\n-                }\n-            }\n-        }\n-\n-        return properties;\n-    }\n-\n-    public static Type[] getReturnTypes(Method method) {\n-        Class<?> returnType = method.getReturnType();\n-        Type genericReturnType = method.getGenericReturnType();\n-        if (Future.class.isAssignableFrom(returnType)) {\n-            if (genericReturnType instanceof ParameterizedType) {\n-                Type actualArgType = ((ParameterizedType) genericReturnType).getActualTypeArguments()[0];\n-                if (actualArgType instanceof ParameterizedType) {\n-                    returnType = (Class<?>) ((ParameterizedType) actualArgType).getRawType();\n-                    genericReturnType = actualArgType;\n-                } else if (actualArgType instanceof TypeVariable) {\n-                    returnType = (Class<?>) ((TypeVariable<?>) actualArgType).getBounds()[0];\n-                    genericReturnType = actualArgType;\n-                } else {\n-                    returnType = (Class<?>) actualArgType;\n-                    genericReturnType = returnType;\n-                }\n-            } else {\n-                returnType = null;\n-                genericReturnType = null;\n-            }\n-        }\n-        return new Type[]{returnType, genericReturnType};\n-    }\n-\n-    /**\n-     * Find the {@link Set} of {@link ParameterizedType}\n-     *\n-     * @param sourceClass the source {@link Class class}\n-     * @return non-null read-only {@link Set}\n-     * @since 2.7.5\n-     */\n-    public static Set<ParameterizedType> findParameterizedTypes(Class<?> sourceClass) {\n-        // Add Generic Interfaces\n-        List<Type> genericTypes = new LinkedList<>(asList(sourceClass.getGenericInterfaces()));\n-        // Add Generic Super Class\n-        genericTypes.add(sourceClass.getGenericSuperclass());\n-\n-        Set<ParameterizedType> parameterizedTypes = genericTypes.stream()\n-                .filter(type -> type instanceof ParameterizedType)// filter ParameterizedType\n-                .map(ParameterizedType.class::cast)  // cast to ParameterizedType\n-                .collect(Collectors.toSet());\n-\n-        if (parameterizedTypes.isEmpty()) { // If not found, try to search super types recursively\n-            genericTypes.stream()\n-                    .filter(type -> type instanceof Class)\n-                    .map(Class.class::cast)\n-                    .forEach(superClass -> parameterizedTypes.addAll(findParameterizedTypes(superClass)));\n-        }\n-\n-        return unmodifiableSet(parameterizedTypes);                     // build as a Set\n-\n-    }\n-\n-    /**\n-     * Find the hierarchical types from the source {@link Class class} by specified {@link Class type}.\n-     *\n-     * @param sourceClass the source {@link Class class}\n-     * @param matchType   the type to match\n-     * @param <T>         the type to match\n-     * @return non-null read-only {@link Set}\n-     * @since 2.7.5\n-     */\n-    public static <T> Set<Class<T>> findHierarchicalTypes(Class<?> sourceClass, Class<T> matchType) {\n-        if (sourceClass == null) {\n-            return Collections.emptySet();\n-        }\n-\n-        Set<Class<T>> hierarchicalTypes = new LinkedHashSet<>();\n-\n-        if (matchType.isAssignableFrom(sourceClass)) {\n-            hierarchicalTypes.add((Class<T>) sourceClass);\n-        }\n-\n-        // Find all super classes\n-        hierarchicalTypes.addAll(findHierarchicalTypes(sourceClass.getSuperclass(), matchType));\n-\n-        return unmodifiableSet(hierarchicalTypes);\n-    }\n-\n-    /**\n-     * Get the value from the specified bean and its getter method.\n-     *\n-     * @param bean       the bean instance\n-     * @param methodName the name of getter\n-     * @param <T>        the type of property value\n-     * @return\n-     * @since 2.7.5\n-     */\n-    public static <T> T getProperty(Object bean, String methodName) {\n-        Class<?> beanClass = bean.getClass();\n-        BeanInfo beanInfo = null;\n-        T propertyValue = null;\n-\n-        try {\n-            beanInfo = Introspector.getBeanInfo(beanClass);\n-            propertyValue = (T) Stream.of(beanInfo.getMethodDescriptors())\n-                    .filter(methodDescriptor -> methodName.equals(methodDescriptor.getName()))\n-                    .findFirst()\n-                    .map(method -> {\n-                        try {\n-                            return method.getMethod().invoke(bean);\n-                        } catch (Exception e) {\n-                            //ignore\n-                        }\n-                        return null;\n-                    }).get();\n-        } catch (Exception e) {\n-\n-        }\n-        return propertyValue;\n-    }\n-\n-    /**\n-     * Resolve the types of the specified values\n-     *\n-     * @param values the values\n-     * @return If can't be resolved, return {@link ReflectUtils#EMPTY_CLASS_ARRAY empty class array}\n-     * @since 2.7.6\n-     */\n-    public static Class[] resolveTypes(Object... values) {\n-\n-        if (isEmpty(values)) {\n-            return EMPTY_CLASS_ARRAY;\n-        }\n-\n-        int size = values.length;\n-\n-        Class[] types = new Class[size];\n-\n-        for (int i = 0; i < size; i++) {\n-            Object value = values[i];\n-            types[i] = value == null ? null : value.getClass();\n-        }\n-\n-        return types;\n-    }\n-\n-    /**\n-     * Copy from org.springframework.util.ReflectionUtils.\n-     * Make the given method accessible, explicitly setting it accessible if\n-     * necessary. The {@code setAccessible(true)} method is only called\n-     * when actually necessary, to avoid unnecessary conflicts with a JVM\n-     * SecurityManager (if active).\n-     * @param method the method to make accessible\n-     * @see java.lang.reflect.Method#setAccessible\n-     */\n-    @SuppressWarnings(\"deprecation\")  // on JDK 9\n-    public static void makeAccessible(Method method) {\n-        if ((!Modifier.isPublic(method.getModifiers()) ||\n-                !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !method.isAccessible()) {\n-            method.setAccessible(true);\n-        }\n-    }\n-\n-    /**\n-     * Copy from org.springframework.util.ReflectionUtils.\n-     * Make the given field accessible, explicitly setting it accessible if\n-     * necessary. The {@code setAccessible(true)} method is only called\n-     * when actually necessary, to avoid unnecessary conflicts with a JVM\n-     * SecurityManager (if active).\n-     * @param field the field to make accessible\n-     * @see java.lang.reflect.Field#setAccessible\n-     */\n-    @SuppressWarnings(\"deprecation\")  // on JDK 9\n-    public static void makeAccessible(Field field) {\n-        if ((!Modifier.isPublic(field.getModifiers()) ||\n-                !Modifier.isPublic(field.getDeclaringClass().getModifiers()) ||\n-                Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {\n-            field.setAccessible(true);\n-        }\n-    }\n-\n-    /**\n-     * Copy from org.springframework.util.ReflectionUtils.\n-     * Make the given constructor accessible, explicitly setting it accessible\n-     * if necessary. The {@code setAccessible(true)} method is only called\n-     * when actually necessary, to avoid unnecessary conflicts with a JVM\n-     * SecurityManager (if active).\n-     * @param ctor the constructor to make accessible\n-     * @see java.lang.reflect.Constructor#setAccessible\n-     */\n-    @SuppressWarnings(\"deprecation\")  // on JDK 9\n-    public static void makeAccessible(Constructor<?> ctor) {\n-        if ((!Modifier.isPublic(ctor.getModifiers()) ||\n-                !Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) && !ctor.isAccessible()) {\n-            ctor.setAccessible(true);\n-        }\n-    }\n-\n-    public static boolean checkZeroArgConstructor(Class clazz) {\n-        try {\n-            clazz.getDeclaredConstructor();\n-            return true;\n-        } catch (NoSuchMethodException e) {\n-            return false;\n-        }\n-    }\n-\n-    public static boolean isJdk(Class clazz) {\n-        return clazz.getName().startsWith(\"java.\") || clazz.getName().startsWith(\"javax.\");\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import javassist.CtClass;\r\n+import javassist.CtConstructor;\r\n+import javassist.CtMethod;\r\n+import javassist.NotFoundException;\r\n+\r\n+import java.beans.BeanInfo;\r\n+import java.beans.Introspector;\r\n+import java.lang.reflect.Array;\r\n+import java.lang.reflect.Constructor;\r\n+import java.lang.reflect.Field;\r\n+import java.lang.reflect.GenericArrayType;\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.lang.reflect.ParameterizedType;\r\n+import java.lang.reflect.Type;\r\n+import java.lang.reflect.TypeVariable;\r\n+import java.net.URL;\r\n+import java.security.CodeSource;\r\n+import java.security.ProtectionDomain;\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.Date;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.Future;\r\n+import java.util.regex.Matcher;\r\n+import java.util.regex.Pattern;\r\n+import java.util.stream.Collectors;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static java.util.Collections.unmodifiableSet;\r\n+import static org.apache.dubbo.common.utils.ArrayUtils.isEmpty;\r\n+\r\n+/**\r\n+ * ReflectUtils\r\n+ */\r\n+public final class ReflectUtils {\r\n+\r\n+    /**\r\n+     * void(V).\r\n+     */\r\n+    public static final char JVM_VOID = 'V';\r\n+\r\n+    /**\r\n+     * boolean(Z).\r\n+     */\r\n+    public static final char JVM_BOOLEAN = 'Z';\r\n+\r\n+    /**\r\n+     * byte(B).\r\n+     */\r\n+    public static final char JVM_BYTE = 'B';\r\n+\r\n+    /**\r\n+     * char(C).\r\n+     */\r\n+    public static final char JVM_CHAR = 'C';\r\n+\r\n+    /**\r\n+     * double(D).\r\n+     */\r\n+    public static final char JVM_DOUBLE = 'D';\r\n+\r\n+    /**\r\n+     * float(F).\r\n+     */\r\n+    public static final char JVM_FLOAT = 'F';\r\n+\r\n+    /**\r\n+     * int(I).\r\n+     */\r\n+    public static final char JVM_INT = 'I';\r\n+\r\n+    /**\r\n+     * long(J).\r\n+     */\r\n+    public static final char JVM_LONG = 'J';\r\n+\r\n+    /**\r\n+     * short(S).\r\n+     */\r\n+    public static final char JVM_SHORT = 'S';\r\n+\r\n+    public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0];\r\n+\r\n+    public static final String JAVA_IDENT_REGEX = \"(?:[_$a-zA-Z][_$a-zA-Z0-9]*)\";\r\n+\r\n+    public static final String JAVA_NAME_REGEX = \"(?:\" + JAVA_IDENT_REGEX + \"(?:\\\\.\" + JAVA_IDENT_REGEX + \")*)\";\r\n+\r\n+    public static final String CLASS_DESC = \"(?:L\" + JAVA_IDENT_REGEX + \"(?:\\\\/\" + JAVA_IDENT_REGEX + \")*;)\";\r\n+\r\n+    public static final String ARRAY_DESC = \"(?:\\\\[+(?:(?:[VZBCDFIJS])|\" + CLASS_DESC + \"))\";\r\n+\r\n+    public static final String DESC_REGEX = \"(?:(?:[VZBCDFIJS])|\" + CLASS_DESC + \"|\" + ARRAY_DESC + \")\";\r\n+\r\n+    public static final Pattern DESC_PATTERN = Pattern.compile(DESC_REGEX);\r\n+\r\n+    public static final String METHOD_DESC_REGEX = \"(?:(\" + JAVA_IDENT_REGEX + \")?\\\\((\" + DESC_REGEX + \"*)\\\\)(\" + DESC_REGEX + \")?)\";\r\n+\r\n+    public static final Pattern METHOD_DESC_PATTERN = Pattern.compile(METHOD_DESC_REGEX);\r\n+\r\n+    public static final Pattern GETTER_METHOD_DESC_PATTERN = Pattern.compile(\"get([A-Z][_a-zA-Z0-9]*)\\\\(\\\\)(\" + DESC_REGEX + \")\");\r\n+\r\n+    public static final Pattern SETTER_METHOD_DESC_PATTERN = Pattern.compile(\"set([A-Z][_a-zA-Z0-9]*)\\\\((\" + DESC_REGEX + \")\\\\)V\");\r\n+\r\n+    public static final Pattern IS_HAS_CAN_METHOD_DESC_PATTERN = Pattern.compile(\"(?:is|has|can)([A-Z][_a-zA-Z0-9]*)\\\\(\\\\)Z\");\r\n+\r\n+    private static final ConcurrentMap<String, Class<?>> DESC_CLASS_CACHE = new ConcurrentHashMap<String, Class<?>>();\r\n+\r\n+    private static final ConcurrentMap<String, Class<?>> NAME_CLASS_CACHE = new ConcurrentHashMap<String, Class<?>>();\r\n+\r\n+    private static final ConcurrentMap<String, Method> SIGNATURE_METHODS_CACHE = new ConcurrentHashMap<String, Method>();\r\n+\r\n+    private static Map<Class<?>, Object> primitiveDefaults = new HashMap<>();\r\n+\r\n+    static {\r\n+        primitiveDefaults.put(int.class, 0);\r\n+        primitiveDefaults.put(long.class, 0L);\r\n+        primitiveDefaults.put(byte.class, (byte) 0);\r\n+        primitiveDefaults.put(char.class, (char) 0);\r\n+        primitiveDefaults.put(short.class, (short) 0);\r\n+        primitiveDefaults.put(float.class, (float) 0);\r\n+        primitiveDefaults.put(double.class, (double) 0);\r\n+        primitiveDefaults.put(boolean.class, false);\r\n+        primitiveDefaults.put(void.class, null);\r\n+    }\r\n+\r\n+    private ReflectUtils() {\r\n+    }\r\n+\r\n+    public static boolean isPrimitives(Class<?> cls) {\r\n+        while (cls.isArray()) {\r\n+            cls = cls.getComponentType();\r\n+        }\r\n+        return isPrimitive(cls);\r\n+    }\r\n+\r\n+    public static boolean isPrimitive(Class<?> cls) {\r\n+        return cls.isPrimitive() || cls == String.class || cls == Boolean.class || cls == Character.class\r\n+                || Number.class.isAssignableFrom(cls) || Date.class.isAssignableFrom(cls);\r\n+    }\r\n+\r\n+    public static Class<?> getBoxedClass(Class<?> c) {\r\n+        if (c == int.class) {\r\n+            c = Integer.class;\r\n+        } else if (c == boolean.class) {\r\n+            c = Boolean.class;\r\n+        } else if (c == long.class) {\r\n+            c = Long.class;\r\n+        } else if (c == float.class) {\r\n+            c = Float.class;\r\n+        } else if (c == double.class) {\r\n+            c = Double.class;\r\n+        } else if (c == char.class) {\r\n+            c = Character.class;\r\n+        } else if (c == byte.class) {\r\n+            c = Byte.class;\r\n+        } else if (c == short.class) {\r\n+            c = Short.class;\r\n+        }\r\n+        return c;\r\n+    }\r\n+\r\n+    /**\r\n+     * is compatible.\r\n+     *\r\n+     * @param c class.\r\n+     * @param o instance.\r\n+     * @return compatible or not.\r\n+     */\r\n+    public static boolean isCompatible(Class<?> c, Object o) {\r\n+        boolean pt = c.isPrimitive();\r\n+        if (o == null) {\r\n+            return !pt;\r\n+        }\r\n+\r\n+        if (pt) {\r\n+            c = getBoxedClass(c);\r\n+        }\r\n+\r\n+        return c == o.getClass() || c.isInstance(o);\r\n+    }\r\n+\r\n+    /**\r\n+     * is compatible.\r\n+     *\r\n+     * @param cs class array.\r\n+     * @param os object array.\r\n+     * @return compatible or not.\r\n+     */\r\n+    public static boolean isCompatible(Class<?>[] cs, Object[] os) {\r\n+        int len = cs.length;\r\n+        if (len != os.length) {\r\n+            return false;\r\n+        }\r\n+        if (len == 0) {\r\n+            return true;\r\n+        }\r\n+        for (int i = 0; i < len; i++) {\r\n+            if (!isCompatible(cs[i], os[i])) {\r\n+                return false;\r\n+            }\r\n+        }\r\n+        return true;\r\n+    }\r\n+\r\n+    public static String getCodeBase(Class<?> cls) {\r\n+        if (cls == null) {\r\n+            return null;\r\n+        }\r\n+        ProtectionDomain domain = cls.getProtectionDomain();\r\n+        if (domain == null) {\r\n+            return null;\r\n+        }\r\n+        CodeSource source = domain.getCodeSource();\r\n+        if (source == null) {\r\n+            return null;\r\n+        }\r\n+        URL location = source.getLocation();\r\n+        if (location == null) {\r\n+            return null;\r\n+        }\r\n+        return location.getFile();\r\n+    }\r\n+\r\n+    /**\r\n+     * get name.\r\n+     * java.lang.Object[][].class => \"java.lang.Object[][]\"\r\n+     *\r\n+     * @param c class.\r\n+     * @return name.\r\n+     */\r\n+    public static String getName(Class<?> c) {\r\n+        if (c.isArray()) {\r\n+            StringBuilder sb = new StringBuilder();\r\n+            do {\r\n+                sb.append(\"[]\");\r\n+                c = c.getComponentType();\r\n+            }\r\n+            while (c.isArray());\r\n+\r\n+            return c.getName() + sb.toString();\r\n+        }\r\n+        return c.getName();\r\n+    }\r\n+\r\n+    public static Class<?> getGenericClass(Class<?> cls) {\r\n+        return getGenericClass(cls, 0);\r\n+    }\r\n+\r\n+    public static Class<?> getGenericClass(Class<?> cls, int i) {\r\n+        try {\r\n+            ParameterizedType parameterizedType = ((ParameterizedType) cls.getGenericInterfaces()[0]);\r\n+            Object genericClass = parameterizedType.getActualTypeArguments()[i];\r\n+\r\n+            // handle nested generic type\r\n+            if (genericClass instanceof ParameterizedType) {\r\n+                return (Class<?>) ((ParameterizedType) genericClass).getRawType();\r\n+            }\r\n+\r\n+            // handle array generic type\r\n+            if (genericClass instanceof GenericArrayType) {\r\n+                return (Class<?>) ((GenericArrayType) genericClass).getGenericComponentType();\r\n+            }\r\n+\r\n+            // Requires JDK 7 or higher, Foo<int[]> is no longer GenericArrayType\r\n+            if (((Class) genericClass).isArray()) {\r\n+                return ((Class) genericClass).getComponentType();\r\n+            }\r\n+            return (Class<?>) genericClass;\r\n+        } catch (Throwable e) {\r\n+            throw new IllegalArgumentException(cls.getName() + \" generic type undefined!\", e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * get method name.\r\n+     * \"void do(int)\", \"void do()\", \"int do(java.lang.String,boolean)\"\r\n+     *\r\n+     * @param m method.\r\n+     * @return name.\r\n+     */\r\n+    public static String getName(final Method m) {\r\n+        StringBuilder ret = new StringBuilder();\r\n+        ret.append(getName(m.getReturnType())).append(' ');\r\n+        ret.append(m.getName()).append('(');\r\n+        Class<?>[] parameterTypes = m.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            if (i > 0) {\r\n+                ret.append(',');\r\n+            }\r\n+            ret.append(getName(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')');\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    public static String getSignature(String methodName, Class<?>[] parameterTypes) {\r\n+        StringBuilder sb = new StringBuilder(methodName);\r\n+        sb.append(\"(\");\r\n+        if (parameterTypes != null && parameterTypes.length > 0) {\r\n+            boolean first = true;\r\n+            for (Class<?> type : parameterTypes) {\r\n+                if (first) {\r\n+                    first = false;\r\n+                } else {\r\n+                    sb.append(\",\");\r\n+                }\r\n+                sb.append(type.getName());\r\n+            }\r\n+        }\r\n+        sb.append(\")\");\r\n+        return sb.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get constructor name.\r\n+     * \"()\", \"(java.lang.String,int)\"\r\n+     *\r\n+     * @param c constructor.\r\n+     * @return name.\r\n+     */\r\n+    public static String getName(final Constructor<?> c) {\r\n+        StringBuilder ret = new StringBuilder(\"(\");\r\n+        Class<?>[] parameterTypes = c.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            if (i > 0) {\r\n+                ret.append(',');\r\n+            }\r\n+            ret.append(getName(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')');\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get class desc.\r\n+     * boolean[].class => \"[Z\"\r\n+     * Object.class => \"Ljava/lang/Object;\"\r\n+     *\r\n+     * @param c class.\r\n+     * @return desc.\r\n+     * @throws NotFoundException\r\n+     */\r\n+    public static String getDesc(Class<?> c) {\r\n+        StringBuilder ret = new StringBuilder();\r\n+\r\n+        while (c.isArray()) {\r\n+            ret.append('[');\r\n+            c = c.getComponentType();\r\n+        }\r\n+\r\n+        if (c.isPrimitive()) {\r\n+            String t = c.getName();\r\n+            if (\"void\".equals(t)) {\r\n+                ret.append(JVM_VOID);\r\n+            } else if (\"boolean\".equals(t)) {\r\n+                ret.append(JVM_BOOLEAN);\r\n+            } else if (\"byte\".equals(t)) {\r\n+                ret.append(JVM_BYTE);\r\n+            } else if (\"char\".equals(t)) {\r\n+                ret.append(JVM_CHAR);\r\n+            } else if (\"double\".equals(t)) {\r\n+                ret.append(JVM_DOUBLE);\r\n+            } else if (\"float\".equals(t)) {\r\n+                ret.append(JVM_FLOAT);\r\n+            } else if (\"int\".equals(t)) {\r\n+                ret.append(JVM_INT);\r\n+            } else if (\"long\".equals(t)) {\r\n+                ret.append(JVM_LONG);\r\n+            } else if (\"short\".equals(t)) {\r\n+                ret.append(JVM_SHORT);\r\n+            }\r\n+        } else {\r\n+            ret.append('L');\r\n+            ret.append(c.getName().replace('.', '/'));\r\n+            ret.append(';');\r\n+        }\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get class array desc.\r\n+     * [int.class, boolean[].class, Object.class] => \"I[ZLjava/lang/Object;\"\r\n+     *\r\n+     * @param cs class array.\r\n+     * @return desc.\r\n+     * @throws NotFoundException\r\n+     */\r\n+    public static String getDesc(final Class<?>[] cs) {\r\n+        if (cs.length == 0) {\r\n+            return \"\";\r\n+        }\r\n+\r\n+        StringBuilder sb = new StringBuilder(64);\r\n+        for (Class<?> c : cs) {\r\n+            sb.append(getDesc(c));\r\n+        }\r\n+        return sb.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get method desc.\r\n+     * int do(int arg1) => \"do(I)I\"\r\n+     * void do(String arg1,boolean arg2) => \"do(Ljava/lang/String;Z)V\"\r\n+     *\r\n+     * @param m method.\r\n+     * @return desc.\r\n+     */\r\n+    public static String getDesc(final Method m) {\r\n+        StringBuilder ret = new StringBuilder(m.getName()).append('(');\r\n+        Class<?>[] parameterTypes = m.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            ret.append(getDesc(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')').append(getDesc(m.getReturnType()));\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    public static String[] getDescArray(final Method m) {\r\n+        Class<?>[] parameterTypes = m.getParameterTypes();\r\n+        String[] arr = new String[parameterTypes.length];\r\n+\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            arr[i] = getDesc(parameterTypes[i]);\r\n+        }\r\n+        return arr;\r\n+    }\r\n+\r\n+    /**\r\n+     * get constructor desc.\r\n+     * \"()V\", \"(Ljava/lang/String;I)V\"\r\n+     *\r\n+     * @param c constructor.\r\n+     * @return desc\r\n+     */\r\n+    public static String getDesc(final Constructor<?> c) {\r\n+        StringBuilder ret = new StringBuilder(\"(\");\r\n+        Class<?>[] parameterTypes = c.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            ret.append(getDesc(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')').append('V');\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get method desc.\r\n+     * \"(I)I\", \"()V\", \"(Ljava/lang/String;Z)V\"\r\n+     *\r\n+     * @param m method.\r\n+     * @return desc.\r\n+     */\r\n+    public static String getDescWithoutMethodName(Method m) {\r\n+        StringBuilder ret = new StringBuilder();\r\n+        ret.append('(');\r\n+        Class<?>[] parameterTypes = m.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            ret.append(getDesc(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')').append(getDesc(m.getReturnType()));\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get class desc.\r\n+     * Object.class => \"Ljava/lang/Object;\"\r\n+     * boolean[].class => \"[Z\"\r\n+     *\r\n+     * @param c class.\r\n+     * @return desc.\r\n+     * @throws NotFoundException\r\n+     */\r\n+    public static String getDesc(final CtClass c) throws NotFoundException {\r\n+        StringBuilder ret = new StringBuilder();\r\n+        if (c.isArray()) {\r\n+            ret.append('[');\r\n+            ret.append(getDesc(c.getComponentType()));\r\n+        } else if (c.isPrimitive()) {\r\n+            String t = c.getName();\r\n+            if (\"void\".equals(t)) {\r\n+                ret.append(JVM_VOID);\r\n+            } else if (\"boolean\".equals(t)) {\r\n+                ret.append(JVM_BOOLEAN);\r\n+            } else if (\"byte\".equals(t)) {\r\n+                ret.append(JVM_BYTE);\r\n+            } else if (\"char\".equals(t)) {\r\n+                ret.append(JVM_CHAR);\r\n+            } else if (\"double\".equals(t)) {\r\n+                ret.append(JVM_DOUBLE);\r\n+            } else if (\"float\".equals(t)) {\r\n+                ret.append(JVM_FLOAT);\r\n+            } else if (\"int\".equals(t)) {\r\n+                ret.append(JVM_INT);\r\n+            } else if (\"long\".equals(t)) {\r\n+                ret.append(JVM_LONG);\r\n+            } else if (\"short\".equals(t)) {\r\n+                ret.append(JVM_SHORT);\r\n+            }\r\n+        } else {\r\n+            ret.append('L');\r\n+            ret.append(c.getName().replace('.', '/'));\r\n+            ret.append(';');\r\n+        }\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get method desc.\r\n+     * \"do(I)I\", \"do()V\", \"do(Ljava/lang/String;Z)V\"\r\n+     *\r\n+     * @param m method.\r\n+     * @return desc.\r\n+     */\r\n+    public static String getDesc(final CtMethod m) throws NotFoundException {\r\n+        StringBuilder ret = new StringBuilder(m.getName()).append('(');\r\n+        CtClass[] parameterTypes = m.getParameterTypes();\r\n+        for (CtClass parameterType : parameterTypes) {\r\n+            ret.append(getDesc(parameterType));\r\n+        }\r\n+        ret.append(')').append(getDesc(m.getReturnType()));\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get constructor desc.\r\n+     * \"()V\", \"(Ljava/lang/String;I)V\"\r\n+     *\r\n+     * @param c constructor.\r\n+     * @return desc\r\n+     */\r\n+    public static String getDesc(final CtConstructor c) throws NotFoundException {\r\n+        StringBuilder ret = new StringBuilder(\"(\");\r\n+        CtClass[] parameterTypes = c.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            ret.append(getDesc(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')').append('V');\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * get method desc.\r\n+     * \"(I)I\", \"()V\", \"(Ljava/lang/String;Z)V\".\r\n+     *\r\n+     * @param m method.\r\n+     * @return desc.\r\n+     */\r\n+    public static String getDescWithoutMethodName(final CtMethod m) throws NotFoundException {\r\n+        StringBuilder ret = new StringBuilder();\r\n+        ret.append('(');\r\n+        CtClass[] parameterTypes = m.getParameterTypes();\r\n+        for (int i = 0; i < parameterTypes.length; i++) {\r\n+            ret.append(getDesc(parameterTypes[i]));\r\n+        }\r\n+        ret.append(')').append(getDesc(m.getReturnType()));\r\n+        return ret.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * name to desc.\r\n+     * java.util.Map[][] => \"[[Ljava/util/Map;\"\r\n+     *\r\n+     * @param name name.\r\n+     * @return desc.\r\n+     */\r\n+    public static String name2desc(String name) {\r\n+        StringBuilder sb = new StringBuilder();\r\n+        int c = 0, index = name.indexOf('[');\r\n+        if (index > 0) {\r\n+            c = (name.length() - index) / 2;\r\n+            name = name.substring(0, index);\r\n+        }\r\n+        while (c-- > 0) {\r\n+            sb.append(\"[\");\r\n+        }\r\n+        if (\"void\".equals(name)) {\r\n+            sb.append(JVM_VOID);\r\n+        } else if (\"boolean\".equals(name)) {\r\n+            sb.append(JVM_BOOLEAN);\r\n+        } else if (\"byte\".equals(name)) {\r\n+            sb.append(JVM_BYTE);\r\n+        } else if (\"char\".equals(name)) {\r\n+            sb.append(JVM_CHAR);\r\n+        } else if (\"double\".equals(name)) {\r\n+            sb.append(JVM_DOUBLE);\r\n+        } else if (\"float\".equals(name)) {\r\n+            sb.append(JVM_FLOAT);\r\n+        } else if (\"int\".equals(name)) {\r\n+            sb.append(JVM_INT);\r\n+        } else if (\"long\".equals(name)) {\r\n+            sb.append(JVM_LONG);\r\n+        } else if (\"short\".equals(name)) {\r\n+            sb.append(JVM_SHORT);\r\n+        } else {\r\n+            sb.append('L').append(name.replace('.', '/')).append(';');\r\n+        }\r\n+        return sb.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * desc to name.\r\n+     * \"[[I\" => \"int[][]\"\r\n+     *\r\n+     * @param desc desc.\r\n+     * @return name.\r\n+     */\r\n+    public static String desc2name(String desc) {\r\n+        StringBuilder sb = new StringBuilder();\r\n+        int c = desc.lastIndexOf('[') + 1;\r\n+        if (desc.length() == c + 1) {\r\n+            switch (desc.charAt(c)) {\r\n+                case JVM_VOID: {\r\n+                    sb.append(\"void\");\r\n+                    break;\r\n+                }\r\n+                case JVM_BOOLEAN: {\r\n+                    sb.append(\"boolean\");\r\n+                    break;\r\n+                }\r\n+                case JVM_BYTE: {\r\n+                    sb.append(\"byte\");\r\n+                    break;\r\n+                }\r\n+                case JVM_CHAR: {\r\n+                    sb.append(\"char\");\r\n+                    break;\r\n+                }\r\n+                case JVM_DOUBLE: {\r\n+                    sb.append(\"double\");\r\n+                    break;\r\n+                }\r\n+                case JVM_FLOAT: {\r\n+                    sb.append(\"float\");\r\n+                    break;\r\n+                }\r\n+                case JVM_INT: {\r\n+                    sb.append(\"int\");\r\n+                    break;\r\n+                }\r\n+                case JVM_LONG: {\r\n+                    sb.append(\"long\");\r\n+                    break;\r\n+                }\r\n+                case JVM_SHORT: {\r\n+                    sb.append(\"short\");\r\n+                    break;\r\n+                }\r\n+                default:\r\n+                    throw new RuntimeException();\r\n+            }\r\n+        } else {\r\n+            sb.append(desc.substring(c + 1, desc.length() - 1).replace('/', '.'));\r\n+        }\r\n+        while (c-- > 0) {\r\n+            sb.append(\"[]\");\r\n+        }\r\n+        return sb.toString();\r\n+    }\r\n+\r\n+    public static Class<?> forName(String name) {\r\n+        try {\r\n+            return name2class(name);\r\n+        } catch (ClassNotFoundException e) {\r\n+            throw new IllegalStateException(\"Not found class \" + name + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public static Class<?> forName(ClassLoader cl, String name) {\r\n+        try {\r\n+            return name2class(cl, name);\r\n+        } catch (ClassNotFoundException e) {\r\n+            throw new IllegalStateException(\"Not found class \" + name + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * name to class.\r\n+     * \"boolean\" => boolean.class\r\n+     * \"java.util.Map[][]\" => java.util.Map[][].class\r\n+     *\r\n+     * @param name name.\r\n+     * @return Class instance.\r\n+     */\r\n+    public static Class<?> name2class(String name) throws ClassNotFoundException {\r\n+        return name2class(ClassUtils.getClassLoader(), name);\r\n+    }\r\n+\r\n+    /**\r\n+     * name to class.\r\n+     * \"boolean\" => boolean.class\r\n+     * \"java.util.Map[][]\" => java.util.Map[][].class\r\n+     *\r\n+     * @param cl   ClassLoader instance.\r\n+     * @param name name.\r\n+     * @return Class instance.\r\n+     */\r\n+    private static Class<?> name2class(ClassLoader cl, String name) throws ClassNotFoundException {\r\n+        int c = 0, index = name.indexOf('[');\r\n+        if (index > 0) {\r\n+            c = (name.length() - index) / 2;\r\n+            name = name.substring(0, index);\r\n+        }\r\n+        if (c > 0) {\r\n+            StringBuilder sb = new StringBuilder();\r\n+            while (c-- > 0) {\r\n+                sb.append(\"[\");\r\n+            }\r\n+\r\n+            if (\"void\".equals(name)) {\r\n+                sb.append(JVM_VOID);\r\n+            } else if (\"boolean\".equals(name)) {\r\n+                sb.append(JVM_BOOLEAN);\r\n+            } else if (\"byte\".equals(name)) {\r\n+                sb.append(JVM_BYTE);\r\n+            } else if (\"char\".equals(name)) {\r\n+                sb.append(JVM_CHAR);\r\n+            } else if (\"double\".equals(name)) {\r\n+                sb.append(JVM_DOUBLE);\r\n+            } else if (\"float\".equals(name)) {\r\n+                sb.append(JVM_FLOAT);\r\n+            } else if (\"int\".equals(name)) {\r\n+                sb.append(JVM_INT);\r\n+            } else if (\"long\".equals(name)) {\r\n+                sb.append(JVM_LONG);\r\n+            } else if (\"short\".equals(name)) {\r\n+                sb.append(JVM_SHORT);\r\n+            } else {\r\n+                // \"java.lang.Object\" ==> \"Ljava.lang.Object;\"\r\n+                sb.append('L').append(name).append(';');\r\n+            }\r\n+            name = sb.toString();\r\n+        } else {\r\n+            if (\"void\".equals(name)) {\r\n+                return void.class;\r\n+            }\r\n+            if (\"boolean\".equals(name)) {\r\n+                return boolean.class;\r\n+            }\r\n+            if (\"byte\".equals(name)) {\r\n+                return byte.class;\r\n+            }\r\n+            if (\"char\".equals(name)) {\r\n+                return char.class;\r\n+            }\r\n+            if (\"double\".equals(name)) {\r\n+                return double.class;\r\n+            }\r\n+            if (\"float\".equals(name)) {\r\n+                return float.class;\r\n+            }\r\n+            if (\"int\".equals(name)) {\r\n+                return int.class;\r\n+            }\r\n+            if (\"long\".equals(name)) {\r\n+                return long.class;\r\n+            }\r\n+            if (\"short\".equals(name)) {\r\n+                return short.class;\r\n+            }\r\n+        }\r\n+\r\n+        if (cl == null) {\r\n+            cl = ClassUtils.getClassLoader();\r\n+        }\r\n+        Class<?> clazz = NAME_CLASS_CACHE.get(name);\r\n+        if (clazz == null) {\r\n+            clazz = Class.forName(name, true, cl);\r\n+            NAME_CLASS_CACHE.put(name, clazz);\r\n+        }\r\n+        return clazz;\r\n+    }\r\n+\r\n+    /**\r\n+     * desc to class.\r\n+     * \"[Z\" => boolean[].class\r\n+     * \"[[Ljava/util/Map;\" => java.util.Map[][].class\r\n+     *\r\n+     * @param desc desc.\r\n+     * @return Class instance.\r\n+     * @throws ClassNotFoundException\r\n+     */\r\n+    public static Class<?> desc2class(String desc) throws ClassNotFoundException {\r\n+        return desc2class(ClassUtils.getClassLoader(), desc);\r\n+    }\r\n+\r\n+    /**\r\n+     * desc to class.\r\n+     * \"[Z\" => boolean[].class\r\n+     * \"[[Ljava/util/Map;\" => java.util.Map[][].class\r\n+     *\r\n+     * @param cl   ClassLoader instance.\r\n+     * @param desc desc.\r\n+     * @return Class instance.\r\n+     * @throws ClassNotFoundException\r\n+     */\r\n+    private static Class<?> desc2class(ClassLoader cl, String desc) throws ClassNotFoundException {\r\n+        switch (desc.charAt(0)) {\r\n+            case JVM_VOID:\r\n+                return void.class;\r\n+            case JVM_BOOLEAN:\r\n+                return boolean.class;\r\n+            case JVM_BYTE:\r\n+                return byte.class;\r\n+            case JVM_CHAR:\r\n+                return char.class;\r\n+            case JVM_DOUBLE:\r\n+                return double.class;\r\n+            case JVM_FLOAT:\r\n+                return float.class;\r\n+            case JVM_INT:\r\n+                return int.class;\r\n+            case JVM_LONG:\r\n+                return long.class;\r\n+            case JVM_SHORT:\r\n+                return short.class;\r\n+            case 'L':\r\n+                // \"Ljava/lang/Object;\" ==> \"java.lang.Object\"\r\n+                desc = desc.substring(1, desc.length() - 1).replace('/', '.');\r\n+                break;\r\n+            case '[':\r\n+                // \"[[Ljava/lang/Object;\" ==> \"[[Ljava.lang.Object;\"\r\n+                desc = desc.replace('/', '.');\r\n+                break;\r\n+            default:\r\n+                throw new ClassNotFoundException(\"Class not found: \" + desc);\r\n+        }\r\n+\r\n+        if (cl == null) {\r\n+            cl = ClassUtils.getClassLoader();\r\n+        }\r\n+        Class<?> clazz = DESC_CLASS_CACHE.get(desc);\r\n+        if (clazz == null) {\r\n+            clazz = Class.forName(desc, true, cl);\r\n+            DESC_CLASS_CACHE.put(desc, clazz);\r\n+        }\r\n+        return clazz;\r\n+    }\r\n+\r\n+    /**\r\n+     * get class array instance.\r\n+     *\r\n+     * @param desc desc.\r\n+     * @return Class class array.\r\n+     * @throws ClassNotFoundException\r\n+     */\r\n+    public static Class<?>[] desc2classArray(String desc) throws ClassNotFoundException {\r\n+        Class<?>[] ret = desc2classArray(ClassUtils.getClassLoader(), desc);\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * get class array instance.\r\n+     *\r\n+     * @param cl   ClassLoader instance.\r\n+     * @param desc desc.\r\n+     * @return Class[] class array.\r\n+     * @throws ClassNotFoundException\r\n+     */\r\n+    private static Class<?>[] desc2classArray(ClassLoader cl, String desc) throws ClassNotFoundException {\r\n+        if (desc.length() == 0) {\r\n+            return EMPTY_CLASS_ARRAY;\r\n+        }\r\n+\r\n+        List<Class<?>> cs = new ArrayList<Class<?>>();\r\n+        Matcher m = DESC_PATTERN.matcher(desc);\r\n+        while (m.find()) {\r\n+            cs.add(desc2class(cl, m.group()));\r\n+        }\r\n+        return cs.toArray(EMPTY_CLASS_ARRAY);\r\n+    }\r\n+\r\n+    /**\r\n+     * Find method from method signature\r\n+     *\r\n+     * @param clazz      Target class to find method\r\n+     * @param methodName Method signature, e.g.: method1(int, String). It is allowed to provide method name only, e.g.: method2\r\n+     * @return target method\r\n+     * @throws NoSuchMethodException\r\n+     * @throws ClassNotFoundException\r\n+     * @throws IllegalStateException  when multiple methods are found (overridden method when parameter info is not provided)\r\n+     * @deprecated Recommend {@link MethodUtils#findMethod(Class, String, Class[])}\r\n+     */\r\n+    @Deprecated\r\n+    public static Method findMethodByMethodSignature(Class<?> clazz, String methodName, String[] parameterTypes)\r\n+            throws NoSuchMethodException, ClassNotFoundException {\r\n+        String signature = clazz.getName() + \".\" + methodName;\r\n+        if (parameterTypes != null && parameterTypes.length > 0) {\r\n+            signature += StringUtils.join(parameterTypes);\r\n+        }\r\n+        Method method = SIGNATURE_METHODS_CACHE.get(signature);\r\n+        if (method != null) {\r\n+            return method;\r\n+        }\r\n+        if (parameterTypes == null) {\r\n+            List<Method> finded = new ArrayList<Method>();\r\n+            for (Method m : clazz.getMethods()) {\r\n+                if (m.getName().equals(methodName)) {\r\n+                    finded.add(m);\r\n+                }\r\n+            }\r\n+            if (finded.isEmpty()) {\r\n+                throw new NoSuchMethodException(\"No such method \" + methodName + \" in class \" + clazz);\r\n+            }\r\n+            if (finded.size() > 1) {\r\n+                String msg = String.format(\"Not unique method for method name(%s) in class(%s), find %d methods.\",\r\n+                        methodName, clazz.getName(), finded.size());\r\n+                throw new IllegalStateException(msg);\r\n+            }\r\n+            method = finded.get(0);\r\n+        } else {\r\n+            Class<?>[] types = new Class<?>[parameterTypes.length];\r\n+            for (int i = 0; i < parameterTypes.length; i++) {\r\n+                types[i] = ReflectUtils.name2class(parameterTypes[i]);\r\n+            }\r\n+            method = clazz.getMethod(methodName, types);\r\n+\r\n+        }\r\n+        SIGNATURE_METHODS_CACHE.put(signature, method);\r\n+        return method;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param clazz      Target class to find method\r\n+     * @param methodName Method signature, e.g.: method1(int, String). It is allowed to provide method name only, e.g.: method2\r\n+     * @return target method\r\n+     * @throws NoSuchMethodException\r\n+     * @throws ClassNotFoundException\r\n+     * @throws IllegalStateException  when multiple methods are found (overridden method when parameter info is not provided)\r\n+     * @deprecated Recommend {@link MethodUtils#findMethod(Class, String, Class[])}\r\n+     */\r\n+    @Deprecated\r\n+    public static Method findMethodByMethodName(Class<?> clazz, String methodName)\r\n+            throws NoSuchMethodException, ClassNotFoundException {\r\n+        return findMethodByMethodSignature(clazz, methodName, null);\r\n+    }\r\n+\r\n+    public static Constructor<?> findConstructor(Class<?> clazz, Class<?> paramType) throws NoSuchMethodException {\r\n+        Constructor<?> targetConstructor;\r\n+        try {\r\n+            targetConstructor = clazz.getConstructor(new Class<?>[]{paramType});\r\n+        } catch (NoSuchMethodException e) {\r\n+            targetConstructor = null;\r\n+            Constructor<?>[] constructors = clazz.getConstructors();\r\n+            for (Constructor<?> constructor : constructors) {\r\n+                if (Modifier.isPublic(constructor.getModifiers())\r\n+                        && constructor.getParameterTypes().length == 1\r\n+                        && constructor.getParameterTypes()[0].isAssignableFrom(paramType)) {\r\n+                    targetConstructor = constructor;\r\n+                    break;\r\n+                }\r\n+            }\r\n+            if (targetConstructor == null) {\r\n+                throw e;\r\n+            }\r\n+        }\r\n+        return targetConstructor;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check if one object is the implementation for a given interface.\r\n+     * <p>\r\n+     * This method will not trigger classloading for the given interface, therefore it will not lead to error when\r\n+     * the given interface is not visible by the classloader\r\n+     *\r\n+     * @param obj                Object to examine\r\n+     * @param interfaceClazzName The given interface\r\n+     * @return true if the object implements the given interface, otherwise return false\r\n+     */\r\n+    public static boolean isInstance(Object obj, String interfaceClazzName) {\r\n+        for (Class<?> clazz = obj.getClass();\r\n+             clazz != null && !clazz.equals(Object.class);\r\n+             clazz = clazz.getSuperclass()) {\r\n+            Class<?>[] interfaces = clazz.getInterfaces();\r\n+            for (Class<?> itf : interfaces) {\r\n+                if (itf.getName().equals(interfaceClazzName)) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    public static Object getEmptyObject(Class<?> returnType) {\r\n+        return getEmptyObject(returnType, new HashMap<>(), 0);\r\n+    }\r\n+\r\n+    private static Object getEmptyObject(Class<?> returnType, Map<Class<?>, Object> emptyInstances, int level) {\r\n+        if (level > 2) {\r\n+            return null;\r\n+        }\r\n+        if (returnType == null) {\r\n+            return null;\r\n+        }\r\n+        if (returnType == boolean.class || returnType == Boolean.class) {\r\n+            return false;\r\n+        }\r\n+        if (returnType == char.class || returnType == Character.class) {\r\n+            return '\\0';\r\n+        }\r\n+        if (returnType == byte.class || returnType == Byte.class) {\r\n+            return (byte) 0;\r\n+        }\r\n+        if (returnType == short.class || returnType == Short.class) {\r\n+            return (short) 0;\r\n+        }\r\n+        if (returnType == int.class || returnType == Integer.class) {\r\n+            return 0;\r\n+        }\r\n+        if (returnType == long.class || returnType == Long.class) {\r\n+            return 0L;\r\n+        }\r\n+        if (returnType == float.class || returnType == Float.class) {\r\n+            return 0F;\r\n+        }\r\n+        if (returnType == double.class || returnType == Double.class) {\r\n+            return 0D;\r\n+        }\r\n+        if (returnType.isArray()) {\r\n+            return Array.newInstance(returnType.getComponentType(), 0);\r\n+        }\r\n+        if (returnType.isAssignableFrom(ArrayList.class)) {\r\n+            return new ArrayList<>(0);\r\n+        }\r\n+        if (returnType.isAssignableFrom(HashSet.class)) {\r\n+            return new HashSet<>(0);\r\n+        }\r\n+        if (returnType.isAssignableFrom(HashMap.class)) {\r\n+            return new HashMap<>(0);\r\n+        }\r\n+        if (String.class.equals(returnType)) {\r\n+            return \"\";\r\n+        }\r\n+        if (returnType.isInterface()) {\r\n+            return null;\r\n+        }\r\n+\r\n+        try {\r\n+            Object value = emptyInstances.get(returnType);\r\n+            if (value == null) {\r\n+                value = returnType.getDeclaredConstructor().newInstance();\r\n+                emptyInstances.put(returnType, value);\r\n+            }\r\n+            Class<?> cls = value.getClass();\r\n+            while (cls != null && cls != Object.class) {\r\n+                Field[] fields = cls.getDeclaredFields();\r\n+                for (Field field : fields) {\r\n+                    if (field.isSynthetic()) {\r\n+                        continue;\r\n+                    }\r\n+                    Object property = getEmptyObject(field.getType(), emptyInstances, level + 1);\r\n+                    if (property != null) {\r\n+                        try {\r\n+                            ReflectUtils.makeAccessible(field);\r\n+                            field.set(value, property);\r\n+                        } catch (Throwable ignored) {\r\n+                        }\r\n+                    }\r\n+                }\r\n+                cls = cls.getSuperclass();\r\n+            }\r\n+            return value;\r\n+        } catch (Throwable e) {\r\n+            return null;\r\n+        }\r\n+    }\r\n+\r\n+    public static Object defaultReturn(Method m) {\r\n+        if (m.getReturnType().isPrimitive()) {\r\n+            return primitiveDefaults.get(m.getReturnType());\r\n+        } else {\r\n+            return null;\r\n+        }\r\n+    }\r\n+\r\n+    public static Object defaultReturn(Class<?> classType) {\r\n+        if (classType != null && classType.isPrimitive()) {\r\n+            return primitiveDefaults.get(classType);\r\n+        } else {\r\n+            return null;\r\n+        }\r\n+    }\r\n+\r\n+    public static boolean isBeanPropertyReadMethod(Method method) {\r\n+        return method != null\r\n+                && Modifier.isPublic(method.getModifiers())\r\n+                && !Modifier.isStatic(method.getModifiers())\r\n+                && method.getReturnType() != void.class\r\n+                && method.getDeclaringClass() != Object.class\r\n+                && method.getParameterTypes().length == 0\r\n+                && ((method.getName().startsWith(\"get\") && method.getName().length() > 3)\r\n+                || (method.getName().startsWith(\"is\") && method.getName().length() > 2));\r\n+    }\r\n+\r\n+    public static String getPropertyNameFromBeanReadMethod(Method method) {\r\n+        if (isBeanPropertyReadMethod(method)) {\r\n+            if (method.getName().startsWith(\"get\")) {\r\n+                return method.getName().substring(3, 4).toLowerCase()\r\n+                        + method.getName().substring(4);\r\n+            }\r\n+            if (method.getName().startsWith(\"is\")) {\r\n+                return method.getName().substring(2, 3).toLowerCase()\r\n+                        + method.getName().substring(3);\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public static boolean isBeanPropertyWriteMethod(Method method) {\r\n+        return method != null\r\n+                && Modifier.isPublic(method.getModifiers())\r\n+                && !Modifier.isStatic(method.getModifiers())\r\n+                && method.getDeclaringClass() != Object.class\r\n+                && method.getParameterTypes().length == 1\r\n+                && method.getName().startsWith(\"set\")\r\n+                && method.getName().length() > 3;\r\n+    }\r\n+\r\n+    public static String getPropertyNameFromBeanWriteMethod(Method method) {\r\n+        if (isBeanPropertyWriteMethod(method)) {\r\n+            return method.getName().substring(3, 4).toLowerCase()\r\n+                    + method.getName().substring(4);\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public static boolean isPublicInstanceField(Field field) {\r\n+        return Modifier.isPublic(field.getModifiers())\r\n+                && !Modifier.isStatic(field.getModifiers())\r\n+                && !Modifier.isFinal(field.getModifiers())\r\n+                && !field.isSynthetic();\r\n+    }\r\n+\r\n+    public static Map<String, Field> getBeanPropertyFields(Class cl) {\r\n+        Map<String, Field> properties = new HashMap<String, Field>();\r\n+        for (; cl != null; cl = cl.getSuperclass()) {\r\n+            Field[] fields = cl.getDeclaredFields();\r\n+            for (Field field : fields) {\r\n+                if (Modifier.isTransient(field.getModifiers())\r\n+                        || Modifier.isStatic(field.getModifiers())) {\r\n+                    continue;\r\n+                }\r\n+                ReflectUtils.makeAccessible(field);\r\n+\r\n+                properties.put(field.getName(), field);\r\n+            }\r\n+        }\r\n+\r\n+        return properties;\r\n+    }\r\n+\r\n+    public static Map<String, Method> getBeanPropertyReadMethods(Class cl) {\r\n+        Map<String, Method> properties = new HashMap<String, Method>();\r\n+        for (; cl != null; cl = cl.getSuperclass()) {\r\n+            Method[] methods = cl.getDeclaredMethods();\r\n+            for (Method method : methods) {\r\n+                if (isBeanPropertyReadMethod(method)) {\r\n+                    ReflectUtils.makeAccessible(method);\r\n+                    String property = getPropertyNameFromBeanReadMethod(method);\r\n+                    properties.put(property, method);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return properties;\r\n+    }\r\n+\r\n+    public static Type[] getReturnTypes(Method method) {\r\n+        Class<?> returnType = method.getReturnType();\r\n+        Type genericReturnType = method.getGenericReturnType();\r\n+        if (Future.class.isAssignableFrom(returnType)) {\r\n+            if (genericReturnType instanceof ParameterizedType) {\r\n+                Type actualArgType = ((ParameterizedType) genericReturnType).getActualTypeArguments()[0];\r\n+                if (actualArgType instanceof ParameterizedType) {\r\n+                    returnType = (Class<?>) ((ParameterizedType) actualArgType).getRawType();\r\n+                    genericReturnType = actualArgType;\r\n+                } else if (actualArgType instanceof TypeVariable) {\r\n+                    returnType = (Class<?>) ((TypeVariable<?>) actualArgType).getBounds()[0];\r\n+                    genericReturnType = actualArgType;\r\n+                } else {\r\n+                    returnType = (Class<?>) actualArgType;\r\n+                    genericReturnType = returnType;\r\n+                }\r\n+            } else {\r\n+                returnType = null;\r\n+                genericReturnType = null;\r\n+            }\r\n+        }\r\n+        return new Type[]{returnType, genericReturnType};\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link Set} of {@link ParameterizedType}\r\n+     *\r\n+     * @param sourceClass the source {@link Class class}\r\n+     * @return non-null read-only {@link Set}\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static Set<ParameterizedType> findParameterizedTypes(Class<?> sourceClass) {\r\n+        // Add Generic Interfaces\r\n+        List<Type> genericTypes = new LinkedList<>(asList(sourceClass.getGenericInterfaces()));\r\n+        // Add Generic Super Class\r\n+        genericTypes.add(sourceClass.getGenericSuperclass());\r\n+\r\n+        Set<ParameterizedType> parameterizedTypes = genericTypes.stream()\r\n+                .filter(type -> type instanceof ParameterizedType)// filter ParameterizedType\r\n+                .map(ParameterizedType.class::cast)  // cast to ParameterizedType\r\n+                .collect(Collectors.toSet());\r\n+\r\n+        if (parameterizedTypes.isEmpty()) { // If not found, try to search super types recursively\r\n+            genericTypes.stream()\r\n+                    .filter(type -> type instanceof Class)\r\n+                    .map(Class.class::cast)\r\n+                    .forEach(superClass -> parameterizedTypes.addAll(findParameterizedTypes(superClass)));\r\n+        }\r\n+\r\n+        return unmodifiableSet(parameterizedTypes);                     // build as a Set\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the hierarchical types from the source {@link Class class} by specified {@link Class type}.\r\n+     *\r\n+     * @param sourceClass the source {@link Class class}\r\n+     * @param matchType   the type to match\r\n+     * @param <T>         the type to match\r\n+     * @return non-null read-only {@link Set}\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static <T> Set<Class<T>> findHierarchicalTypes(Class<?> sourceClass, Class<T> matchType) {\r\n+        if (sourceClass == null) {\r\n+            return Collections.emptySet();\r\n+        }\r\n+\r\n+        Set<Class<T>> hierarchicalTypes = new LinkedHashSet<>();\r\n+\r\n+        if (matchType.isAssignableFrom(sourceClass)) {\r\n+            hierarchicalTypes.add((Class<T>) sourceClass);\r\n+        }\r\n+\r\n+        // Find all super classes\r\n+        hierarchicalTypes.addAll(findHierarchicalTypes(sourceClass.getSuperclass(), matchType));\r\n+\r\n+        return unmodifiableSet(hierarchicalTypes);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the value from the specified bean and its getter method.\r\n+     *\r\n+     * @param bean       the bean instance\r\n+     * @param methodName the name of getter\r\n+     * @param <T>        the type of property value\r\n+     * @return\r\n+     * @since 2.7.5\r\n+     */\r\n+    public static <T> T getProperty(Object bean, String methodName) {\r\n+        Class<?> beanClass = bean.getClass();\r\n+        BeanInfo beanInfo = null;\r\n+        T propertyValue = null;\r\n+\r\n+        try {\r\n+            beanInfo = Introspector.getBeanInfo(beanClass);\r\n+            propertyValue = (T) Stream.of(beanInfo.getMethodDescriptors())\r\n+                    .filter(methodDescriptor -> methodName.equals(methodDescriptor.getName()))\r\n+                    .findFirst()\r\n+                    .map(method -> {\r\n+                        try {\r\n+                            return method.getMethod().invoke(bean);\r\n+                        } catch (Exception e) {\r\n+                            //ignore\r\n+                        }\r\n+                        return null;\r\n+                    }).get();\r\n+        } catch (Exception e) {\r\n+\r\n+        }\r\n+        return propertyValue;\r\n+    }\r\n+\r\n+    /**\r\n+     * Resolve the types of the specified values\r\n+     *\r\n+     * @param values the values\r\n+     * @return If can't be resolved, return {@link ReflectUtils#EMPTY_CLASS_ARRAY empty class array}\r\n+     * @since 2.7.6\r\n+     */\r\n+    public static Class[] resolveTypes(Object... values) {\r\n+\r\n+        if (isEmpty(values)) {\r\n+            return EMPTY_CLASS_ARRAY;\r\n+        }\r\n+\r\n+        int size = values.length;\r\n+\r\n+        Class[] types = new Class[size];\r\n+\r\n+        for (int i = 0; i < size; i++) {\r\n+            Object value = values[i];\r\n+            types[i] = value == null ? null : value.getClass();\r\n+        }\r\n+\r\n+        return types;\r\n+    }\r\n+\r\n+    /**\r\n+     * Copy from org.springframework.util.ReflectionUtils.\r\n+     * Make the given method accessible, explicitly setting it accessible if\r\n+     * necessary. The {@code setAccessible(true)} method is only called\r\n+     * when actually necessary, to avoid unnecessary conflicts with a JVM\r\n+     * SecurityManager (if active).\r\n+     * @param method the method to make accessible\r\n+     * @see java.lang.reflect.Method#setAccessible\r\n+     */\r\n+    @SuppressWarnings(\"deprecation\")  // on JDK 9\r\n+    public static void makeAccessible(Method method) {\r\n+        if ((!Modifier.isPublic(method.getModifiers()) ||\r\n+                !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !method.isAccessible()) {\r\n+            method.setAccessible(true);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Copy from org.springframework.util.ReflectionUtils.\r\n+     * Make the given field accessible, explicitly setting it accessible if\r\n+     * necessary. The {@code setAccessible(true)} method is only called\r\n+     * when actually necessary, to avoid unnecessary conflicts with a JVM\r\n+     * SecurityManager (if active).\r\n+     * @param field the field to make accessible\r\n+     * @see java.lang.reflect.Field#setAccessible\r\n+     */\r\n+    @SuppressWarnings(\"deprecation\")  // on JDK 9\r\n+    public static void makeAccessible(Field field) {\r\n+        if ((!Modifier.isPublic(field.getModifiers()) ||\r\n+                !Modifier.isPublic(field.getDeclaringClass().getModifiers()) ||\r\n+                Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {\r\n+            field.setAccessible(true);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Copy from org.springframework.util.ReflectionUtils.\r\n+     * Make the given constructor accessible, explicitly setting it accessible\r\n+     * if necessary. The {@code setAccessible(true)} method is only called\r\n+     * when actually necessary, to avoid unnecessary conflicts with a JVM\r\n+     * SecurityManager (if active).\r\n+     * @param ctor the constructor to make accessible\r\n+     * @see java.lang.reflect.Constructor#setAccessible\r\n+     */\r\n+    @SuppressWarnings(\"deprecation\")  // on JDK 9\r\n+    public static void makeAccessible(Constructor<?> ctor) {\r\n+        if ((!Modifier.isPublic(ctor.getModifiers()) ||\r\n+                !Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) && !ctor.isAccessible()) {\r\n+            ctor.setAccessible(true);\r\n+        }\r\n+    }\r\n+\r\n+    public static boolean checkZeroArgConstructor(Class clazz) {\r\n+        try {\r\n+            clazz.getDeclaredConstructor();\r\n+            return true;\r\n+        } catch (NoSuchMethodException e) {\r\n+            return false;\r\n+        }\r\n+    }\r\n+\r\n+    public static boolean isJdk(Class clazz) {\r\n+        return clazz.getName().startsWith(\"java.\") || clazz.getName().startsWith(\"javax.\");\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/SerializeClassChecker.java", "source2": "org/apache/dubbo/common/utils/SerializeClassChecker.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,150 +1,150 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import org.apache.dubbo.common.beanutil.JavaBeanSerializeUtil;\n-import org.apache.dubbo.common.constants.CommonConstants;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-\n-import java.io.IOException;\n-import java.util.Arrays;\n-import java.util.Locale;\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicLong;\n-\n-public class SerializeClassChecker {\n-    private static final Logger logger = LoggerFactory.getLogger(SerializeClassChecker.class);\n-\n-    private static volatile SerializeClassChecker INSTANCE = null;\n-\n-    private final boolean BLOCK_ALL_CLASS_EXCEPT_ALLOW;\n-    private final Set<String> CLASS_DESERIALIZE_ALLOWED_SET = new ConcurrentHashSet<>();\n-    private final Set<String> CLASS_DESERIALIZE_BLOCKED_SET = new ConcurrentHashSet<>();\n-\n-    private final Object CACHE = new Object();\n-    private final LFUCache<String, Object> CLASS_ALLOW_LFU_CACHE = new LFUCache<>();\n-    private final LFUCache<String, Object> CLASS_BLOCK_LFU_CACHE = new LFUCache<>();\n-\n-    private final AtomicLong counter = new AtomicLong(0);\n-\n-    private SerializeClassChecker() {\n-        String blockAllClassExceptAllow = System.getProperty(CommonConstants.CLASS_DESERIALIZE_BLOCK_ALL, \"false\");\n-        BLOCK_ALL_CLASS_EXCEPT_ALLOW = Boolean.parseBoolean(blockAllClassExceptAllow);\n-\n-        String[] lines;\n-        try {\n-            ClassLoader classLoader = ClassUtils.getClassLoader(JavaBeanSerializeUtil.class);\n-            if (classLoader != null) {\n-                lines = IOUtils.readLines(classLoader.getResourceAsStream(CommonConstants.SERIALIZE_BLOCKED_LIST_FILE_PATH));\n-            } else {\n-                lines = IOUtils.readLines(ClassLoader.getSystemResourceAsStream(CommonConstants.SERIALIZE_BLOCKED_LIST_FILE_PATH));\n-            }\n-            for (String line : lines) {\n-                line = line.trim();\n-                if (StringUtils.isEmpty(line) || line.startsWith(\"#\")) {\n-                    continue;\n-                }\n-                CLASS_DESERIALIZE_BLOCKED_SET.add(line);\n-            }\n-\n-        } catch (IOException e) {\n-            logger.error(\"Failed to load blocked class list! Will ignore default blocked list.\", e);\n-        }\n-\n-        String allowedClassList = System.getProperty(CommonConstants.CLASS_DESERIALIZE_ALLOWED_LIST, \"\").trim().toLowerCase(Locale.ROOT);\n-        String blockedClassList = System.getProperty(CommonConstants.CLASS_DESERIALIZE_BLOCKED_LIST, \"\").trim().toLowerCase(Locale.ROOT);\n-\n-        if (StringUtils.isNotEmpty(allowedClassList)) {\n-            String[] classStrings = allowedClassList.trim().split(\",\");\n-            CLASS_DESERIALIZE_ALLOWED_SET.addAll(Arrays.asList(classStrings));\n-        }\n-\n-        if (StringUtils.isNotEmpty(blockedClassList)) {\n-            String[] classStrings = blockedClassList.trim().split(\",\");\n-            CLASS_DESERIALIZE_BLOCKED_SET.addAll(Arrays.asList(classStrings));\n-        }\n-\n-    }\n-\n-    public static SerializeClassChecker getInstance() {\n-        if (INSTANCE == null) {\n-            synchronized (SerializeClassChecker.class) {\n-                if (INSTANCE == null) {\n-                    INSTANCE = new SerializeClassChecker();\n-                }\n-            }\n-        }\n-        return INSTANCE;\n-    }\n-\n-    /**\n-     * For ut only\n-     */\n-    @Deprecated\n-    protected static void clearInstance() {\n-        INSTANCE = null;\n-    }\n-\n-    /**\n-     * Check if a class is in block list, using prefix match\n-     *\n-     * @throws IllegalArgumentException if class is blocked\n-     * @param name class name ( all are convert to lower case )\n-     */\n-    public void validateClass(String name) {\n-        name = name.toLowerCase(Locale.ROOT);\n-        if (CACHE == CLASS_ALLOW_LFU_CACHE.get(name)) {\n-            return;\n-        }\n-\n-        if (CACHE == CLASS_BLOCK_LFU_CACHE.get(name)) {\n-            error(name);\n-        }\n-\n-        for (String allowedPrefix : CLASS_DESERIALIZE_ALLOWED_SET) {\n-            if (name.startsWith(allowedPrefix)) {\n-                CLASS_ALLOW_LFU_CACHE.put(name, CACHE);\n-                return;\n-            }\n-        }\n-\n-        for (String blockedPrefix : CLASS_DESERIALIZE_BLOCKED_SET) {\n-            if (BLOCK_ALL_CLASS_EXCEPT_ALLOW || name.startsWith(blockedPrefix)) {\n-                CLASS_BLOCK_LFU_CACHE.put(name, CACHE);\n-                error(name);\n-            }\n-        }\n-\n-        CLASS_ALLOW_LFU_CACHE.put(name, CACHE);\n-    }\n-\n-    private void error(String name) {\n-        String notice = \"Trigger the safety barrier! \" +\n-                \"Catch not allowed serialize class. \" +\n-                \"Class name: \" + name + \" . \" +\n-                \"This means currently maybe being attacking by others.\" +\n-                \"If you are sure this is a mistake, \" +\n-                \"please add this class name to `\" + CommonConstants.CLASS_DESERIALIZE_ALLOWED_LIST +\n-                \"` as a system environment property.\";\n-        if (counter.incrementAndGet() % 1000 == 0 || counter.get() < 100) {\n-            logger.error(notice);\n-        }\n-        throw new IllegalArgumentException(notice);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import org.apache.dubbo.common.beanutil.JavaBeanSerializeUtil;\r\n+import org.apache.dubbo.common.constants.CommonConstants;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+\r\n+import java.io.IOException;\r\n+import java.util.Arrays;\r\n+import java.util.Locale;\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicLong;\r\n+\r\n+public class SerializeClassChecker {\r\n+    private static final Logger logger = LoggerFactory.getLogger(SerializeClassChecker.class);\r\n+\r\n+    private static volatile SerializeClassChecker INSTANCE = null;\r\n+\r\n+    private final boolean BLOCK_ALL_CLASS_EXCEPT_ALLOW;\r\n+    private final Set<String> CLASS_DESERIALIZE_ALLOWED_SET = new ConcurrentHashSet<>();\r\n+    private final Set<String> CLASS_DESERIALIZE_BLOCKED_SET = new ConcurrentHashSet<>();\r\n+\r\n+    private final Object CACHE = new Object();\r\n+    private final LFUCache<String, Object> CLASS_ALLOW_LFU_CACHE = new LFUCache<>();\r\n+    private final LFUCache<String, Object> CLASS_BLOCK_LFU_CACHE = new LFUCache<>();\r\n+\r\n+    private final AtomicLong counter = new AtomicLong(0);\r\n+\r\n+    private SerializeClassChecker() {\r\n+        String blockAllClassExceptAllow = System.getProperty(CommonConstants.CLASS_DESERIALIZE_BLOCK_ALL, \"false\");\r\n+        BLOCK_ALL_CLASS_EXCEPT_ALLOW = Boolean.parseBoolean(blockAllClassExceptAllow);\r\n+\r\n+        String[] lines;\r\n+        try {\r\n+            ClassLoader classLoader = ClassUtils.getClassLoader(JavaBeanSerializeUtil.class);\r\n+            if (classLoader != null) {\r\n+                lines = IOUtils.readLines(classLoader.getResourceAsStream(CommonConstants.SERIALIZE_BLOCKED_LIST_FILE_PATH));\r\n+            } else {\r\n+                lines = IOUtils.readLines(ClassLoader.getSystemResourceAsStream(CommonConstants.SERIALIZE_BLOCKED_LIST_FILE_PATH));\r\n+            }\r\n+            for (String line : lines) {\r\n+                line = line.trim();\r\n+                if (StringUtils.isEmpty(line) || line.startsWith(\"#\")) {\r\n+                    continue;\r\n+                }\r\n+                CLASS_DESERIALIZE_BLOCKED_SET.add(line);\r\n+            }\r\n+\r\n+        } catch (IOException e) {\r\n+            logger.error(\"Failed to load blocked class list! Will ignore default blocked list.\", e);\r\n+        }\r\n+\r\n+        String allowedClassList = System.getProperty(CommonConstants.CLASS_DESERIALIZE_ALLOWED_LIST, \"\").trim().toLowerCase(Locale.ROOT);\r\n+        String blockedClassList = System.getProperty(CommonConstants.CLASS_DESERIALIZE_BLOCKED_LIST, \"\").trim().toLowerCase(Locale.ROOT);\r\n+\r\n+        if (StringUtils.isNotEmpty(allowedClassList)) {\r\n+            String[] classStrings = allowedClassList.trim().split(\",\");\r\n+            CLASS_DESERIALIZE_ALLOWED_SET.addAll(Arrays.asList(classStrings));\r\n+        }\r\n+\r\n+        if (StringUtils.isNotEmpty(blockedClassList)) {\r\n+            String[] classStrings = blockedClassList.trim().split(\",\");\r\n+            CLASS_DESERIALIZE_BLOCKED_SET.addAll(Arrays.asList(classStrings));\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    public static SerializeClassChecker getInstance() {\r\n+        if (INSTANCE == null) {\r\n+            synchronized (SerializeClassChecker.class) {\r\n+                if (INSTANCE == null) {\r\n+                    INSTANCE = new SerializeClassChecker();\r\n+                }\r\n+            }\r\n+        }\r\n+        return INSTANCE;\r\n+    }\r\n+\r\n+    /**\r\n+     * For ut only\r\n+     */\r\n+    @Deprecated\r\n+    protected static void clearInstance() {\r\n+        INSTANCE = null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check if a class is in block list, using prefix match\r\n+     *\r\n+     * @throws IllegalArgumentException if class is blocked\r\n+     * @param name class name ( all are convert to lower case )\r\n+     */\r\n+    public void validateClass(String name) {\r\n+        name = name.toLowerCase(Locale.ROOT);\r\n+        if (CACHE == CLASS_ALLOW_LFU_CACHE.get(name)) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (CACHE == CLASS_BLOCK_LFU_CACHE.get(name)) {\r\n+            error(name);\r\n+        }\r\n+\r\n+        for (String allowedPrefix : CLASS_DESERIALIZE_ALLOWED_SET) {\r\n+            if (name.startsWith(allowedPrefix)) {\r\n+                CLASS_ALLOW_LFU_CACHE.put(name, CACHE);\r\n+                return;\r\n+            }\r\n+        }\r\n+\r\n+        for (String blockedPrefix : CLASS_DESERIALIZE_BLOCKED_SET) {\r\n+            if (BLOCK_ALL_CLASS_EXCEPT_ALLOW || name.startsWith(blockedPrefix)) {\r\n+                CLASS_BLOCK_LFU_CACHE.put(name, CACHE);\r\n+                error(name);\r\n+            }\r\n+        }\r\n+\r\n+        CLASS_ALLOW_LFU_CACHE.put(name, CACHE);\r\n+    }\r\n+\r\n+    private void error(String name) {\r\n+        String notice = \"Trigger the safety barrier! \" +\r\n+                \"Catch not allowed serialize class. \" +\r\n+                \"Class name: \" + name + \" . \" +\r\n+                \"This means currently maybe being attacking by others.\" +\r\n+                \"If you are sure this is a mistake, \" +\r\n+                \"please add this class name to `\" + CommonConstants.CLASS_DESERIALIZE_ALLOWED_LIST +\r\n+                \"` as a system environment property.\";\r\n+        if (counter.incrementAndGet() % 1000 == 0 || counter.get() < 100) {\r\n+            logger.error(notice);\r\n+        }\r\n+        throw new IllegalArgumentException(notice);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/ServiceAnnotationResolver.java", "source2": "org/apache/dubbo/common/utils/ServiceAnnotationResolver.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,132 +1,132 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import org.apache.dubbo.config.annotation.DubboService;\n-import org.apache.dubbo.config.annotation.Service;\n-\n-import java.lang.annotation.Annotation;\n-import java.util.List;\n-\n-import static java.lang.String.format;\n-import static java.util.Arrays.asList;\n-import static java.util.Collections.unmodifiableList;\n-import static org.apache.dubbo.common.utils.AnnotationUtils.getAttribute;\n-import static org.apache.dubbo.common.utils.ArrayUtils.isNotEmpty;\n-import static org.apache.dubbo.common.utils.ClassUtils.isGenericClass;\n-import static org.apache.dubbo.common.utils.ClassUtils.resolveClass;\n-import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\n-\n-/**\n- * The resolver class for {@link Service @Service}\n- *\n- * @see Service\n- * @see com.alibaba.dubbo.config.annotation.Service\n- * @since 2.7.6\n- */\n-public class ServiceAnnotationResolver {\n-\n-    /**\n-     * The annotation {@link Class classes} of Dubbo Service (read-only)\n-     *\n-     * @since 2.7.9\n-     */\n-    public static List<Class<? extends Annotation>> SERVICE_ANNOTATION_CLASSES = unmodifiableList(asList(DubboService.class, Service.class, com.alibaba.dubbo.config.annotation.Service.class));\n-\n-    private final Annotation serviceAnnotation;\n-\n-    private final Class<?> serviceType;\n-\n-    public ServiceAnnotationResolver(Class<?> serviceType) throws IllegalArgumentException {\n-        this.serviceType = serviceType;\n-        this.serviceAnnotation = getServiceAnnotation(serviceType);\n-    }\n-\n-    private Annotation getServiceAnnotation(Class<?> serviceType) {\n-\n-        Annotation serviceAnnotation = null;\n-\n-        for (Class<? extends Annotation> serviceAnnotationClass : SERVICE_ANNOTATION_CLASSES) {\n-            serviceAnnotation = serviceType.getAnnotation(serviceAnnotationClass);\n-            if (serviceAnnotation != null) {\n-                break;\n-            }\n-        }\n-\n-        if (serviceAnnotation == null) {\n-            throw new IllegalArgumentException(format(\"Any annotation of [%s] can't be annotated in the service type[%s].\",\n-                    SERVICE_ANNOTATION_CLASSES,\n-                    serviceType.getName()\n-            ));\n-        }\n-\n-        return serviceAnnotation;\n-    }\n-\n-    /**\n-     * Resolve the class name of interface\n-     *\n-     * @return if not found, return <code>null</code>\n-     */\n-    public String resolveInterfaceClassName() {\n-\n-        Class interfaceClass = null;\n-        // first, try to get the value from \"interfaceName\" attribute\n-        String interfaceName = resolveAttribute(\"interfaceName\");\n-\n-        if (isEmpty(interfaceName)) { // If not found, try \"interfaceClass\"\n-            interfaceClass = resolveAttribute(\"interfaceClass\");\n-        } else {\n-            interfaceClass = resolveClass(interfaceName, getClass().getClassLoader());\n-        }\n-\n-        if (isGenericClass(interfaceClass)) {\n-            interfaceName = interfaceClass.getName();\n-        } else {\n-            interfaceName = null;\n-        }\n-\n-        if (isEmpty(interfaceName)) { // If not fund, try to get the first interface from the service type\n-            Class[] interfaces = serviceType.getInterfaces();\n-            if (isNotEmpty(interfaces)) {\n-                interfaceName = interfaces[0].getName();\n-            }\n-        }\n-\n-        return interfaceName;\n-    }\n-\n-    public String resolveVersion() {\n-        return resolveAttribute(\"version\");\n-    }\n-\n-    public String resolveGroup() {\n-        return resolveAttribute(\"group\");\n-    }\n-\n-    private <T> T resolveAttribute(String attributeName) {\n-        return getAttribute(serviceAnnotation, attributeName);\n-    }\n-\n-    public Annotation getServiceAnnotation() {\n-        return serviceAnnotation;\n-    }\n-\n-    public Class<?> getServiceType() {\n-        return serviceType;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import org.apache.dubbo.config.annotation.DubboService;\r\n+import org.apache.dubbo.config.annotation.Service;\r\n+\r\n+import java.lang.annotation.Annotation;\r\n+import java.util.List;\r\n+\r\n+import static java.lang.String.format;\r\n+import static java.util.Arrays.asList;\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static org.apache.dubbo.common.utils.AnnotationUtils.getAttribute;\r\n+import static org.apache.dubbo.common.utils.ArrayUtils.isNotEmpty;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.isGenericClass;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.resolveClass;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\r\n+\r\n+/**\r\n+ * The resolver class for {@link Service @Service}\r\n+ *\r\n+ * @see Service\r\n+ * @see com.alibaba.dubbo.config.annotation.Service\r\n+ * @since 2.7.6\r\n+ */\r\n+public class ServiceAnnotationResolver {\r\n+\r\n+    /**\r\n+     * The annotation {@link Class classes} of Dubbo Service (read-only)\r\n+     *\r\n+     * @since 2.7.9\r\n+     */\r\n+    public static List<Class<? extends Annotation>> SERVICE_ANNOTATION_CLASSES = unmodifiableList(asList(DubboService.class, Service.class, com.alibaba.dubbo.config.annotation.Service.class));\r\n+\r\n+    private final Annotation serviceAnnotation;\r\n+\r\n+    private final Class<?> serviceType;\r\n+\r\n+    public ServiceAnnotationResolver(Class<?> serviceType) throws IllegalArgumentException {\r\n+        this.serviceType = serviceType;\r\n+        this.serviceAnnotation = getServiceAnnotation(serviceType);\r\n+    }\r\n+\r\n+    private Annotation getServiceAnnotation(Class<?> serviceType) {\r\n+\r\n+        Annotation serviceAnnotation = null;\r\n+\r\n+        for (Class<? extends Annotation> serviceAnnotationClass : SERVICE_ANNOTATION_CLASSES) {\r\n+            serviceAnnotation = serviceType.getAnnotation(serviceAnnotationClass);\r\n+            if (serviceAnnotation != null) {\r\n+                break;\r\n+            }\r\n+        }\r\n+\r\n+        if (serviceAnnotation == null) {\r\n+            throw new IllegalArgumentException(format(\"Any annotation of [%s] can't be annotated in the service type[%s].\",\r\n+                    SERVICE_ANNOTATION_CLASSES,\r\n+                    serviceType.getName()\r\n+            ));\r\n+        }\r\n+\r\n+        return serviceAnnotation;\r\n+    }\r\n+\r\n+    /**\r\n+     * Resolve the class name of interface\r\n+     *\r\n+     * @return if not found, return <code>null</code>\r\n+     */\r\n+    public String resolveInterfaceClassName() {\r\n+\r\n+        Class interfaceClass = null;\r\n+        // first, try to get the value from \"interfaceName\" attribute\r\n+        String interfaceName = resolveAttribute(\"interfaceName\");\r\n+\r\n+        if (isEmpty(interfaceName)) { // If not found, try \"interfaceClass\"\r\n+            interfaceClass = resolveAttribute(\"interfaceClass\");\r\n+        } else {\r\n+            interfaceClass = resolveClass(interfaceName, getClass().getClassLoader());\r\n+        }\r\n+\r\n+        if (isGenericClass(interfaceClass)) {\r\n+            interfaceName = interfaceClass.getName();\r\n+        } else {\r\n+            interfaceName = null;\r\n+        }\r\n+\r\n+        if (isEmpty(interfaceName)) { // If not fund, try to get the first interface from the service type\r\n+            Class[] interfaces = serviceType.getInterfaces();\r\n+            if (isNotEmpty(interfaces)) {\r\n+                interfaceName = interfaces[0].getName();\r\n+            }\r\n+        }\r\n+\r\n+        return interfaceName;\r\n+    }\r\n+\r\n+    public String resolveVersion() {\r\n+        return resolveAttribute(\"version\");\r\n+    }\r\n+\r\n+    public String resolveGroup() {\r\n+        return resolveAttribute(\"group\");\r\n+    }\r\n+\r\n+    private <T> T resolveAttribute(String attributeName) {\r\n+        return getAttribute(serviceAnnotation, attributeName);\r\n+    }\r\n+\r\n+    public Annotation getServiceAnnotation() {\r\n+        return serviceAnnotation;\r\n+    }\r\n+\r\n+    public Class<?> getServiceType() {\r\n+        return serviceType;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/Stack.java", "source2": "org/apache/dubbo/common/utils/Stack.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,143 +1,143 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.util.ArrayList;\n-import java.util.EmptyStackException;\n-import java.util.List;\n-\n-/**\n- * Stack.\n- */\n-\n-public class Stack<E> {\n-    private int mSize = 0;\n-\n-    private List<E> mElements = new ArrayList<E>();\n-\n-    public Stack() {\n-    }\n-\n-    /**\n-     * push.\n-     *\n-     * @param ele\n-     */\n-    public void push(E ele) {\n-        if (mElements.size() > mSize) {\n-            mElements.set(mSize, ele);\n-        } else {\n-            mElements.add(ele);\n-        }\n-        mSize++;\n-    }\n-\n-    /**\n-     * pop.\n-     *\n-     * @return the last element.\n-     */\n-    public E pop() {\n-        if (mSize == 0) {\n-            throw new EmptyStackException();\n-        }\n-        return mElements.set(--mSize, null);\n-    }\n-\n-    /**\n-     * peek.\n-     *\n-     * @return the last element.\n-     */\n-    public E peek() {\n-        if (mSize == 0) {\n-            throw new EmptyStackException();\n-        }\n-        return mElements.get(mSize - 1);\n-    }\n-\n-    /**\n-     * get.\n-     *\n-     * @param index index.\n-     * @return element.\n-     */\n-    public E get(int index) {\n-        if (index >= mSize || index + mSize < 0) {\n-            throw new IndexOutOfBoundsException(\"Index: \" + index + \", Size: \" + mSize);\n-        }\n-\n-        return index < 0 ? mElements.get(index + mSize) : mElements.get(index);\n-    }\n-\n-    /**\n-     * set.\n-     *\n-     * @param index index.\n-     * @param value element.\n-     * @return old element.\n-     */\n-    public E set(int index, E value) {\n-        if (index >= mSize || index + mSize < 0) {\n-            throw new IndexOutOfBoundsException(\"Index: \" + index + \", Size: \" + mSize);\n-        }\n-\n-        return mElements.set(index < 0 ? index + mSize : index, value);\n-    }\n-\n-    /**\n-     * remove.\n-     *\n-     * @param index\n-     * @return element\n-     */\n-    public E remove(int index) {\n-        if (index >= mSize || index + mSize < 0) {\n-            throw new IndexOutOfBoundsException(\"Index: \" + index + \", Size: \" + mSize);\n-        }\n-\n-        E ret = mElements.remove(index < 0 ? index + mSize : index);\n-        mSize--;\n-        return ret;\n-    }\n-\n-    /**\n-     * get stack size.\n-     *\n-     * @return size.\n-     */\n-    public int size() {\n-        return mSize;\n-    }\n-\n-    /**\n-     * is empty.\n-     *\n-     * @return empty or not.\n-     */\n-    public boolean isEmpty() {\n-        return mSize == 0;\n-    }\n-\n-    /**\n-     * clear stack.\n-     */\n-    public void clear() {\n-        mSize = 0;\n-        mElements.clear();\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.EmptyStackException;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * Stack.\r\n+ */\r\n+\r\n+public class Stack<E> {\r\n+    private int mSize = 0;\r\n+\r\n+    private List<E> mElements = new ArrayList<E>();\r\n+\r\n+    public Stack() {\r\n+    }\r\n+\r\n+    /**\r\n+     * push.\r\n+     *\r\n+     * @param ele\r\n+     */\r\n+    public void push(E ele) {\r\n+        if (mElements.size() > mSize) {\r\n+            mElements.set(mSize, ele);\r\n+        } else {\r\n+            mElements.add(ele);\r\n+        }\r\n+        mSize++;\r\n+    }\r\n+\r\n+    /**\r\n+     * pop.\r\n+     *\r\n+     * @return the last element.\r\n+     */\r\n+    public E pop() {\r\n+        if (mSize == 0) {\r\n+            throw new EmptyStackException();\r\n+        }\r\n+        return mElements.set(--mSize, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * peek.\r\n+     *\r\n+     * @return the last element.\r\n+     */\r\n+    public E peek() {\r\n+        if (mSize == 0) {\r\n+            throw new EmptyStackException();\r\n+        }\r\n+        return mElements.get(mSize - 1);\r\n+    }\r\n+\r\n+    /**\r\n+     * get.\r\n+     *\r\n+     * @param index index.\r\n+     * @return element.\r\n+     */\r\n+    public E get(int index) {\r\n+        if (index >= mSize || index + mSize < 0) {\r\n+            throw new IndexOutOfBoundsException(\"Index: \" + index + \", Size: \" + mSize);\r\n+        }\r\n+\r\n+        return index < 0 ? mElements.get(index + mSize) : mElements.get(index);\r\n+    }\r\n+\r\n+    /**\r\n+     * set.\r\n+     *\r\n+     * @param index index.\r\n+     * @param value element.\r\n+     * @return old element.\r\n+     */\r\n+    public E set(int index, E value) {\r\n+        if (index >= mSize || index + mSize < 0) {\r\n+            throw new IndexOutOfBoundsException(\"Index: \" + index + \", Size: \" + mSize);\r\n+        }\r\n+\r\n+        return mElements.set(index < 0 ? index + mSize : index, value);\r\n+    }\r\n+\r\n+    /**\r\n+     * remove.\r\n+     *\r\n+     * @param index\r\n+     * @return element\r\n+     */\r\n+    public E remove(int index) {\r\n+        if (index >= mSize || index + mSize < 0) {\r\n+            throw new IndexOutOfBoundsException(\"Index: \" + index + \", Size: \" + mSize);\r\n+        }\r\n+\r\n+        E ret = mElements.remove(index < 0 ? index + mSize : index);\r\n+        mSize--;\r\n+        return ret;\r\n+    }\r\n+\r\n+    /**\r\n+     * get stack size.\r\n+     *\r\n+     * @return size.\r\n+     */\r\n+    public int size() {\r\n+        return mSize;\r\n+    }\r\n+\r\n+    /**\r\n+     * is empty.\r\n+     *\r\n+     * @return empty or not.\r\n+     */\r\n+    public boolean isEmpty() {\r\n+        return mSize == 0;\r\n+    }\r\n+\r\n+    /**\r\n+     * clear stack.\r\n+     */\r\n+    public void clear() {\r\n+        mSize = 0;\r\n+        mElements.clear();\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/common/utils/StringConstantFieldValuePredicate.java", "source2": "org/apache/dubbo/common/utils/StringConstantFieldValuePredicate.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,67 +1,67 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.reflect.Field;\n-import java.util.Set;\n-import java.util.function.Predicate;\n-import java.util.stream.Collectors;\n-import java.util.stream.Stream;\n-\n-import static java.lang.reflect.Modifier.isFinal;\n-import static java.lang.reflect.Modifier.isPublic;\n-import static java.lang.reflect.Modifier.isStatic;\n-import static org.apache.dubbo.common.utils.FieldUtils.getFieldValue;\n-\n-/**\n- * The constant field value {@link Predicate} for the specified {@link Class}\n- *\n- * @see Predicate\n- * @since 2.7.8\n- */\n-public class StringConstantFieldValuePredicate implements Predicate<String> {\n-\n-    private final Set<String> constantFieldValues;\n-\n-    public StringConstantFieldValuePredicate(Class<?> targetClass) {\n-        this.constantFieldValues = getConstantFieldValues(targetClass);\n-    }\n-\n-    public static Predicate<String> of(Class<?> targetClass) {\n-        return new StringConstantFieldValuePredicate(targetClass);\n-    }\n-\n-    private Set<String> getConstantFieldValues(Class<?> targetClass) {\n-        return Stream.of(targetClass.getFields())\n-                .filter(f -> isStatic(f.getModifiers()))         // static\n-                .filter(f -> isPublic(f.getModifiers()))         // public\n-                .filter(f -> isFinal(f.getModifiers()))          // final\n-                .map(this::getConstantValue)\n-                .filter(v -> v instanceof String)                // filters String type\n-                .map(String.class::cast)                         // Casts String type\n-                .collect(Collectors.toSet());\n-    }\n-\n-    @Override\n-    public boolean test(String s) {\n-        return constantFieldValues.contains(s);\n-    }\n-\n-    private Object getConstantValue(Field field) {\n-        return getFieldValue(null, field);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.reflect.Field;\r\n+import java.util.Set;\r\n+import java.util.function.Predicate;\r\n+import java.util.stream.Collectors;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static java.lang.reflect.Modifier.isFinal;\r\n+import static java.lang.reflect.Modifier.isPublic;\r\n+import static java.lang.reflect.Modifier.isStatic;\r\n+import static org.apache.dubbo.common.utils.FieldUtils.getFieldValue;\r\n+\r\n+/**\r\n+ * The constant field value {@link Predicate} for the specified {@link Class}\r\n+ *\r\n+ * @see Predicate\r\n+ * @since 2.7.8\r\n+ */\r\n+public class StringConstantFieldValuePredicate implements Predicate<String> {\r\n+\r\n+    private final Set<String> constantFieldValues;\r\n+\r\n+    public StringConstantFieldValuePredicate(Class<?> targetClass) {\r\n+        this.constantFieldValues = getConstantFieldValues(targetClass);\r\n+    }\r\n+\r\n+    public static Predicate<String> of(Class<?> targetClass) {\r\n+        return new StringConstantFieldValuePredicate(targetClass);\r\n+    }\r\n+\r\n+    private Set<String> getConstantFieldValues(Class<?> targetClass) {\r\n+        return Stream.of(targetClass.getFields())\r\n+                .filter(f -> isStatic(f.getModifiers()))         // static\r\n+                .filter(f -> isPublic(f.getModifiers()))         // public\r\n+                .filter(f -> isFinal(f.getModifiers()))          // final\r\n+                .map(this::getConstantValue)\r\n+                .filter(v -> v instanceof String)                // filters String type\r\n+                .map(String.class::cast)                         // Casts String type\r\n+                .collect(Collectors.toSet());\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean test(String s) {\r\n+        return constantFieldValues.contains(s);\r\n+    }\r\n+\r\n+    private Object getConstantValue(Field field) {\r\n+        return getFieldValue(null, field);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/TypeUtils.java", "source2": "org/apache/dubbo/common/utils/TypeUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,224 +1,224 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.common.utils;\n-\n-import java.lang.reflect.ParameterizedType;\n-import java.lang.reflect.Type;\n-import java.util.Arrays;\n-import java.util.Collection;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.function.Predicate;\n-import java.util.stream.Collectors;\n-\n-import static java.util.Arrays.asList;\n-import static java.util.Collections.emptyList;\n-import static java.util.Collections.unmodifiableList;\n-import static java.util.stream.Collectors.toList;\n-import static java.util.stream.Collectors.toSet;\n-import static java.util.stream.StreamSupport.stream;\n-import static org.apache.dubbo.common.function.Predicates.and;\n-import static org.apache.dubbo.common.function.Streams.filterAll;\n-import static org.apache.dubbo.common.function.Streams.filterList;\n-import static org.apache.dubbo.common.utils.ClassUtils.getAllInterfaces;\n-import static org.apache.dubbo.common.utils.ClassUtils.getAllSuperClasses;\n-import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;\n-\n-/**\n- * The utilities class for {@link Type}\n- *\n- * @since 2.7.6\n- */\n-public interface TypeUtils {\n-\n-    Predicate<Class<?>> NON_OBJECT_TYPE_FILTER = t -> !Objects.equals(Object.class, t);\n-\n-    static boolean isParameterizedType(Type type) {\n-        return type instanceof ParameterizedType;\n-    }\n-\n-    static Type getRawType(Type type) {\n-        if (isParameterizedType(type)) {\n-            return ((ParameterizedType) type).getRawType();\n-        } else {\n-            return type;\n-        }\n-    }\n-\n-    static Class<?> getRawClass(Type type) {\n-        Type rawType = getRawType(type);\n-        if (isClass(rawType)) {\n-            return (Class) rawType;\n-        }\n-        return null;\n-    }\n-\n-    static boolean isClass(Type type) {\n-        return type instanceof Class;\n-    }\n-\n-    static <T> Class<T> findActualTypeArgument(Type type, Class<?> interfaceClass, int index) {\n-        return (Class<T>) findActualTypeArguments(type, interfaceClass).get(index);\n-    }\n-\n-    static List<Class<?>> findActualTypeArguments(Type type, Class<?> interfaceClass) {\n-\n-        List<Class<?>> actualTypeArguments = new LinkedList<>();\n-\n-        getAllGenericTypes(type, t -> isAssignableFrom(interfaceClass, getRawClass(t)))\n-                .forEach(parameterizedType -> {\n-                    Class<?> rawClass = getRawClass(parameterizedType);\n-                    Type[] typeArguments = parameterizedType.getActualTypeArguments();\n-                    for (int i = 0; i < typeArguments.length; i++) {\n-                        Type typeArgument = typeArguments[i];\n-                        if (typeArgument instanceof Class) {\n-                            actualTypeArguments.add(i, (Class) typeArgument);\n-                        }\n-                    }\n-                    Class<?> superClass = rawClass.getSuperclass();\n-                    if (superClass != null) {\n-                        actualTypeArguments.addAll(findActualTypeArguments(superClass, interfaceClass));\n-                    }\n-                });\n-\n-        return unmodifiableList(actualTypeArguments);\n-    }\n-\n-    /**\n-     * Get the specified types' generic types(including super classes and interfaces) that are assignable from {@link ParameterizedType} interface\n-     *\n-     * @param type        the specified type\n-     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<ParameterizedType> getGenericTypes(Type type, Predicate<ParameterizedType>... typeFilters) {\n-\n-        Class<?> rawClass = getRawClass(type);\n-\n-        if (rawClass == null) {\n-            return emptyList();\n-        }\n-\n-        List<Type> genericTypes = new LinkedList<>();\n-\n-        genericTypes.add(rawClass.getGenericSuperclass());\n-        genericTypes.addAll(asList(rawClass.getGenericInterfaces()));\n-\n-        return unmodifiableList(\n-                filterList(genericTypes, TypeUtils::isParameterizedType)\n-                        .stream()\n-                        .map(ParameterizedType.class::cast)\n-                        .filter(and(typeFilters))\n-                        .collect(toList())\n-        );\n-    }\n-\n-    /**\n-     * Get all generic types(including super classes and interfaces) that are assignable from {@link ParameterizedType} interface\n-     *\n-     * @param type        the specified type\n-     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<ParameterizedType> getAllGenericTypes(Type type, Predicate<ParameterizedType>... typeFilters) {\n-        List<ParameterizedType> allGenericTypes = new LinkedList<>();\n-        // Add generic super classes\n-        allGenericTypes.addAll(getAllGenericSuperClasses(type, typeFilters));\n-        // Add generic super interfaces\n-        allGenericTypes.addAll(getAllGenericInterfaces(type, typeFilters));\n-        // wrap unmodifiable object\n-        return unmodifiableList(allGenericTypes);\n-    }\n-\n-    /**\n-     * Get all generic super classes that are assignable from {@link ParameterizedType} interface\n-     *\n-     * @param type        the specified type\n-     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<ParameterizedType> getAllGenericSuperClasses(Type type, Predicate<ParameterizedType>... typeFilters) {\n-\n-        Class<?> rawClass = getRawClass(type);\n-\n-        if (rawClass == null || rawClass.isInterface()) {\n-            return emptyList();\n-        }\n-\n-        List<Class<?>> allTypes = new LinkedList<>();\n-        // Add current class\n-        allTypes.add(rawClass);\n-        // Add all super classes\n-        allTypes.addAll(getAllSuperClasses(rawClass, NON_OBJECT_TYPE_FILTER));\n-\n-        List<ParameterizedType> allGenericSuperClasses = allTypes\n-                .stream()\n-                .map(Class::getGenericSuperclass)\n-                .filter(TypeUtils::isParameterizedType)\n-                .map(ParameterizedType.class::cast)\n-                .collect(Collectors.toList());\n-\n-        return unmodifiableList(filterAll(allGenericSuperClasses, typeFilters));\n-    }\n-\n-    /**\n-     * Get all generic interfaces that are assignable from {@link ParameterizedType} interface\n-     *\n-     * @param type        the specified type\n-     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\n-     * @return non-null read-only {@link List}\n-     */\n-    static List<ParameterizedType> getAllGenericInterfaces(Type type, Predicate<ParameterizedType>... typeFilters) {\n-\n-        Class<?> rawClass = getRawClass(type);\n-\n-        if (rawClass == null) {\n-            return emptyList();\n-        }\n-\n-        List<Class<?>> allTypes = new LinkedList<>();\n-        // Add current class\n-        allTypes.add(rawClass);\n-        // Add all super classes\n-        allTypes.addAll(getAllSuperClasses(rawClass, NON_OBJECT_TYPE_FILTER));\n-        // Add all super interfaces\n-        allTypes.addAll(getAllInterfaces(rawClass));\n-\n-        List<ParameterizedType> allGenericInterfaces = allTypes\n-                .stream()\n-                .map(Class::getGenericInterfaces)\n-                .map(Arrays::asList)\n-                .flatMap(Collection::stream)\n-                .filter(TypeUtils::isParameterizedType)\n-                .map(ParameterizedType.class::cast)\n-                .collect(toList());\n-\n-        return unmodifiableList(filterAll(allGenericInterfaces, typeFilters));\n-    }\n-\n-    static String getClassName(Type type) {\n-        return getRawType(type).getTypeName();\n-    }\n-\n-    static Set<String> getClassNames(Iterable<? extends Type> types) {\n-        return stream(types.spliterator(), false)\n-                .map(TypeUtils::getClassName)\n-                .collect(toSet());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import java.lang.reflect.ParameterizedType;\r\n+import java.lang.reflect.Type;\r\n+import java.util.Arrays;\r\n+import java.util.Collection;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.function.Predicate;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static java.util.Collections.emptyList;\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static java.util.stream.Collectors.toList;\r\n+import static java.util.stream.Collectors.toSet;\r\n+import static java.util.stream.StreamSupport.stream;\r\n+import static org.apache.dubbo.common.function.Predicates.and;\r\n+import static org.apache.dubbo.common.function.Streams.filterAll;\r\n+import static org.apache.dubbo.common.function.Streams.filterList;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.getAllInterfaces;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.getAllSuperClasses;\r\n+import static org.apache.dubbo.common.utils.ClassUtils.isAssignableFrom;\r\n+\r\n+/**\r\n+ * The utilities class for {@link Type}\r\n+ *\r\n+ * @since 2.7.6\r\n+ */\r\n+public interface TypeUtils {\r\n+\r\n+    Predicate<Class<?>> NON_OBJECT_TYPE_FILTER = t -> !Objects.equals(Object.class, t);\r\n+\r\n+    static boolean isParameterizedType(Type type) {\r\n+        return type instanceof ParameterizedType;\r\n+    }\r\n+\r\n+    static Type getRawType(Type type) {\r\n+        if (isParameterizedType(type)) {\r\n+            return ((ParameterizedType) type).getRawType();\r\n+        } else {\r\n+            return type;\r\n+        }\r\n+    }\r\n+\r\n+    static Class<?> getRawClass(Type type) {\r\n+        Type rawType = getRawType(type);\r\n+        if (isClass(rawType)) {\r\n+            return (Class) rawType;\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    static boolean isClass(Type type) {\r\n+        return type instanceof Class;\r\n+    }\r\n+\r\n+    static <T> Class<T> findActualTypeArgument(Type type, Class<?> interfaceClass, int index) {\r\n+        return (Class<T>) findActualTypeArguments(type, interfaceClass).get(index);\r\n+    }\r\n+\r\n+    static List<Class<?>> findActualTypeArguments(Type type, Class<?> interfaceClass) {\r\n+\r\n+        List<Class<?>> actualTypeArguments = new LinkedList<>();\r\n+\r\n+        getAllGenericTypes(type, t -> isAssignableFrom(interfaceClass, getRawClass(t)))\r\n+                .forEach(parameterizedType -> {\r\n+                    Class<?> rawClass = getRawClass(parameterizedType);\r\n+                    Type[] typeArguments = parameterizedType.getActualTypeArguments();\r\n+                    for (int i = 0; i < typeArguments.length; i++) {\r\n+                        Type typeArgument = typeArguments[i];\r\n+                        if (typeArgument instanceof Class) {\r\n+                            actualTypeArguments.add(i, (Class) typeArgument);\r\n+                        }\r\n+                    }\r\n+                    Class<?> superClass = rawClass.getSuperclass();\r\n+                    if (superClass != null) {\r\n+                        actualTypeArguments.addAll(findActualTypeArguments(superClass, interfaceClass));\r\n+                    }\r\n+                });\r\n+\r\n+        return unmodifiableList(actualTypeArguments);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the specified types' generic types(including super classes and interfaces) that are assignable from {@link ParameterizedType} interface\r\n+     *\r\n+     * @param type        the specified type\r\n+     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<ParameterizedType> getGenericTypes(Type type, Predicate<ParameterizedType>... typeFilters) {\r\n+\r\n+        Class<?> rawClass = getRawClass(type);\r\n+\r\n+        if (rawClass == null) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        List<Type> genericTypes = new LinkedList<>();\r\n+\r\n+        genericTypes.add(rawClass.getGenericSuperclass());\r\n+        genericTypes.addAll(asList(rawClass.getGenericInterfaces()));\r\n+\r\n+        return unmodifiableList(\r\n+                filterList(genericTypes, TypeUtils::isParameterizedType)\r\n+                        .stream()\r\n+                        .map(ParameterizedType.class::cast)\r\n+                        .filter(and(typeFilters))\r\n+                        .collect(toList())\r\n+        );\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all generic types(including super classes and interfaces) that are assignable from {@link ParameterizedType} interface\r\n+     *\r\n+     * @param type        the specified type\r\n+     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<ParameterizedType> getAllGenericTypes(Type type, Predicate<ParameterizedType>... typeFilters) {\r\n+        List<ParameterizedType> allGenericTypes = new LinkedList<>();\r\n+        // Add generic super classes\r\n+        allGenericTypes.addAll(getAllGenericSuperClasses(type, typeFilters));\r\n+        // Add generic super interfaces\r\n+        allGenericTypes.addAll(getAllGenericInterfaces(type, typeFilters));\r\n+        // wrap unmodifiable object\r\n+        return unmodifiableList(allGenericTypes);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all generic super classes that are assignable from {@link ParameterizedType} interface\r\n+     *\r\n+     * @param type        the specified type\r\n+     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<ParameterizedType> getAllGenericSuperClasses(Type type, Predicate<ParameterizedType>... typeFilters) {\r\n+\r\n+        Class<?> rawClass = getRawClass(type);\r\n+\r\n+        if (rawClass == null || rawClass.isInterface()) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        List<Class<?>> allTypes = new LinkedList<>();\r\n+        // Add current class\r\n+        allTypes.add(rawClass);\r\n+        // Add all super classes\r\n+        allTypes.addAll(getAllSuperClasses(rawClass, NON_OBJECT_TYPE_FILTER));\r\n+\r\n+        List<ParameterizedType> allGenericSuperClasses = allTypes\r\n+                .stream()\r\n+                .map(Class::getGenericSuperclass)\r\n+                .filter(TypeUtils::isParameterizedType)\r\n+                .map(ParameterizedType.class::cast)\r\n+                .collect(Collectors.toList());\r\n+\r\n+        return unmodifiableList(filterAll(allGenericSuperClasses, typeFilters));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all generic interfaces that are assignable from {@link ParameterizedType} interface\r\n+     *\r\n+     * @param type        the specified type\r\n+     * @param typeFilters one or more {@link Predicate}s to filter the {@link ParameterizedType} instance\r\n+     * @return non-null read-only {@link List}\r\n+     */\r\n+    static List<ParameterizedType> getAllGenericInterfaces(Type type, Predicate<ParameterizedType>... typeFilters) {\r\n+\r\n+        Class<?> rawClass = getRawClass(type);\r\n+\r\n+        if (rawClass == null) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        List<Class<?>> allTypes = new LinkedList<>();\r\n+        // Add current class\r\n+        allTypes.add(rawClass);\r\n+        // Add all super classes\r\n+        allTypes.addAll(getAllSuperClasses(rawClass, NON_OBJECT_TYPE_FILTER));\r\n+        // Add all super interfaces\r\n+        allTypes.addAll(getAllInterfaces(rawClass));\r\n+\r\n+        List<ParameterizedType> allGenericInterfaces = allTypes\r\n+                .stream()\r\n+                .map(Class::getGenericInterfaces)\r\n+                .map(Arrays::asList)\r\n+                .flatMap(Collection::stream)\r\n+                .filter(TypeUtils::isParameterizedType)\r\n+                .map(ParameterizedType.class::cast)\r\n+                .collect(toList());\r\n+\r\n+        return unmodifiableList(filterAll(allGenericInterfaces, typeFilters));\r\n+    }\r\n+\r\n+    static String getClassName(Type type) {\r\n+        return getRawType(type).getTypeName();\r\n+    }\r\n+\r\n+    static Set<String> getClassNames(Iterable<? extends Type> types) {\r\n+        return stream(types.spliterator(), false)\r\n+                .map(TypeUtils::getClassName)\r\n+                .collect(toSet());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/common/utils/Utf8Utils.java", "source2": "org/apache/dubbo/common/utils/Utf8Utils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,229 +1,229 @@\n-// Protocol Buffers - Google's data interchange format\n-// Copyright 2008 Google Inc.  All rights reserved.\n-// https://developers.google.com/protocol-buffers/\n-//\n-// Redistribution and use in source and binary forms, with or without\n-// modification, are permitted provided that the following conditions are\n-// met:\n-//\n-//     * Redistributions of source code must retain the above copyright\n-// notice, this list of conditions and the following disclaimer.\n-//     * Redistributions in binary form must reproduce the above\n-// copyright notice, this list of conditions and the following disclaimer\n-// in the documentation and/or other materials provided with the\n-// distribution.\n-//     * Neither the name of Google Inc. nor the names of its\n-// contributors may be used to endorse or promote products derived from\n-// this software without specific prior written permission.\n-//\n-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n-// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n-package org.apache.dubbo.common.utils;\n-\n-import static java.lang.Character.MIN_HIGH_SURROGATE;\n-import static java.lang.Character.MIN_LOW_SURROGATE;\n-import static java.lang.Character.MIN_SUPPLEMENTARY_CODE_POINT;\n-\n-/**\n- * See original <a href=\n- * \"https://github.com/protocolbuffers/protobuf/blob/master/java/core/src/main/java/com/google/protobuf/Utf8.java\"\n- * >Utf8.java</a>\n- */\n-public final class Utf8Utils {\n-\n-    private Utf8Utils() {\n-        //empty\n-    }\n-\n-    public static int decodeUtf8(byte[] srcBytes, int srcIdx, int srcSize, char[] destChars, int destIdx) {\n-        // Bitwise OR combines the sign bits so any negative value fails the check.\n-        if ((srcIdx | srcSize | srcBytes.length - srcIdx - srcSize) < 0\n-                || (destIdx | destChars.length - destIdx - srcSize) < 0) {\n-            String exMsg = String.format(\"buffer srcBytes.length=%d, srcIdx=%d, srcSize=%d, destChars.length=%d, \" +\n-                    \"destIdx=%d\", srcBytes.length, srcIdx, srcSize, destChars.length, destIdx);\n-            throw new ArrayIndexOutOfBoundsException(\n-                    exMsg);\n-        }\n-\n-        int offset = srcIdx;\n-        final int limit = offset + srcSize;\n-        final int destIdx0 = destIdx;\n-\n-        // Optimize for 100% ASCII (Hotspot loves small simple top-level loops like this).\n-        // This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).\n-        while (offset < limit) {\n-            byte b = srcBytes[offset];\n-            if (!DecodeUtil.isOneByte(b)) {\n-                break;\n-            }\n-            offset++;\n-            DecodeUtil.handleOneByteSafe(b, destChars, destIdx++);\n-        }\n-\n-        while (offset < limit) {\n-            byte byte1 = srcBytes[offset++];\n-            if (DecodeUtil.isOneByte(byte1)) {\n-                DecodeUtil.handleOneByteSafe(byte1, destChars, destIdx++);\n-                // It's common for there to be multiple ASCII characters in a run mixed in, so add an\n-                // extra optimized loop to take care of these runs.\n-                while (offset < limit) {\n-                    byte b = srcBytes[offset];\n-                    if (!DecodeUtil.isOneByte(b)) {\n-                        break;\n-                    }\n-                    offset++;\n-                    DecodeUtil.handleOneByteSafe(b, destChars, destIdx++);\n-                }\n-            } else if (DecodeUtil.isTwoBytes(byte1)) {\n-                if (offset >= limit) {\n-                    throw new IllegalArgumentException(\"invalid UTF-8.\");\n-                }\n-                DecodeUtil.handleTwoBytesSafe(byte1, /* byte2 */ srcBytes[offset++], destChars, destIdx++);\n-            } else if (DecodeUtil.isThreeBytes(byte1)) {\n-                if (offset >= limit - 1) {\n-                    throw new IllegalArgumentException(\"invalid UTF-8.\");\n-                }\n-                DecodeUtil.handleThreeBytesSafe(\n-                        byte1,\n-                        /* byte2 */ srcBytes[offset++],\n-                        /* byte3 */ srcBytes[offset++],\n-                        destChars,\n-                        destIdx++);\n-            } else {\n-                if (offset >= limit - 2) {\n-                    throw new IllegalArgumentException(\"invalid UTF-8.\");\n-                }\n-                DecodeUtil.handleFourBytesSafe(\n-                        byte1,\n-                        /* byte2 */ srcBytes[offset++],\n-                        /* byte3 */ srcBytes[offset++],\n-                        /* byte4 */ srcBytes[offset++],\n-                        destChars,\n-                        destIdx);\n-                destIdx += 2;\n-            }\n-        }\n-        return destIdx - destIdx0;\n-    }\n-\n-\n-    private static class DecodeUtil {\n-\n-        /**\n-         * Returns whether this is a single-byte codepoint (i.e., ASCII) with the form '0XXXXXXX'.\n-         */\n-        private static boolean isOneByte(byte b) {\n-            return b >= 0;\n-        }\n-\n-        /**\n-         * Returns whether this is a two-byte codepoint with the form '10XXXXXX'.\n-         */\n-        private static boolean isTwoBytes(byte b) {\n-            return b < (byte) 0xE0;\n-        }\n-\n-        /**\n-         * Returns whether this is a three-byte codepoint with the form '110XXXXX'.\n-         */\n-        private static boolean isThreeBytes(byte b) {\n-            return b < (byte) 0xF0;\n-        }\n-\n-        private static void handleOneByteSafe(byte byte1, char[] resultArr, int resultPos) {\n-            resultArr[resultPos] = (char) byte1;\n-        }\n-\n-        private static void handleTwoBytesSafe(byte byte1, byte byte2, char[] resultArr, int resultPos) {\n-            checkUtf8(byte1, byte2);\n-            resultArr[resultPos] = (char) (((byte1 & 0x1F) << 6) | trailingByteValue(byte2));\n-        }\n-\n-        private static void checkUtf8(byte byte1, byte byte2) {\n-            // Simultaneously checks for illegal trailing-byte in leading position (<= '11000000') and\n-            // overlong 2-byte, '11000001'.\n-            if (byte1 < (byte) 0xC2 || isNotTrailingByte(byte2)) {\n-                throw new IllegalArgumentException(\"invalid UTF-8.\");\n-            }\n-        }\n-\n-        private static void handleThreeBytesSafe(byte byte1, byte byte2, byte byte3, char[] resultArr, int resultPos) {\n-            checkUtf8(byte1, byte2, byte3);\n-            resultArr[resultPos] =\n-                    (char) (((byte1 & 0x0F) << 12) | (trailingByteValue(byte2) << 6) | trailingByteValue(byte3));\n-        }\n-\n-        private static void checkUtf8(byte byte1, byte byte2, byte byte3) {\n-            if (isNotTrailingByte(byte2)\n-                    // overlong? 5 most significant bits must not all be zero\n-                    || (byte1 == (byte) 0xE0 && byte2 < (byte) 0xA0)\n-                    // check for illegal surrogate codepoints\n-                    || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)\n-                    || isNotTrailingByte(byte3)) {\n-                throw new IllegalArgumentException(\"invalid UTF-8.\");\n-            }\n-        }\n-\n-        private static void handleFourBytesSafe(byte byte1, byte byte2, byte byte3, byte byte4, char[] resultArr,\n-                                                int resultPos) {\n-            checkUtf8(byte1, byte2, byte3, byte4);\n-            int codepoint =\n-                    ((byte1 & 0x07) << 18)\n-                            | (trailingByteValue(byte2) << 12)\n-                            | (trailingByteValue(byte3) << 6)\n-                            | trailingByteValue(byte4);\n-\n-            resultArr[resultPos] = DecodeUtil.highSurrogate(codepoint);\n-            resultArr[resultPos + 1] = DecodeUtil.lowSurrogate(codepoint);\n-        }\n-\n-        private static void checkUtf8(byte byte1, byte byte2, byte byte3, byte byte4) {\n-            if (isNotTrailingByte(byte2)\n-                    // Check that 1 <= plane <= 16.  Tricky optimized form of:\n-                    //   valid 4-byte leading byte?\n-                    // if (byte1 > (byte) 0xF4 ||\n-                    //   overlong? 4 most significant bits must not all be zero\n-                    //     byte1 == (byte) 0xF0 && byte2 < (byte) 0x90 ||\n-                    //   codepoint larger than the highest code point (U+10FFFF)?\n-                    //     byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F)\n-                    || (((byte1 << 28) + (byte2 - (byte) 0x90)) >> 30) != 0\n-                    || isNotTrailingByte(byte3)\n-                    || isNotTrailingByte(byte4)) {\n-                throw new IllegalArgumentException(\"invalid UTF-8.\");\n-            }\n-        }\n-\n-        /**\n-         * Returns whether the byte is not a valid continuation of the form '10XXXXXX'.\n-         */\n-        private static boolean isNotTrailingByte(byte b) {\n-            return b > (byte) 0xBF;\n-        }\n-\n-        /**\n-         * Returns the actual value of the trailing byte (removes the prefix '10') for composition.\n-         */\n-        private static int trailingByteValue(byte b) {\n-            return b & 0x3F;\n-        }\n-\n-        private static char highSurrogate(int codePoint) {\n-            return (char)\n-                    ((MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)) + (codePoint >>> 10));\n-        }\n-\n-        private static char lowSurrogate(int codePoint) {\n-            return (char) (MIN_LOW_SURROGATE + (codePoint & 0x3ff));\n-        }\n-    }\n-\n-}\n+// Protocol Buffers - Google's data interchange format\r\n+// Copyright 2008 Google Inc.  All rights reserved.\r\n+// https://developers.google.com/protocol-buffers/\r\n+//\r\n+// Redistribution and use in source and binary forms, with or without\r\n+// modification, are permitted provided that the following conditions are\r\n+// met:\r\n+//\r\n+//     * Redistributions of source code must retain the above copyright\r\n+// notice, this list of conditions and the following disclaimer.\r\n+//     * Redistributions in binary form must reproduce the above\r\n+// copyright notice, this list of conditions and the following disclaimer\r\n+// in the documentation and/or other materials provided with the\r\n+// distribution.\r\n+//     * Neither the name of Google Inc. nor the names of its\r\n+// contributors may be used to endorse or promote products derived from\r\n+// this software without specific prior written permission.\r\n+//\r\n+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+package org.apache.dubbo.common.utils;\r\n+\r\n+import static java.lang.Character.MIN_HIGH_SURROGATE;\r\n+import static java.lang.Character.MIN_LOW_SURROGATE;\r\n+import static java.lang.Character.MIN_SUPPLEMENTARY_CODE_POINT;\r\n+\r\n+/**\r\n+ * See original <a href=\r\n+ * \"https://github.com/protocolbuffers/protobuf/blob/master/java/core/src/main/java/com/google/protobuf/Utf8.java\"\r\n+ * >Utf8.java</a>\r\n+ */\r\n+public final class Utf8Utils {\r\n+\r\n+    private Utf8Utils() {\r\n+        //empty\r\n+    }\r\n+\r\n+    public static int decodeUtf8(byte[] srcBytes, int srcIdx, int srcSize, char[] destChars, int destIdx) {\r\n+        // Bitwise OR combines the sign bits so any negative value fails the check.\r\n+        if ((srcIdx | srcSize | srcBytes.length - srcIdx - srcSize) < 0\r\n+                || (destIdx | destChars.length - destIdx - srcSize) < 0) {\r\n+            String exMsg = String.format(\"buffer srcBytes.length=%d, srcIdx=%d, srcSize=%d, destChars.length=%d, \" +\r\n+                    \"destIdx=%d\", srcBytes.length, srcIdx, srcSize, destChars.length, destIdx);\r\n+            throw new ArrayIndexOutOfBoundsException(\r\n+                    exMsg);\r\n+        }\r\n+\r\n+        int offset = srcIdx;\r\n+        final int limit = offset + srcSize;\r\n+        final int destIdx0 = destIdx;\r\n+\r\n+        // Optimize for 100% ASCII (Hotspot loves small simple top-level loops like this).\r\n+        // This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).\r\n+        while (offset < limit) {\r\n+            byte b = srcBytes[offset];\r\n+            if (!DecodeUtil.isOneByte(b)) {\r\n+                break;\r\n+            }\r\n+            offset++;\r\n+            DecodeUtil.handleOneByteSafe(b, destChars, destIdx++);\r\n+        }\r\n+\r\n+        while (offset < limit) {\r\n+            byte byte1 = srcBytes[offset++];\r\n+            if (DecodeUtil.isOneByte(byte1)) {\r\n+                DecodeUtil.handleOneByteSafe(byte1, destChars, destIdx++);\r\n+                // It's common for there to be multiple ASCII characters in a run mixed in, so add an\r\n+                // extra optimized loop to take care of these runs.\r\n+                while (offset < limit) {\r\n+                    byte b = srcBytes[offset];\r\n+                    if (!DecodeUtil.isOneByte(b)) {\r\n+                        break;\r\n+                    }\r\n+                    offset++;\r\n+                    DecodeUtil.handleOneByteSafe(b, destChars, destIdx++);\r\n+                }\r\n+            } else if (DecodeUtil.isTwoBytes(byte1)) {\r\n+                if (offset >= limit) {\r\n+                    throw new IllegalArgumentException(\"invalid UTF-8.\");\r\n+                }\r\n+                DecodeUtil.handleTwoBytesSafe(byte1, /* byte2 */ srcBytes[offset++], destChars, destIdx++);\r\n+            } else if (DecodeUtil.isThreeBytes(byte1)) {\r\n+                if (offset >= limit - 1) {\r\n+                    throw new IllegalArgumentException(\"invalid UTF-8.\");\r\n+                }\r\n+                DecodeUtil.handleThreeBytesSafe(\r\n+                        byte1,\r\n+                        /* byte2 */ srcBytes[offset++],\r\n+                        /* byte3 */ srcBytes[offset++],\r\n+                        destChars,\r\n+                        destIdx++);\r\n+            } else {\r\n+                if (offset >= limit - 2) {\r\n+                    throw new IllegalArgumentException(\"invalid UTF-8.\");\r\n+                }\r\n+                DecodeUtil.handleFourBytesSafe(\r\n+                        byte1,\r\n+                        /* byte2 */ srcBytes[offset++],\r\n+                        /* byte3 */ srcBytes[offset++],\r\n+                        /* byte4 */ srcBytes[offset++],\r\n+                        destChars,\r\n+                        destIdx);\r\n+                destIdx += 2;\r\n+            }\r\n+        }\r\n+        return destIdx - destIdx0;\r\n+    }\r\n+\r\n+\r\n+    private static class DecodeUtil {\r\n+\r\n+        /**\r\n+         * Returns whether this is a single-byte codepoint (i.e., ASCII) with the form '0XXXXXXX'.\r\n+         */\r\n+        private static boolean isOneByte(byte b) {\r\n+            return b >= 0;\r\n+        }\r\n+\r\n+        /**\r\n+         * Returns whether this is a two-byte codepoint with the form '10XXXXXX'.\r\n+         */\r\n+        private static boolean isTwoBytes(byte b) {\r\n+            return b < (byte) 0xE0;\r\n+        }\r\n+\r\n+        /**\r\n+         * Returns whether this is a three-byte codepoint with the form '110XXXXX'.\r\n+         */\r\n+        private static boolean isThreeBytes(byte b) {\r\n+            return b < (byte) 0xF0;\r\n+        }\r\n+\r\n+        private static void handleOneByteSafe(byte byte1, char[] resultArr, int resultPos) {\r\n+            resultArr[resultPos] = (char) byte1;\r\n+        }\r\n+\r\n+        private static void handleTwoBytesSafe(byte byte1, byte byte2, char[] resultArr, int resultPos) {\r\n+            checkUtf8(byte1, byte2);\r\n+            resultArr[resultPos] = (char) (((byte1 & 0x1F) << 6) | trailingByteValue(byte2));\r\n+        }\r\n+\r\n+        private static void checkUtf8(byte byte1, byte byte2) {\r\n+            // Simultaneously checks for illegal trailing-byte in leading position (<= '11000000') and\r\n+            // overlong 2-byte, '11000001'.\r\n+            if (byte1 < (byte) 0xC2 || isNotTrailingByte(byte2)) {\r\n+                throw new IllegalArgumentException(\"invalid UTF-8.\");\r\n+            }\r\n+        }\r\n+\r\n+        private static void handleThreeBytesSafe(byte byte1, byte byte2, byte byte3, char[] resultArr, int resultPos) {\r\n+            checkUtf8(byte1, byte2, byte3);\r\n+            resultArr[resultPos] =\r\n+                    (char) (((byte1 & 0x0F) << 12) | (trailingByteValue(byte2) << 6) | trailingByteValue(byte3));\r\n+        }\r\n+\r\n+        private static void checkUtf8(byte byte1, byte byte2, byte byte3) {\r\n+            if (isNotTrailingByte(byte2)\r\n+                    // overlong? 5 most significant bits must not all be zero\r\n+                    || (byte1 == (byte) 0xE0 && byte2 < (byte) 0xA0)\r\n+                    // check for illegal surrogate codepoints\r\n+                    || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)\r\n+                    || isNotTrailingByte(byte3)) {\r\n+                throw new IllegalArgumentException(\"invalid UTF-8.\");\r\n+            }\r\n+        }\r\n+\r\n+        private static void handleFourBytesSafe(byte byte1, byte byte2, byte byte3, byte byte4, char[] resultArr,\r\n+                                                int resultPos) {\r\n+            checkUtf8(byte1, byte2, byte3, byte4);\r\n+            int codepoint =\r\n+                    ((byte1 & 0x07) << 18)\r\n+                            | (trailingByteValue(byte2) << 12)\r\n+                            | (trailingByteValue(byte3) << 6)\r\n+                            | trailingByteValue(byte4);\r\n+\r\n+            resultArr[resultPos] = DecodeUtil.highSurrogate(codepoint);\r\n+            resultArr[resultPos + 1] = DecodeUtil.lowSurrogate(codepoint);\r\n+        }\r\n+\r\n+        private static void checkUtf8(byte byte1, byte byte2, byte byte3, byte byte4) {\r\n+            if (isNotTrailingByte(byte2)\r\n+                    // Check that 1 <= plane <= 16.  Tricky optimized form of:\r\n+                    //   valid 4-byte leading byte?\r\n+                    // if (byte1 > (byte) 0xF4 ||\r\n+                    //   overlong? 4 most significant bits must not all be zero\r\n+                    //     byte1 == (byte) 0xF0 && byte2 < (byte) 0x90 ||\r\n+                    //   codepoint larger than the highest code point (U+10FFFF)?\r\n+                    //     byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F)\r\n+                    || (((byte1 << 28) + (byte2 - (byte) 0x90)) >> 30) != 0\r\n+                    || isNotTrailingByte(byte3)\r\n+                    || isNotTrailingByte(byte4)) {\r\n+                throw new IllegalArgumentException(\"invalid UTF-8.\");\r\n+            }\r\n+        }\r\n+\r\n+        /**\r\n+         * Returns whether the byte is not a valid continuation of the form '10XXXXXX'.\r\n+         */\r\n+        private static boolean isNotTrailingByte(byte b) {\r\n+            return b > (byte) 0xBF;\r\n+        }\r\n+\r\n+        /**\r\n+         * Returns the actual value of the trailing byte (removes the prefix '10') for composition.\r\n+         */\r\n+        private static int trailingByteValue(byte b) {\r\n+            return b & 0x3F;\r\n+        }\r\n+\r\n+        private static char highSurrogate(int codePoint) {\r\n+            return (char)\r\n+                    ((MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)) + (codePoint >>> 10));\r\n+        }\r\n+\r\n+        private static char lowSurrogate(int codePoint) {\r\n+            return (char) (MIN_LOW_SURROGATE + (codePoint & 0x3ff));\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/AbstractConfig.java", "source2": "org/apache/dubbo/config/AbstractConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,614 +1,614 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.CompositeConfiguration;\n-import org.apache.dubbo.common.config.Environment;\n-import org.apache.dubbo.common.constants.CommonConstants;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.MethodUtils;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.AsyncMethodInfo;\n-\n-import javax.annotation.PostConstruct;\n-import java.io.Serializable;\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-import java.util.stream.Collectors;\n-\n-import static org.apache.dubbo.common.utils.ReflectUtils.findMethodByMethodSignature;\n-\n-/**\n- * Utility methods and public methods for parsing configuration\n- *\n- * @export\n- */\n-public abstract class AbstractConfig implements Serializable {\n-\n-    protected static final Logger logger = LoggerFactory.getLogger(AbstractConfig.class);\n-    private static final long serialVersionUID = 4267533505537413570L;\n-\n-    /**\n-     * The legacy properties container\n-     */\n-    private static final Map<String, String> LEGACY_PROPERTIES = new HashMap<String, String>();\n-\n-    /**\n-     * The suffix container\n-     */\n-    private static final String[] SUFFIXES = new String[]{\"Config\", \"Bean\", \"ConfigBase\"};\n-\n-    static {\n-        LEGACY_PROPERTIES.put(\"dubbo.protocol.name\", \"dubbo.service.protocol\");\n-        LEGACY_PROPERTIES.put(\"dubbo.protocol.host\", \"dubbo.service.server.host\");\n-        LEGACY_PROPERTIES.put(\"dubbo.protocol.port\", \"dubbo.service.server.port\");\n-        LEGACY_PROPERTIES.put(\"dubbo.protocol.threads\", \"dubbo.service.max.thread.pool.size\");\n-        LEGACY_PROPERTIES.put(\"dubbo.consumer.timeout\", \"dubbo.service.invoke.timeout\");\n-        LEGACY_PROPERTIES.put(\"dubbo.consumer.retries\", \"dubbo.service.max.retry.providers\");\n-        LEGACY_PROPERTIES.put(\"dubbo.consumer.check\", \"dubbo.service.allow.no.provider\");\n-        LEGACY_PROPERTIES.put(\"dubbo.service.url\", \"dubbo.service.address\");\n-    }\n-\n-    /**\n-     * The config id\n-     */\n-    protected String id;\n-    protected String prefix;\n-\n-    protected final AtomicBoolean refreshed = new AtomicBoolean(false);\n-\n-    private static String convertLegacyValue(String key, String value) {\n-        if (value != null && value.length() > 0) {\n-            if (\"dubbo.service.max.retry.providers\".equals(key)) {\n-                return String.valueOf(Integer.parseInt(value) - 1);\n-            } else if (\"dubbo.service.allow.no.provider\".equals(key)) {\n-                return String.valueOf(!Boolean.parseBoolean(value));\n-            }\n-        }\n-        return value;\n-    }\n-\n-    public static String getTagName(Class<?> cls) {\n-        String tag = cls.getSimpleName();\n-        for (String suffix : SUFFIXES) {\n-            if (tag.endsWith(suffix)) {\n-                tag = tag.substring(0, tag.length() - suffix.length());\n-                break;\n-            }\n-        }\n-        return StringUtils.camelToSplitName(tag, \"-\");\n-    }\n-\n-    public static void appendParameters(Map<String, String> parameters, Object config) {\n-        appendParameters(parameters, config, null);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public static void appendParameters(Map<String, String> parameters, Object config, String prefix) {\n-        if (config == null) {\n-            return;\n-        }\n-        Method[] methods = config.getClass().getMethods();\n-        for (Method method : methods) {\n-            try {\n-                String name = method.getName();\n-                if (MethodUtils.isGetter(method)) {\n-                    Parameter parameter = method.getAnnotation(Parameter.class);\n-                    if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {\n-                        continue;\n-                    }\n-                    String key;\n-                    if (parameter != null && parameter.key().length() > 0) {\n-                        key = parameter.key();\n-                    } else {\n-                        key = calculatePropertyFromGetter(name);\n-                    }\n-                    Object value = method.invoke(config);\n-                    String str = String.valueOf(value).trim();\n-                    if (value != null && str.length() > 0) {\n-                        if (parameter != null && parameter.escaped()) {\n-                            str = URL.encode(str);\n-                        }\n-                        if (parameter != null && parameter.append()) {\n-                            String pre = parameters.get(key);\n-                            if (pre != null && pre.length() > 0) {\n-                                str = pre + \",\" + str;\n-                            }\n-                        }\n-                        if (prefix != null && prefix.length() > 0) {\n-                            key = prefix + \".\" + key;\n-                        }\n-                        parameters.put(key, str);\n-                    } else if (parameter != null && parameter.required()) {\n-                        throw new IllegalStateException(config.getClass().getSimpleName() + \".\" + key + \" == null\");\n-                    }\n-                } else if (isParametersGetter(method)) {\n-                    Map<String, String> map = (Map<String, String>) method.invoke(config, new Object[0]);\n-                    parameters.putAll(convert(map, prefix));\n-                }\n-            } catch (Exception e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-        }\n-    }\n-\n-    @Deprecated\n-    protected static void appendAttributes(Map<String, Object> parameters, Object config) {\n-        appendAttributes(parameters, config, null);\n-    }\n-\n-    @Deprecated\n-    protected static void appendAttributes(Map<String, Object> parameters, Object config, String prefix) {\n-        if (config == null) {\n-            return;\n-        }\n-        Method[] methods = config.getClass().getMethods();\n-        for (Method method : methods) {\n-            try {\n-                Parameter parameter = method.getAnnotation(Parameter.class);\n-                if (parameter == null || !parameter.attribute()) {\n-                    continue;\n-                }\n-                String name = method.getName();\n-                if (MethodUtils.isGetter(method)) {\n-                    String key;\n-                    if (parameter.key().length() > 0) {\n-                        key = parameter.key();\n-                    } else {\n-                        key = calculateAttributeFromGetter(name);\n-                    }\n-                    Object value = method.invoke(config);\n-                    if (value != null) {\n-                        if (prefix != null && prefix.length() > 0) {\n-                            key = prefix + \".\" + key;\n-                        }\n-                        parameters.put(key, value);\n-                    }\n-                }\n-            } catch (Exception e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-        }\n-    }\n-\n-    protected static AsyncMethodInfo convertMethodConfig2AsyncInfo(MethodConfig methodConfig) {\n-        if (methodConfig == null || (methodConfig.getOninvoke() == null && methodConfig.getOnreturn() == null && methodConfig.getOnthrow() == null)) {\n-            return null;\n-        }\n-\n-        //check config conflict\n-        if (Boolean.FALSE.equals(methodConfig.isReturn()) && (methodConfig.getOnreturn() != null || methodConfig.getOnthrow() != null)) {\n-            throw new IllegalStateException(\"method config error : return attribute must be set true when onreturn or onthrow has been set.\");\n-        }\n-\n-        AsyncMethodInfo asyncMethodInfo = new AsyncMethodInfo();\n-\n-        asyncMethodInfo.setOninvokeInstance(methodConfig.getOninvoke());\n-        asyncMethodInfo.setOnreturnInstance(methodConfig.getOnreturn());\n-        asyncMethodInfo.setOnthrowInstance(methodConfig.getOnthrow());\n-\n-        try {\n-            String oninvokeMethod = methodConfig.getOninvokeMethod();\n-            if (StringUtils.isNotEmpty(oninvokeMethod)) {\n-                asyncMethodInfo.setOninvokeMethod(getMethodByName(methodConfig.getOninvoke().getClass(), oninvokeMethod));\n-            }\n-\n-            String onreturnMethod = methodConfig.getOnreturnMethod();\n-            if (StringUtils.isNotEmpty(onreturnMethod)) {\n-                asyncMethodInfo.setOnreturnMethod(getMethodByName(methodConfig.getOnreturn().getClass(), onreturnMethod));\n-            }\n-\n-            String onthrowMethod = methodConfig.getOnthrowMethod();\n-            if (StringUtils.isNotEmpty(onthrowMethod)) {\n-                asyncMethodInfo.setOnthrowMethod(getMethodByName(methodConfig.getOnthrow().getClass(), onthrowMethod));\n-            }\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-\n-        return asyncMethodInfo;\n-    }\n-\n-    private static Method getMethodByName(Class<?> clazz, String methodName) {\n-        try {\n-            return ReflectUtils.findMethodByMethodName(clazz, methodName);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e);\n-        }\n-    }\n-\n-    protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {\n-        return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {\n-            k = k.substring(prefix.length());\n-            return k.substring(0, k.indexOf(\".\"));\n-        }).collect(Collectors.toSet());\n-    }\n-\n-    private static String extractPropertyName(Class<?> clazz, Method setter) throws Exception {\n-        String propertyName = setter.getName().substring(\"set\".length());\n-        Method getter = null;\n-        try {\n-            getter = clazz.getMethod(\"get\" + propertyName);\n-        } catch (NoSuchMethodException e) {\n-            getter = clazz.getMethod(\"is\" + propertyName);\n-        }\n-        Parameter parameter = getter.getAnnotation(Parameter.class);\n-        if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.useKeyAsProperty()) {\n-            propertyName = parameter.key();\n-        } else {\n-            propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);\n-        }\n-        return propertyName;\n-    }\n-\n-    private static String calculatePropertyFromGetter(String name) {\n-        int i = name.startsWith(\"get\") ? 3 : 2;\n-        return StringUtils.camelToSplitName(name.substring(i, i + 1).toLowerCase() + name.substring(i + 1), \".\");\n-    }\n-\n-    private static String calculateAttributeFromGetter(String getter) {\n-        int i = getter.startsWith(\"get\") ? 3 : 2;\n-        return getter.substring(i, i + 1).toLowerCase() + getter.substring(i + 1);\n-    }\n-\n-    private static void invokeSetParameters(Class c, Object o, Map map) {\n-        try {\n-            Method method = findMethodByMethodSignature(c, \"setParameters\", new String[]{Map.class.getName()});\n-            if (method != null && isParametersSetter(method)) {\n-                method.invoke(o, map);\n-            }\n-        } catch (Throwable t) {\n-            // ignore\n-        }\n-    }\n-\n-    private static Map<String, String> invokeGetParameters(Class c, Object o) {\n-        try {\n-            Method method = findMethodByMethodSignature(c, \"getParameters\", null);\n-            if (method != null && isParametersGetter(method)) {\n-                return (Map<String, String>) method.invoke(o);\n-            }\n-        } catch (Throwable t) {\n-            // ignore\n-        }\n-        return null;\n-    }\n-\n-    private static boolean isParametersGetter(Method method) {\n-        String name = method.getName();\n-        return (\"getParameters\".equals(name)\n-                && Modifier.isPublic(method.getModifiers())\n-                && method.getParameterTypes().length == 0\n-                && method.getReturnType() == Map.class);\n-    }\n-\n-    private static boolean isParametersSetter(Method method) {\n-        return (\"setParameters\".equals(method.getName())\n-                && Modifier.isPublic(method.getModifiers())\n-                && method.getParameterCount() == 1\n-                && Map.class == method.getParameterTypes()[0]\n-                && method.getReturnType() == void.class);\n-    }\n-\n-    /**\n-     * @param parameters the raw parameters\n-     * @param prefix     the prefix\n-     * @return the parameters whose raw key will replace \"-\" to \".\"\n-     * @revised 2.7.8 \"private\" to be \"protected\"\n-     */\n-    protected static Map<String, String> convert(Map<String, String> parameters, String prefix) {\n-        if (parameters == null || parameters.isEmpty()) {\n-            return Collections.emptyMap();\n-        }\n-\n-        Map<String, String> result = new HashMap<>();\n-        String pre = (prefix != null && prefix.length() > 0 ? prefix + \".\" : \"\");\n-        for (Map.Entry<String, String> entry : parameters.entrySet()) {\n-            String key = entry.getKey();\n-            String value = entry.getValue();\n-            result.put(pre + key, value);\n-            // For compatibility, key like \"registry-type\" will has a duplicate key \"registry.type\"\n-            if (key.contains(\"-\")) {\n-                result.put(pre + key.replace('-', '.'), value);\n-            }\n-        }\n-        return result;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getId() {\n-        return id;\n-    }\n-\n-    public void setId(String id) {\n-        this.id = id;\n-    }\n-\n-    public void updateIdIfAbsent(String value) {\n-        if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(id)) {\n-            this.id = value;\n-        }\n-    }\n-\n-    protected void appendAnnotation(Class<?> annotationClass, Object annotation) {\n-        Method[] methods = annotationClass.getMethods();\n-        for (Method method : methods) {\n-            if (method.getDeclaringClass() != Object.class\n-                    && method.getReturnType() != void.class\n-                    && method.getParameterTypes().length == 0\n-                    && Modifier.isPublic(method.getModifiers())\n-                    && !Modifier.isStatic(method.getModifiers())) {\n-                try {\n-                    String property = method.getName();\n-                    if (\"interfaceClass\".equals(property) || \"interfaceName\".equals(property)) {\n-                        property = \"interface\";\n-                    }\n-                    String setter = \"set\" + property.substring(0, 1).toUpperCase() + property.substring(1);\n-                    Object value = method.invoke(annotation);\n-                    if (value != null && !value.equals(method.getDefaultValue())) {\n-                        Class<?> parameterType = ReflectUtils.getBoxedClass(method.getReturnType());\n-                        if (\"filter\".equals(property) || \"listener\".equals(property)) {\n-                            parameterType = String.class;\n-                            value = StringUtils.join((String[]) value, \",\");\n-                        } else if (\"parameters\".equals(property)) {\n-                            parameterType = Map.class;\n-                            value = CollectionUtils.toStringMap((String[]) value);\n-                        }\n-                        try {\n-                            Method setterMethod = getClass().getMethod(setter, parameterType);\n-                            setterMethod.invoke(this, value);\n-                        } catch (NoSuchMethodException e) {\n-                            // ignore\n-                        }\n-                    }\n-                } catch (Throwable e) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-        }\n-    }\n-\n-    /**\n-     * Should be called after Config was fully initialized.\n-     * // FIXME: this method should be completely replaced by appendParameters\n-     *\n-     * @return\n-     * @see AbstractConfig#appendParameters(Map, Object, String)\n-     * <p>\n-     * Notice! This method should include all properties in the returning map, treat @Parameter differently compared to appendParameters.\n-     */\n-    public Map<String, String> getMetaData() {\n-        Map<String, String> metaData = new HashMap<>();\n-        Method[] methods = this.getClass().getMethods();\n-        for (Method method : methods) {\n-            try {\n-                String name = method.getName();\n-                if (MethodUtils.isMetaMethod(method)) {\n-                    String key;\n-                    Parameter parameter = method.getAnnotation(Parameter.class);\n-                    if (parameter != null && parameter.key().length() > 0 && parameter.useKeyAsProperty()) {\n-                        key = parameter.key();\n-                    } else {\n-                        key = calculateAttributeFromGetter(name);\n-                    }\n-                    // treat url and configuration differently, the value should always present in configuration though it may not need to present in url.\n-                    //if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {\n-                    if (method.getReturnType() == Object.class) {\n-                        metaData.put(key, null);\n-                        continue;\n-                    }\n-\n-                    /**\n-                     * Attributes annotated as deprecated should not override newly added replacement.\n-                     */\n-                    if (MethodUtils.isDeprecated(method) && metaData.get(key) != null) {\n-                        continue;\n-                    }\n-\n-                    Object value = method.invoke(this);\n-                    String str = String.valueOf(value).trim();\n-                    if (value != null && str.length() > 0) {\n-                        metaData.put(key, str);\n-                    } else {\n-                        metaData.put(key, null);\n-                    }\n-                } else if (isParametersGetter(method)) {\n-                    Map<String, String> map = (Map<String, String>) method.invoke(this, new Object[0]);\n-                    metaData.putAll(convert(map, \"\"));\n-                }\n-            } catch (Exception e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-        }\n-        return metaData;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getPrefix() {\n-        return StringUtils.isNotEmpty(prefix) ? prefix : (CommonConstants.DUBBO + \".\" + getTagName(this.getClass()));\n-    }\n-\n-    public void setPrefix(String prefix) {\n-        this.prefix = prefix;\n-    }\n-\n-    public void refresh() {\n-        Environment env = ApplicationModel.getEnvironment();\n-        try {\n-            CompositeConfiguration compositeConfiguration = env.getPrefixedConfiguration(this);\n-            // loop methods, get override value and set the new value back to method\n-            Method[] methods = getClass().getMethods();\n-            for (Method method : methods) {\n-                if (MethodUtils.isSetter(method)) {\n-                    try {\n-                        String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method)));\n-                        // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig.\n-                        if (StringUtils.isNotEmpty(value) && ClassUtils.isTypeMatch(method.getParameterTypes()[0], value)) {\n-                            method.invoke(this, ClassUtils.convertPrimitive(method.getParameterTypes()[0], value));\n-                        }\n-                    } catch (NoSuchMethodException e) {\n-                        logger.info(\"Failed to override the property \" + method.getName() + \" in \" +\n-                                this.getClass().getSimpleName() +\n-                                \", please make sure every property has getter/setter method provided.\");\n-                    }\n-                } else if (isParametersSetter(method)) {\n-                    String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method)));\n-                    if (StringUtils.isNotEmpty(value)) {\n-                        Map<String, String> map = invokeGetParameters(getClass(), this);\n-                        map = map == null ? new HashMap<>() : map;\n-                        map.putAll(convert(StringUtils.parseParameters(value), \"\"));\n-                        invokeSetParameters(getClass(), this, map);\n-                    }\n-                }\n-            }\n-        } catch (Exception e) {\n-            logger.error(\"Failed to override \", e);\n-        }\n-    }\n-\n-    @Override\n-    public String toString() {\n-        try {\n-            StringBuilder buf = new StringBuilder();\n-            buf.append(\"<dubbo:\");\n-            buf.append(getTagName(getClass()));\n-            Method[] methods = getClass().getMethods();\n-            for (Method method : methods) {\n-                try {\n-                    if (MethodUtils.isGetter(method)) {\n-                        String name = method.getName();\n-                        String key = calculateAttributeFromGetter(name);\n-\n-                        try {\n-                            getClass().getDeclaredField(key);\n-                        } catch (NoSuchFieldException e) {\n-                            // ignore\n-                            continue;\n-                        }\n-\n-                        Object value = method.invoke(this);\n-                        if (value != null) {\n-                            buf.append(\" \");\n-                            buf.append(key);\n-                            buf.append(\"=\\\"\");\n-                            buf.append(value);\n-                            buf.append(\"\\\"\");\n-                        }\n-                    }\n-                } catch (Exception e) {\n-                    logger.warn(e.getMessage(), e);\n-                }\n-            }\n-            buf.append(\" />\");\n-            return buf.toString();\n-        } catch (Throwable t) {\n-            logger.warn(t.getMessage(), t);\n-            return super.toString();\n-        }\n-    }\n-\n-    /**\n-     * FIXME check @Parameter(required=true) and any conditions that need to match.\n-     */\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        return true;\n-    }\n-\n-\n-    @Override\n-    public boolean equals(Object obj) {\n-        if (obj == null || !(obj.getClass().getName().equals(this.getClass().getName()))) {\n-            return false;\n-        }\n-\n-        Method[] methods = this.getClass().getMethods();\n-        for (Method method1 : methods) {\n-            if (MethodUtils.isGetter(method1)) {\n-                Parameter parameter = method1.getAnnotation(Parameter.class);\n-                if (parameter != null && parameter.excluded()) {\n-                    continue;\n-                }\n-                try {\n-                    Method method2 = obj.getClass().getMethod(method1.getName(), method1.getParameterTypes());\n-                    Object value1 = method1.invoke(this, new Object[]{});\n-                    Object value2 = method2.invoke(obj, new Object[]{});\n-                    if (!Objects.equals(value1, value2)) {\n-                        return false;\n-                    }\n-                } catch (Exception e) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return true;\n-    }\n-\n-    /**\n-     * Add {@link AbstractConfig instance} into {@link ConfigManager}\n-     * <p>\n-     * Current method will invoked by Spring or Java EE container automatically, or should be triggered manually.\n-     *\n-     * @see ConfigManager#addConfig(AbstractConfig)\n-     * @since 2.7.5\n-     */\n-    @PostConstruct\n-    public void addIntoConfigManager() {\n-        ApplicationModel.getConfigManager().addConfig(this);\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        int hashCode = 1;\n-\n-        Method[] methods = this.getClass().getMethods();\n-        for (Method method : methods) {\n-            if (MethodUtils.isGetter(method)) {\n-                Parameter parameter = method.getAnnotation(Parameter.class);\n-                if (parameter != null && parameter.excluded()) {\n-                    continue;\n-                }\n-                try {\n-                    Object value = method.invoke(this, new Object[]{});\n-                    hashCode = 31 * hashCode + value.hashCode();\n-                } catch (Exception ignored) {\n-                    //ignored\n-                }\n-            }\n-        }\n-\n-        if (hashCode == 0) {\n-            hashCode = 1;\n-        }\n-\n-        return hashCode;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.CompositeConfiguration;\r\n+import org.apache.dubbo.common.config.Environment;\r\n+import org.apache.dubbo.common.constants.CommonConstants;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.MethodUtils;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.AsyncMethodInfo;\r\n+\r\n+import javax.annotation.PostConstruct;\r\n+import java.io.Serializable;\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static org.apache.dubbo.common.utils.ReflectUtils.findMethodByMethodSignature;\r\n+\r\n+/**\r\n+ * Utility methods and public methods for parsing configuration\r\n+ *\r\n+ * @export\r\n+ */\r\n+public abstract class AbstractConfig implements Serializable {\r\n+\r\n+    protected static final Logger logger = LoggerFactory.getLogger(AbstractConfig.class);\r\n+    private static final long serialVersionUID = 4267533505537413570L;\r\n+\r\n+    /**\r\n+     * The legacy properties container\r\n+     */\r\n+    private static final Map<String, String> LEGACY_PROPERTIES = new HashMap<String, String>();\r\n+\r\n+    /**\r\n+     * The suffix container\r\n+     */\r\n+    private static final String[] SUFFIXES = new String[]{\"Config\", \"Bean\", \"ConfigBase\"};\r\n+\r\n+    static {\r\n+        LEGACY_PROPERTIES.put(\"dubbo.protocol.name\", \"dubbo.service.protocol\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.protocol.host\", \"dubbo.service.server.host\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.protocol.port\", \"dubbo.service.server.port\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.protocol.threads\", \"dubbo.service.max.thread.pool.size\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.consumer.timeout\", \"dubbo.service.invoke.timeout\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.consumer.retries\", \"dubbo.service.max.retry.providers\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.consumer.check\", \"dubbo.service.allow.no.provider\");\r\n+        LEGACY_PROPERTIES.put(\"dubbo.service.url\", \"dubbo.service.address\");\r\n+    }\r\n+\r\n+    /**\r\n+     * The config id\r\n+     */\r\n+    protected String id;\r\n+    protected String prefix;\r\n+\r\n+    protected final AtomicBoolean refreshed = new AtomicBoolean(false);\r\n+\r\n+    private static String convertLegacyValue(String key, String value) {\r\n+        if (value != null && value.length() > 0) {\r\n+            if (\"dubbo.service.max.retry.providers\".equals(key)) {\r\n+                return String.valueOf(Integer.parseInt(value) - 1);\r\n+            } else if (\"dubbo.service.allow.no.provider\".equals(key)) {\r\n+                return String.valueOf(!Boolean.parseBoolean(value));\r\n+            }\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    public static String getTagName(Class<?> cls) {\r\n+        String tag = cls.getSimpleName();\r\n+        for (String suffix : SUFFIXES) {\r\n+            if (tag.endsWith(suffix)) {\r\n+                tag = tag.substring(0, tag.length() - suffix.length());\r\n+                break;\r\n+            }\r\n+        }\r\n+        return StringUtils.camelToSplitName(tag, \"-\");\r\n+    }\r\n+\r\n+    public static void appendParameters(Map<String, String> parameters, Object config) {\r\n+        appendParameters(parameters, config, null);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public static void appendParameters(Map<String, String> parameters, Object config, String prefix) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+        Method[] methods = config.getClass().getMethods();\r\n+        for (Method method : methods) {\r\n+            try {\r\n+                String name = method.getName();\r\n+                if (MethodUtils.isGetter(method)) {\r\n+                    Parameter parameter = method.getAnnotation(Parameter.class);\r\n+                    if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {\r\n+                        continue;\r\n+                    }\r\n+                    String key;\r\n+                    if (parameter != null && parameter.key().length() > 0) {\r\n+                        key = parameter.key();\r\n+                    } else {\r\n+                        key = calculatePropertyFromGetter(name);\r\n+                    }\r\n+                    Object value = method.invoke(config);\r\n+                    String str = String.valueOf(value).trim();\r\n+                    if (value != null && str.length() > 0) {\r\n+                        if (parameter != null && parameter.escaped()) {\r\n+                            str = URL.encode(str);\r\n+                        }\r\n+                        if (parameter != null && parameter.append()) {\r\n+                            String pre = parameters.get(key);\r\n+                            if (pre != null && pre.length() > 0) {\r\n+                                str = pre + \",\" + str;\r\n+                            }\r\n+                        }\r\n+                        if (prefix != null && prefix.length() > 0) {\r\n+                            key = prefix + \".\" + key;\r\n+                        }\r\n+                        parameters.put(key, str);\r\n+                    } else if (parameter != null && parameter.required()) {\r\n+                        throw new IllegalStateException(config.getClass().getSimpleName() + \".\" + key + \" == null\");\r\n+                    }\r\n+                } else if (isParametersGetter(method)) {\r\n+                    Map<String, String> map = (Map<String, String>) method.invoke(config, new Object[0]);\r\n+                    parameters.putAll(convert(map, prefix));\r\n+                }\r\n+            } catch (Exception e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    protected static void appendAttributes(Map<String, Object> parameters, Object config) {\r\n+        appendAttributes(parameters, config, null);\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    protected static void appendAttributes(Map<String, Object> parameters, Object config, String prefix) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+        Method[] methods = config.getClass().getMethods();\r\n+        for (Method method : methods) {\r\n+            try {\r\n+                Parameter parameter = method.getAnnotation(Parameter.class);\r\n+                if (parameter == null || !parameter.attribute()) {\r\n+                    continue;\r\n+                }\r\n+                String name = method.getName();\r\n+                if (MethodUtils.isGetter(method)) {\r\n+                    String key;\r\n+                    if (parameter.key().length() > 0) {\r\n+                        key = parameter.key();\r\n+                    } else {\r\n+                        key = calculateAttributeFromGetter(name);\r\n+                    }\r\n+                    Object value = method.invoke(config);\r\n+                    if (value != null) {\r\n+                        if (prefix != null && prefix.length() > 0) {\r\n+                            key = prefix + \".\" + key;\r\n+                        }\r\n+                        parameters.put(key, value);\r\n+                    }\r\n+                }\r\n+            } catch (Exception e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    protected static AsyncMethodInfo convertMethodConfig2AsyncInfo(MethodConfig methodConfig) {\r\n+        if (methodConfig == null || (methodConfig.getOninvoke() == null && methodConfig.getOnreturn() == null && methodConfig.getOnthrow() == null)) {\r\n+            return null;\r\n+        }\r\n+\r\n+        //check config conflict\r\n+        if (Boolean.FALSE.equals(methodConfig.isReturn()) && (methodConfig.getOnreturn() != null || methodConfig.getOnthrow() != null)) {\r\n+            throw new IllegalStateException(\"method config error : return attribute must be set true when onreturn or onthrow has been set.\");\r\n+        }\r\n+\r\n+        AsyncMethodInfo asyncMethodInfo = new AsyncMethodInfo();\r\n+\r\n+        asyncMethodInfo.setOninvokeInstance(methodConfig.getOninvoke());\r\n+        asyncMethodInfo.setOnreturnInstance(methodConfig.getOnreturn());\r\n+        asyncMethodInfo.setOnthrowInstance(methodConfig.getOnthrow());\r\n+\r\n+        try {\r\n+            String oninvokeMethod = methodConfig.getOninvokeMethod();\r\n+            if (StringUtils.isNotEmpty(oninvokeMethod)) {\r\n+                asyncMethodInfo.setOninvokeMethod(getMethodByName(methodConfig.getOninvoke().getClass(), oninvokeMethod));\r\n+            }\r\n+\r\n+            String onreturnMethod = methodConfig.getOnreturnMethod();\r\n+            if (StringUtils.isNotEmpty(onreturnMethod)) {\r\n+                asyncMethodInfo.setOnreturnMethod(getMethodByName(methodConfig.getOnreturn().getClass(), onreturnMethod));\r\n+            }\r\n+\r\n+            String onthrowMethod = methodConfig.getOnthrowMethod();\r\n+            if (StringUtils.isNotEmpty(onthrowMethod)) {\r\n+                asyncMethodInfo.setOnthrowMethod(getMethodByName(methodConfig.getOnthrow().getClass(), onthrowMethod));\r\n+            }\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+\r\n+        return asyncMethodInfo;\r\n+    }\r\n+\r\n+    private static Method getMethodByName(Class<?> clazz, String methodName) {\r\n+        try {\r\n+            return ReflectUtils.findMethodByMethodName(clazz, methodName);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e);\r\n+        }\r\n+    }\r\n+\r\n+    protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {\r\n+        return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {\r\n+            k = k.substring(prefix.length());\r\n+            return k.substring(0, k.indexOf(\".\"));\r\n+        }).collect(Collectors.toSet());\r\n+    }\r\n+\r\n+    private static String extractPropertyName(Class<?> clazz, Method setter) throws Exception {\r\n+        String propertyName = setter.getName().substring(\"set\".length());\r\n+        Method getter = null;\r\n+        try {\r\n+            getter = clazz.getMethod(\"get\" + propertyName);\r\n+        } catch (NoSuchMethodException e) {\r\n+            getter = clazz.getMethod(\"is\" + propertyName);\r\n+        }\r\n+        Parameter parameter = getter.getAnnotation(Parameter.class);\r\n+        if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.useKeyAsProperty()) {\r\n+            propertyName = parameter.key();\r\n+        } else {\r\n+            propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);\r\n+        }\r\n+        return propertyName;\r\n+    }\r\n+\r\n+    private static String calculatePropertyFromGetter(String name) {\r\n+        int i = name.startsWith(\"get\") ? 3 : 2;\r\n+        return StringUtils.camelToSplitName(name.substring(i, i + 1).toLowerCase() + name.substring(i + 1), \".\");\r\n+    }\r\n+\r\n+    private static String calculateAttributeFromGetter(String getter) {\r\n+        int i = getter.startsWith(\"get\") ? 3 : 2;\r\n+        return getter.substring(i, i + 1).toLowerCase() + getter.substring(i + 1);\r\n+    }\r\n+\r\n+    private static void invokeSetParameters(Class c, Object o, Map map) {\r\n+        try {\r\n+            Method method = findMethodByMethodSignature(c, \"setParameters\", new String[]{Map.class.getName()});\r\n+            if (method != null && isParametersSetter(method)) {\r\n+                method.invoke(o, map);\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            // ignore\r\n+        }\r\n+    }\r\n+\r\n+    private static Map<String, String> invokeGetParameters(Class c, Object o) {\r\n+        try {\r\n+            Method method = findMethodByMethodSignature(c, \"getParameters\", null);\r\n+            if (method != null && isParametersGetter(method)) {\r\n+                return (Map<String, String>) method.invoke(o);\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            // ignore\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    private static boolean isParametersGetter(Method method) {\r\n+        String name = method.getName();\r\n+        return (\"getParameters\".equals(name)\r\n+                && Modifier.isPublic(method.getModifiers())\r\n+                && method.getParameterTypes().length == 0\r\n+                && method.getReturnType() == Map.class);\r\n+    }\r\n+\r\n+    private static boolean isParametersSetter(Method method) {\r\n+        return (\"setParameters\".equals(method.getName())\r\n+                && Modifier.isPublic(method.getModifiers())\r\n+                && method.getParameterCount() == 1\r\n+                && Map.class == method.getParameterTypes()[0]\r\n+                && method.getReturnType() == void.class);\r\n+    }\r\n+\r\n+    /**\r\n+     * @param parameters the raw parameters\r\n+     * @param prefix     the prefix\r\n+     * @return the parameters whose raw key will replace \"-\" to \".\"\r\n+     * @revised 2.7.8 \"private\" to be \"protected\"\r\n+     */\r\n+    protected static Map<String, String> convert(Map<String, String> parameters, String prefix) {\r\n+        if (parameters == null || parameters.isEmpty()) {\r\n+            return Collections.emptyMap();\r\n+        }\r\n+\r\n+        Map<String, String> result = new HashMap<>();\r\n+        String pre = (prefix != null && prefix.length() > 0 ? prefix + \".\" : \"\");\r\n+        for (Map.Entry<String, String> entry : parameters.entrySet()) {\r\n+            String key = entry.getKey();\r\n+            String value = entry.getValue();\r\n+            result.put(pre + key, value);\r\n+            // For compatibility, key like \"registry-type\" will has a duplicate key \"registry.type\"\r\n+            if (key.contains(\"-\")) {\r\n+                result.put(pre + key.replace('-', '.'), value);\r\n+            }\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getId() {\r\n+        return id;\r\n+    }\r\n+\r\n+    public void setId(String id) {\r\n+        this.id = id;\r\n+    }\r\n+\r\n+    public void updateIdIfAbsent(String value) {\r\n+        if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(id)) {\r\n+            this.id = value;\r\n+        }\r\n+    }\r\n+\r\n+    protected void appendAnnotation(Class<?> annotationClass, Object annotation) {\r\n+        Method[] methods = annotationClass.getMethods();\r\n+        for (Method method : methods) {\r\n+            if (method.getDeclaringClass() != Object.class\r\n+                    && method.getReturnType() != void.class\r\n+                    && method.getParameterTypes().length == 0\r\n+                    && Modifier.isPublic(method.getModifiers())\r\n+                    && !Modifier.isStatic(method.getModifiers())) {\r\n+                try {\r\n+                    String property = method.getName();\r\n+                    if (\"interfaceClass\".equals(property) || \"interfaceName\".equals(property)) {\r\n+                        property = \"interface\";\r\n+                    }\r\n+                    String setter = \"set\" + property.substring(0, 1).toUpperCase() + property.substring(1);\r\n+                    Object value = method.invoke(annotation);\r\n+                    if (value != null && !value.equals(method.getDefaultValue())) {\r\n+                        Class<?> parameterType = ReflectUtils.getBoxedClass(method.getReturnType());\r\n+                        if (\"filter\".equals(property) || \"listener\".equals(property)) {\r\n+                            parameterType = String.class;\r\n+                            value = StringUtils.join((String[]) value, \",\");\r\n+                        } else if (\"parameters\".equals(property)) {\r\n+                            parameterType = Map.class;\r\n+                            value = CollectionUtils.toStringMap((String[]) value);\r\n+                        }\r\n+                        try {\r\n+                            Method setterMethod = getClass().getMethod(setter, parameterType);\r\n+                            setterMethod.invoke(this, value);\r\n+                        } catch (NoSuchMethodException e) {\r\n+                            // ignore\r\n+                        }\r\n+                    }\r\n+                } catch (Throwable e) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Should be called after Config was fully initialized.\r\n+     * // FIXME: this method should be completely replaced by appendParameters\r\n+     *\r\n+     * @return\r\n+     * @see AbstractConfig#appendParameters(Map, Object, String)\r\n+     * <p>\r\n+     * Notice! This method should include all properties in the returning map, treat @Parameter differently compared to appendParameters.\r\n+     */\r\n+    public Map<String, String> getMetaData() {\r\n+        Map<String, String> metaData = new HashMap<>();\r\n+        Method[] methods = this.getClass().getMethods();\r\n+        for (Method method : methods) {\r\n+            try {\r\n+                String name = method.getName();\r\n+                if (MethodUtils.isMetaMethod(method)) {\r\n+                    String key;\r\n+                    Parameter parameter = method.getAnnotation(Parameter.class);\r\n+                    if (parameter != null && parameter.key().length() > 0 && parameter.useKeyAsProperty()) {\r\n+                        key = parameter.key();\r\n+                    } else {\r\n+                        key = calculateAttributeFromGetter(name);\r\n+                    }\r\n+                    // treat url and configuration differently, the value should always present in configuration though it may not need to present in url.\r\n+                    //if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {\r\n+                    if (method.getReturnType() == Object.class) {\r\n+                        metaData.put(key, null);\r\n+                        continue;\r\n+                    }\r\n+\r\n+                    /**\r\n+                     * Attributes annotated as deprecated should not override newly added replacement.\r\n+                     */\r\n+                    if (MethodUtils.isDeprecated(method) && metaData.get(key) != null) {\r\n+                        continue;\r\n+                    }\r\n+\r\n+                    Object value = method.invoke(this);\r\n+                    String str = String.valueOf(value).trim();\r\n+                    if (value != null && str.length() > 0) {\r\n+                        metaData.put(key, str);\r\n+                    } else {\r\n+                        metaData.put(key, null);\r\n+                    }\r\n+                } else if (isParametersGetter(method)) {\r\n+                    Map<String, String> map = (Map<String, String>) method.invoke(this, new Object[0]);\r\n+                    metaData.putAll(convert(map, \"\"));\r\n+                }\r\n+            } catch (Exception e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+        return metaData;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getPrefix() {\r\n+        return StringUtils.isNotEmpty(prefix) ? prefix : (CommonConstants.DUBBO + \".\" + getTagName(this.getClass()));\r\n+    }\r\n+\r\n+    public void setPrefix(String prefix) {\r\n+        this.prefix = prefix;\r\n+    }\r\n+\r\n+    public void refresh() {\r\n+        Environment env = ApplicationModel.getEnvironment();\r\n+        try {\r\n+            CompositeConfiguration compositeConfiguration = env.getPrefixedConfiguration(this);\r\n+            // loop methods, get override value and set the new value back to method\r\n+            Method[] methods = getClass().getMethods();\r\n+            for (Method method : methods) {\r\n+                if (MethodUtils.isSetter(method)) {\r\n+                    try {\r\n+                        String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method)));\r\n+                        // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig.\r\n+                        if (StringUtils.isNotEmpty(value) && ClassUtils.isTypeMatch(method.getParameterTypes()[0], value)) {\r\n+                            method.invoke(this, ClassUtils.convertPrimitive(method.getParameterTypes()[0], value));\r\n+                        }\r\n+                    } catch (NoSuchMethodException e) {\r\n+                        logger.info(\"Failed to override the property \" + method.getName() + \" in \" +\r\n+                                this.getClass().getSimpleName() +\r\n+                                \", please make sure every property has getter/setter method provided.\");\r\n+                    }\r\n+                } else if (isParametersSetter(method)) {\r\n+                    String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method)));\r\n+                    if (StringUtils.isNotEmpty(value)) {\r\n+                        Map<String, String> map = invokeGetParameters(getClass(), this);\r\n+                        map = map == null ? new HashMap<>() : map;\r\n+                        map.putAll(convert(StringUtils.parseParameters(value), \"\"));\r\n+                        invokeSetParameters(getClass(), this, map);\r\n+                    }\r\n+                }\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Failed to override \", e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        try {\r\n+            StringBuilder buf = new StringBuilder();\r\n+            buf.append(\"<dubbo:\");\r\n+            buf.append(getTagName(getClass()));\r\n+            Method[] methods = getClass().getMethods();\r\n+            for (Method method : methods) {\r\n+                try {\r\n+                    if (MethodUtils.isGetter(method)) {\r\n+                        String name = method.getName();\r\n+                        String key = calculateAttributeFromGetter(name);\r\n+\r\n+                        try {\r\n+                            getClass().getDeclaredField(key);\r\n+                        } catch (NoSuchFieldException e) {\r\n+                            // ignore\r\n+                            continue;\r\n+                        }\r\n+\r\n+                        Object value = method.invoke(this);\r\n+                        if (value != null) {\r\n+                            buf.append(\" \");\r\n+                            buf.append(key);\r\n+                            buf.append(\"=\\\"\");\r\n+                            buf.append(value);\r\n+                            buf.append(\"\\\"\");\r\n+                        }\r\n+                    }\r\n+                } catch (Exception e) {\r\n+                    logger.warn(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+            buf.append(\" />\");\r\n+            return buf.toString();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(t.getMessage(), t);\r\n+            return super.toString();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * FIXME check @Parameter(required=true) and any conditions that need to match.\r\n+     */\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        return true;\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public boolean equals(Object obj) {\r\n+        if (obj == null || !(obj.getClass().getName().equals(this.getClass().getName()))) {\r\n+            return false;\r\n+        }\r\n+\r\n+        Method[] methods = this.getClass().getMethods();\r\n+        for (Method method1 : methods) {\r\n+            if (MethodUtils.isGetter(method1)) {\r\n+                Parameter parameter = method1.getAnnotation(Parameter.class);\r\n+                if (parameter != null && parameter.excluded()) {\r\n+                    continue;\r\n+                }\r\n+                try {\r\n+                    Method method2 = obj.getClass().getMethod(method1.getName(), method1.getParameterTypes());\r\n+                    Object value1 = method1.invoke(this, new Object[]{});\r\n+                    Object value2 = method2.invoke(obj, new Object[]{});\r\n+                    if (!Objects.equals(value1, value2)) {\r\n+                        return false;\r\n+                    }\r\n+                } catch (Exception e) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * Add {@link AbstractConfig instance} into {@link ConfigManager}\r\n+     * <p>\r\n+     * Current method will invoked by Spring or Java EE container automatically, or should be triggered manually.\r\n+     *\r\n+     * @see ConfigManager#addConfig(AbstractConfig)\r\n+     * @since 2.7.5\r\n+     */\r\n+    @PostConstruct\r\n+    public void addIntoConfigManager() {\r\n+        ApplicationModel.getConfigManager().addConfig(this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        int hashCode = 1;\r\n+\r\n+        Method[] methods = this.getClass().getMethods();\r\n+        for (Method method : methods) {\r\n+            if (MethodUtils.isGetter(method)) {\r\n+                Parameter parameter = method.getAnnotation(Parameter.class);\r\n+                if (parameter != null && parameter.excluded()) {\r\n+                    continue;\r\n+                }\r\n+                try {\r\n+                    Object value = method.invoke(this, new Object[]{});\r\n+                    hashCode = 31 * hashCode + value.hashCode();\r\n+                } catch (Exception ignored) {\r\n+                    //ignored\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (hashCode == 0) {\r\n+            hashCode = 1;\r\n+        }\r\n+\r\n+        return hashCode;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/AbstractInterfaceConfig.java", "source2": "org/apache/dubbo/config/AbstractInterfaceConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,758 +1,758 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.Version;\n-import org.apache.dubbo.common.utils.Assert;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ServiceMetadata;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.Collection;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INVOKER_LISTENER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-\n-/**\n- * AbstractDefaultConfig\n- *\n- * @export\n- */\n-public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {\n-\n-    private static final long serialVersionUID = -1559314110797223229L;\n-\n-    /**\n-     * The interface name of the exported service\n-     */\n-    protected String interfaceName;\n-    /**\n-     * The remote service version the customer/provider side will reference\n-     */\n-    protected String version;\n-\n-    /**\n-     * The remote service group the customer/provider side will reference\n-     */\n-    protected String group;\n-    \n-    protected ServiceMetadata serviceMetadata;\n-    /**\n-     * Local impl class name for the service interface\n-     */\n-    protected String local;\n-\n-    /**\n-     * Local stub class name for the service interface\n-     */\n-    protected String stub;\n-\n-    /**\n-     * Service monitor\n-     */\n-    protected MonitorConfig monitor;\n-\n-    /**\n-     * Strategies for generating dynamic agents\uff0cthere are two strategies can be choosed: jdk and javassist\n-     */\n-    protected String proxy;\n-\n-    /**\n-     * Cluster type\n-     */\n-    protected String cluster;\n-\n-    /**\n-     * The {@code Filter} when the provider side exposed a service or the customer side references a remote service used,\n-     * if there are more than one, you can use commas to separate them\n-     */\n-    protected String filter;\n-\n-    /**\n-     * The Listener when the provider side exposes a service or the customer side references a remote service used\n-     * if there are more than one, you can use commas to separate them\n-     */\n-    protected String listener;\n-\n-    /**\n-     * The owner of the service providers\n-     */\n-    protected String owner;\n-\n-    /**\n-     * Connection limits, 0 means shared connection, otherwise it defines the connections delegated to the current service\n-     */\n-    protected Integer connections;\n-\n-    /**\n-     * The layer of service providers\n-     */\n-    protected String layer;\n-\n-    /**\n-     * The application info\n-     */\n-    protected ApplicationConfig application;\n-\n-    /**\n-     * The module info\n-     */\n-    protected ModuleConfig module;\n-\n-    /**\n-     * The registry list the service will register to\n-     * Also see {@link #registryIds}, only one of them will work.\n-     */\n-    protected List<RegistryConfig> registries;\n-\n-    /**\n-     * The method configuration\n-     */\n-    private List<MethodConfig> methods;\n-\n-    /**\n-     * The id list of registries the service will register to\n-     * Also see {@link #registries}, only one of them will work.\n-     */\n-    protected String registryIds;\n-\n-    // connection events\n-    protected String onconnect;\n-\n-    /**\n-     * Disconnection events\n-     */\n-    protected String ondisconnect;\n-\n-    /**\n-     * The metrics configuration\n-     */\n-    protected MetricsConfig metrics;\n-    protected MetadataReportConfig metadataReportConfig;\n-\n-    protected ConfigCenterConfig configCenter;\n-\n-    // callback limits\n-    private Integer callbacks;\n-    // the scope for referring/exporting a service, if it's local, it means searching in current JVM only.\n-    private String scope;\n-\n-    protected String tag;\n-\n-    private  Boolean auth;\n-\n-\n-    /**\n-     * The url of the reference service\n-     */\n-    protected final List<URL> urls = new ArrayList<URL>();\n-\n-    public List<URL> getExportedUrls() {\n-        return urls;\n-    }\n-\n-    public URL toUrl() {\n-        return urls.isEmpty() ? null : urls.iterator().next();\n-    }\n-\n-    public List<URL> toUrls() {\n-        return urls;\n-    }\n-\n-    /**\n-     * Check whether the registry config is exists, and then conversion it to {@link RegistryConfig}\n-     */\n-    public void checkRegistry() {\n-        convertRegistryIdsToRegistries();\n-\n-        for (RegistryConfig registryConfig : registries) {\n-            if (!registryConfig.isValid()) {\n-                throw new IllegalStateException(\"No registry config found or it's not a valid config! \" +\n-                        \"The registry config is: \" + registryConfig);\n-            }\n-        }\n-    }\n-\n-    public static void appendRuntimeParameters(Map<String, String> map) {\n-        map.put(DUBBO_VERSION_KEY, Version.getProtocolVersion());\n-        map.put(RELEASE_KEY, Version.getVersion());\n-        map.put(TIMESTAMP_KEY, String.valueOf(System.currentTimeMillis()));\n-        if (ConfigUtils.getPid() > 0) {\n-            map.put(PID_KEY, String.valueOf(ConfigUtils.getPid()));\n-        }\n-    }\n-\n-    /**\n-     * Check whether the remote service interface and the methods meet with Dubbo's requirements.it mainly check, if the\n-     * methods configured in the configuration file are included in the interface of remote service\n-     *\n-     * @param interfaceClass the interface of remote service\n-     * @param methods        the methods configured\n-     */\n-    public void checkInterfaceAndMethods(Class<?> interfaceClass, List<MethodConfig> methods) {\n-        // interface cannot be null\n-        Assert.notNull(interfaceClass, new IllegalStateException(\"interface not allow null!\"));\n-\n-        // to verify interfaceClass is an interface\n-        if (!interfaceClass.isInterface()) {\n-            throw new IllegalStateException(\"The interface class \" + interfaceClass + \" is not a interface!\");\n-        }\n-        // check if methods exist in the remote service interface\n-        if (CollectionUtils.isNotEmpty(methods)) {\n-            for (MethodConfig methodBean : methods) {\n-                methodBean.setService(interfaceClass.getName());\n-                methodBean.setServiceId(this.getId());\n-                methodBean.refresh();\n-                String methodName = methodBean.getName();\n-                if (StringUtils.isEmpty(methodName)) {\n-                    throw new IllegalStateException(\"<dubbo:method> name attribute is required! Please check: \" +\n-                            \"<dubbo:service interface=\\\"\" + interfaceClass.getName() + \"\\\" ... >\" +\n-                            \"<dubbo:method name=\\\"\\\" ... /></<dubbo:reference>\");\n-                }\n-\n-                boolean hasMethod = Arrays.stream(interfaceClass.getMethods()).anyMatch(method -> method.getName().equals(methodName));\n-                if (!hasMethod) {\n-                    throw new IllegalStateException(\"The interface \" + interfaceClass.getName()\n-                            + \" not found method \" + methodName);\n-                }\n-            }\n-        }\n-    }\n-\n-\n-\n-    /**\n-     * Legitimacy check of stub, note that: the local will deprecated, and replace with <code>stub</code>\n-     *\n-     * @param interfaceClass for provider side, it is the {@link Class} of the service that will be exported; for consumer\n-     *                       side, it is the {@link Class} of the remote service interface\n-     */\n-    public void checkStubAndLocal(Class<?> interfaceClass) {\n-        verifyStubAndLocal(local, \"Local\", interfaceClass);\n-        verifyStubAndLocal(stub, \"Stub\", interfaceClass);\n-    }\n-    \n-    public void verifyStubAndLocal(String className, String label, Class<?> interfaceClass){\n-    \tif (ConfigUtils.isNotEmpty(className)) {\n-            Class<?> localClass = ConfigUtils.isDefault(className) ?\n-                    ReflectUtils.forName(interfaceClass.getName() + label) : ReflectUtils.forName(className);\n-                        verify(interfaceClass, localClass);\n-            }\n-    }\n-\n-    private void verify(Class<?> interfaceClass, Class<?> localClass) {\n-        if (!interfaceClass.isAssignableFrom(localClass)) {\n-            throw new IllegalStateException(\"The local implementation class \" + localClass.getName() +\n-                    \" not implement interface \" + interfaceClass.getName());\n-        }\n-\n-        try {\n-            //Check if the localClass a constructor with parameter who's type is interfaceClass\n-            ReflectUtils.findConstructor(localClass, interfaceClass);\n-        } catch (NoSuchMethodException e) {\n-            throw new IllegalStateException(\"No such constructor \\\"public \" + localClass.getSimpleName() +\n-                    \"(\" + interfaceClass.getName() + \")\\\" in local implementation class \" + localClass.getName());\n-        }\n-    }\n-\n-    private void convertRegistryIdsToRegistries() {\n-        computeValidRegistryIds();\n-        if (StringUtils.isEmpty(registryIds)) {\n-            if (CollectionUtils.isEmpty(registries)) {\n-                List<RegistryConfig> registryConfigs = ApplicationModel.getConfigManager().getDefaultRegistries();\n-                if (registryConfigs.isEmpty()) {\n-                    registryConfigs = new ArrayList<>();\n-                    RegistryConfig registryConfig = new RegistryConfig();\n-                    registryConfig.refresh();\n-                    registryConfigs.add(registryConfig);\n-                } else {\n-                    registryConfigs = new ArrayList<>(registryConfigs);\n-                }\n-                setRegistries(registryConfigs);\n-            }\n-        } else {\n-            String[] ids = COMMA_SPLIT_PATTERN.split(registryIds);\n-            List<RegistryConfig> tmpRegistries = new ArrayList<>();\n-            Arrays.stream(ids).forEach(id -> {\n-                if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {\n-                    Optional<RegistryConfig> globalRegistry = ApplicationModel.getConfigManager().getRegistry(id);\n-                    if (globalRegistry.isPresent()) {\n-                        tmpRegistries.add(globalRegistry.get());\n-                    } else {\n-                        RegistryConfig registryConfig = new RegistryConfig();\n-                        registryConfig.setId(id);\n-                        registryConfig.refresh();\n-                        tmpRegistries.add(registryConfig);\n-                    }\n-                }\n-            });\n-\n-            if (tmpRegistries.size() > ids.length) {\n-                throw new IllegalStateException(\"Too much registries found, the registries assigned to this service \" +\n-                        \"are :\" + registryIds + \", but got \" + tmpRegistries.size() + \" registries!\");\n-            }\n-\n-            setRegistries(tmpRegistries);\n-        }\n-\n-    }\n-\n-    protected boolean notHasSelfRegistryProperty() {\n-        return CollectionUtils.isEmpty(registries) && StringUtils.isEmpty(registryIds);\n-    }\n-\n-    public void completeCompoundConfigs(AbstractInterfaceConfig interfaceConfig) {\n-        if (interfaceConfig != null) {\n-            if (application == null) {\n-                setApplication(interfaceConfig.getApplication());\n-            }\n-            if (module == null) {\n-                setModule(interfaceConfig.getModule());\n-            }\n-            if (notHasSelfRegistryProperty()) {\n-                setRegistries(interfaceConfig.getRegistries());\n-                setRegistryIds(interfaceConfig.getRegistryIds());\n-            }\n-            if (monitor == null) {\n-                setMonitor(interfaceConfig.getMonitor());\n-            }\n-        }\n-        if (module != null) {\n-            if (notHasSelfRegistryProperty()) {\n-                setRegistries(module.getRegistries());\n-            }\n-            if (monitor == null) {\n-                setMonitor(module.getMonitor());\n-            }\n-        }\n-        if (application != null) {\n-            if (notHasSelfRegistryProperty()) {\n-                setRegistries(application.getRegistries());\n-                setRegistryIds(application.getRegistryIds());\n-            }\n-            if (monitor == null) {\n-                setMonitor(application.getMonitor());\n-            }\n-        }\n-    }\n-    \n-    protected void computeValidRegistryIds() {\n-        if (application != null && notHasSelfRegistryProperty()) {\n-            setRegistries(application.getRegistries());\n-            setRegistryIds(application.getRegistryIds());\n-        }\n-    }\n-\n-    /**\n-     * @return local\n-     * @deprecated Replace to <code>getStub()</code>\n-     */\n-    @Deprecated\n-    public String getLocal() {\n-        return local;\n-    }\n-\n-    /**\n-     * @param local\n-     * @deprecated Replace to <code>setStub(Boolean)</code>\n-     */\n-    @Deprecated\n-    public void setLocal(Boolean local) {\n-        if (local == null) {\n-            setLocal((String) null);\n-        } else {\n-            setLocal(local.toString());\n-        }\n-    }\n-\n-    /**\n-     * @param local\n-     * @deprecated Replace to <code>setStub(String)</code>\n-     */\n-    @Deprecated\n-    public void setLocal(String local) {\n-        this.local = local;\n-    }\n-\n-    public String getStub() {\n-        return stub;\n-    }\n-\n-    public void setStub(Boolean stub) {\n-        if (stub == null) {\n-            setStub((String) null);\n-        } else {\n-            setStub(stub.toString());\n-        }\n-    }\n-\n-    public void setStub(String stub) {\n-        this.stub = stub;\n-    }\n-\n-    public String getCluster() {\n-        return cluster;\n-    }\n-\n-    public void setCluster(String cluster) {\n-        this.cluster = cluster;\n-    }\n-\n-    public String getProxy() {\n-        return proxy;\n-    }\n-\n-    public void setProxy(String proxy) {\n-\n-        this.proxy = proxy;\n-    }\n-\n-    public Integer getConnections() {\n-        return connections;\n-    }\n-\n-    public void setConnections(Integer connections) {\n-        this.connections = connections;\n-    }\n-\n-    @Parameter(key = REFERENCE_FILTER_KEY, append = true)\n-    public String getFilter() {\n-        return filter;\n-    }\n-\n-    public void setFilter(String filter) {\n-        this.filter = filter;\n-    }\n-\n-    @Parameter(key = INVOKER_LISTENER_KEY, append = true)\n-    public String getListener() {\n-        return listener;\n-    }\n-\n-    public void setListener(String listener) {\n-        this.listener = listener;\n-    }\n-\n-    public String getLayer() {\n-        return layer;\n-    }\n-\n-    public void setLayer(String layer) {\n-        this.layer = layer;\n-    }\n-\n-    /**\n-     * Always use the global ApplicationConfig\n-     */\n-    public ApplicationConfig getApplication() {\n-        ApplicationConfig globalApplication = ApplicationModel.getConfigManager().getApplicationOrElseThrow();\n-        if (globalApplication == null) {\n-            return application;\n-        }\n-        if (application != null && !StringUtils.isEquals(application.getName(), globalApplication.getName())) {\n-            return application;\n-        }\n-        return globalApplication;\n-    }\n-\n-    @Deprecated\n-    public void setApplication(ApplicationConfig application) {\n-        this.application = application;\n-        if (application != null) {\n-            ConfigManager configManager = ApplicationModel.getConfigManager();\n-            configManager.getApplication().orElseGet(() -> {\n-                configManager.setApplication(application);\n-                return application;\n-            });\n-        }\n-    }\n-\n-    public ModuleConfig getModule() {\n-        if (module != null) {\n-            return module;\n-        }\n-        return ApplicationModel.getConfigManager().getModule().orElse(null);\n-    }\n-\n-    @Deprecated\n-    public void setModule(ModuleConfig module) {\n-        this.module = module;\n-        if (module != null) {\n-            ConfigManager configManager = ApplicationModel.getConfigManager();\n-            configManager.getModule().orElseGet(() -> {\n-                configManager.setModule(module);\n-                return module;\n-            });\n-        }\n-    }\n-\n-    public RegistryConfig getRegistry() {\n-        return CollectionUtils.isEmpty(registries) ? null : registries.get(0);\n-    }\n-\n-    public void setRegistry(RegistryConfig registry) {\n-        List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);\n-        registries.add(registry);\n-        setRegistries(registries);\n-    }\n-\n-    public List<RegistryConfig> getRegistries() {\n-        return registries;\n-    }\n-\n-    @SuppressWarnings({\"unchecked\"})\n-    public void setRegistries(List<? extends RegistryConfig> registries) {\n-        this.registries = (List<RegistryConfig>) registries;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getRegistryIds() {\n-        return registryIds;\n-    }\n-\n-    public void setRegistryIds(String registryIds) {\n-        this.registryIds = registryIds;\n-    }\n-\n-\n-    public List<MethodConfig> getMethods() {\n-        return methods;\n-    }\n-\n-    // ======== Deprecated ========\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public void setMethods(List<? extends MethodConfig> methods) {\n-        this.methods = (List<MethodConfig>) methods;\n-    }\n-\n-\n-    public MonitorConfig getMonitor() {\n-        if (monitor != null) {\n-            return monitor;\n-        }\n-        // FIXME: instead of return null, we should set default monitor when getMonitor() return null in ConfigManager\n-        return ApplicationModel.getConfigManager().getMonitor().orElse(null);\n-    }\n-\n-    @Deprecated\n-    public void setMonitor(String monitor) {\n-        setMonitor(new MonitorConfig(monitor));\n-    }\n-\n-    @Deprecated\n-    public void setMonitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        if (monitor != null) {\n-            ConfigManager configManager = ApplicationModel.getConfigManager();\n-            configManager.getMonitor().orElseGet(() -> {\n-                configManager.setMonitor(monitor);\n-                return monitor;\n-            });\n-        }\n-    }\n-\n-    public String getOwner() {\n-        return owner;\n-    }\n-\n-    public void setOwner(String owner) {\n-        this.owner = owner;\n-    }\n-\n-    @Deprecated\n-    public ConfigCenterConfig getConfigCenter() {\n-        if (configCenter != null) {\n-            return configCenter;\n-        }\n-        Collection<ConfigCenterConfig> configCenterConfigs = ApplicationModel.getConfigManager().getConfigCenters();\n-        if (CollectionUtils.isNotEmpty(configCenterConfigs)) {\n-            return configCenterConfigs.iterator().next();\n-        }\n-        return null;\n-    }\n-\n-    @Deprecated\n-    public void setConfigCenter(ConfigCenterConfig configCenter) {\n-        this.configCenter = configCenter;\n-        if (configCenter != null) {\n-            ConfigManager configManager = ApplicationModel.getConfigManager();\n-            Collection<ConfigCenterConfig> configs = configManager.getConfigCenters();\n-            if (CollectionUtils.isEmpty(configs)\n-                    || configs.stream().noneMatch(existed -> existed.equals(configCenter))) {\n-                configManager.addConfigCenter(configCenter);\n-            }\n-        }\n-    }\n-\n-    public Integer getCallbacks() {\n-        return callbacks;\n-    }\n-\n-    public void setCallbacks(Integer callbacks) {\n-        this.callbacks = callbacks;\n-    }\n-\n-    public String getOnconnect() {\n-        return onconnect;\n-    }\n-\n-    public void setOnconnect(String onconnect) {\n-        this.onconnect = onconnect;\n-    }\n-\n-    public String getOndisconnect() {\n-        return ondisconnect;\n-    }\n-\n-    public void setOndisconnect(String ondisconnect) {\n-        this.ondisconnect = ondisconnect;\n-    }\n-\n-    public String getScope() {\n-        return scope;\n-    }\n-\n-    public void setScope(String scope) {\n-        this.scope = scope;\n-    }\n-\n-    @Deprecated\n-    public MetadataReportConfig getMetadataReportConfig() {\n-        if (metadataReportConfig != null) {\n-            return metadataReportConfig;\n-        }\n-        Collection<MetadataReportConfig> metadataReportConfigs = ApplicationModel.getConfigManager().getMetadataConfigs();\n-        if (CollectionUtils.isNotEmpty(metadataReportConfigs)) {\n-            return metadataReportConfigs.iterator().next();\n-        }\n-        return null;\n-    }\n-\n-    @Deprecated\n-    public void setMetadataReportConfig(MetadataReportConfig metadataReportConfig) {\n-        this.metadataReportConfig = metadataReportConfig;\n-        if (metadataReportConfig != null) {\n-            ConfigManager configManager = ApplicationModel.getConfigManager();\n-            Collection<MetadataReportConfig> configs = configManager.getMetadataConfigs();\n-            if (CollectionUtils.isEmpty(configs)\n-                    || configs.stream().noneMatch(existed -> existed.equals(metadataReportConfig))) {\n-                configManager.addMetadataReport(metadataReportConfig);\n-            }\n-        }\n-    }\n-\n-    @Deprecated\n-    public MetricsConfig getMetrics() {\n-        if (metrics != null) {\n-            return metrics;\n-        }\n-        return ApplicationModel.getConfigManager().getMetrics().orElse(null);\n-    }\n-\n-    @Deprecated\n-    public void setMetrics(MetricsConfig metrics) {\n-        this.metrics = metrics;\n-        if (metrics != null) {\n-            ConfigManager configManager = ApplicationModel.getConfigManager();\n-            configManager.getMetrics().orElseGet(() -> {\n-                configManager.setMetrics(metrics);\n-                return metrics;\n-            });\n-        }\n-    }\n-\n-    @Parameter(key = TAG_KEY, useKeyAsProperty = false)\n-    public String getTag() {\n-        return tag;\n-    }\n-\n-    public void setTag(String tag) {\n-        this.tag = tag;\n-    }\n-\n-    public Boolean getAuth() {\n-        return auth;\n-    }\n-\n-    public void setAuth(Boolean auth) {\n-        this.auth = auth;\n-    }\n-\n-    public SslConfig getSslConfig() {\n-        return ApplicationModel.getConfigManager().getSsl().orElse(null);\n-    }\n-    \n-    public void initServiceMetadata(AbstractInterfaceConfig interfaceConfig) {\n-        serviceMetadata.setVersion(getVersion(interfaceConfig));\n-        serviceMetadata.setGroup(getGroup(interfaceConfig));\n-        serviceMetadata.setDefaultGroup(getGroup(interfaceConfig));\n-        serviceMetadata.setServiceInterfaceName(getInterface());\n-    }\n-    \n-    public String getGroup(AbstractInterfaceConfig interfaceConfig) {\n-        return StringUtils.isEmpty(this.group) ? (interfaceConfig != null ? interfaceConfig.getGroup() : this.group) : this.group;\n-    }\n-\n-    public String getVersion(AbstractInterfaceConfig interfaceConfig) {\n-        return StringUtils.isEmpty(this.version) ? (interfaceConfig != null ? interfaceConfig.getVersion() : this.version) : this.version;\n-    }\n-    \n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-    \n-    public String getInterface() {\n-        return interfaceName;\n-    }\n-    \n-    public void setInterface(String interfaceName) {\n-        this.interfaceName = interfaceName;\n-//         if (StringUtils.isEmpty(id)) {\n-//             id = interfaceName;\n-//         }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.Version;\r\n+import org.apache.dubbo.common.utils.Assert;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ServiceMetadata;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.Collection;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INVOKER_LISTENER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+\r\n+/**\r\n+ * AbstractDefaultConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {\r\n+\r\n+    private static final long serialVersionUID = -1559314110797223229L;\r\n+\r\n+    /**\r\n+     * The interface name of the exported service\r\n+     */\r\n+    protected String interfaceName;\r\n+    /**\r\n+     * The remote service version the customer/provider side will reference\r\n+     */\r\n+    protected String version;\r\n+\r\n+    /**\r\n+     * The remote service group the customer/provider side will reference\r\n+     */\r\n+    protected String group;\r\n+    \r\n+    protected ServiceMetadata serviceMetadata;\r\n+    /**\r\n+     * Local impl class name for the service interface\r\n+     */\r\n+    protected String local;\r\n+\r\n+    /**\r\n+     * Local stub class name for the service interface\r\n+     */\r\n+    protected String stub;\r\n+\r\n+    /**\r\n+     * Service monitor\r\n+     */\r\n+    protected MonitorConfig monitor;\r\n+\r\n+    /**\r\n+     * Strategies for generating dynamic agents\uff0cthere are two strategies can be choosed: jdk and javassist\r\n+     */\r\n+    protected String proxy;\r\n+\r\n+    /**\r\n+     * Cluster type\r\n+     */\r\n+    protected String cluster;\r\n+\r\n+    /**\r\n+     * The {@code Filter} when the provider side exposed a service or the customer side references a remote service used,\r\n+     * if there are more than one, you can use commas to separate them\r\n+     */\r\n+    protected String filter;\r\n+\r\n+    /**\r\n+     * The Listener when the provider side exposes a service or the customer side references a remote service used\r\n+     * if there are more than one, you can use commas to separate them\r\n+     */\r\n+    protected String listener;\r\n+\r\n+    /**\r\n+     * The owner of the service providers\r\n+     */\r\n+    protected String owner;\r\n+\r\n+    /**\r\n+     * Connection limits, 0 means shared connection, otherwise it defines the connections delegated to the current service\r\n+     */\r\n+    protected Integer connections;\r\n+\r\n+    /**\r\n+     * The layer of service providers\r\n+     */\r\n+    protected String layer;\r\n+\r\n+    /**\r\n+     * The application info\r\n+     */\r\n+    protected ApplicationConfig application;\r\n+\r\n+    /**\r\n+     * The module info\r\n+     */\r\n+    protected ModuleConfig module;\r\n+\r\n+    /**\r\n+     * The registry list the service will register to\r\n+     * Also see {@link #registryIds}, only one of them will work.\r\n+     */\r\n+    protected List<RegistryConfig> registries;\r\n+\r\n+    /**\r\n+     * The method configuration\r\n+     */\r\n+    private List<MethodConfig> methods;\r\n+\r\n+    /**\r\n+     * The id list of registries the service will register to\r\n+     * Also see {@link #registries}, only one of them will work.\r\n+     */\r\n+    protected String registryIds;\r\n+\r\n+    // connection events\r\n+    protected String onconnect;\r\n+\r\n+    /**\r\n+     * Disconnection events\r\n+     */\r\n+    protected String ondisconnect;\r\n+\r\n+    /**\r\n+     * The metrics configuration\r\n+     */\r\n+    protected MetricsConfig metrics;\r\n+    protected MetadataReportConfig metadataReportConfig;\r\n+\r\n+    protected ConfigCenterConfig configCenter;\r\n+\r\n+    // callback limits\r\n+    private Integer callbacks;\r\n+    // the scope for referring/exporting a service, if it's local, it means searching in current JVM only.\r\n+    private String scope;\r\n+\r\n+    protected String tag;\r\n+\r\n+    private  Boolean auth;\r\n+\r\n+\r\n+    /**\r\n+     * The url of the reference service\r\n+     */\r\n+    protected final List<URL> urls = new ArrayList<URL>();\r\n+\r\n+    public List<URL> getExportedUrls() {\r\n+        return urls;\r\n+    }\r\n+\r\n+    public URL toUrl() {\r\n+        return urls.isEmpty() ? null : urls.iterator().next();\r\n+    }\r\n+\r\n+    public List<URL> toUrls() {\r\n+        return urls;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check whether the registry config is exists, and then conversion it to {@link RegistryConfig}\r\n+     */\r\n+    public void checkRegistry() {\r\n+        convertRegistryIdsToRegistries();\r\n+\r\n+        for (RegistryConfig registryConfig : registries) {\r\n+            if (!registryConfig.isValid()) {\r\n+                throw new IllegalStateException(\"No registry config found or it's not a valid config! \" +\r\n+                        \"The registry config is: \" + registryConfig);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static void appendRuntimeParameters(Map<String, String> map) {\r\n+        map.put(DUBBO_VERSION_KEY, Version.getProtocolVersion());\r\n+        map.put(RELEASE_KEY, Version.getVersion());\r\n+        map.put(TIMESTAMP_KEY, String.valueOf(System.currentTimeMillis()));\r\n+        if (ConfigUtils.getPid() > 0) {\r\n+            map.put(PID_KEY, String.valueOf(ConfigUtils.getPid()));\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Check whether the remote service interface and the methods meet with Dubbo's requirements.it mainly check, if the\r\n+     * methods configured in the configuration file are included in the interface of remote service\r\n+     *\r\n+     * @param interfaceClass the interface of remote service\r\n+     * @param methods        the methods configured\r\n+     */\r\n+    public void checkInterfaceAndMethods(Class<?> interfaceClass, List<MethodConfig> methods) {\r\n+        // interface cannot be null\r\n+        Assert.notNull(interfaceClass, new IllegalStateException(\"interface not allow null!\"));\r\n+\r\n+        // to verify interfaceClass is an interface\r\n+        if (!interfaceClass.isInterface()) {\r\n+            throw new IllegalStateException(\"The interface class \" + interfaceClass + \" is not a interface!\");\r\n+        }\r\n+        // check if methods exist in the remote service interface\r\n+        if (CollectionUtils.isNotEmpty(methods)) {\r\n+            for (MethodConfig methodBean : methods) {\r\n+                methodBean.setService(interfaceClass.getName());\r\n+                methodBean.setServiceId(this.getId());\r\n+                methodBean.refresh();\r\n+                String methodName = methodBean.getName();\r\n+                if (StringUtils.isEmpty(methodName)) {\r\n+                    throw new IllegalStateException(\"<dubbo:method> name attribute is required! Please check: \" +\r\n+                            \"<dubbo:service interface=\\\"\" + interfaceClass.getName() + \"\\\" ... >\" +\r\n+                            \"<dubbo:method name=\\\"\\\" ... /></<dubbo:reference>\");\r\n+                }\r\n+\r\n+                boolean hasMethod = Arrays.stream(interfaceClass.getMethods()).anyMatch(method -> method.getName().equals(methodName));\r\n+                if (!hasMethod) {\r\n+                    throw new IllegalStateException(\"The interface \" + interfaceClass.getName()\r\n+                            + \" not found method \" + methodName);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+\r\n+\r\n+    /**\r\n+     * Legitimacy check of stub, note that: the local will deprecated, and replace with <code>stub</code>\r\n+     *\r\n+     * @param interfaceClass for provider side, it is the {@link Class} of the service that will be exported; for consumer\r\n+     *                       side, it is the {@link Class} of the remote service interface\r\n+     */\r\n+    public void checkStubAndLocal(Class<?> interfaceClass) {\r\n+        verifyStubAndLocal(local, \"Local\", interfaceClass);\r\n+        verifyStubAndLocal(stub, \"Stub\", interfaceClass);\r\n+    }\r\n+    \r\n+    public void verifyStubAndLocal(String className, String label, Class<?> interfaceClass){\r\n+    \tif (ConfigUtils.isNotEmpty(className)) {\r\n+            Class<?> localClass = ConfigUtils.isDefault(className) ?\r\n+                    ReflectUtils.forName(interfaceClass.getName() + label) : ReflectUtils.forName(className);\r\n+                        verify(interfaceClass, localClass);\r\n+            }\r\n+    }\r\n+\r\n+    private void verify(Class<?> interfaceClass, Class<?> localClass) {\r\n+        if (!interfaceClass.isAssignableFrom(localClass)) {\r\n+            throw new IllegalStateException(\"The local implementation class \" + localClass.getName() +\r\n+                    \" not implement interface \" + interfaceClass.getName());\r\n+        }\r\n+\r\n+        try {\r\n+            //Check if the localClass a constructor with parameter who's type is interfaceClass\r\n+            ReflectUtils.findConstructor(localClass, interfaceClass);\r\n+        } catch (NoSuchMethodException e) {\r\n+            throw new IllegalStateException(\"No such constructor \\\"public \" + localClass.getSimpleName() +\r\n+                    \"(\" + interfaceClass.getName() + \")\\\" in local implementation class \" + localClass.getName());\r\n+        }\r\n+    }\r\n+\r\n+    private void convertRegistryIdsToRegistries() {\r\n+        computeValidRegistryIds();\r\n+        if (StringUtils.isEmpty(registryIds)) {\r\n+            if (CollectionUtils.isEmpty(registries)) {\r\n+                List<RegistryConfig> registryConfigs = ApplicationModel.getConfigManager().getDefaultRegistries();\r\n+                if (registryConfigs.isEmpty()) {\r\n+                    registryConfigs = new ArrayList<>();\r\n+                    RegistryConfig registryConfig = new RegistryConfig();\r\n+                    registryConfig.refresh();\r\n+                    registryConfigs.add(registryConfig);\r\n+                } else {\r\n+                    registryConfigs = new ArrayList<>(registryConfigs);\r\n+                }\r\n+                setRegistries(registryConfigs);\r\n+            }\r\n+        } else {\r\n+            String[] ids = COMMA_SPLIT_PATTERN.split(registryIds);\r\n+            List<RegistryConfig> tmpRegistries = new ArrayList<>();\r\n+            Arrays.stream(ids).forEach(id -> {\r\n+                if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {\r\n+                    Optional<RegistryConfig> globalRegistry = ApplicationModel.getConfigManager().getRegistry(id);\r\n+                    if (globalRegistry.isPresent()) {\r\n+                        tmpRegistries.add(globalRegistry.get());\r\n+                    } else {\r\n+                        RegistryConfig registryConfig = new RegistryConfig();\r\n+                        registryConfig.setId(id);\r\n+                        registryConfig.refresh();\r\n+                        tmpRegistries.add(registryConfig);\r\n+                    }\r\n+                }\r\n+            });\r\n+\r\n+            if (tmpRegistries.size() > ids.length) {\r\n+                throw new IllegalStateException(\"Too much registries found, the registries assigned to this service \" +\r\n+                        \"are :\" + registryIds + \", but got \" + tmpRegistries.size() + \" registries!\");\r\n+            }\r\n+\r\n+            setRegistries(tmpRegistries);\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    protected boolean notHasSelfRegistryProperty() {\r\n+        return CollectionUtils.isEmpty(registries) && StringUtils.isEmpty(registryIds);\r\n+    }\r\n+\r\n+    public void completeCompoundConfigs(AbstractInterfaceConfig interfaceConfig) {\r\n+        if (interfaceConfig != null) {\r\n+            if (application == null) {\r\n+                setApplication(interfaceConfig.getApplication());\r\n+            }\r\n+            if (module == null) {\r\n+                setModule(interfaceConfig.getModule());\r\n+            }\r\n+            if (notHasSelfRegistryProperty()) {\r\n+                setRegistries(interfaceConfig.getRegistries());\r\n+                setRegistryIds(interfaceConfig.getRegistryIds());\r\n+            }\r\n+            if (monitor == null) {\r\n+                setMonitor(interfaceConfig.getMonitor());\r\n+            }\r\n+        }\r\n+        if (module != null) {\r\n+            if (notHasSelfRegistryProperty()) {\r\n+                setRegistries(module.getRegistries());\r\n+            }\r\n+            if (monitor == null) {\r\n+                setMonitor(module.getMonitor());\r\n+            }\r\n+        }\r\n+        if (application != null) {\r\n+            if (notHasSelfRegistryProperty()) {\r\n+                setRegistries(application.getRegistries());\r\n+                setRegistryIds(application.getRegistryIds());\r\n+            }\r\n+            if (monitor == null) {\r\n+                setMonitor(application.getMonitor());\r\n+            }\r\n+        }\r\n+    }\r\n+    \r\n+    protected void computeValidRegistryIds() {\r\n+        if (application != null && notHasSelfRegistryProperty()) {\r\n+            setRegistries(application.getRegistries());\r\n+            setRegistryIds(application.getRegistryIds());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * @return local\r\n+     * @deprecated Replace to <code>getStub()</code>\r\n+     */\r\n+    @Deprecated\r\n+    public String getLocal() {\r\n+        return local;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param local\r\n+     * @deprecated Replace to <code>setStub(Boolean)</code>\r\n+     */\r\n+    @Deprecated\r\n+    public void setLocal(Boolean local) {\r\n+        if (local == null) {\r\n+            setLocal((String) null);\r\n+        } else {\r\n+            setLocal(local.toString());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * @param local\r\n+     * @deprecated Replace to <code>setStub(String)</code>\r\n+     */\r\n+    @Deprecated\r\n+    public void setLocal(String local) {\r\n+        this.local = local;\r\n+    }\r\n+\r\n+    public String getStub() {\r\n+        return stub;\r\n+    }\r\n+\r\n+    public void setStub(Boolean stub) {\r\n+        if (stub == null) {\r\n+            setStub((String) null);\r\n+        } else {\r\n+            setStub(stub.toString());\r\n+        }\r\n+    }\r\n+\r\n+    public void setStub(String stub) {\r\n+        this.stub = stub;\r\n+    }\r\n+\r\n+    public String getCluster() {\r\n+        return cluster;\r\n+    }\r\n+\r\n+    public void setCluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+    }\r\n+\r\n+    public String getProxy() {\r\n+        return proxy;\r\n+    }\r\n+\r\n+    public void setProxy(String proxy) {\r\n+\r\n+        this.proxy = proxy;\r\n+    }\r\n+\r\n+    public Integer getConnections() {\r\n+        return connections;\r\n+    }\r\n+\r\n+    public void setConnections(Integer connections) {\r\n+        this.connections = connections;\r\n+    }\r\n+\r\n+    @Parameter(key = REFERENCE_FILTER_KEY, append = true)\r\n+    public String getFilter() {\r\n+        return filter;\r\n+    }\r\n+\r\n+    public void setFilter(String filter) {\r\n+        this.filter = filter;\r\n+    }\r\n+\r\n+    @Parameter(key = INVOKER_LISTENER_KEY, append = true)\r\n+    public String getListener() {\r\n+        return listener;\r\n+    }\r\n+\r\n+    public void setListener(String listener) {\r\n+        this.listener = listener;\r\n+    }\r\n+\r\n+    public String getLayer() {\r\n+        return layer;\r\n+    }\r\n+\r\n+    public void setLayer(String layer) {\r\n+        this.layer = layer;\r\n+    }\r\n+\r\n+    /**\r\n+     * Always use the global ApplicationConfig\r\n+     */\r\n+    public ApplicationConfig getApplication() {\r\n+        ApplicationConfig globalApplication = ApplicationModel.getConfigManager().getApplicationOrElseThrow();\r\n+        if (globalApplication == null) {\r\n+            return application;\r\n+        }\r\n+        if (application != null && !StringUtils.isEquals(application.getName(), globalApplication.getName())) {\r\n+            return application;\r\n+        }\r\n+        return globalApplication;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setApplication(ApplicationConfig application) {\r\n+        this.application = application;\r\n+        if (application != null) {\r\n+            ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+            configManager.getApplication().orElseGet(() -> {\r\n+                configManager.setApplication(application);\r\n+                return application;\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    public ModuleConfig getModule() {\r\n+        if (module != null) {\r\n+            return module;\r\n+        }\r\n+        return ApplicationModel.getConfigManager().getModule().orElse(null);\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setModule(ModuleConfig module) {\r\n+        this.module = module;\r\n+        if (module != null) {\r\n+            ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+            configManager.getModule().orElseGet(() -> {\r\n+                configManager.setModule(module);\r\n+                return module;\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    public RegistryConfig getRegistry() {\r\n+        return CollectionUtils.isEmpty(registries) ? null : registries.get(0);\r\n+    }\r\n+\r\n+    public void setRegistry(RegistryConfig registry) {\r\n+        List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);\r\n+        registries.add(registry);\r\n+        setRegistries(registries);\r\n+    }\r\n+\r\n+    public List<RegistryConfig> getRegistries() {\r\n+        return registries;\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\"})\r\n+    public void setRegistries(List<? extends RegistryConfig> registries) {\r\n+        this.registries = (List<RegistryConfig>) registries;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getRegistryIds() {\r\n+        return registryIds;\r\n+    }\r\n+\r\n+    public void setRegistryIds(String registryIds) {\r\n+        this.registryIds = registryIds;\r\n+    }\r\n+\r\n+\r\n+    public List<MethodConfig> getMethods() {\r\n+        return methods;\r\n+    }\r\n+\r\n+    // ======== Deprecated ========\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public void setMethods(List<? extends MethodConfig> methods) {\r\n+        this.methods = (List<MethodConfig>) methods;\r\n+    }\r\n+\r\n+\r\n+    public MonitorConfig getMonitor() {\r\n+        if (monitor != null) {\r\n+            return monitor;\r\n+        }\r\n+        // FIXME: instead of return null, we should set default monitor when getMonitor() return null in ConfigManager\r\n+        return ApplicationModel.getConfigManager().getMonitor().orElse(null);\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setMonitor(String monitor) {\r\n+        setMonitor(new MonitorConfig(monitor));\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setMonitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        if (monitor != null) {\r\n+            ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+            configManager.getMonitor().orElseGet(() -> {\r\n+                configManager.setMonitor(monitor);\r\n+                return monitor;\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    public String getOwner() {\r\n+        return owner;\r\n+    }\r\n+\r\n+    public void setOwner(String owner) {\r\n+        this.owner = owner;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public ConfigCenterConfig getConfigCenter() {\r\n+        if (configCenter != null) {\r\n+            return configCenter;\r\n+        }\r\n+        Collection<ConfigCenterConfig> configCenterConfigs = ApplicationModel.getConfigManager().getConfigCenters();\r\n+        if (CollectionUtils.isNotEmpty(configCenterConfigs)) {\r\n+            return configCenterConfigs.iterator().next();\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setConfigCenter(ConfigCenterConfig configCenter) {\r\n+        this.configCenter = configCenter;\r\n+        if (configCenter != null) {\r\n+            ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+            Collection<ConfigCenterConfig> configs = configManager.getConfigCenters();\r\n+            if (CollectionUtils.isEmpty(configs)\r\n+                    || configs.stream().noneMatch(existed -> existed.equals(configCenter))) {\r\n+                configManager.addConfigCenter(configCenter);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public Integer getCallbacks() {\r\n+        return callbacks;\r\n+    }\r\n+\r\n+    public void setCallbacks(Integer callbacks) {\r\n+        this.callbacks = callbacks;\r\n+    }\r\n+\r\n+    public String getOnconnect() {\r\n+        return onconnect;\r\n+    }\r\n+\r\n+    public void setOnconnect(String onconnect) {\r\n+        this.onconnect = onconnect;\r\n+    }\r\n+\r\n+    public String getOndisconnect() {\r\n+        return ondisconnect;\r\n+    }\r\n+\r\n+    public void setOndisconnect(String ondisconnect) {\r\n+        this.ondisconnect = ondisconnect;\r\n+    }\r\n+\r\n+    public String getScope() {\r\n+        return scope;\r\n+    }\r\n+\r\n+    public void setScope(String scope) {\r\n+        this.scope = scope;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public MetadataReportConfig getMetadataReportConfig() {\r\n+        if (metadataReportConfig != null) {\r\n+            return metadataReportConfig;\r\n+        }\r\n+        Collection<MetadataReportConfig> metadataReportConfigs = ApplicationModel.getConfigManager().getMetadataConfigs();\r\n+        if (CollectionUtils.isNotEmpty(metadataReportConfigs)) {\r\n+            return metadataReportConfigs.iterator().next();\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setMetadataReportConfig(MetadataReportConfig metadataReportConfig) {\r\n+        this.metadataReportConfig = metadataReportConfig;\r\n+        if (metadataReportConfig != null) {\r\n+            ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+            Collection<MetadataReportConfig> configs = configManager.getMetadataConfigs();\r\n+            if (CollectionUtils.isEmpty(configs)\r\n+                    || configs.stream().noneMatch(existed -> existed.equals(metadataReportConfig))) {\r\n+                configManager.addMetadataReport(metadataReportConfig);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public MetricsConfig getMetrics() {\r\n+        if (metrics != null) {\r\n+            return metrics;\r\n+        }\r\n+        return ApplicationModel.getConfigManager().getMetrics().orElse(null);\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setMetrics(MetricsConfig metrics) {\r\n+        this.metrics = metrics;\r\n+        if (metrics != null) {\r\n+            ConfigManager configManager = ApplicationModel.getConfigManager();\r\n+            configManager.getMetrics().orElseGet(() -> {\r\n+                configManager.setMetrics(metrics);\r\n+                return metrics;\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    @Parameter(key = TAG_KEY, useKeyAsProperty = false)\r\n+    public String getTag() {\r\n+        return tag;\r\n+    }\r\n+\r\n+    public void setTag(String tag) {\r\n+        this.tag = tag;\r\n+    }\r\n+\r\n+    public Boolean getAuth() {\r\n+        return auth;\r\n+    }\r\n+\r\n+    public void setAuth(Boolean auth) {\r\n+        this.auth = auth;\r\n+    }\r\n+\r\n+    public SslConfig getSslConfig() {\r\n+        return ApplicationModel.getConfigManager().getSsl().orElse(null);\r\n+    }\r\n+    \r\n+    public void initServiceMetadata(AbstractInterfaceConfig interfaceConfig) {\r\n+        serviceMetadata.setVersion(getVersion(interfaceConfig));\r\n+        serviceMetadata.setGroup(getGroup(interfaceConfig));\r\n+        serviceMetadata.setDefaultGroup(getGroup(interfaceConfig));\r\n+        serviceMetadata.setServiceInterfaceName(getInterface());\r\n+    }\r\n+    \r\n+    public String getGroup(AbstractInterfaceConfig interfaceConfig) {\r\n+        return StringUtils.isEmpty(this.group) ? (interfaceConfig != null ? interfaceConfig.getGroup() : this.group) : this.group;\r\n+    }\r\n+\r\n+    public String getVersion(AbstractInterfaceConfig interfaceConfig) {\r\n+        return StringUtils.isEmpty(this.version) ? (interfaceConfig != null ? interfaceConfig.getVersion() : this.version) : this.version;\r\n+    }\r\n+    \r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+    \r\n+    public String getInterface() {\r\n+        return interfaceName;\r\n+    }\r\n+    \r\n+    public void setInterface(String interfaceName) {\r\n+        this.interfaceName = interfaceName;\r\n+//         if (StringUtils.isEmpty(id)) {\r\n+//             id = interfaceName;\r\n+//         }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/AbstractMethodConfig.java", "source2": "org/apache/dubbo/config/AbstractMethodConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,208 +1,208 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.Map;\n-\n-/**\n- * AbstractMethodConfig\n- *\n- * @export\n- */\n-public abstract class AbstractMethodConfig extends AbstractConfig {\n-\n-    private static final long serialVersionUID = 1L;\n-\n-    /**\n-     * The timeout for remote invocation in milliseconds\n-     */\n-    protected Integer timeout;\n-\n-    /**\n-     * The retry times\n-     */\n-    protected Integer retries;\n-\n-    /**\n-     * max concurrent invocations\n-     */\n-    protected Integer actives;\n-\n-    /**\n-     * The load balance\n-     */\n-    protected String loadbalance;\n-\n-    /**\n-     * Whether to async\n-     * note that: it is an unreliable asynchronism that ignores return values and does not block threads.\n-     */\n-    protected Boolean async;\n-\n-    /**\n-     * Whether to ack async-sent\n-     */\n-    protected Boolean sent;\n-\n-    /**\n-     * The name of mock class which gets called when a service fails to execute\n-     * <p>\n-     * note that: the mock doesn't support on the provider side\uff0cand the mock is executed when a non-business exception\n-     * occurs after a remote service call\n-     */\n-    protected String mock;\n-\n-    /**\n-     * Merger\n-     */\n-    protected String merger;\n-\n-    /**\n-     * Cache the return result with the call parameter as key, the following options are available: lru, threadlocal,\n-     * jcache, etc.\n-     */\n-    protected String cache;\n-\n-    /**\n-     * Whether JSR303 standard annotation validation is enabled or not, if enabled, annotations on method parameters will\n-     * be validated\n-     */\n-    protected String validation;\n-\n-    /**\n-     * The customized parameters\n-     */\n-    protected Map<String, String> parameters;\n-\n-    /**\n-     * Forks for forking cluster\n-     */\n-    protected Integer forks;\n-\n-    public Integer getForks() {\n-        return forks;\n-    }\n-\n-    public void setForks(Integer forks) {\n-        this.forks = forks;\n-    }\n-\n-    public Integer getTimeout() {\n-        return timeout;\n-    }\n-\n-    public void setTimeout(Integer timeout) {\n-        this.timeout = timeout;\n-    }\n-\n-    public Integer getRetries() {\n-        return retries;\n-    }\n-\n-    public void setRetries(Integer retries) {\n-        this.retries = retries;\n-    }\n-\n-    public String getLoadbalance() {\n-        return loadbalance;\n-    }\n-\n-    public void setLoadbalance(String loadbalance) {\n-        this.loadbalance = loadbalance;\n-    }\n-\n-    public Boolean isAsync() {\n-        return async;\n-    }\n-\n-    public void setAsync(Boolean async) {\n-        this.async = async;\n-    }\n-\n-    public Integer getActives() {\n-        return actives;\n-    }\n-\n-    public void setActives(Integer actives) {\n-        this.actives = actives;\n-    }\n-\n-    public Boolean getSent() {\n-        return sent;\n-    }\n-\n-    public void setSent(Boolean sent) {\n-        this.sent = sent;\n-    }\n-\n-    @Parameter(escaped = true)\n-    public String getMock() {\n-        return mock;\n-    }\n-\n-    public void setMock(String mock) {\n-        this.mock = mock;\n-    }\n-\n-    /**\n-     * Set the property \"mock\"\n-     *\n-     * @param mock the value of mock\n-     * @since 2.7.6\n-     */\n-    public void setMock(Object mock) {\n-        if (mock == null) {\n-            return;\n-        }\n-        this.setMock(String.valueOf(mock));\n-    }\n-\n-    public String getMerger() {\n-        return merger;\n-    }\n-\n-    public void setMerger(String merger) {\n-        this.merger = merger;\n-    }\n-\n-    public String getCache() {\n-        return cache;\n-    }\n-\n-    public void setCache(String cache) {\n-        this.cache = cache;\n-    }\n-\n-    public String getValidation() {\n-        return validation;\n-    }\n-\n-    public void setValidation(String validation) {\n-        this.validation = validation;\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * AbstractMethodConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public abstract class AbstractMethodConfig extends AbstractConfig {\r\n+\r\n+    private static final long serialVersionUID = 1L;\r\n+\r\n+    /**\r\n+     * The timeout for remote invocation in milliseconds\r\n+     */\r\n+    protected Integer timeout;\r\n+\r\n+    /**\r\n+     * The retry times\r\n+     */\r\n+    protected Integer retries;\r\n+\r\n+    /**\r\n+     * max concurrent invocations\r\n+     */\r\n+    protected Integer actives;\r\n+\r\n+    /**\r\n+     * The load balance\r\n+     */\r\n+    protected String loadbalance;\r\n+\r\n+    /**\r\n+     * Whether to async\r\n+     * note that: it is an unreliable asynchronism that ignores return values and does not block threads.\r\n+     */\r\n+    protected Boolean async;\r\n+\r\n+    /**\r\n+     * Whether to ack async-sent\r\n+     */\r\n+    protected Boolean sent;\r\n+\r\n+    /**\r\n+     * The name of mock class which gets called when a service fails to execute\r\n+     * <p>\r\n+     * note that: the mock doesn't support on the provider side\uff0cand the mock is executed when a non-business exception\r\n+     * occurs after a remote service call\r\n+     */\r\n+    protected String mock;\r\n+\r\n+    /**\r\n+     * Merger\r\n+     */\r\n+    protected String merger;\r\n+\r\n+    /**\r\n+     * Cache the return result with the call parameter as key, the following options are available: lru, threadlocal,\r\n+     * jcache, etc.\r\n+     */\r\n+    protected String cache;\r\n+\r\n+    /**\r\n+     * Whether JSR303 standard annotation validation is enabled or not, if enabled, annotations on method parameters will\r\n+     * be validated\r\n+     */\r\n+    protected String validation;\r\n+\r\n+    /**\r\n+     * The customized parameters\r\n+     */\r\n+    protected Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * Forks for forking cluster\r\n+     */\r\n+    protected Integer forks;\r\n+\r\n+    public Integer getForks() {\r\n+        return forks;\r\n+    }\r\n+\r\n+    public void setForks(Integer forks) {\r\n+        this.forks = forks;\r\n+    }\r\n+\r\n+    public Integer getTimeout() {\r\n+        return timeout;\r\n+    }\r\n+\r\n+    public void setTimeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+    }\r\n+\r\n+    public Integer getRetries() {\r\n+        return retries;\r\n+    }\r\n+\r\n+    public void setRetries(Integer retries) {\r\n+        this.retries = retries;\r\n+    }\r\n+\r\n+    public String getLoadbalance() {\r\n+        return loadbalance;\r\n+    }\r\n+\r\n+    public void setLoadbalance(String loadbalance) {\r\n+        this.loadbalance = loadbalance;\r\n+    }\r\n+\r\n+    public Boolean isAsync() {\r\n+        return async;\r\n+    }\r\n+\r\n+    public void setAsync(Boolean async) {\r\n+        this.async = async;\r\n+    }\r\n+\r\n+    public Integer getActives() {\r\n+        return actives;\r\n+    }\r\n+\r\n+    public void setActives(Integer actives) {\r\n+        this.actives = actives;\r\n+    }\r\n+\r\n+    public Boolean getSent() {\r\n+        return sent;\r\n+    }\r\n+\r\n+    public void setSent(Boolean sent) {\r\n+        this.sent = sent;\r\n+    }\r\n+\r\n+    @Parameter(escaped = true)\r\n+    public String getMock() {\r\n+        return mock;\r\n+    }\r\n+\r\n+    public void setMock(String mock) {\r\n+        this.mock = mock;\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the property \"mock\"\r\n+     *\r\n+     * @param mock the value of mock\r\n+     * @since 2.7.6\r\n+     */\r\n+    public void setMock(Object mock) {\r\n+        if (mock == null) {\r\n+            return;\r\n+        }\r\n+        this.setMock(String.valueOf(mock));\r\n+    }\r\n+\r\n+    public String getMerger() {\r\n+        return merger;\r\n+    }\r\n+\r\n+    public void setMerger(String merger) {\r\n+        this.merger = merger;\r\n+    }\r\n+\r\n+    public String getCache() {\r\n+        return cache;\r\n+    }\r\n+\r\n+    public void setCache(String cache) {\r\n+        this.cache = cache;\r\n+    }\r\n+\r\n+    public String getValidation() {\r\n+        return validation;\r\n+    }\r\n+\r\n+    public void setValidation(String validation) {\r\n+        this.validation = validation;\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/AbstractReferenceConfig.java", "source2": "org/apache/dubbo/config/AbstractReferenceConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,226 +1,226 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.INVOKER_LISTENER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.STUB_EVENT_KEY;\n-\n-/**\n- * AbstractConsumerConfig\n- *\n- * @export\n- * @see ReferenceConfigBase\n- */\n-public abstract class AbstractReferenceConfig extends AbstractInterfaceConfig {\n-\n-    private static final long serialVersionUID = -2786526984373031126L;\n-\n-    // ======== Reference config default values, will take effect if reference's attribute is not set  ========\n-\n-    /**\n-     * Check if service provider exists, if not exists, it will be fast fail\n-     */\n-    protected Boolean check;\n-\n-    /**\n-     * Whether to eagle-init\n-     */\n-    protected Boolean init;\n-\n-    /**\n-     * Whether to use generic interface\n-     */\n-    protected String generic;\n-\n-    /**\n-     * Whether to find reference's instance from the current JVM\n-     */\n-    protected Boolean injvm;\n-\n-    /**\n-     * Lazy create connection\n-     */\n-    protected Boolean lazy;\n-\n-    protected String reconnect;\n-\n-    protected Boolean sticky = false;\n-\n-    /**\n-     * Whether to support event in stub.\n-     */\n-    //TODO solve merge problem\n-    protected Boolean stubevent;//= Constants.DEFAULT_STUB_EVENT;\n-\n-\n-\n-    /**\n-     * declares which app or service this interface belongs to\n-     */\n-    protected String providedBy;\n-\n-    protected String router;\n-\n-    public Boolean isCheck() {\n-        return check;\n-    }\n-\n-    public void setCheck(Boolean check) {\n-        this.check = check;\n-    }\n-\n-    public Boolean isInit() {\n-        return init;\n-    }\n-\n-    public void setInit(Boolean init) {\n-        this.init = init;\n-    }\n-\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public Boolean isGeneric() {\n-        return this.generic != null ? ProtocolUtils.isGeneric(generic) : null;\n-    }\n-\n-    @Deprecated\n-    public void setGeneric(Boolean generic) {\n-        if (generic != null) {\n-            this.generic = generic.toString();\n-        }\n-    }\n-\n-    public String getGeneric() {\n-        return generic;\n-    }\n-\n-    public void setGeneric(String generic) {\n-        if (StringUtils.isEmpty(generic)) {\n-            return;\n-        }\n-        if (ProtocolUtils.isValidGenericValue(generic)) {\n-            this.generic = generic;\n-        } else {\n-            throw new IllegalArgumentException(\"Unsupported generic type \" + generic);\n-        }\n-    }\n-\n-    /**\n-     * @return\n-     * @deprecated instead, use the parameter <b>scope</> to judge if it's in jvm, scope=local\n-     */\n-    @Deprecated\n-    public Boolean isInjvm() {\n-        return injvm;\n-    }\n-\n-    /**\n-     * @param injvm\n-     * @deprecated instead, use the parameter <b>scope</b> to judge if it's in jvm, scope=local\n-     */\n-    @Deprecated\n-    public void setInjvm(Boolean injvm) {\n-        this.injvm = injvm;\n-    }\n-\n-    @Override\n-    @Parameter(key = REFERENCE_FILTER_KEY, append = true)\n-    public String getFilter() {\n-        return super.getFilter();\n-    }\n-\n-    @Override\n-    @Parameter(key = INVOKER_LISTENER_KEY, append = true)\n-    public String getListener() {\n-        return super.getListener();\n-    }\n-\n-    @Override\n-    public void setListener(String listener) {\n-        super.setListener(listener);\n-    }\n-\n-    public Boolean getLazy() {\n-        return lazy;\n-    }\n-\n-    public void setLazy(Boolean lazy) {\n-        this.lazy = lazy;\n-    }\n-\n-    @Override\n-    public void setOnconnect(String onconnect) {\n-        if (onconnect != null && onconnect.length() > 0) {\n-            this.stubevent = true;\n-        }\n-        super.setOnconnect(onconnect);\n-    }\n-\n-    @Override\n-    public void setOndisconnect(String ondisconnect) {\n-        if (ondisconnect != null && ondisconnect.length() > 0) {\n-            this.stubevent = true;\n-        }\n-        super.setOndisconnect(ondisconnect);\n-    }\n-\n-    @Parameter(key = STUB_EVENT_KEY)\n-    public Boolean getStubevent() {\n-        return stubevent;\n-    }\n-\n-    public String getReconnect() {\n-        return reconnect;\n-    }\n-\n-    public void setReconnect(String reconnect) {\n-        this.reconnect = reconnect;\n-    }\n-\n-    public Boolean getSticky() {\n-        return sticky;\n-    }\n-\n-    public void setSticky(Boolean sticky) {\n-        this.sticky = sticky;\n-    }\n-\n-\n-\n-    @Parameter(key = \"provided-by\")\n-    public String getProvidedBy() {\n-        return providedBy;\n-    }\n-\n-    public void setProvidedBy(String providedBy) {\n-        this.providedBy = providedBy;\n-    }\n-\n-    @Parameter(key = \"router\", append = true)\n-    public String getRouter() {\n-        return router;\n-    }\n-\n-    public void setRouter(String router) {\n-        this.router = router;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INVOKER_LISTENER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.STUB_EVENT_KEY;\r\n+\r\n+/**\r\n+ * AbstractConsumerConfig\r\n+ *\r\n+ * @export\r\n+ * @see ReferenceConfigBase\r\n+ */\r\n+public abstract class AbstractReferenceConfig extends AbstractInterfaceConfig {\r\n+\r\n+    private static final long serialVersionUID = -2786526984373031126L;\r\n+\r\n+    // ======== Reference config default values, will take effect if reference's attribute is not set  ========\r\n+\r\n+    /**\r\n+     * Check if service provider exists, if not exists, it will be fast fail\r\n+     */\r\n+    protected Boolean check;\r\n+\r\n+    /**\r\n+     * Whether to eagle-init\r\n+     */\r\n+    protected Boolean init;\r\n+\r\n+    /**\r\n+     * Whether to use generic interface\r\n+     */\r\n+    protected String generic;\r\n+\r\n+    /**\r\n+     * Whether to find reference's instance from the current JVM\r\n+     */\r\n+    protected Boolean injvm;\r\n+\r\n+    /**\r\n+     * Lazy create connection\r\n+     */\r\n+    protected Boolean lazy;\r\n+\r\n+    protected String reconnect;\r\n+\r\n+    protected Boolean sticky = false;\r\n+\r\n+    /**\r\n+     * Whether to support event in stub.\r\n+     */\r\n+    //TODO solve merge problem\r\n+    protected Boolean stubevent;//= Constants.DEFAULT_STUB_EVENT;\r\n+\r\n+\r\n+\r\n+    /**\r\n+     * declares which app or service this interface belongs to\r\n+     */\r\n+    protected String providedBy;\r\n+\r\n+    protected String router;\r\n+\r\n+    public Boolean isCheck() {\r\n+        return check;\r\n+    }\r\n+\r\n+    public void setCheck(Boolean check) {\r\n+        this.check = check;\r\n+    }\r\n+\r\n+    public Boolean isInit() {\r\n+        return init;\r\n+    }\r\n+\r\n+    public void setInit(Boolean init) {\r\n+        this.init = init;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public Boolean isGeneric() {\r\n+        return this.generic != null ? ProtocolUtils.isGeneric(generic) : null;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setGeneric(Boolean generic) {\r\n+        if (generic != null) {\r\n+            this.generic = generic.toString();\r\n+        }\r\n+    }\r\n+\r\n+    public String getGeneric() {\r\n+        return generic;\r\n+    }\r\n+\r\n+    public void setGeneric(String generic) {\r\n+        if (StringUtils.isEmpty(generic)) {\r\n+            return;\r\n+        }\r\n+        if (ProtocolUtils.isValidGenericValue(generic)) {\r\n+            this.generic = generic;\r\n+        } else {\r\n+            throw new IllegalArgumentException(\"Unsupported generic type \" + generic);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * @return\r\n+     * @deprecated instead, use the parameter <b>scope</> to judge if it's in jvm, scope=local\r\n+     */\r\n+    @Deprecated\r\n+    public Boolean isInjvm() {\r\n+        return injvm;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param injvm\r\n+     * @deprecated instead, use the parameter <b>scope</b> to judge if it's in jvm, scope=local\r\n+     */\r\n+    @Deprecated\r\n+    public void setInjvm(Boolean injvm) {\r\n+        this.injvm = injvm;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(key = REFERENCE_FILTER_KEY, append = true)\r\n+    public String getFilter() {\r\n+        return super.getFilter();\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(key = INVOKER_LISTENER_KEY, append = true)\r\n+    public String getListener() {\r\n+        return super.getListener();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void setListener(String listener) {\r\n+        super.setListener(listener);\r\n+    }\r\n+\r\n+    public Boolean getLazy() {\r\n+        return lazy;\r\n+    }\r\n+\r\n+    public void setLazy(Boolean lazy) {\r\n+        this.lazy = lazy;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void setOnconnect(String onconnect) {\r\n+        if (onconnect != null && onconnect.length() > 0) {\r\n+            this.stubevent = true;\r\n+        }\r\n+        super.setOnconnect(onconnect);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void setOndisconnect(String ondisconnect) {\r\n+        if (ondisconnect != null && ondisconnect.length() > 0) {\r\n+            this.stubevent = true;\r\n+        }\r\n+        super.setOndisconnect(ondisconnect);\r\n+    }\r\n+\r\n+    @Parameter(key = STUB_EVENT_KEY)\r\n+    public Boolean getStubevent() {\r\n+        return stubevent;\r\n+    }\r\n+\r\n+    public String getReconnect() {\r\n+        return reconnect;\r\n+    }\r\n+\r\n+    public void setReconnect(String reconnect) {\r\n+        this.reconnect = reconnect;\r\n+    }\r\n+\r\n+    public Boolean getSticky() {\r\n+        return sticky;\r\n+    }\r\n+\r\n+    public void setSticky(Boolean sticky) {\r\n+        this.sticky = sticky;\r\n+    }\r\n+\r\n+\r\n+\r\n+    @Parameter(key = \"provided-by\")\r\n+    public String getProvidedBy() {\r\n+        return providedBy;\r\n+    }\r\n+\r\n+    public void setProvidedBy(String providedBy) {\r\n+        this.providedBy = providedBy;\r\n+    }\r\n+\r\n+    @Parameter(key = \"router\", append = true)\r\n+    public String getRouter() {\r\n+        return router;\r\n+    }\r\n+\r\n+    public void setRouter(String router) {\r\n+        this.router = router;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/AbstractServiceConfig.java", "source2": "org/apache/dubbo/config/AbstractServiceConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,291 +1,291 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.List;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.EXPORTER_LISTENER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SERVICE_FILTER_KEY;\n-\n-/**\n- * AbstractServiceConfig\n- *\n- * @export\n- */\n-public abstract class AbstractServiceConfig extends AbstractInterfaceConfig {\n-\n-    private static final long serialVersionUID = 1L;\n-\n-    /**\n-     * The service version\n-     */\n-    protected String version;\n-\n-    /**\n-     * The service group\n-     */\n-    protected String group;\n-\n-    /**\n-     * whether the service is deprecated\n-     */\n-    protected Boolean deprecated = false;\n-\n-    /**\n-     * The time delay register service (milliseconds)\n-     */\n-    protected Integer delay;\n-\n-    /**\n-     * Whether to export the service\n-     */\n-    protected Boolean export;\n-\n-    /**\n-     * The service weight\n-     */\n-    protected Integer weight;\n-\n-    /**\n-     * Document center\n-     */\n-    protected String document;\n-\n-    /**\n-     * Whether to register as a dynamic service or not on register center, the value is true, the status will be enabled\n-     * after the service registered,and it needs to be disabled manually; if you want to disable the service, you also need\n-     * manual processing\n-     */\n-    protected Boolean dynamic = true;\n-\n-    /**\n-     * Whether to use token\n-     */\n-    protected String token;\n-\n-    /**\n-     * Whether to export access logs to logs\n-     */\n-    protected String accesslog;\n-\n-    /**\n-     * The protocol list the service will export with\n-     * Also see {@link #protocolIds}, only one of them will work.\n-     */\n-    protected List<ProtocolConfig> protocols;\n-\n-    /**\n-     * The id list of protocols the service will export with\n-     * Also see {@link #protocols}, only one of them will work.\n-     */\n-    protected String protocolIds;\n-\n-    // max allowed execute times\n-    private Integer executes;\n-\n-    /**\n-     * Whether to register\n-     */\n-    private Boolean register;\n-\n-    /**\n-     * Warm up period\n-     */\n-    private Integer warmup;\n-\n-    /**\n-     * The serialization type\n-     */\n-    private String serialization;\n-\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-    public Integer getDelay() {\n-        return delay;\n-    }\n-\n-    public void setDelay(Integer delay) {\n-        this.delay = delay;\n-    }\n-\n-    public Boolean getExport() {\n-        return export;\n-    }\n-\n-    public void setExport(Boolean export) {\n-        this.export = export;\n-    }\n-\n-    public Integer getWeight() {\n-        return weight;\n-    }\n-\n-    public void setWeight(Integer weight) {\n-        this.weight = weight;\n-    }\n-\n-    @Parameter(escaped = true)\n-    public String getDocument() {\n-        return document;\n-    }\n-\n-    public void setDocument(String document) {\n-        this.document = document;\n-    }\n-\n-    public String getToken() {\n-        return token;\n-    }\n-\n-    public void setToken(Boolean token) {\n-        if (token == null) {\n-            setToken((String) null);\n-        } else {\n-            setToken(String.valueOf(token));\n-        }\n-    }\n-\n-    public void setToken(String token) {\n-        this.token = token;\n-    }\n-\n-    public Boolean isDeprecated() {\n-        return deprecated;\n-    }\n-\n-    public void setDeprecated(Boolean deprecated) {\n-        this.deprecated = deprecated;\n-    }\n-\n-    public Boolean isDynamic() {\n-        return dynamic;\n-    }\n-\n-    public void setDynamic(Boolean dynamic) {\n-        this.dynamic = dynamic;\n-    }\n-\n-    public List<ProtocolConfig> getProtocols() {\n-        return protocols;\n-    }\n-\n-    @SuppressWarnings({\"unchecked\"})\n-    public void setProtocols(List<? extends ProtocolConfig> protocols) {\n-        this.protocols = (List<ProtocolConfig>) protocols;\n-    }\n-\n-    public ProtocolConfig getProtocol() {\n-        return CollectionUtils.isEmpty(protocols) ? null : protocols.get(0);\n-    }\n-\n-    public void setProtocol(ProtocolConfig protocol) {\n-        setProtocols(new ArrayList<>(Arrays.asList(protocol)));\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getProtocolIds() {\n-        return protocolIds;\n-    }\n-\n-    public void setProtocolIds(String protocolIds) {\n-        this.protocolIds = protocolIds;\n-    }\n-\n-    public String getAccesslog() {\n-        return accesslog;\n-    }\n-\n-    public void setAccesslog(Boolean accesslog) {\n-        if (accesslog == null) {\n-            setAccesslog((String) null);\n-        } else {\n-            setAccesslog(String.valueOf(accesslog));\n-        }\n-    }\n-\n-    public void setAccesslog(String accesslog) {\n-        this.accesslog = accesslog;\n-    }\n-\n-    public Integer getExecutes() {\n-        return executes;\n-    }\n-\n-    public void setExecutes(Integer executes) {\n-        this.executes = executes;\n-    }\n-\n-    @Override\n-    @Parameter(key = SERVICE_FILTER_KEY, append = true)\n-    public String getFilter() {\n-        return super.getFilter();\n-    }\n-\n-    @Override\n-    @Parameter(key = EXPORTER_LISTENER_KEY, append = true)\n-    public String getListener() {\n-        return listener;\n-    }\n-\n-    @Override\n-    public void setListener(String listener) {\n-        this.listener = listener;\n-    }\n-\n-    public Boolean isRegister() {\n-        return register;\n-    }\n-\n-    public void setRegister(Boolean register) {\n-        this.register = register;\n-    }\n-\n-    public Integer getWarmup() {\n-        return warmup;\n-    }\n-\n-    public void setWarmup(Integer warmup) {\n-        this.warmup = warmup;\n-    }\n-\n-    public String getSerialization() {\n-        return serialization;\n-    }\n-\n-    public void setSerialization(String serialization) {\n-        this.serialization = serialization;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.List;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.EXPORTER_LISTENER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SERVICE_FILTER_KEY;\r\n+\r\n+/**\r\n+ * AbstractServiceConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public abstract class AbstractServiceConfig extends AbstractInterfaceConfig {\r\n+\r\n+    private static final long serialVersionUID = 1L;\r\n+\r\n+    /**\r\n+     * The service version\r\n+     */\r\n+    protected String version;\r\n+\r\n+    /**\r\n+     * The service group\r\n+     */\r\n+    protected String group;\r\n+\r\n+    /**\r\n+     * whether the service is deprecated\r\n+     */\r\n+    protected Boolean deprecated = false;\r\n+\r\n+    /**\r\n+     * The time delay register service (milliseconds)\r\n+     */\r\n+    protected Integer delay;\r\n+\r\n+    /**\r\n+     * Whether to export the service\r\n+     */\r\n+    protected Boolean export;\r\n+\r\n+    /**\r\n+     * The service weight\r\n+     */\r\n+    protected Integer weight;\r\n+\r\n+    /**\r\n+     * Document center\r\n+     */\r\n+    protected String document;\r\n+\r\n+    /**\r\n+     * Whether to register as a dynamic service or not on register center, the value is true, the status will be enabled\r\n+     * after the service registered,and it needs to be disabled manually; if you want to disable the service, you also need\r\n+     * manual processing\r\n+     */\r\n+    protected Boolean dynamic = true;\r\n+\r\n+    /**\r\n+     * Whether to use token\r\n+     */\r\n+    protected String token;\r\n+\r\n+    /**\r\n+     * Whether to export access logs to logs\r\n+     */\r\n+    protected String accesslog;\r\n+\r\n+    /**\r\n+     * The protocol list the service will export with\r\n+     * Also see {@link #protocolIds}, only one of them will work.\r\n+     */\r\n+    protected List<ProtocolConfig> protocols;\r\n+\r\n+    /**\r\n+     * The id list of protocols the service will export with\r\n+     * Also see {@link #protocols}, only one of them will work.\r\n+     */\r\n+    protected String protocolIds;\r\n+\r\n+    // max allowed execute times\r\n+    private Integer executes;\r\n+\r\n+    /**\r\n+     * Whether to register\r\n+     */\r\n+    private Boolean register;\r\n+\r\n+    /**\r\n+     * Warm up period\r\n+     */\r\n+    private Integer warmup;\r\n+\r\n+    /**\r\n+     * The serialization type\r\n+     */\r\n+    private String serialization;\r\n+\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+    public Integer getDelay() {\r\n+        return delay;\r\n+    }\r\n+\r\n+    public void setDelay(Integer delay) {\r\n+        this.delay = delay;\r\n+    }\r\n+\r\n+    public Boolean getExport() {\r\n+        return export;\r\n+    }\r\n+\r\n+    public void setExport(Boolean export) {\r\n+        this.export = export;\r\n+    }\r\n+\r\n+    public Integer getWeight() {\r\n+        return weight;\r\n+    }\r\n+\r\n+    public void setWeight(Integer weight) {\r\n+        this.weight = weight;\r\n+    }\r\n+\r\n+    @Parameter(escaped = true)\r\n+    public String getDocument() {\r\n+        return document;\r\n+    }\r\n+\r\n+    public void setDocument(String document) {\r\n+        this.document = document;\r\n+    }\r\n+\r\n+    public String getToken() {\r\n+        return token;\r\n+    }\r\n+\r\n+    public void setToken(Boolean token) {\r\n+        if (token == null) {\r\n+            setToken((String) null);\r\n+        } else {\r\n+            setToken(String.valueOf(token));\r\n+        }\r\n+    }\r\n+\r\n+    public void setToken(String token) {\r\n+        this.token = token;\r\n+    }\r\n+\r\n+    public Boolean isDeprecated() {\r\n+        return deprecated;\r\n+    }\r\n+\r\n+    public void setDeprecated(Boolean deprecated) {\r\n+        this.deprecated = deprecated;\r\n+    }\r\n+\r\n+    public Boolean isDynamic() {\r\n+        return dynamic;\r\n+    }\r\n+\r\n+    public void setDynamic(Boolean dynamic) {\r\n+        this.dynamic = dynamic;\r\n+    }\r\n+\r\n+    public List<ProtocolConfig> getProtocols() {\r\n+        return protocols;\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\"})\r\n+    public void setProtocols(List<? extends ProtocolConfig> protocols) {\r\n+        this.protocols = (List<ProtocolConfig>) protocols;\r\n+    }\r\n+\r\n+    public ProtocolConfig getProtocol() {\r\n+        return CollectionUtils.isEmpty(protocols) ? null : protocols.get(0);\r\n+    }\r\n+\r\n+    public void setProtocol(ProtocolConfig protocol) {\r\n+        setProtocols(new ArrayList<>(Arrays.asList(protocol)));\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getProtocolIds() {\r\n+        return protocolIds;\r\n+    }\r\n+\r\n+    public void setProtocolIds(String protocolIds) {\r\n+        this.protocolIds = protocolIds;\r\n+    }\r\n+\r\n+    public String getAccesslog() {\r\n+        return accesslog;\r\n+    }\r\n+\r\n+    public void setAccesslog(Boolean accesslog) {\r\n+        if (accesslog == null) {\r\n+            setAccesslog((String) null);\r\n+        } else {\r\n+            setAccesslog(String.valueOf(accesslog));\r\n+        }\r\n+    }\r\n+\r\n+    public void setAccesslog(String accesslog) {\r\n+        this.accesslog = accesslog;\r\n+    }\r\n+\r\n+    public Integer getExecutes() {\r\n+        return executes;\r\n+    }\r\n+\r\n+    public void setExecutes(Integer executes) {\r\n+        this.executes = executes;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(key = SERVICE_FILTER_KEY, append = true)\r\n+    public String getFilter() {\r\n+        return super.getFilter();\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(key = EXPORTER_LISTENER_KEY, append = true)\r\n+    public String getListener() {\r\n+        return listener;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void setListener(String listener) {\r\n+        this.listener = listener;\r\n+    }\r\n+\r\n+    public Boolean isRegister() {\r\n+        return register;\r\n+    }\r\n+\r\n+    public void setRegister(Boolean register) {\r\n+        this.register = register;\r\n+    }\r\n+\r\n+    public Integer getWarmup() {\r\n+        return warmup;\r\n+    }\r\n+\r\n+    public void setWarmup(Integer warmup) {\r\n+        this.warmup = warmup;\r\n+    }\r\n+\r\n+    public String getSerialization() {\r\n+        return serialization;\r\n+    }\r\n+\r\n+    public void setSerialization(String serialization) {\r\n+        this.serialization = serialization;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ApplicationConfig.java", "source2": "org/apache/dubbo/config/ApplicationConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,504 +1,504 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.compiler.support.AdaptiveCompiler;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.infra.InfraAdapter;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.net.InetAddress;\n-import java.net.UnknownHostException;\n-import java.util.ArrayList;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;\n-import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\n-import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;\n-import static org.apache.dubbo.config.Constants.DEVELOPMENT_ENVIRONMENT;\n-import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;\n-import static org.apache.dubbo.config.Constants.TEST_ENVIRONMENT;\n-\n-\n-/**\n- * The application info\n- *\n- * @export\n- */\n-public class ApplicationConfig extends AbstractConfig {\n-    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationConfig.class);\n-\n-    private static final long serialVersionUID = 5508512956753757169L;\n-\n-    /**\n-     * Application name\n-     */\n-    private String name;\n-\n-    /**\n-     * The application version\n-     */\n-    private String version;\n-\n-    /**\n-     * Application owner\n-     */\n-    private String owner;\n-\n-    /**\n-     * Application's organization (BU)\n-     */\n-    private String organization;\n-\n-    /**\n-     * Architecture layer\n-     */\n-    private String architecture;\n-\n-    /**\n-     * Environment, e.g. dev, test or production\n-     */\n-    private String environment;\n-\n-    /**\n-     * Java compiler\n-     */\n-    private String compiler;\n-\n-    /**\n-     * The type of the log access\n-     */\n-    private String logger;\n-\n-    /**\n-     * Registry centers\n-     */\n-    private List<RegistryConfig> registries;\n-    private String registryIds;\n-\n-    /**\n-     * Monitor center\n-     */\n-    private MonitorConfig monitor;\n-\n-    /**\n-     * Is default or not\n-     */\n-    private Boolean isDefault;\n-\n-    /**\n-     * Directory for saving thread dump\n-     */\n-    private String dumpDirectory;\n-\n-    /**\n-     * Whether to enable qos or not\n-     */\n-    private Boolean qosEnable;\n-\n-    /**\n-     * The qos host to listen\n-     */\n-    private String qosHost;\n-\n-    /**\n-     * The qos port to listen\n-     */\n-    private Integer qosPort;\n-\n-    /**\n-     * Should we accept foreign ip or not?\n-     */\n-    private Boolean qosAcceptForeignIp;\n-\n-    /**\n-     * Customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * Config the shutdown.wait\n-     */\n-    private String shutwait;\n-\n-    private String hostname;\n-\n-    /**\n-     * Metadata type, local or remote, if choose remote, you need to further specify metadata center.\n-     */\n-    private String metadataType;\n-\n-    private Boolean registerConsumer;\n-\n-    private String repository;\n-\n-    private Boolean publishInterface;\n-\n-    /**\n-     * Metadata Service, used in Service Discovery\n-     */\n-    private Integer metadataServicePort;\n-\n-    public ApplicationConfig() {\n-    }\n-\n-    public ApplicationConfig(String name) {\n-        setName(name);\n-    }\n-\n-    @Parameter(key = APPLICATION_KEY, required = true, useKeyAsProperty = false)\n-    public String getName() {\n-        return name;\n-    }\n-\n-    public void setName(String name) {\n-        this.name = name;\n-        if (StringUtils.isEmpty(id)) {\n-            id = name;\n-        }\n-    }\n-\n-    @Parameter(key = \"application.version\")\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public String getOwner() {\n-        return owner;\n-    }\n-\n-    public void setOwner(String owner) {\n-        this.owner = owner;\n-    }\n-\n-    public String getOrganization() {\n-        return organization;\n-    }\n-\n-    public void setOrganization(String organization) {\n-        this.organization = organization;\n-    }\n-\n-    public String getArchitecture() {\n-        return architecture;\n-    }\n-\n-    public void setArchitecture(String architecture) {\n-        this.architecture = architecture;\n-    }\n-\n-    public String getEnvironment() {\n-        return environment;\n-    }\n-\n-    public void setEnvironment(String environment) {\n-        if (environment != null) {\n-            if (!(DEVELOPMENT_ENVIRONMENT.equals(environment)\n-                    || TEST_ENVIRONMENT.equals(environment)\n-                    || PRODUCTION_ENVIRONMENT.equals(environment))) {\n-\n-                throw new IllegalStateException(String.format(\"Unsupported environment: %s, only support %s/%s/%s, default is %s.\",\n-                        environment,\n-                        DEVELOPMENT_ENVIRONMENT,\n-                        TEST_ENVIRONMENT,\n-                        PRODUCTION_ENVIRONMENT,\n-                        PRODUCTION_ENVIRONMENT));\n-            }\n-        }\n-        this.environment = environment;\n-    }\n-\n-    public RegistryConfig getRegistry() {\n-        return CollectionUtils.isEmpty(registries) ? null : registries.get(0);\n-    }\n-\n-    public void setRegistry(RegistryConfig registry) {\n-        List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);\n-        registries.add(registry);\n-        this.registries = registries;\n-    }\n-\n-    public List<RegistryConfig> getRegistries() {\n-        return registries;\n-    }\n-\n-    @SuppressWarnings({\"unchecked\"})\n-    public void setRegistries(List<? extends RegistryConfig> registries) {\n-        this.registries = (List<RegistryConfig>) registries;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getRegistryIds() {\n-        return registryIds;\n-    }\n-\n-    public void setRegistryIds(String registryIds) {\n-        this.registryIds = registryIds;\n-    }\n-\n-    public MonitorConfig getMonitor() {\n-        return monitor;\n-    }\n-\n-    public void setMonitor(String monitor) {\n-        this.monitor = new MonitorConfig(monitor);\n-    }\n-\n-    public void setMonitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-    }\n-\n-    public String getCompiler() {\n-        return compiler;\n-    }\n-\n-    public void setCompiler(String compiler) {\n-        this.compiler = compiler;\n-        AdaptiveCompiler.setDefaultCompiler(compiler);\n-    }\n-\n-    public String getLogger() {\n-        return logger;\n-    }\n-\n-    public void setLogger(String logger) {\n-        this.logger = logger;\n-        LoggerFactory.setLoggerAdapter(logger);\n-    }\n-\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-    @Parameter(key = DUMP_DIRECTORY)\n-    public String getDumpDirectory() {\n-        return dumpDirectory;\n-    }\n-\n-    public void setDumpDirectory(String dumpDirectory) {\n-        this.dumpDirectory = dumpDirectory;\n-    }\n-\n-    @Parameter(key = QOS_ENABLE)\n-    public Boolean getQosEnable() {\n-        return qosEnable;\n-    }\n-\n-    public void setQosEnable(Boolean qosEnable) {\n-        this.qosEnable = qosEnable;\n-    }\n-\n-    @Parameter(key = QOS_HOST)\n-    public String getQosHost() {\n-        return qosHost;\n-    }\n-\n-    public void setQosHost(String qosHost) {\n-        this.qosHost = qosHost;\n-    }\n-\n-    @Parameter(key = QOS_PORT)\n-    public Integer getQosPort() {\n-        return qosPort;\n-    }\n-\n-    public void setQosPort(Integer qosPort) {\n-        this.qosPort = qosPort;\n-    }\n-\n-    @Parameter(key = ACCEPT_FOREIGN_IP)\n-    public Boolean getQosAcceptForeignIp() {\n-        return qosAcceptForeignIp;\n-    }\n-\n-    public void setQosAcceptForeignIp(Boolean qosAcceptForeignIp) {\n-        this.qosAcceptForeignIp = qosAcceptForeignIp;\n-    }\n-\n-    /**\n-     * The format is the same as the springboot, including: getQosEnableCompatible(), getQosPortCompatible(), getQosAcceptForeignIpCompatible().\n-     *\n-     * @return\n-     */\n-    @Parameter(key = \"qos-enable\", excluded = true)\n-    public Boolean getQosEnableCompatible() {\n-        return getQosEnable();\n-    }\n-\n-    public void setQosEnableCompatible(Boolean qosEnable) {\n-        setQosEnable(qosEnable);\n-    }\n-\n-    @Parameter(key = \"qos-host\", excluded = true)\n-    public String getQosHostCompatible() {\n-        return getQosHost();\n-    }\n-\n-    public void setQosHostCompatible(String qosHost) {\n-        this.setQosHost(qosHost);\n-    }\n-\n-    @Parameter(key = \"qos-port\", excluded = true)\n-    public Integer getQosPortCompatible() {\n-        return getQosPort();\n-    }\n-\n-    public void setQosPortCompatible(Integer qosPort) {\n-        this.setQosPort(qosPort);\n-    }\n-\n-    @Parameter(key = \"qos-accept-foreign-ip\", excluded = true)\n-    public Boolean getQosAcceptForeignIpCompatible() {\n-        return this.getQosAcceptForeignIp();\n-    }\n-\n-    public void setQosAcceptForeignIpCompatible(Boolean qosAcceptForeignIp) {\n-        this.setQosAcceptForeignIp(qosAcceptForeignIp);\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-    public String getShutwait() {\n-        return shutwait;\n-    }\n-\n-    public void setShutwait(String shutwait) {\n-        System.setProperty(SHUTDOWN_WAIT_KEY, shutwait);\n-        this.shutwait = shutwait;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getHostname() {\n-        if (hostname == null) {\n-            try {\n-                hostname = InetAddress.getLocalHost().getHostName();\n-            } catch (UnknownHostException e) {\n-                LOGGER.warn(\"Failed to get the hostname of current instance.\", e);\n-                hostname = \"UNKNOWN\";\n-            }\n-        }\n-        return hostname;\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        return !StringUtils.isEmpty(name);\n-    }\n-\n-    @Parameter(key = METADATA_KEY)\n-    public String getMetadataType() {\n-        return metadataType;\n-    }\n-\n-    public void setMetadataType(String metadataType) {\n-        this.metadataType = metadataType;\n-    }\n-\n-    public Boolean getRegisterConsumer() {\n-        return registerConsumer;\n-    }\n-\n-    public void setRegisterConsumer(Boolean registerConsumer) {\n-        this.registerConsumer = registerConsumer;\n-    }\n-\n-    public String getRepository() {\n-        return repository;\n-    }\n-\n-    public void setRepository(String repository) {\n-        this.repository = repository;\n-    }\n-\n-    @Parameter(key = REGISTRY_PUBLISH_INTERFACE_KEY)\n-    public Boolean getPublishInterface() {\n-        return publishInterface;\n-    }\n-\n-    public void setPublishInterface(Boolean publishInterface) {\n-        this.publishInterface = publishInterface;\n-    }\n-\n-    @Parameter(key = \"metadata-service-port\")\n-    public Integer getMetadataServicePort() {\n-        return metadataServicePort;\n-    }\n-\n-    public void setMetadataServicePort(Integer metadataServicePort) {\n-        this.metadataServicePort = metadataServicePort;\n-    }\n-\n-    @Override\n-    public void refresh() {\n-        super.refresh();\n-        appendEnvironmentProperties();\n-    }\n-\n-    private void appendEnvironmentProperties() {\n-        if (parameters == null) {\n-            parameters = new HashMap<>();\n-        }\n-\n-        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();\n-        if (CollectionUtils.isNotEmpty(adapters)) {\n-            Map<String, String> inputParameters = new HashMap<>();\n-            inputParameters.put(APPLICATION_KEY, getName());\n-            inputParameters.put(HOST_KEY, getHostname());\n-            for (InfraAdapter adapter : adapters) {\n-                Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);\n-                if (CollectionUtils.isNotEmptyMap(extraParameters)) {\n-                    extraParameters.forEach((key, value) -> {\n-                        String prefix = this.getPrefix() + \".\";\n-                        if (key.startsWith(prefix)) {\n-                            key = key.substring(prefix.length());\n-                        }\n-                        parameters.put(key, value);\n-                    });\n-                }\n-            }\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.compiler.support.AdaptiveCompiler;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.infra.InfraAdapter;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.net.InetAddress;\r\n+import java.net.UnknownHostException;\r\n+import java.util.ArrayList;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\r\n+import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;\r\n+import static org.apache.dubbo.config.Constants.DEVELOPMENT_ENVIRONMENT;\r\n+import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;\r\n+import static org.apache.dubbo.config.Constants.TEST_ENVIRONMENT;\r\n+\r\n+\r\n+/**\r\n+ * The application info\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class ApplicationConfig extends AbstractConfig {\r\n+    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationConfig.class);\r\n+\r\n+    private static final long serialVersionUID = 5508512956753757169L;\r\n+\r\n+    /**\r\n+     * Application name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * The application version\r\n+     */\r\n+    private String version;\r\n+\r\n+    /**\r\n+     * Application owner\r\n+     */\r\n+    private String owner;\r\n+\r\n+    /**\r\n+     * Application's organization (BU)\r\n+     */\r\n+    private String organization;\r\n+\r\n+    /**\r\n+     * Architecture layer\r\n+     */\r\n+    private String architecture;\r\n+\r\n+    /**\r\n+     * Environment, e.g. dev, test or production\r\n+     */\r\n+    private String environment;\r\n+\r\n+    /**\r\n+     * Java compiler\r\n+     */\r\n+    private String compiler;\r\n+\r\n+    /**\r\n+     * The type of the log access\r\n+     */\r\n+    private String logger;\r\n+\r\n+    /**\r\n+     * Registry centers\r\n+     */\r\n+    private List<RegistryConfig> registries;\r\n+    private String registryIds;\r\n+\r\n+    /**\r\n+     * Monitor center\r\n+     */\r\n+    private MonitorConfig monitor;\r\n+\r\n+    /**\r\n+     * Is default or not\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    /**\r\n+     * Directory for saving thread dump\r\n+     */\r\n+    private String dumpDirectory;\r\n+\r\n+    /**\r\n+     * Whether to enable qos or not\r\n+     */\r\n+    private Boolean qosEnable;\r\n+\r\n+    /**\r\n+     * The qos host to listen\r\n+     */\r\n+    private String qosHost;\r\n+\r\n+    /**\r\n+     * The qos port to listen\r\n+     */\r\n+    private Integer qosPort;\r\n+\r\n+    /**\r\n+     * Should we accept foreign ip or not?\r\n+     */\r\n+    private Boolean qosAcceptForeignIp;\r\n+\r\n+    /**\r\n+     * Customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * Config the shutdown.wait\r\n+     */\r\n+    private String shutwait;\r\n+\r\n+    private String hostname;\r\n+\r\n+    /**\r\n+     * Metadata type, local or remote, if choose remote, you need to further specify metadata center.\r\n+     */\r\n+    private String metadataType;\r\n+\r\n+    private Boolean registerConsumer;\r\n+\r\n+    private String repository;\r\n+\r\n+    private Boolean publishInterface;\r\n+\r\n+    /**\r\n+     * Metadata Service, used in Service Discovery\r\n+     */\r\n+    private Integer metadataServicePort;\r\n+\r\n+    public ApplicationConfig() {\r\n+    }\r\n+\r\n+    public ApplicationConfig(String name) {\r\n+        setName(name);\r\n+    }\r\n+\r\n+    @Parameter(key = APPLICATION_KEY, required = true, useKeyAsProperty = false)\r\n+    public String getName() {\r\n+        return name;\r\n+    }\r\n+\r\n+    public void setName(String name) {\r\n+        this.name = name;\r\n+        if (StringUtils.isEmpty(id)) {\r\n+            id = name;\r\n+        }\r\n+    }\r\n+\r\n+    @Parameter(key = \"application.version\")\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public String getOwner() {\r\n+        return owner;\r\n+    }\r\n+\r\n+    public void setOwner(String owner) {\r\n+        this.owner = owner;\r\n+    }\r\n+\r\n+    public String getOrganization() {\r\n+        return organization;\r\n+    }\r\n+\r\n+    public void setOrganization(String organization) {\r\n+        this.organization = organization;\r\n+    }\r\n+\r\n+    public String getArchitecture() {\r\n+        return architecture;\r\n+    }\r\n+\r\n+    public void setArchitecture(String architecture) {\r\n+        this.architecture = architecture;\r\n+    }\r\n+\r\n+    public String getEnvironment() {\r\n+        return environment;\r\n+    }\r\n+\r\n+    public void setEnvironment(String environment) {\r\n+        if (environment != null) {\r\n+            if (!(DEVELOPMENT_ENVIRONMENT.equals(environment)\r\n+                    || TEST_ENVIRONMENT.equals(environment)\r\n+                    || PRODUCTION_ENVIRONMENT.equals(environment))) {\r\n+\r\n+                throw new IllegalStateException(String.format(\"Unsupported environment: %s, only support %s/%s/%s, default is %s.\",\r\n+                        environment,\r\n+                        DEVELOPMENT_ENVIRONMENT,\r\n+                        TEST_ENVIRONMENT,\r\n+                        PRODUCTION_ENVIRONMENT,\r\n+                        PRODUCTION_ENVIRONMENT));\r\n+            }\r\n+        }\r\n+        this.environment = environment;\r\n+    }\r\n+\r\n+    public RegistryConfig getRegistry() {\r\n+        return CollectionUtils.isEmpty(registries) ? null : registries.get(0);\r\n+    }\r\n+\r\n+    public void setRegistry(RegistryConfig registry) {\r\n+        List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);\r\n+        registries.add(registry);\r\n+        this.registries = registries;\r\n+    }\r\n+\r\n+    public List<RegistryConfig> getRegistries() {\r\n+        return registries;\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\"})\r\n+    public void setRegistries(List<? extends RegistryConfig> registries) {\r\n+        this.registries = (List<RegistryConfig>) registries;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getRegistryIds() {\r\n+        return registryIds;\r\n+    }\r\n+\r\n+    public void setRegistryIds(String registryIds) {\r\n+        this.registryIds = registryIds;\r\n+    }\r\n+\r\n+    public MonitorConfig getMonitor() {\r\n+        return monitor;\r\n+    }\r\n+\r\n+    public void setMonitor(String monitor) {\r\n+        this.monitor = new MonitorConfig(monitor);\r\n+    }\r\n+\r\n+    public void setMonitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+    }\r\n+\r\n+    public String getCompiler() {\r\n+        return compiler;\r\n+    }\r\n+\r\n+    public void setCompiler(String compiler) {\r\n+        this.compiler = compiler;\r\n+        AdaptiveCompiler.setDefaultCompiler(compiler);\r\n+    }\r\n+\r\n+    public String getLogger() {\r\n+        return logger;\r\n+    }\r\n+\r\n+    public void setLogger(String logger) {\r\n+        this.logger = logger;\r\n+        LoggerFactory.setLoggerAdapter(logger);\r\n+    }\r\n+\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+    @Parameter(key = DUMP_DIRECTORY)\r\n+    public String getDumpDirectory() {\r\n+        return dumpDirectory;\r\n+    }\r\n+\r\n+    public void setDumpDirectory(String dumpDirectory) {\r\n+        this.dumpDirectory = dumpDirectory;\r\n+    }\r\n+\r\n+    @Parameter(key = QOS_ENABLE)\r\n+    public Boolean getQosEnable() {\r\n+        return qosEnable;\r\n+    }\r\n+\r\n+    public void setQosEnable(Boolean qosEnable) {\r\n+        this.qosEnable = qosEnable;\r\n+    }\r\n+\r\n+    @Parameter(key = QOS_HOST)\r\n+    public String getQosHost() {\r\n+        return qosHost;\r\n+    }\r\n+\r\n+    public void setQosHost(String qosHost) {\r\n+        this.qosHost = qosHost;\r\n+    }\r\n+\r\n+    @Parameter(key = QOS_PORT)\r\n+    public Integer getQosPort() {\r\n+        return qosPort;\r\n+    }\r\n+\r\n+    public void setQosPort(Integer qosPort) {\r\n+        this.qosPort = qosPort;\r\n+    }\r\n+\r\n+    @Parameter(key = ACCEPT_FOREIGN_IP)\r\n+    public Boolean getQosAcceptForeignIp() {\r\n+        return qosAcceptForeignIp;\r\n+    }\r\n+\r\n+    public void setQosAcceptForeignIp(Boolean qosAcceptForeignIp) {\r\n+        this.qosAcceptForeignIp = qosAcceptForeignIp;\r\n+    }\r\n+\r\n+    /**\r\n+     * The format is the same as the springboot, including: getQosEnableCompatible(), getQosPortCompatible(), getQosAcceptForeignIpCompatible().\r\n+     *\r\n+     * @return\r\n+     */\r\n+    @Parameter(key = \"qos-enable\", excluded = true)\r\n+    public Boolean getQosEnableCompatible() {\r\n+        return getQosEnable();\r\n+    }\r\n+\r\n+    public void setQosEnableCompatible(Boolean qosEnable) {\r\n+        setQosEnable(qosEnable);\r\n+    }\r\n+\r\n+    @Parameter(key = \"qos-host\", excluded = true)\r\n+    public String getQosHostCompatible() {\r\n+        return getQosHost();\r\n+    }\r\n+\r\n+    public void setQosHostCompatible(String qosHost) {\r\n+        this.setQosHost(qosHost);\r\n+    }\r\n+\r\n+    @Parameter(key = \"qos-port\", excluded = true)\r\n+    public Integer getQosPortCompatible() {\r\n+        return getQosPort();\r\n+    }\r\n+\r\n+    public void setQosPortCompatible(Integer qosPort) {\r\n+        this.setQosPort(qosPort);\r\n+    }\r\n+\r\n+    @Parameter(key = \"qos-accept-foreign-ip\", excluded = true)\r\n+    public Boolean getQosAcceptForeignIpCompatible() {\r\n+        return this.getQosAcceptForeignIp();\r\n+    }\r\n+\r\n+    public void setQosAcceptForeignIpCompatible(Boolean qosAcceptForeignIp) {\r\n+        this.setQosAcceptForeignIp(qosAcceptForeignIp);\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+    public String getShutwait() {\r\n+        return shutwait;\r\n+    }\r\n+\r\n+    public void setShutwait(String shutwait) {\r\n+        System.setProperty(SHUTDOWN_WAIT_KEY, shutwait);\r\n+        this.shutwait = shutwait;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getHostname() {\r\n+        if (hostname == null) {\r\n+            try {\r\n+                hostname = InetAddress.getLocalHost().getHostName();\r\n+            } catch (UnknownHostException e) {\r\n+                LOGGER.warn(\"Failed to get the hostname of current instance.\", e);\r\n+                hostname = \"UNKNOWN\";\r\n+            }\r\n+        }\r\n+        return hostname;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        return !StringUtils.isEmpty(name);\r\n+    }\r\n+\r\n+    @Parameter(key = METADATA_KEY)\r\n+    public String getMetadataType() {\r\n+        return metadataType;\r\n+    }\r\n+\r\n+    public void setMetadataType(String metadataType) {\r\n+        this.metadataType = metadataType;\r\n+    }\r\n+\r\n+    public Boolean getRegisterConsumer() {\r\n+        return registerConsumer;\r\n+    }\r\n+\r\n+    public void setRegisterConsumer(Boolean registerConsumer) {\r\n+        this.registerConsumer = registerConsumer;\r\n+    }\r\n+\r\n+    public String getRepository() {\r\n+        return repository;\r\n+    }\r\n+\r\n+    public void setRepository(String repository) {\r\n+        this.repository = repository;\r\n+    }\r\n+\r\n+    @Parameter(key = REGISTRY_PUBLISH_INTERFACE_KEY)\r\n+    public Boolean getPublishInterface() {\r\n+        return publishInterface;\r\n+    }\r\n+\r\n+    public void setPublishInterface(Boolean publishInterface) {\r\n+        this.publishInterface = publishInterface;\r\n+    }\r\n+\r\n+    @Parameter(key = \"metadata-service-port\")\r\n+    public Integer getMetadataServicePort() {\r\n+        return metadataServicePort;\r\n+    }\r\n+\r\n+    public void setMetadataServicePort(Integer metadataServicePort) {\r\n+        this.metadataServicePort = metadataServicePort;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void refresh() {\r\n+        super.refresh();\r\n+        appendEnvironmentProperties();\r\n+    }\r\n+\r\n+    private void appendEnvironmentProperties() {\r\n+        if (parameters == null) {\r\n+            parameters = new HashMap<>();\r\n+        }\r\n+\r\n+        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();\r\n+        if (CollectionUtils.isNotEmpty(adapters)) {\r\n+            Map<String, String> inputParameters = new HashMap<>();\r\n+            inputParameters.put(APPLICATION_KEY, getName());\r\n+            inputParameters.put(HOST_KEY, getHostname());\r\n+            for (InfraAdapter adapter : adapters) {\r\n+                Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);\r\n+                if (CollectionUtils.isNotEmptyMap(extraParameters)) {\r\n+                    extraParameters.forEach((key, value) -> {\r\n+                        String prefix = this.getPrefix() + \".\";\r\n+                        if (key.startsWith(prefix)) {\r\n+                            key = key.substring(prefix.length());\r\n+                        }\r\n+                        parameters.put(key, value);\r\n+                    });\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ArgumentConfig.java", "source2": "org/apache/dubbo/config/ArgumentConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,83 +1,83 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.config.annotation.Argument;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.io.Serializable;\n-\n-/**\n- * The method arguments configuration\n- *\n- * @export\n- */\n-public class ArgumentConfig implements Serializable {\n-\n-    private static final long serialVersionUID = -2165482463925213595L;\n-\n-    /**\n-     * The argument index: index -1 represents not set\n-     */\n-    private Integer index = -1;\n-\n-    /**\n-     * Argument type\n-     */\n-    private String type;\n-\n-    /**\n-     * Whether the argument is the callback interface\n-     */\n-    private Boolean callback;\n-\n-    public ArgumentConfig() {\n-    }\n-\n-    public ArgumentConfig(Argument argument) {\n-        this.index = argument.index();\n-        this.type = argument.type();\n-        this.callback = argument.callback();\n-    }\n-\n-    @Parameter(excluded = true)\n-    public Integer getIndex() {\n-        return index;\n-    }\n-\n-    public void setIndex(Integer index) {\n-        this.index = index;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getType() {\n-        return type;\n-    }\n-\n-    public void setType(String type) {\n-        this.type = type;\n-    }\n-\n-    public void setCallback(Boolean callback) {\n-        this.callback = callback;\n-    }\n-\n-    public Boolean isCallback() {\n-        return callback;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.config.annotation.Argument;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.io.Serializable;\r\n+\r\n+/**\r\n+ * The method arguments configuration\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class ArgumentConfig implements Serializable {\r\n+\r\n+    private static final long serialVersionUID = -2165482463925213595L;\r\n+\r\n+    /**\r\n+     * The argument index: index -1 represents not set\r\n+     */\r\n+    private Integer index = -1;\r\n+\r\n+    /**\r\n+     * Argument type\r\n+     */\r\n+    private String type;\r\n+\r\n+    /**\r\n+     * Whether the argument is the callback interface\r\n+     */\r\n+    private Boolean callback;\r\n+\r\n+    public ArgumentConfig() {\r\n+    }\r\n+\r\n+    public ArgumentConfig(Argument argument) {\r\n+        this.index = argument.index();\r\n+        this.type = argument.type();\r\n+        this.callback = argument.callback();\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public Integer getIndex() {\r\n+        return index;\r\n+    }\r\n+\r\n+    public void setIndex(Integer index) {\r\n+        this.index = index;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getType() {\r\n+        return type;\r\n+    }\r\n+\r\n+    public void setType(String type) {\r\n+        this.type = type;\r\n+    }\r\n+\r\n+    public void setCallback(Boolean callback) {\r\n+        this.callback = callback;\r\n+    }\r\n+\r\n+    public Boolean isCallback() {\r\n+        return callback;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ConfigCenterConfig.java", "source2": "org/apache/dubbo/config/ConfigCenterConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,289 +1,289 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.constants.CommonConstants;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_CONFIGFILE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_ENABLE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.config.Constants.CONFIG_APP_CONFIGFILE_KEY;\n-import static org.apache.dubbo.config.Constants.ZOOKEEPER_PROTOCOL;\n-\n-/**\n- * ConfigCenterConfig\n- */\n-public class ConfigCenterConfig extends AbstractConfig {\n-    private AtomicBoolean inited = new AtomicBoolean(false);\n-\n-    private String protocol;\n-    private String address;\n-    private Integer port;\n-\n-    /* The config center cluster, it's real meaning may very on different Config Center products. */\n-    private String cluster;\n-\n-    /* The namespace of the config center, generally it's used for multi-tenant,\n-    but it's real meaning depends on the actual Config Center you use.\n-    */\n-\n-    private String namespace = CommonConstants.DUBBO;\n-    /* The group of the config center, generally it's used to identify an isolated space for a batch of config items,\n-    but it's real meaning depends on the actual Config Center you use.\n-    */\n-    private String group = CommonConstants.DUBBO;\n-    private String username;\n-    private String password;\n-    private Long timeout = 3000L;\n-\n-    // If the Config Center is given the highest priority, it will override all the other configurations\n-    private Boolean highestPriority = true;\n-\n-    // Decide the behaviour when initial connection try fails, 'true' means interrupt the whole process once fail.\n-    private Boolean check = true;\n-\n-    /* Used to specify the key that your properties file mapping to, most of the time you do not need to change this parameter.\n-    Notice that for Apollo, this parameter is meaningless, set the 'namespace' is enough.\n-    */\n-    private String configFile = CommonConstants.DEFAULT_DUBBO_PROPERTIES;\n-\n-    /* the .properties file under 'configFile' is global shared while .properties under this one is limited only to this application\n-     */\n-    private String appConfigFile;\n-\n-    /* If the Config Center product you use have some special parameters that is not covered by this class, you can add it to here.\n-    For example, with XML:\n-      <dubbo:config-center>\n-           <dubbo:parameter key=\"{your key}\" value=\"{your value}\" />\n-      </dubbo:config-center>\n-     */\n-    private Map<String, String> parameters;\n-\n-    private Map<String, String> externalConfiguration;\n-\n-    private Map<String, String> appExternalConfiguration;\n-\n-    public ConfigCenterConfig() {\n-    }\n-\n-    public URL toUrl() {\n-        Map<String, String> map = new HashMap<>();\n-        appendParameters(map, this);\n-        if (StringUtils.isEmpty(address)) {\n-            address = ANYHOST_VALUE;\n-        }\n-        map.put(PATH_KEY, ConfigCenterConfig.class.getSimpleName());\n-        // use 'zookeeper' as the default configcenter.\n-        if (StringUtils.isEmpty(map.get(PROTOCOL_KEY))) {\n-            map.put(PROTOCOL_KEY, ZOOKEEPER_PROTOCOL);\n-        }\n-        return UrlUtils.parseURL(address, map);\n-    }\n-\n-    public boolean checkOrUpdateInited() {\n-        return inited.compareAndSet(false, true);\n-    }\n-\n-    public Map<String, String> getExternalConfiguration() {\n-        return externalConfiguration;\n-    }\n-\n-    public Map<String, String> getAppExternalConfiguration() {\n-        return appExternalConfiguration;\n-    }\n-\n-    public void setExternalConfig(Map<String, String> externalConfiguration) {\n-        this.externalConfiguration = externalConfiguration;\n-    }\n-\n-    public void setAppExternalConfig(Map<String, String> appExternalConfiguration) {\n-        this.appExternalConfiguration = appExternalConfiguration;\n-    }\n-\n-    public String getProtocol() {\n-        return protocol;\n-    }\n-\n-    public void setProtocol(String protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getAddress() {\n-        return address;\n-    }\n-\n-    public void setAddress(String address) {\n-        this.address = address;\n-        if (address != null) {\n-            try {\n-                URL url = URL.valueOf(address);\n-                setUsername(url.getUsername());\n-                setPassword(url.getPassword());\n-                updateIdIfAbsent(url.getProtocol());\n-                updateProtocolIfAbsent(url.getProtocol());\n-                updatePortIfAbsent(url.getPort());\n-                updateParameters(url.getParameters());\n-            } catch (Exception ignored) {\n-            }\n-        }\n-    }\n-\n-    public Integer getPort() {\n-        return port;\n-    }\n-\n-    public void setPort(Integer port) {\n-        this.port = port;\n-    }\n-\n-    public String getCluster() {\n-        return cluster;\n-    }\n-\n-    public void setCluster(String cluster) {\n-        this.cluster = cluster;\n-    }\n-\n-    public String getNamespace() {\n-        return namespace;\n-    }\n-\n-    public void setNamespace(String namespace) {\n-        this.namespace = namespace;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-    public Boolean isCheck() {\n-        return check;\n-    }\n-\n-    public void setCheck(Boolean check) {\n-        this.check = check;\n-    }\n-\n-    @Parameter(key = CONFIG_ENABLE_KEY)\n-    public Boolean isHighestPriority() {\n-        return highestPriority;\n-    }\n-\n-    public void setHighestPriority(Boolean highestPriority) {\n-        this.highestPriority = highestPriority;\n-    }\n-\n-    public String getUsername() {\n-        return username;\n-    }\n-\n-    public void setUsername(String username) {\n-        this.username = username;\n-    }\n-\n-    public String getPassword() {\n-        return password;\n-    }\n-\n-    public void setPassword(String password) {\n-        this.password = password;\n-    }\n-\n-    public Long getTimeout() {\n-        return timeout;\n-    }\n-\n-    public void setTimeout(Long timeout) {\n-        this.timeout = timeout;\n-    }\n-\n-    @Parameter(key = CONFIG_CONFIGFILE_KEY)\n-    public String getConfigFile() {\n-        return configFile;\n-    }\n-\n-    public void setConfigFile(String configFile) {\n-        this.configFile = configFile;\n-    }\n-\n-    @Parameter(excluded = true, key = CONFIG_APP_CONFIGFILE_KEY)\n-    public String getAppConfigFile() {\n-        return appConfigFile;\n-    }\n-\n-    public void setAppConfigFile(String appConfigFile) {\n-        this.appConfigFile = appConfigFile;\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        if (StringUtils.isEmpty(address)) {\n-            return false;\n-        }\n-\n-        return address.contains(\"://\") || StringUtils.isNotEmpty(protocol);\n-    }\n-\n-    protected void updatePortIfAbsent(Integer value) {\n-        if (value != null && value > 0 && port == null) {\n-            this.port = value;\n-        }\n-    }\n-\n-    protected void updateProtocolIfAbsent(String value) {\n-        if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(protocol)) {\n-            this.protocol = value;\n-        }\n-    }\n-\n-    public void updateParameters(Map<String, String> parameters) {\n-        if (CollectionUtils.isEmptyMap(parameters)) {\n-            return;\n-        }\n-        if (this.parameters == null) {\n-            this.parameters = parameters;\n-        } else {\n-            this.parameters.putAll(parameters);\n-        }\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.constants.CommonConstants;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.common.utils.UrlUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_CONFIGFILE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_ENABLE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.config.Constants.CONFIG_APP_CONFIGFILE_KEY;\r\n+import static org.apache.dubbo.config.Constants.ZOOKEEPER_PROTOCOL;\r\n+\r\n+/**\r\n+ * ConfigCenterConfig\r\n+ */\r\n+public class ConfigCenterConfig extends AbstractConfig {\r\n+    private AtomicBoolean inited = new AtomicBoolean(false);\r\n+\r\n+    private String protocol;\r\n+    private String address;\r\n+    private Integer port;\r\n+\r\n+    /* The config center cluster, it's real meaning may very on different Config Center products. */\r\n+    private String cluster;\r\n+\r\n+    /* The namespace of the config center, generally it's used for multi-tenant,\r\n+    but it's real meaning depends on the actual Config Center you use.\r\n+    */\r\n+\r\n+    private String namespace = CommonConstants.DUBBO;\r\n+    /* The group of the config center, generally it's used to identify an isolated space for a batch of config items,\r\n+    but it's real meaning depends on the actual Config Center you use.\r\n+    */\r\n+    private String group = CommonConstants.DUBBO;\r\n+    private String username;\r\n+    private String password;\r\n+    private Long timeout = 3000L;\r\n+\r\n+    // If the Config Center is given the highest priority, it will override all the other configurations\r\n+    private Boolean highestPriority = true;\r\n+\r\n+    // Decide the behaviour when initial connection try fails, 'true' means interrupt the whole process once fail.\r\n+    private Boolean check = true;\r\n+\r\n+    /* Used to specify the key that your properties file mapping to, most of the time you do not need to change this parameter.\r\n+    Notice that for Apollo, this parameter is meaningless, set the 'namespace' is enough.\r\n+    */\r\n+    private String configFile = CommonConstants.DEFAULT_DUBBO_PROPERTIES;\r\n+\r\n+    /* the .properties file under 'configFile' is global shared while .properties under this one is limited only to this application\r\n+     */\r\n+    private String appConfigFile;\r\n+\r\n+    /* If the Config Center product you use have some special parameters that is not covered by this class, you can add it to here.\r\n+    For example, with XML:\r\n+      <dubbo:config-center>\r\n+           <dubbo:parameter key=\"{your key}\" value=\"{your value}\" />\r\n+      </dubbo:config-center>\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    private Map<String, String> externalConfiguration;\r\n+\r\n+    private Map<String, String> appExternalConfiguration;\r\n+\r\n+    public ConfigCenterConfig() {\r\n+    }\r\n+\r\n+    public URL toUrl() {\r\n+        Map<String, String> map = new HashMap<>();\r\n+        appendParameters(map, this);\r\n+        if (StringUtils.isEmpty(address)) {\r\n+            address = ANYHOST_VALUE;\r\n+        }\r\n+        map.put(PATH_KEY, ConfigCenterConfig.class.getSimpleName());\r\n+        // use 'zookeeper' as the default configcenter.\r\n+        if (StringUtils.isEmpty(map.get(PROTOCOL_KEY))) {\r\n+            map.put(PROTOCOL_KEY, ZOOKEEPER_PROTOCOL);\r\n+        }\r\n+        return UrlUtils.parseURL(address, map);\r\n+    }\r\n+\r\n+    public boolean checkOrUpdateInited() {\r\n+        return inited.compareAndSet(false, true);\r\n+    }\r\n+\r\n+    public Map<String, String> getExternalConfiguration() {\r\n+        return externalConfiguration;\r\n+    }\r\n+\r\n+    public Map<String, String> getAppExternalConfiguration() {\r\n+        return appExternalConfiguration;\r\n+    }\r\n+\r\n+    public void setExternalConfig(Map<String, String> externalConfiguration) {\r\n+        this.externalConfiguration = externalConfiguration;\r\n+    }\r\n+\r\n+    public void setAppExternalConfig(Map<String, String> appExternalConfiguration) {\r\n+        this.appExternalConfiguration = appExternalConfiguration;\r\n+    }\r\n+\r\n+    public String getProtocol() {\r\n+        return protocol;\r\n+    }\r\n+\r\n+    public void setProtocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getAddress() {\r\n+        return address;\r\n+    }\r\n+\r\n+    public void setAddress(String address) {\r\n+        this.address = address;\r\n+        if (address != null) {\r\n+            try {\r\n+                URL url = URL.valueOf(address);\r\n+                setUsername(url.getUsername());\r\n+                setPassword(url.getPassword());\r\n+                updateIdIfAbsent(url.getProtocol());\r\n+                updateProtocolIfAbsent(url.getProtocol());\r\n+                updatePortIfAbsent(url.getPort());\r\n+                updateParameters(url.getParameters());\r\n+            } catch (Exception ignored) {\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public Integer getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    public void setPort(Integer port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    public String getCluster() {\r\n+        return cluster;\r\n+    }\r\n+\r\n+    public void setCluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+    }\r\n+\r\n+    public String getNamespace() {\r\n+        return namespace;\r\n+    }\r\n+\r\n+    public void setNamespace(String namespace) {\r\n+        this.namespace = namespace;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+    public Boolean isCheck() {\r\n+        return check;\r\n+    }\r\n+\r\n+    public void setCheck(Boolean check) {\r\n+        this.check = check;\r\n+    }\r\n+\r\n+    @Parameter(key = CONFIG_ENABLE_KEY)\r\n+    public Boolean isHighestPriority() {\r\n+        return highestPriority;\r\n+    }\r\n+\r\n+    public void setHighestPriority(Boolean highestPriority) {\r\n+        this.highestPriority = highestPriority;\r\n+    }\r\n+\r\n+    public String getUsername() {\r\n+        return username;\r\n+    }\r\n+\r\n+    public void setUsername(String username) {\r\n+        this.username = username;\r\n+    }\r\n+\r\n+    public String getPassword() {\r\n+        return password;\r\n+    }\r\n+\r\n+    public void setPassword(String password) {\r\n+        this.password = password;\r\n+    }\r\n+\r\n+    public Long getTimeout() {\r\n+        return timeout;\r\n+    }\r\n+\r\n+    public void setTimeout(Long timeout) {\r\n+        this.timeout = timeout;\r\n+    }\r\n+\r\n+    @Parameter(key = CONFIG_CONFIGFILE_KEY)\r\n+    public String getConfigFile() {\r\n+        return configFile;\r\n+    }\r\n+\r\n+    public void setConfigFile(String configFile) {\r\n+        this.configFile = configFile;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true, key = CONFIG_APP_CONFIGFILE_KEY)\r\n+    public String getAppConfigFile() {\r\n+        return appConfigFile;\r\n+    }\r\n+\r\n+    public void setAppConfigFile(String appConfigFile) {\r\n+        this.appConfigFile = appConfigFile;\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        if (StringUtils.isEmpty(address)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        return address.contains(\"://\") || StringUtils.isNotEmpty(protocol);\r\n+    }\r\n+\r\n+    protected void updatePortIfAbsent(Integer value) {\r\n+        if (value != null && value > 0 && port == null) {\r\n+            this.port = value;\r\n+        }\r\n+    }\r\n+\r\n+    protected void updateProtocolIfAbsent(String value) {\r\n+        if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(protocol)) {\r\n+            this.protocol = value;\r\n+        }\r\n+    }\r\n+\r\n+    public void updateParameters(Map<String, String> parameters) {\r\n+        if (CollectionUtils.isEmptyMap(parameters)) {\r\n+            return;\r\n+        }\r\n+        if (this.parameters == null) {\r\n+            this.parameters = parameters;\r\n+        } else {\r\n+            this.parameters.putAll(parameters);\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/Constants.java", "source2": "org/apache/dubbo/config/Constants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,120 +1,120 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.config;\n-\n-/**\n- *\n- */\n-public interface Constants {\n-\n-    String STATUS_KEY = \"status\";\n-\n-    String CONTEXTPATH_KEY = \"contextpath\";\n-\n-    String LISTENER_KEY = \"listener\";\n-\n-    String LAYER_KEY = \"layer\";\n-\n-    /**\n-     * General\n-     */\n-    /**\n-     * Application name;\n-     */\n-    String NAME = \"name\";\n-\n-    /**\n-     * Application owner name;\n-     */\n-    String OWNER = \"owner\";\n-\n-    /**\n-     * Running application organization name.\n-     */\n-    String ORGANIZATION = \"organization\";\n-\n-    /**\n-     * Application architecture name.\n-     */\n-    String ARCHITECTURE = \"architecture\";\n-\n-    /**\n-     * Environment name\n-     */\n-    String ENVIRONMENT = \"environment\";\n-\n-    /**\n-     * Test environment key.\n-     */\n-    String TEST_ENVIRONMENT = \"test\";\n-\n-    /**\n-     * Development environment key.\n-     */\n-    String DEVELOPMENT_ENVIRONMENT = \"develop\";\n-\n-    /**\n-     * Production environment key.\n-     */\n-    String PRODUCTION_ENVIRONMENT = \"product\";\n-\n-    String CONFIG_CONFIGFILE_KEY = \"config-file\";\n-    String CONFIG_ENABLE_KEY = \"highest-priority\";\n-    String CONFIG_APP_CONFIGFILE_KEY = \"app-config-file\";\n-\n-    String MULTICAST = \"multicast\";\n-\n-\n-    String DUBBO_IP_TO_REGISTRY = \"DUBBO_IP_TO_REGISTRY\";\n-\n-    String DUBBO_PORT_TO_REGISTRY = \"DUBBO_PORT_TO_REGISTRY\";\n-\n-\n-    String DUBBO_PORT_TO_BIND = \"DUBBO_PORT_TO_BIND\";\n-\n-    String SCOPE_NONE = \"none\";\n-\n-\n-    String ON_INVOKE_METHOD_KEY = \"oninvoke.method\";\n-\n-    String ON_RETURN_METHOD_KEY = \"onreturn.method\";\n-\n-    String ON_THROW_METHOD_KEY = \"onthrow.method\";\n-\n-    String ON_INVOKE_INSTANCE_KEY = \"oninvoke.instance\";\n-\n-    String ON_RETURN_INSTANCE_KEY = \"onreturn.instance\";\n-\n-    String ON_THROW_INSTANCE_KEY = \"onthrow.instance\";\n-\n-\n-    // FIXME: is this still useful?\n-    String SHUTDOWN_TIMEOUT_KEY = \"shutdown.timeout\";\n-\n-\n-    String PROTOCOLS_SUFFIX = \"dubbo.protocols.\";\n-\n-\n-    String REGISTRIES_SUFFIX = \"dubbo.registries.\";\n-\n-    String ZOOKEEPER_PROTOCOL = \"zookeeper\";\n-\n-    String REGISTER_KEY = \"register\";\n-\n-    String IGNORE_CHECK_KEYS = \"ignoreCheckKeys\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.config;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public interface Constants {\r\n+\r\n+    String STATUS_KEY = \"status\";\r\n+\r\n+    String CONTEXTPATH_KEY = \"contextpath\";\r\n+\r\n+    String LISTENER_KEY = \"listener\";\r\n+\r\n+    String LAYER_KEY = \"layer\";\r\n+\r\n+    /**\r\n+     * General\r\n+     */\r\n+    /**\r\n+     * Application name;\r\n+     */\r\n+    String NAME = \"name\";\r\n+\r\n+    /**\r\n+     * Application owner name;\r\n+     */\r\n+    String OWNER = \"owner\";\r\n+\r\n+    /**\r\n+     * Running application organization name.\r\n+     */\r\n+    String ORGANIZATION = \"organization\";\r\n+\r\n+    /**\r\n+     * Application architecture name.\r\n+     */\r\n+    String ARCHITECTURE = \"architecture\";\r\n+\r\n+    /**\r\n+     * Environment name\r\n+     */\r\n+    String ENVIRONMENT = \"environment\";\r\n+\r\n+    /**\r\n+     * Test environment key.\r\n+     */\r\n+    String TEST_ENVIRONMENT = \"test\";\r\n+\r\n+    /**\r\n+     * Development environment key.\r\n+     */\r\n+    String DEVELOPMENT_ENVIRONMENT = \"develop\";\r\n+\r\n+    /**\r\n+     * Production environment key.\r\n+     */\r\n+    String PRODUCTION_ENVIRONMENT = \"product\";\r\n+\r\n+    String CONFIG_CONFIGFILE_KEY = \"config-file\";\r\n+    String CONFIG_ENABLE_KEY = \"highest-priority\";\r\n+    String CONFIG_APP_CONFIGFILE_KEY = \"app-config-file\";\r\n+\r\n+    String MULTICAST = \"multicast\";\r\n+\r\n+\r\n+    String DUBBO_IP_TO_REGISTRY = \"DUBBO_IP_TO_REGISTRY\";\r\n+\r\n+    String DUBBO_PORT_TO_REGISTRY = \"DUBBO_PORT_TO_REGISTRY\";\r\n+\r\n+\r\n+    String DUBBO_PORT_TO_BIND = \"DUBBO_PORT_TO_BIND\";\r\n+\r\n+    String SCOPE_NONE = \"none\";\r\n+\r\n+\r\n+    String ON_INVOKE_METHOD_KEY = \"oninvoke.method\";\r\n+\r\n+    String ON_RETURN_METHOD_KEY = \"onreturn.method\";\r\n+\r\n+    String ON_THROW_METHOD_KEY = \"onthrow.method\";\r\n+\r\n+    String ON_INVOKE_INSTANCE_KEY = \"oninvoke.instance\";\r\n+\r\n+    String ON_RETURN_INSTANCE_KEY = \"onreturn.instance\";\r\n+\r\n+    String ON_THROW_INSTANCE_KEY = \"onthrow.instance\";\r\n+\r\n+\r\n+    // FIXME: is this still useful?\r\n+    String SHUTDOWN_TIMEOUT_KEY = \"shutdown.timeout\";\r\n+\r\n+\r\n+    String PROTOCOLS_SUFFIX = \"dubbo.protocols.\";\r\n+\r\n+\r\n+    String REGISTRIES_SUFFIX = \"dubbo.registries.\";\r\n+\r\n+    String ZOOKEEPER_PROTOCOL = \"zookeeper\";\r\n+\r\n+    String REGISTER_KEY = \"register\";\r\n+\r\n+    String IGNORE_CHECK_KEYS = \"ignoreCheckKeys\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ConsumerConfig.java", "source2": "org/apache/dubbo/config/ConsumerConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,135 +1,135 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-/**\n- * The service consumer default configuration\n- *\n- * @export\n- */\n-public class ConsumerConfig extends AbstractReferenceConfig {\n-\n-    private static final long serialVersionUID = 2827274711143680600L;\n-\n-    /**\n-     * Whether to use the default protocol\n-     */\n-    private Boolean isDefault;\n-\n-    /**\n-     * Networking framework client uses: netty, mina, etc.\n-     */\n-    private String client;\n-\n-    /**\n-     * Consumer thread pool type: cached, fixed, limit, eager\n-     */\n-    private String threadpool;\n-\n-    /**\n-     * Consumer threadpool core thread size\n-     */\n-    private Integer corethreads;\n-\n-    /**\n-     * Consumer threadpool thread size\n-     */\n-    private Integer threads;\n-\n-    /**\n-     * Consumer threadpool queue size\n-     */\n-    private Integer queues;\n-\n-    /**\n-     * By default, a TCP long-connection communication is shared between the consumer process and the provider process.\n-     * This property can be set to share multiple TCP long-connection communications. Note that only the dubbo protocol takes effect.\n-     */\n-    private Integer shareconnections;\n-\n-    @Override\n-    public void setTimeout(Integer timeout) {\n-        super.setTimeout(timeout);\n-        String rmiTimeout = System.getProperty(\"sun.rmi.transport.tcp.responseTimeout\");\n-        if (timeout != null && timeout > 0\n-                && (StringUtils.isEmpty(rmiTimeout))) {\n-            System.setProperty(\"sun.rmi.transport.tcp.responseTimeout\", String.valueOf(timeout));\n-        }\n-    }\n-\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    public String getClient() {\n-        return client;\n-    }\n-\n-    public void setClient(String client) {\n-        this.client = client;\n-    }\n-\n-    public String getThreadpool() {\n-        return threadpool;\n-    }\n-\n-    public void setThreadpool(String threadpool) {\n-        this.threadpool = threadpool;\n-    }\n-\n-    public Boolean getDefault() {\n-        return isDefault;\n-    }\n-\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-    public Integer getCorethreads() {\n-        return corethreads;\n-    }\n-\n-    public void setCorethreads(Integer corethreads) {\n-        this.corethreads = corethreads;\n-    }\n-\n-    public Integer getThreads() {\n-        return threads;\n-    }\n-\n-    public void setThreads(Integer threads) {\n-        this.threads = threads;\n-    }\n-\n-    public Integer getQueues() {\n-        return queues;\n-    }\n-\n-    public void setQueues(Integer queues) {\n-        this.queues = queues;\n-    }\n-\n-    public Integer getShareconnections() {\n-        return shareconnections;\n-    }\n-\n-    public void setShareconnections(Integer shareconnections) {\n-        this.shareconnections = shareconnections;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+/**\r\n+ * The service consumer default configuration\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class ConsumerConfig extends AbstractReferenceConfig {\r\n+\r\n+    private static final long serialVersionUID = 2827274711143680600L;\r\n+\r\n+    /**\r\n+     * Whether to use the default protocol\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    /**\r\n+     * Networking framework client uses: netty, mina, etc.\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Consumer thread pool type: cached, fixed, limit, eager\r\n+     */\r\n+    private String threadpool;\r\n+\r\n+    /**\r\n+     * Consumer threadpool core thread size\r\n+     */\r\n+    private Integer corethreads;\r\n+\r\n+    /**\r\n+     * Consumer threadpool thread size\r\n+     */\r\n+    private Integer threads;\r\n+\r\n+    /**\r\n+     * Consumer threadpool queue size\r\n+     */\r\n+    private Integer queues;\r\n+\r\n+    /**\r\n+     * By default, a TCP long-connection communication is shared between the consumer process and the provider process.\r\n+     * This property can be set to share multiple TCP long-connection communications. Note that only the dubbo protocol takes effect.\r\n+     */\r\n+    private Integer shareconnections;\r\n+\r\n+    @Override\r\n+    public void setTimeout(Integer timeout) {\r\n+        super.setTimeout(timeout);\r\n+        String rmiTimeout = System.getProperty(\"sun.rmi.transport.tcp.responseTimeout\");\r\n+        if (timeout != null && timeout > 0\r\n+                && (StringUtils.isEmpty(rmiTimeout))) {\r\n+            System.setProperty(\"sun.rmi.transport.tcp.responseTimeout\", String.valueOf(timeout));\r\n+        }\r\n+    }\r\n+\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public String getClient() {\r\n+        return client;\r\n+    }\r\n+\r\n+    public void setClient(String client) {\r\n+        this.client = client;\r\n+    }\r\n+\r\n+    public String getThreadpool() {\r\n+        return threadpool;\r\n+    }\r\n+\r\n+    public void setThreadpool(String threadpool) {\r\n+        this.threadpool = threadpool;\r\n+    }\r\n+\r\n+    public Boolean getDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+    public Integer getCorethreads() {\r\n+        return corethreads;\r\n+    }\r\n+\r\n+    public void setCorethreads(Integer corethreads) {\r\n+        this.corethreads = corethreads;\r\n+    }\r\n+\r\n+    public Integer getThreads() {\r\n+        return threads;\r\n+    }\r\n+\r\n+    public void setThreads(Integer threads) {\r\n+        this.threads = threads;\r\n+    }\r\n+\r\n+    public Integer getQueues() {\r\n+        return queues;\r\n+    }\r\n+\r\n+    public void setQueues(Integer queues) {\r\n+        this.queues = queues;\r\n+    }\r\n+\r\n+    public Integer getShareconnections() {\r\n+        return shareconnections;\r\n+    }\r\n+\r\n+    public void setShareconnections(Integer shareconnections) {\r\n+        this.shareconnections = shareconnections;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/MetadataReportConfig.java", "source2": "org/apache/dubbo/config/MetadataReportConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,227 +1,227 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROPERTIES_CHAR_SEPARATOR;\n-import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\n-\n-/**\n- * MetadataReportConfig\n- *\n- * @export\n- */\n-public class MetadataReportConfig extends AbstractConfig {\n-\n-    private static final long serialVersionUID = 55233L;\n-    /**\n-     * the value is : metadata-report\n-     */\n-    private static final String PREFIX_TAG = StringUtils.camelToSplitName(\n-            MetadataReportConfig.class.getSimpleName().substring(0, MetadataReportConfig.class.getSimpleName().length() - 6), PROPERTIES_CHAR_SEPARATOR);\n-\n-    // Register center address\n-    private String address;\n-\n-    // Username to login register center\n-    private String username;\n-\n-    // Password to login register center\n-    private String password;\n-\n-    // Request timeout in milliseconds for register center\n-    private Integer timeout;\n-\n-    /**\n-     * The group the metadata in . It is the same as registry\n-     */\n-    private String group;\n-\n-    // Customized parameters\n-    private Map<String, String> parameters;\n-\n-    private Integer retryTimes;\n-\n-    private Integer retryPeriod;\n-    /**\n-     * By default the metadatastore will store full metadata repeatedly every day .\n-     */\n-    private Boolean cycleReport;\n-\n-    /**\n-     * Sync report, default async\n-     */\n-    private Boolean syncReport;\n-\n-    /**\n-     * cluster\n-     */\n-    private Boolean cluster;\n-\n-    /**\n-     * registry id\n-     */\n-    private String registry;\n-\n-    public MetadataReportConfig() {\n-    }\n-\n-    public MetadataReportConfig(String address) {\n-        setAddress(address);\n-    }\n-\n-    public URL toUrl() throws IllegalArgumentException {\n-        String address = this.getAddress();\n-        if (isEmpty(address)) {\n-            throw new IllegalArgumentException(\"The address of metadata report is invalid.\");\n-        }\n-        Map<String, String> map = new HashMap<String, String>();\n-        URL url = URL.valueOf(address);\n-        // Issue : https://github.com/apache/dubbo/issues/6491\n-        // Append the parameters from address\n-        map.putAll(url.getParameters());\n-        // Append or overrides the properties as parameters\n-        appendParameters(map, this);\n-        // Normalize the parameters\n-        map.putAll(convert(map, null));\n-        // put the protocol of URL as the \"metadata\"\n-        map.put(\"metadata\", url.getProtocol());\n-        return new URL(\"metadata\", url.getUsername(), url.getPassword(), url.getHost(),\n-                url.getPort(), url.getPath(), map);\n-\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getAddress() {\n-        return address;\n-    }\n-\n-    public void setAddress(String address) {\n-        this.address = address;\n-    }\n-\n-    public String getUsername() {\n-        return username;\n-    }\n-\n-    public void setUsername(String username) {\n-        this.username = username;\n-    }\n-\n-    public String getPassword() {\n-        return password;\n-    }\n-\n-    public void setPassword(String password) {\n-        this.password = password;\n-    }\n-\n-    public Integer getTimeout() {\n-        return timeout;\n-    }\n-\n-    public void setTimeout(Integer timeout) {\n-        this.timeout = timeout;\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-    @Parameter(key = \"retry-times\")\n-    public Integer getRetryTimes() {\n-        return retryTimes;\n-    }\n-\n-    public void setRetryTimes(Integer retryTimes) {\n-        this.retryTimes = retryTimes;\n-    }\n-\n-    @Parameter(key = \"retry-period\")\n-    public Integer getRetryPeriod() {\n-        return retryPeriod;\n-    }\n-\n-    public void setRetryPeriod(Integer retryPeriod) {\n-        this.retryPeriod = retryPeriod;\n-    }\n-\n-    @Parameter(key = \"cycle-report\")\n-    public Boolean getCycleReport() {\n-        return cycleReport;\n-    }\n-\n-    public void setCycleReport(Boolean cycleReport) {\n-        this.cycleReport = cycleReport;\n-    }\n-\n-    @Parameter(key = \"sync-report\")\n-    public Boolean getSyncReport() {\n-        return syncReport;\n-    }\n-\n-    public void setSyncReport(Boolean syncReport) {\n-        this.syncReport = syncReport;\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public String getPrefix() {\n-        return StringUtils.isNotEmpty(prefix) ? prefix : (DUBBO + \".\" + PREFIX_TAG);\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        return StringUtils.isNotEmpty(address);\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-    public Boolean getCluster() {\n-        return cluster;\n-    }\n-\n-    public void setCluster(Boolean cluster) {\n-        this.cluster = cluster;\n-    }\n-\n-    public String getRegistry() {\n-        return registry;\n-    }\n-\n-    public void setRegistry(String registry) {\n-        this.registry = registry;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROPERTIES_CHAR_SEPARATOR;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\r\n+\r\n+/**\r\n+ * MetadataReportConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class MetadataReportConfig extends AbstractConfig {\r\n+\r\n+    private static final long serialVersionUID = 55233L;\r\n+    /**\r\n+     * the value is : metadata-report\r\n+     */\r\n+    private static final String PREFIX_TAG = StringUtils.camelToSplitName(\r\n+            MetadataReportConfig.class.getSimpleName().substring(0, MetadataReportConfig.class.getSimpleName().length() - 6), PROPERTIES_CHAR_SEPARATOR);\r\n+\r\n+    // Register center address\r\n+    private String address;\r\n+\r\n+    // Username to login register center\r\n+    private String username;\r\n+\r\n+    // Password to login register center\r\n+    private String password;\r\n+\r\n+    // Request timeout in milliseconds for register center\r\n+    private Integer timeout;\r\n+\r\n+    /**\r\n+     * The group the metadata in . It is the same as registry\r\n+     */\r\n+    private String group;\r\n+\r\n+    // Customized parameters\r\n+    private Map<String, String> parameters;\r\n+\r\n+    private Integer retryTimes;\r\n+\r\n+    private Integer retryPeriod;\r\n+    /**\r\n+     * By default the metadatastore will store full metadata repeatedly every day .\r\n+     */\r\n+    private Boolean cycleReport;\r\n+\r\n+    /**\r\n+     * Sync report, default async\r\n+     */\r\n+    private Boolean syncReport;\r\n+\r\n+    /**\r\n+     * cluster\r\n+     */\r\n+    private Boolean cluster;\r\n+\r\n+    /**\r\n+     * registry id\r\n+     */\r\n+    private String registry;\r\n+\r\n+    public MetadataReportConfig() {\r\n+    }\r\n+\r\n+    public MetadataReportConfig(String address) {\r\n+        setAddress(address);\r\n+    }\r\n+\r\n+    public URL toUrl() throws IllegalArgumentException {\r\n+        String address = this.getAddress();\r\n+        if (isEmpty(address)) {\r\n+            throw new IllegalArgumentException(\"The address of metadata report is invalid.\");\r\n+        }\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        URL url = URL.valueOf(address);\r\n+        // Issue : https://github.com/apache/dubbo/issues/6491\r\n+        // Append the parameters from address\r\n+        map.putAll(url.getParameters());\r\n+        // Append or overrides the properties as parameters\r\n+        appendParameters(map, this);\r\n+        // Normalize the parameters\r\n+        map.putAll(convert(map, null));\r\n+        // put the protocol of URL as the \"metadata\"\r\n+        map.put(\"metadata\", url.getProtocol());\r\n+        return new URL(\"metadata\", url.getUsername(), url.getPassword(), url.getHost(),\r\n+                url.getPort(), url.getPath(), map);\r\n+\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getAddress() {\r\n+        return address;\r\n+    }\r\n+\r\n+    public void setAddress(String address) {\r\n+        this.address = address;\r\n+    }\r\n+\r\n+    public String getUsername() {\r\n+        return username;\r\n+    }\r\n+\r\n+    public void setUsername(String username) {\r\n+        this.username = username;\r\n+    }\r\n+\r\n+    public String getPassword() {\r\n+        return password;\r\n+    }\r\n+\r\n+    public void setPassword(String password) {\r\n+        this.password = password;\r\n+    }\r\n+\r\n+    public Integer getTimeout() {\r\n+        return timeout;\r\n+    }\r\n+\r\n+    public void setTimeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+    @Parameter(key = \"retry-times\")\r\n+    public Integer getRetryTimes() {\r\n+        return retryTimes;\r\n+    }\r\n+\r\n+    public void setRetryTimes(Integer retryTimes) {\r\n+        this.retryTimes = retryTimes;\r\n+    }\r\n+\r\n+    @Parameter(key = \"retry-period\")\r\n+    public Integer getRetryPeriod() {\r\n+        return retryPeriod;\r\n+    }\r\n+\r\n+    public void setRetryPeriod(Integer retryPeriod) {\r\n+        this.retryPeriod = retryPeriod;\r\n+    }\r\n+\r\n+    @Parameter(key = \"cycle-report\")\r\n+    public Boolean getCycleReport() {\r\n+        return cycleReport;\r\n+    }\r\n+\r\n+    public void setCycleReport(Boolean cycleReport) {\r\n+        this.cycleReport = cycleReport;\r\n+    }\r\n+\r\n+    @Parameter(key = \"sync-report\")\r\n+    public Boolean getSyncReport() {\r\n+        return syncReport;\r\n+    }\r\n+\r\n+    public void setSyncReport(Boolean syncReport) {\r\n+        this.syncReport = syncReport;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public String getPrefix() {\r\n+        return StringUtils.isNotEmpty(prefix) ? prefix : (DUBBO + \".\" + PREFIX_TAG);\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        return StringUtils.isNotEmpty(address);\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+    public Boolean getCluster() {\r\n+        return cluster;\r\n+    }\r\n+\r\n+    public void setCluster(Boolean cluster) {\r\n+        this.cluster = cluster;\r\n+    }\r\n+\r\n+    public String getRegistry() {\r\n+        return registry;\r\n+    }\r\n+\r\n+    public void setRegistry(String registry) {\r\n+        this.registry = registry;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/MethodConfig.java", "source2": "org/apache/dubbo/config/MethodConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,332 +1,332 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.constants.CommonConstants;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.annotation.Method;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.List;\n-\n-import static org.apache.dubbo.config.Constants.ON_INVOKE_INSTANCE_KEY;\n-import static org.apache.dubbo.config.Constants.ON_INVOKE_METHOD_KEY;\n-import static org.apache.dubbo.config.Constants.ON_RETURN_INSTANCE_KEY;\n-import static org.apache.dubbo.config.Constants.ON_RETURN_METHOD_KEY;\n-import static org.apache.dubbo.config.Constants.ON_THROW_INSTANCE_KEY;\n-import static org.apache.dubbo.config.Constants.ON_THROW_METHOD_KEY;\n-\n-/**\n- * The method configuration\n- *\n- * @export\n- */\n-public class MethodConfig extends AbstractMethodConfig {\n-\n-    private static final long serialVersionUID = 884908855422675941L;\n-\n-    /**\n-     * The method name\n-     */\n-    private String name;\n-\n-    /**\n-     * Stat\n-     */\n-    private Integer stat;\n-\n-    /**\n-     * Whether to retry\n-     */\n-    private Boolean retry;\n-\n-    /**\n-     * If it's reliable\n-     */\n-    private Boolean reliable;\n-\n-    /**\n-     * Thread limits for method invocations\n-     */\n-    private Integer executes;\n-\n-    /**\n-     * If it's deprecated\n-     */\n-    private Boolean deprecated;\n-\n-    /**\n-     * Whether to enable sticky\n-     */\n-    private Boolean sticky;\n-\n-    /**\n-     * Whether need to return\n-     */\n-    private Boolean isReturn;\n-\n-    /**\n-     * Callback instance when async-call is invoked\n-     */\n-    private Object oninvoke;\n-\n-    /**\n-     * Callback method when async-call is invoked\n-     */\n-    private String oninvokeMethod;\n-\n-    /**\n-     * Callback instance when async-call is returned\n-     */\n-    private Object onreturn;\n-\n-    /**\n-     * Callback method when async-call is returned\n-     */\n-    private String onreturnMethod;\n-\n-    /**\n-     * Callback instance when async-call has exception thrown\n-     */\n-    private Object onthrow;\n-\n-    /**\n-     * Callback method when async-call has exception thrown\n-     */\n-    private String onthrowMethod;\n-\n-    /**\n-     * The method arguments\n-     */\n-    private List<ArgumentConfig> arguments;\n-\n-    /**\n-     * These properties come from MethodConfig's parent Config module, they will neither be collected directly from xml or API nor be delivered to url\n-     */\n-    private String service;\n-    private String serviceId;\n-\n-    @Parameter(excluded = true)\n-    public String getName() {\n-        return name;\n-    }\n-\n-    public MethodConfig() {\n-    }\n-\n-    public MethodConfig(Method method) {\n-        appendAnnotation(Method.class, method);\n-\n-        this.setReturn(method.isReturn());\n-\n-        if(!\"\".equals(method.oninvoke())){\n-            this.setOninvoke(method.oninvoke());\n-        }\n-        if(!\"\".equals(method.onreturn())){\n-            this.setOnreturn(method.onreturn());\n-        }\n-        if(!\"\".equals(method.onthrow())){\n-            this.setOnthrow(method.onthrow());\n-        }\n-\n-        if (method.arguments() != null && method.arguments().length != 0) {\n-            List<ArgumentConfig> argumentConfigs = new ArrayList<ArgumentConfig>(method.arguments().length);\n-            this.setArguments(argumentConfigs);\n-            for (int i = 0; i < method.arguments().length; i++) {\n-                ArgumentConfig argumentConfig = new ArgumentConfig(method.arguments()[i]);\n-                argumentConfigs.add(argumentConfig);\n-            }\n-        }\n-    }\n-\n-    public static List<MethodConfig> constructMethodConfig(Method[] methods) {\n-        if (methods != null && methods.length != 0) {\n-            List<MethodConfig> methodConfigs = new ArrayList<MethodConfig>(methods.length);\n-            for (int i = 0; i < methods.length; i++) {\n-                MethodConfig methodConfig = new MethodConfig(methods[i]);\n-                methodConfigs.add(methodConfig);\n-            }\n-            return methodConfigs;\n-        }\n-        return Collections.emptyList();\n-    }\n-\n-    public void setName(String name) {\n-        this.name = name;\n-        // FIXME, add id strategy in ConfigManager\n-//        if (StringUtils.isEmpty(id)) {\n-//            id = name;\n-//        }\n-    }\n-\n-    public Integer getStat() {\n-        return stat;\n-    }\n-\n-    @Deprecated\n-    public void setStat(Integer stat) {\n-        this.stat = stat;\n-    }\n-\n-    @Deprecated\n-    public Boolean isRetry() {\n-        return retry;\n-    }\n-\n-    @Deprecated\n-    public void setRetry(Boolean retry) {\n-        this.retry = retry;\n-    }\n-\n-    @Deprecated\n-    public Boolean isReliable() {\n-        return reliable;\n-    }\n-\n-    @Deprecated\n-    public void setReliable(Boolean reliable) {\n-        this.reliable = reliable;\n-    }\n-\n-    public Integer getExecutes() {\n-        return executes;\n-    }\n-\n-    public void setExecutes(Integer executes) {\n-        this.executes = executes;\n-    }\n-\n-    public Boolean getDeprecated() {\n-        return deprecated;\n-    }\n-\n-    public void setDeprecated(Boolean deprecated) {\n-        this.deprecated = deprecated;\n-    }\n-\n-    public List<ArgumentConfig> getArguments() {\n-        return arguments;\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public void setArguments(List<? extends ArgumentConfig> arguments) {\n-        this.arguments = (List<ArgumentConfig>) arguments;\n-    }\n-\n-    public Boolean getSticky() {\n-        return sticky;\n-    }\n-\n-    public void setSticky(Boolean sticky) {\n-        this.sticky = sticky;\n-    }\n-\n-    @Parameter(key = ON_RETURN_INSTANCE_KEY, excluded = true, attribute = true)\n-    public Object getOnreturn() {\n-        return onreturn;\n-    }\n-\n-    public void setOnreturn(Object onreturn) {\n-        this.onreturn = onreturn;\n-    }\n-\n-    @Parameter(key = ON_RETURN_METHOD_KEY, excluded = true, attribute = true)\n-    public String getOnreturnMethod() {\n-        return onreturnMethod;\n-    }\n-\n-    public void setOnreturnMethod(String onreturnMethod) {\n-        this.onreturnMethod = onreturnMethod;\n-    }\n-\n-    @Parameter(key = ON_THROW_INSTANCE_KEY, excluded = true, attribute = true)\n-    public Object getOnthrow() {\n-        return onthrow;\n-    }\n-\n-    public void setOnthrow(Object onthrow) {\n-        this.onthrow = onthrow;\n-    }\n-\n-    @Parameter(key = ON_THROW_METHOD_KEY, excluded = true, attribute = true)\n-    public String getOnthrowMethod() {\n-        return onthrowMethod;\n-    }\n-\n-    public void setOnthrowMethod(String onthrowMethod) {\n-        this.onthrowMethod = onthrowMethod;\n-    }\n-\n-    @Parameter(key = ON_INVOKE_INSTANCE_KEY, excluded = true, attribute = true)\n-    public Object getOninvoke() {\n-        return oninvoke;\n-    }\n-\n-    public void setOninvoke(Object oninvoke) {\n-        this.oninvoke = oninvoke;\n-    }\n-\n-    @Parameter(key = ON_INVOKE_METHOD_KEY, excluded = true, attribute = true)\n-    public String getOninvokeMethod() {\n-        return oninvokeMethod;\n-    }\n-\n-    public void setOninvokeMethod(String oninvokeMethod) {\n-        this.oninvokeMethod = oninvokeMethod;\n-    }\n-\n-    public Boolean isReturn() {\n-        return isReturn;\n-    }\n-\n-    public void setReturn(Boolean isReturn) {\n-        this.isReturn = isReturn;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getService() {\n-        return service;\n-    }\n-\n-    public void setService(String service) {\n-        this.service = service;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getServiceId() {\n-        return serviceId;\n-    }\n-\n-    public void setServiceId(String serviceId) {\n-        this.serviceId = serviceId;\n-    }\n-\n-    /**\n-     * service and name must not be null.\n-     *\n-     * @return\n-     */\n-    @Override\n-    @Parameter(excluded = true)\n-    public String getPrefix() {\n-        return CommonConstants.DUBBO + \".\" + service\n-                + (StringUtils.isEmpty(serviceId) ? \"\" : (\".\" + serviceId))\n-                + \".\" + getName();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.constants.CommonConstants;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.annotation.Method;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+\r\n+import static org.apache.dubbo.config.Constants.ON_INVOKE_INSTANCE_KEY;\r\n+import static org.apache.dubbo.config.Constants.ON_INVOKE_METHOD_KEY;\r\n+import static org.apache.dubbo.config.Constants.ON_RETURN_INSTANCE_KEY;\r\n+import static org.apache.dubbo.config.Constants.ON_RETURN_METHOD_KEY;\r\n+import static org.apache.dubbo.config.Constants.ON_THROW_INSTANCE_KEY;\r\n+import static org.apache.dubbo.config.Constants.ON_THROW_METHOD_KEY;\r\n+\r\n+/**\r\n+ * The method configuration\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class MethodConfig extends AbstractMethodConfig {\r\n+\r\n+    private static final long serialVersionUID = 884908855422675941L;\r\n+\r\n+    /**\r\n+     * The method name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * Stat\r\n+     */\r\n+    private Integer stat;\r\n+\r\n+    /**\r\n+     * Whether to retry\r\n+     */\r\n+    private Boolean retry;\r\n+\r\n+    /**\r\n+     * If it's reliable\r\n+     */\r\n+    private Boolean reliable;\r\n+\r\n+    /**\r\n+     * Thread limits for method invocations\r\n+     */\r\n+    private Integer executes;\r\n+\r\n+    /**\r\n+     * If it's deprecated\r\n+     */\r\n+    private Boolean deprecated;\r\n+\r\n+    /**\r\n+     * Whether to enable sticky\r\n+     */\r\n+    private Boolean sticky;\r\n+\r\n+    /**\r\n+     * Whether need to return\r\n+     */\r\n+    private Boolean isReturn;\r\n+\r\n+    /**\r\n+     * Callback instance when async-call is invoked\r\n+     */\r\n+    private Object oninvoke;\r\n+\r\n+    /**\r\n+     * Callback method when async-call is invoked\r\n+     */\r\n+    private String oninvokeMethod;\r\n+\r\n+    /**\r\n+     * Callback instance when async-call is returned\r\n+     */\r\n+    private Object onreturn;\r\n+\r\n+    /**\r\n+     * Callback method when async-call is returned\r\n+     */\r\n+    private String onreturnMethod;\r\n+\r\n+    /**\r\n+     * Callback instance when async-call has exception thrown\r\n+     */\r\n+    private Object onthrow;\r\n+\r\n+    /**\r\n+     * Callback method when async-call has exception thrown\r\n+     */\r\n+    private String onthrowMethod;\r\n+\r\n+    /**\r\n+     * The method arguments\r\n+     */\r\n+    private List<ArgumentConfig> arguments;\r\n+\r\n+    /**\r\n+     * These properties come from MethodConfig's parent Config module, they will neither be collected directly from xml or API nor be delivered to url\r\n+     */\r\n+    private String service;\r\n+    private String serviceId;\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getName() {\r\n+        return name;\r\n+    }\r\n+\r\n+    public MethodConfig() {\r\n+    }\r\n+\r\n+    public MethodConfig(Method method) {\r\n+        appendAnnotation(Method.class, method);\r\n+\r\n+        this.setReturn(method.isReturn());\r\n+\r\n+        if(!\"\".equals(method.oninvoke())){\r\n+            this.setOninvoke(method.oninvoke());\r\n+        }\r\n+        if(!\"\".equals(method.onreturn())){\r\n+            this.setOnreturn(method.onreturn());\r\n+        }\r\n+        if(!\"\".equals(method.onthrow())){\r\n+            this.setOnthrow(method.onthrow());\r\n+        }\r\n+\r\n+        if (method.arguments() != null && method.arguments().length != 0) {\r\n+            List<ArgumentConfig> argumentConfigs = new ArrayList<ArgumentConfig>(method.arguments().length);\r\n+            this.setArguments(argumentConfigs);\r\n+            for (int i = 0; i < method.arguments().length; i++) {\r\n+                ArgumentConfig argumentConfig = new ArgumentConfig(method.arguments()[i]);\r\n+                argumentConfigs.add(argumentConfig);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static List<MethodConfig> constructMethodConfig(Method[] methods) {\r\n+        if (methods != null && methods.length != 0) {\r\n+            List<MethodConfig> methodConfigs = new ArrayList<MethodConfig>(methods.length);\r\n+            for (int i = 0; i < methods.length; i++) {\r\n+                MethodConfig methodConfig = new MethodConfig(methods[i]);\r\n+                methodConfigs.add(methodConfig);\r\n+            }\r\n+            return methodConfigs;\r\n+        }\r\n+        return Collections.emptyList();\r\n+    }\r\n+\r\n+    public void setName(String name) {\r\n+        this.name = name;\r\n+        // FIXME, add id strategy in ConfigManager\r\n+//        if (StringUtils.isEmpty(id)) {\r\n+//            id = name;\r\n+//        }\r\n+    }\r\n+\r\n+    public Integer getStat() {\r\n+        return stat;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setStat(Integer stat) {\r\n+        this.stat = stat;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public Boolean isRetry() {\r\n+        return retry;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setRetry(Boolean retry) {\r\n+        this.retry = retry;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public Boolean isReliable() {\r\n+        return reliable;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setReliable(Boolean reliable) {\r\n+        this.reliable = reliable;\r\n+    }\r\n+\r\n+    public Integer getExecutes() {\r\n+        return executes;\r\n+    }\r\n+\r\n+    public void setExecutes(Integer executes) {\r\n+        this.executes = executes;\r\n+    }\r\n+\r\n+    public Boolean getDeprecated() {\r\n+        return deprecated;\r\n+    }\r\n+\r\n+    public void setDeprecated(Boolean deprecated) {\r\n+        this.deprecated = deprecated;\r\n+    }\r\n+\r\n+    public List<ArgumentConfig> getArguments() {\r\n+        return arguments;\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public void setArguments(List<? extends ArgumentConfig> arguments) {\r\n+        this.arguments = (List<ArgumentConfig>) arguments;\r\n+    }\r\n+\r\n+    public Boolean getSticky() {\r\n+        return sticky;\r\n+    }\r\n+\r\n+    public void setSticky(Boolean sticky) {\r\n+        this.sticky = sticky;\r\n+    }\r\n+\r\n+    @Parameter(key = ON_RETURN_INSTANCE_KEY, excluded = true, attribute = true)\r\n+    public Object getOnreturn() {\r\n+        return onreturn;\r\n+    }\r\n+\r\n+    public void setOnreturn(Object onreturn) {\r\n+        this.onreturn = onreturn;\r\n+    }\r\n+\r\n+    @Parameter(key = ON_RETURN_METHOD_KEY, excluded = true, attribute = true)\r\n+    public String getOnreturnMethod() {\r\n+        return onreturnMethod;\r\n+    }\r\n+\r\n+    public void setOnreturnMethod(String onreturnMethod) {\r\n+        this.onreturnMethod = onreturnMethod;\r\n+    }\r\n+\r\n+    @Parameter(key = ON_THROW_INSTANCE_KEY, excluded = true, attribute = true)\r\n+    public Object getOnthrow() {\r\n+        return onthrow;\r\n+    }\r\n+\r\n+    public void setOnthrow(Object onthrow) {\r\n+        this.onthrow = onthrow;\r\n+    }\r\n+\r\n+    @Parameter(key = ON_THROW_METHOD_KEY, excluded = true, attribute = true)\r\n+    public String getOnthrowMethod() {\r\n+        return onthrowMethod;\r\n+    }\r\n+\r\n+    public void setOnthrowMethod(String onthrowMethod) {\r\n+        this.onthrowMethod = onthrowMethod;\r\n+    }\r\n+\r\n+    @Parameter(key = ON_INVOKE_INSTANCE_KEY, excluded = true, attribute = true)\r\n+    public Object getOninvoke() {\r\n+        return oninvoke;\r\n+    }\r\n+\r\n+    public void setOninvoke(Object oninvoke) {\r\n+        this.oninvoke = oninvoke;\r\n+    }\r\n+\r\n+    @Parameter(key = ON_INVOKE_METHOD_KEY, excluded = true, attribute = true)\r\n+    public String getOninvokeMethod() {\r\n+        return oninvokeMethod;\r\n+    }\r\n+\r\n+    public void setOninvokeMethod(String oninvokeMethod) {\r\n+        this.oninvokeMethod = oninvokeMethod;\r\n+    }\r\n+\r\n+    public Boolean isReturn() {\r\n+        return isReturn;\r\n+    }\r\n+\r\n+    public void setReturn(Boolean isReturn) {\r\n+        this.isReturn = isReturn;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getService() {\r\n+        return service;\r\n+    }\r\n+\r\n+    public void setService(String service) {\r\n+        this.service = service;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getServiceId() {\r\n+        return serviceId;\r\n+    }\r\n+\r\n+    public void setServiceId(String serviceId) {\r\n+        this.serviceId = serviceId;\r\n+    }\r\n+\r\n+    /**\r\n+     * service and name must not be null.\r\n+     *\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public String getPrefix() {\r\n+        return CommonConstants.DUBBO + \".\" + service\r\n+                + (StringUtils.isEmpty(serviceId) ? \"\" : (\".\" + serviceId))\r\n+                + \".\" + getName();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/MetricsConfig.java", "source2": "org/apache/dubbo/config/MetricsConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,53 +1,53 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PORT;\n-import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PROTOCOL;\n-\n-public class MetricsConfig extends AbstractConfig {\n-\n-    private static final long serialVersionUID = -9089919311611546383L;\n-\n-    private String port;\n-    private String protocol;\n-\n-    public MetricsConfig() {\n-    }\n-\n-    @Parameter(key = METRICS_PORT)\n-    public String getPort() {\n-        return port;\n-    }\n-\n-    public void setPort(String port) {\n-        this.port = port;\n-    }\n-\n-    @Parameter(key = METRICS_PROTOCOL)\n-    public String getProtocol() {\n-        return protocol;\n-    }\n-\n-    public void setProtocol(String protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PORT;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PROTOCOL;\r\n+\r\n+public class MetricsConfig extends AbstractConfig {\r\n+\r\n+    private static final long serialVersionUID = -9089919311611546383L;\r\n+\r\n+    private String port;\r\n+    private String protocol;\r\n+\r\n+    public MetricsConfig() {\r\n+    }\r\n+\r\n+    @Parameter(key = METRICS_PORT)\r\n+    public String getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    public void setPort(String port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    @Parameter(key = METRICS_PROTOCOL)\r\n+    public String getProtocol() {\r\n+        return protocol;\r\n+    }\r\n+\r\n+    public void setProtocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ModuleConfig.java", "source2": "org/apache/dubbo/config/ModuleConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,153 +1,153 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * The module info\n- *\n- * @export\n- */\n-public class ModuleConfig extends AbstractConfig {\n-\n-    private static final long serialVersionUID = 5508512956753757169L;\n-\n-    /**\n-     * Module name\n-     */\n-    private String name;\n-\n-    /**\n-     * Module version\n-     */\n-    private String version;\n-\n-    /**\n-     * Module owner\n-     */\n-    private String owner;\n-\n-    /**\n-     * Module's organization\n-     */\n-    private String organization;\n-\n-    /**\n-     * Registry centers\n-     */\n-    private List<RegistryConfig> registries;\n-\n-    /**\n-     * Monitor center\n-     */\n-    private MonitorConfig monitor;\n-\n-    /**\n-     * If it's default\n-     */\n-    private Boolean isDefault;\n-\n-    public ModuleConfig() {\n-    }\n-\n-    public ModuleConfig(String name) {\n-        setName(name);\n-    }\n-\n-    @Parameter(key = \"module\")\n-    public String getName() {\n-        return name;\n-    }\n-\n-    public void setName(String name) {\n-        this.name = name;\n-        if (StringUtils.isEmpty(id)) {\n-            id = name;\n-        }\n-    }\n-\n-    @Parameter(key = \"module.version\")\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public String getOwner() {\n-        return owner;\n-    }\n-\n-    public void setOwner(String owner) {\n-        this.owner = owner;\n-    }\n-\n-    public String getOrganization() {\n-        return organization;\n-    }\n-\n-    public void setOrganization(String organization) {\n-        this.organization = organization;\n-    }\n-\n-    public RegistryConfig getRegistry() {\n-        return CollectionUtils.isEmpty(registries) ? null : registries.get(0);\n-    }\n-\n-    public void setRegistry(RegistryConfig registry) {\n-        List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);\n-        registries.add(registry);\n-        this.registries = registries;\n-    }\n-\n-    public List<RegistryConfig> getRegistries() {\n-        return registries;\n-    }\n-\n-    @SuppressWarnings({\"unchecked\"})\n-    public void setRegistries(List<? extends RegistryConfig> registries) {\n-        this.registries = (List<RegistryConfig>) registries;\n-    }\n-\n-    public MonitorConfig getMonitor() {\n-        return monitor;\n-    }\n-\n-    public void setMonitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-    }\n-\n-    public void setMonitor(String monitor) {\n-        this.monitor = new MonitorConfig(monitor);\n-    }\n-\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The module info\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class ModuleConfig extends AbstractConfig {\r\n+\r\n+    private static final long serialVersionUID = 5508512956753757169L;\r\n+\r\n+    /**\r\n+     * Module name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * Module version\r\n+     */\r\n+    private String version;\r\n+\r\n+    /**\r\n+     * Module owner\r\n+     */\r\n+    private String owner;\r\n+\r\n+    /**\r\n+     * Module's organization\r\n+     */\r\n+    private String organization;\r\n+\r\n+    /**\r\n+     * Registry centers\r\n+     */\r\n+    private List<RegistryConfig> registries;\r\n+\r\n+    /**\r\n+     * Monitor center\r\n+     */\r\n+    private MonitorConfig monitor;\r\n+\r\n+    /**\r\n+     * If it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    public ModuleConfig() {\r\n+    }\r\n+\r\n+    public ModuleConfig(String name) {\r\n+        setName(name);\r\n+    }\r\n+\r\n+    @Parameter(key = \"module\")\r\n+    public String getName() {\r\n+        return name;\r\n+    }\r\n+\r\n+    public void setName(String name) {\r\n+        this.name = name;\r\n+        if (StringUtils.isEmpty(id)) {\r\n+            id = name;\r\n+        }\r\n+    }\r\n+\r\n+    @Parameter(key = \"module.version\")\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public String getOwner() {\r\n+        return owner;\r\n+    }\r\n+\r\n+    public void setOwner(String owner) {\r\n+        this.owner = owner;\r\n+    }\r\n+\r\n+    public String getOrganization() {\r\n+        return organization;\r\n+    }\r\n+\r\n+    public void setOrganization(String organization) {\r\n+        this.organization = organization;\r\n+    }\r\n+\r\n+    public RegistryConfig getRegistry() {\r\n+        return CollectionUtils.isEmpty(registries) ? null : registries.get(0);\r\n+    }\r\n+\r\n+    public void setRegistry(RegistryConfig registry) {\r\n+        List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);\r\n+        registries.add(registry);\r\n+        this.registries = registries;\r\n+    }\r\n+\r\n+    public List<RegistryConfig> getRegistries() {\r\n+        return registries;\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\"})\r\n+    public void setRegistries(List<? extends RegistryConfig> registries) {\r\n+        this.registries = (List<RegistryConfig>) registries;\r\n+    }\r\n+\r\n+    public MonitorConfig getMonitor() {\r\n+        return monitor;\r\n+    }\r\n+\r\n+    public void setMonitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+    }\r\n+\r\n+    public void setMonitor(String monitor) {\r\n+        this.monitor = new MonitorConfig(monitor);\r\n+    }\r\n+\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/MonitorConfig.java", "source2": "org/apache/dubbo/config/MonitorConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,160 +1,160 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.constants.RegistryConstants;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.Map;\n-\n-/**\n- * MonitorConfig\n- *\n- * @export\n- */\n-public class MonitorConfig extends AbstractConfig {\n-\n-    private static final long serialVersionUID = -1184681514659198203L;\n-\n-    /**\n-     * The protocol of the monitor, if the value is registry, it will search the monitor address from the registry center,\n-     * otherwise, it will directly connect to the monitor center\n-     */\n-    private String protocol;\n-\n-    /**\n-     * The monitor address\n-     */\n-    private String address;\n-\n-    /**\n-     * The monitor user name\n-     */\n-    private String username;\n-\n-    /**\n-     * The password\n-     */\n-    private String password;\n-\n-    private String group;\n-\n-    private String version;\n-\n-    private String interval;\n-\n-    /**\n-     * customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * If it's default\n-     */\n-    private Boolean isDefault;\n-\n-    public MonitorConfig() {\n-    }\n-\n-    public MonitorConfig(String address) {\n-        this.address = address;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getAddress() {\n-        return address;\n-    }\n-\n-    public void setAddress(String address) {\n-        this.address = address;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getProtocol() {\n-        return protocol;\n-    }\n-\n-    public void setProtocol(String protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getUsername() {\n-        return username;\n-    }\n-\n-    public void setUsername(String username) {\n-        this.username = username;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getPassword() {\n-        return password;\n-    }\n-\n-    public void setPassword(String password) {\n-        this.password = password;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-    public String getInterval() {\n-        return interval;\n-    }\n-\n-    public void setInterval(String interval) {\n-        this.interval = interval;\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        return StringUtils.isNotEmpty(address) || RegistryConstants.REGISTRY_PROTOCOL.equals(protocol);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.constants.RegistryConstants;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * MonitorConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class MonitorConfig extends AbstractConfig {\r\n+\r\n+    private static final long serialVersionUID = -1184681514659198203L;\r\n+\r\n+    /**\r\n+     * The protocol of the monitor, if the value is registry, it will search the monitor address from the registry center,\r\n+     * otherwise, it will directly connect to the monitor center\r\n+     */\r\n+    private String protocol;\r\n+\r\n+    /**\r\n+     * The monitor address\r\n+     */\r\n+    private String address;\r\n+\r\n+    /**\r\n+     * The monitor user name\r\n+     */\r\n+    private String username;\r\n+\r\n+    /**\r\n+     * The password\r\n+     */\r\n+    private String password;\r\n+\r\n+    private String group;\r\n+\r\n+    private String version;\r\n+\r\n+    private String interval;\r\n+\r\n+    /**\r\n+     * customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * If it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    public MonitorConfig() {\r\n+    }\r\n+\r\n+    public MonitorConfig(String address) {\r\n+        this.address = address;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getAddress() {\r\n+        return address;\r\n+    }\r\n+\r\n+    public void setAddress(String address) {\r\n+        this.address = address;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getProtocol() {\r\n+        return protocol;\r\n+    }\r\n+\r\n+    public void setProtocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getUsername() {\r\n+        return username;\r\n+    }\r\n+\r\n+    public void setUsername(String username) {\r\n+        this.username = username;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getPassword() {\r\n+        return password;\r\n+    }\r\n+\r\n+    public void setPassword(String password) {\r\n+        this.password = password;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+    public String getInterval() {\r\n+        return interval;\r\n+    }\r\n+\r\n+    public void setInterval(String interval) {\r\n+        this.interval = interval;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        return StringUtils.isNotEmpty(address) || RegistryConstants.REGISTRY_PROTOCOL.equals(protocol);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ProtocolConfig.java", "source2": "org/apache/dubbo/config/ProtocolConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,598 +1,598 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SSL_ENABLED_KEY;\n-import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX;\n-\n-/**\n- * ProtocolConfig\n- *\n- * @export\n- */\n-public class ProtocolConfig extends AbstractConfig {\n-\n-    private static final long serialVersionUID = 6913423882496634749L;\n-\n-    /**\n-     * Protocol name\n-     */\n-    private String name;\n-\n-    /**\n-     * Service ip address (when there are multiple network cards available)\n-     */\n-    private String host;\n-\n-    /**\n-     * Service port\n-     */\n-    private Integer port;\n-\n-    /**\n-     * Context path\n-     */\n-    private String contextpath;\n-\n-    /**\n-     * Thread pool\n-     */\n-    private String threadpool;\n-\n-    /**\n-     * Thread pool name\n-     */\n-    private String threadname;\n-\n-    /**\n-     * Thread pool core thread size\n-     */\n-    private Integer corethreads;\n-\n-    /**\n-     * Thread pool size (fixed size)\n-     */\n-    private Integer threads;\n-\n-    /**\n-     * IO thread pool size (fixed size)\n-     */\n-    private Integer iothreads;\n-\n-    /**\n-     * Thread pool keepAliveTime, default unit TimeUnit.MILLISECONDS\n-     */\n-    private Integer alive;\n-\n-    /**\n-     * Thread pool's queue length\n-     */\n-    private Integer queues;\n-\n-    /**\n-     * Max acceptable connections\n-     */\n-    private Integer accepts;\n-\n-    /**\n-     * Protocol codec\n-     */\n-    private String codec;\n-\n-    /**\n-     * Serialization\n-     */\n-    private String serialization;\n-\n-    /**\n-     * Charset\n-     */\n-    private String charset;\n-\n-    /**\n-     * Payload max length\n-     */\n-    private Integer payload;\n-\n-    /**\n-     * Buffer size\n-     */\n-    private Integer buffer;\n-\n-    /**\n-     * Heartbeat interval\n-     */\n-    private Integer heartbeat;\n-\n-    /**\n-     * Access log\n-     */\n-    private String accesslog;\n-\n-    /**\n-     * Transporter\n-     */\n-    private String transporter;\n-\n-    /**\n-     * How information is exchanged\n-     */\n-    private String exchanger;\n-\n-    /**\n-     * Thread dispatch mode\n-     */\n-    private String dispatcher;\n-\n-    /**\n-     * Networker\n-     */\n-    private String networker;\n-\n-    /**\n-     * Sever impl\n-     */\n-    private String server;\n-\n-    /**\n-     * Client impl\n-     */\n-    private String client;\n-\n-    /**\n-     * Supported telnet commands, separated with comma.\n-     */\n-    private String telnet;\n-\n-    /**\n-     * Command line prompt\n-     */\n-    private String prompt;\n-\n-    /**\n-     * Status check\n-     */\n-    private String status;\n-\n-    /**\n-     * Whether to register\n-     */\n-    private Boolean register;\n-\n-    /**\n-     * whether it is a persistent connection\n-     */\n-    //TODO add this to provider config\n-    private Boolean keepAlive;\n-\n-    // TODO add this to provider config\n-    private String optimizer;\n-\n-    /**\n-     * The extension\n-     */\n-    private String extension;\n-\n-    /**\n-     * The customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * If it's default\n-     */\n-    private Boolean isDefault;\n-\n-    private Boolean sslEnabled;\n-\n-    public ProtocolConfig() {\n-    }\n-\n-    public ProtocolConfig(String name) {\n-        setName(name);\n-    }\n-\n-    public ProtocolConfig(String name, int port) {\n-        setName(name);\n-        setPort(port);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getName() {\n-        return name;\n-    }\n-\n-    public final void setName(String name) {\n-        this.name = name;\n-        this.updateIdIfAbsent(name);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getHost() {\n-        return host;\n-    }\n-\n-    public void setHost(String host) {\n-        this.host = host;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public Integer getPort() {\n-        return port;\n-    }\n-\n-    public final void setPort(Integer port) {\n-        this.port = port;\n-    }\n-\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public String getPath() {\n-        return getContextpath();\n-    }\n-\n-    @Deprecated\n-    public void setPath(String path) {\n-        setContextpath(path);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getContextpath() {\n-        return contextpath;\n-    }\n-\n-    public void setContextpath(String contextpath) {\n-        this.contextpath = contextpath;\n-    }\n-\n-    public String getThreadpool() {\n-        return threadpool;\n-    }\n-\n-    public void setThreadpool(String threadpool) {\n-        this.threadpool = threadpool;\n-    }\n-\n-    public String getThreadname() {\n-        return threadname;\n-    }\n-\n-    public void setThreadname(String threadname) {\n-        this.threadname = threadname;\n-    }\n-\n-    public Integer getCorethreads() {\n-        return corethreads;\n-    }\n-\n-    public void setCorethreads(Integer corethreads) {\n-        this.corethreads = corethreads;\n-    }\n-\n-    public Integer getThreads() {\n-        return threads;\n-    }\n-\n-    public void setThreads(Integer threads) {\n-        this.threads = threads;\n-    }\n-\n-    public Integer getIothreads() {\n-        return iothreads;\n-    }\n-\n-    public void setIothreads(Integer iothreads) {\n-        this.iothreads = iothreads;\n-    }\n-\n-    public Integer getAlive() {\n-        return alive;\n-    }\n-\n-    public void setAlive(Integer alive) {\n-        this.alive = alive;\n-    }\n-\n-    public Integer getQueues() {\n-        return queues;\n-    }\n-\n-    public void setQueues(Integer queues) {\n-        this.queues = queues;\n-    }\n-\n-    public Integer getAccepts() {\n-        return accepts;\n-    }\n-\n-    public void setAccepts(Integer accepts) {\n-        this.accepts = accepts;\n-    }\n-\n-    public String getCodec() {\n-        return codec;\n-    }\n-\n-    public void setCodec(String codec) {\n-        this.codec = codec;\n-    }\n-\n-    public String getSerialization() {\n-        return serialization;\n-    }\n-\n-    public void setSerialization(String serialization) {\n-        this.serialization = serialization;\n-    }\n-\n-    public String getCharset() {\n-        return charset;\n-    }\n-\n-    public void setCharset(String charset) {\n-        this.charset = charset;\n-    }\n-\n-    public Integer getPayload() {\n-        return payload;\n-    }\n-\n-    public void setPayload(Integer payload) {\n-        this.payload = payload;\n-    }\n-\n-    public Integer getBuffer() {\n-        return buffer;\n-    }\n-\n-    public void setBuffer(Integer buffer) {\n-        this.buffer = buffer;\n-    }\n-\n-    public Integer getHeartbeat() {\n-        return heartbeat;\n-    }\n-\n-    public void setHeartbeat(Integer heartbeat) {\n-        this.heartbeat = heartbeat;\n-    }\n-\n-    public String getServer() {\n-        return server;\n-    }\n-\n-    public void setServer(String server) {\n-        this.server = server;\n-    }\n-\n-    public String getClient() {\n-        return client;\n-    }\n-\n-    public void setClient(String client) {\n-        this.client = client;\n-    }\n-\n-    public String getAccesslog() {\n-        return accesslog;\n-    }\n-\n-    public void setAccesslog(String accesslog) {\n-        this.accesslog = accesslog;\n-    }\n-\n-    public String getTelnet() {\n-        return telnet;\n-    }\n-\n-    public void setTelnet(String telnet) {\n-        this.telnet = telnet;\n-    }\n-\n-    @Parameter(escaped = true)\n-    public String getPrompt() {\n-        return prompt;\n-    }\n-\n-    public void setPrompt(String prompt) {\n-        this.prompt = prompt;\n-    }\n-\n-    public String getStatus() {\n-        return status;\n-    }\n-\n-    public void setStatus(String status) {\n-        this.status = status;\n-    }\n-\n-    public Boolean isRegister() {\n-        return register;\n-    }\n-\n-    public void setRegister(Boolean register) {\n-        this.register = register;\n-    }\n-\n-    public String getTransporter() {\n-        return transporter;\n-    }\n-\n-    public void setTransporter(String transporter) {\n-        this.transporter = transporter;\n-    }\n-\n-    public String getExchanger() {\n-        return exchanger;\n-    }\n-\n-    public void setExchanger(String exchanger) {\n-        this.exchanger = exchanger;\n-    }\n-\n-    /**\n-     * typo, switch to use {@link #getDispatcher()}\n-     *\n-     * @deprecated {@link #getDispatcher()}\n-     */\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public String getDispather() {\n-        return getDispatcher();\n-    }\n-\n-    /**\n-     * typo, switch to use {@link #getDispatcher()}\n-     *\n-     * @deprecated {@link #setDispatcher(String)}\n-     */\n-    @Deprecated\n-    public void setDispather(String dispather) {\n-        setDispatcher(dispather);\n-    }\n-\n-    public String getDispatcher() {\n-        return dispatcher;\n-    }\n-\n-    public void setDispatcher(String dispatcher) {\n-        this.dispatcher = dispatcher;\n-    }\n-\n-    public String getNetworker() {\n-        return networker;\n-    }\n-\n-    public void setNetworker(String networker) {\n-        this.networker = networker;\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-    @Parameter(key = SSL_ENABLED_KEY)\n-    public Boolean getSslEnabled() {\n-        return sslEnabled;\n-    }\n-\n-    public void setSslEnabled(Boolean sslEnabled) {\n-        this.sslEnabled = sslEnabled;\n-    }\n-\n-    public Boolean getKeepAlive() {\n-        return keepAlive;\n-    }\n-\n-    public void setKeepAlive(Boolean keepAlive) {\n-        this.keepAlive = keepAlive;\n-    }\n-\n-    public String getOptimizer() {\n-        return optimizer;\n-    }\n-\n-    public void setOptimizer(String optimizer) {\n-        this.optimizer = optimizer;\n-    }\n-\n-    public String getExtension() {\n-        return extension;\n-    }\n-\n-    public void setExtension(String extension) {\n-        this.extension = extension;\n-    }\n-\n-    @Override\n-    public void refresh() {\n-        if (StringUtils.isEmpty(this.getName())) {\n-            this.setName(DUBBO_VERSION_KEY);\n-        }\n-        super.refresh();\n-        if (StringUtils.isNotEmpty(this.getId())) {\n-            this.setPrefix(PROTOCOLS_SUFFIX);\n-            super.refresh();\n-        }\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        return StringUtils.isNotEmpty(name);\n-    }\n-\n-    @Override\n-    public String toString() {\n-        final StringBuilder sb = new StringBuilder(\"ProtocolConfig{\");\n-        sb.append(\"name='\").append(name).append('\\'');\n-        sb.append(\", host='\").append(host).append('\\'');\n-        sb.append(\", port=\").append(port);\n-        sb.append(\", contextpath='\").append(contextpath).append('\\'');\n-        sb.append(\", threadpool='\").append(threadpool).append('\\'');\n-        sb.append(\", threadname='\").append(threadname).append('\\'');\n-        sb.append(\", corethreads=\").append(corethreads);\n-        sb.append(\", threads=\").append(threads);\n-        sb.append(\", iothreads=\").append(iothreads);\n-        sb.append(\", alive=\").append(alive);\n-        sb.append(\", queues=\").append(queues);\n-        sb.append(\", accepts=\").append(accepts);\n-        sb.append(\", codec='\").append(codec).append('\\'');\n-        sb.append(\", serialization='\").append(serialization).append('\\'');\n-        sb.append(\", charset='\").append(charset).append('\\'');\n-        sb.append(\", payload=\").append(payload);\n-        sb.append(\", buffer=\").append(buffer);\n-        sb.append(\", heartbeat=\").append(heartbeat);\n-        sb.append(\", accesslog='\").append(accesslog).append('\\'');\n-        sb.append(\", transporter='\").append(transporter).append('\\'');\n-        sb.append(\", exchanger='\").append(exchanger).append('\\'');\n-        sb.append(\", dispatcher='\").append(dispatcher).append('\\'');\n-        sb.append(\", networker='\").append(networker).append('\\'');\n-        sb.append(\", server='\").append(server).append('\\'');\n-        sb.append(\", client='\").append(client).append('\\'');\n-        sb.append(\", telnet='\").append(telnet).append('\\'');\n-        sb.append(\", prompt='\").append(prompt).append('\\'');\n-        sb.append(\", status='\").append(status).append('\\'');\n-        sb.append(\", register=\").append(register);\n-        sb.append(\", keepAlive=\").append(keepAlive);\n-        sb.append(\", optimizer='\").append(optimizer).append('\\'');\n-        sb.append(\", extension='\").append(extension).append('\\'');\n-        sb.append(\", parameters=\").append(parameters);\n-        sb.append(\", isDefault=\").append(isDefault);\n-        sb.append(\", sslEnabled=\").append(sslEnabled);\n-        sb.append('}');\n-        return sb.toString();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SSL_ENABLED_KEY;\r\n+import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX;\r\n+\r\n+/**\r\n+ * ProtocolConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class ProtocolConfig extends AbstractConfig {\r\n+\r\n+    private static final long serialVersionUID = 6913423882496634749L;\r\n+\r\n+    /**\r\n+     * Protocol name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * Service ip address (when there are multiple network cards available)\r\n+     */\r\n+    private String host;\r\n+\r\n+    /**\r\n+     * Service port\r\n+     */\r\n+    private Integer port;\r\n+\r\n+    /**\r\n+     * Context path\r\n+     */\r\n+    private String contextpath;\r\n+\r\n+    /**\r\n+     * Thread pool\r\n+     */\r\n+    private String threadpool;\r\n+\r\n+    /**\r\n+     * Thread pool name\r\n+     */\r\n+    private String threadname;\r\n+\r\n+    /**\r\n+     * Thread pool core thread size\r\n+     */\r\n+    private Integer corethreads;\r\n+\r\n+    /**\r\n+     * Thread pool size (fixed size)\r\n+     */\r\n+    private Integer threads;\r\n+\r\n+    /**\r\n+     * IO thread pool size (fixed size)\r\n+     */\r\n+    private Integer iothreads;\r\n+\r\n+    /**\r\n+     * Thread pool keepAliveTime, default unit TimeUnit.MILLISECONDS\r\n+     */\r\n+    private Integer alive;\r\n+\r\n+    /**\r\n+     * Thread pool's queue length\r\n+     */\r\n+    private Integer queues;\r\n+\r\n+    /**\r\n+     * Max acceptable connections\r\n+     */\r\n+    private Integer accepts;\r\n+\r\n+    /**\r\n+     * Protocol codec\r\n+     */\r\n+    private String codec;\r\n+\r\n+    /**\r\n+     * Serialization\r\n+     */\r\n+    private String serialization;\r\n+\r\n+    /**\r\n+     * Charset\r\n+     */\r\n+    private String charset;\r\n+\r\n+    /**\r\n+     * Payload max length\r\n+     */\r\n+    private Integer payload;\r\n+\r\n+    /**\r\n+     * Buffer size\r\n+     */\r\n+    private Integer buffer;\r\n+\r\n+    /**\r\n+     * Heartbeat interval\r\n+     */\r\n+    private Integer heartbeat;\r\n+\r\n+    /**\r\n+     * Access log\r\n+     */\r\n+    private String accesslog;\r\n+\r\n+    /**\r\n+     * Transporter\r\n+     */\r\n+    private String transporter;\r\n+\r\n+    /**\r\n+     * How information is exchanged\r\n+     */\r\n+    private String exchanger;\r\n+\r\n+    /**\r\n+     * Thread dispatch mode\r\n+     */\r\n+    private String dispatcher;\r\n+\r\n+    /**\r\n+     * Networker\r\n+     */\r\n+    private String networker;\r\n+\r\n+    /**\r\n+     * Sever impl\r\n+     */\r\n+    private String server;\r\n+\r\n+    /**\r\n+     * Client impl\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Supported telnet commands, separated with comma.\r\n+     */\r\n+    private String telnet;\r\n+\r\n+    /**\r\n+     * Command line prompt\r\n+     */\r\n+    private String prompt;\r\n+\r\n+    /**\r\n+     * Status check\r\n+     */\r\n+    private String status;\r\n+\r\n+    /**\r\n+     * Whether to register\r\n+     */\r\n+    private Boolean register;\r\n+\r\n+    /**\r\n+     * whether it is a persistent connection\r\n+     */\r\n+    //TODO add this to provider config\r\n+    private Boolean keepAlive;\r\n+\r\n+    // TODO add this to provider config\r\n+    private String optimizer;\r\n+\r\n+    /**\r\n+     * The extension\r\n+     */\r\n+    private String extension;\r\n+\r\n+    /**\r\n+     * The customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * If it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    private Boolean sslEnabled;\r\n+\r\n+    public ProtocolConfig() {\r\n+    }\r\n+\r\n+    public ProtocolConfig(String name) {\r\n+        setName(name);\r\n+    }\r\n+\r\n+    public ProtocolConfig(String name, int port) {\r\n+        setName(name);\r\n+        setPort(port);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getName() {\r\n+        return name;\r\n+    }\r\n+\r\n+    public final void setName(String name) {\r\n+        this.name = name;\r\n+        this.updateIdIfAbsent(name);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getHost() {\r\n+        return host;\r\n+    }\r\n+\r\n+    public void setHost(String host) {\r\n+        this.host = host;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public Integer getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    public final void setPort(Integer port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public String getPath() {\r\n+        return getContextpath();\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setPath(String path) {\r\n+        setContextpath(path);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getContextpath() {\r\n+        return contextpath;\r\n+    }\r\n+\r\n+    public void setContextpath(String contextpath) {\r\n+        this.contextpath = contextpath;\r\n+    }\r\n+\r\n+    public String getThreadpool() {\r\n+        return threadpool;\r\n+    }\r\n+\r\n+    public void setThreadpool(String threadpool) {\r\n+        this.threadpool = threadpool;\r\n+    }\r\n+\r\n+    public String getThreadname() {\r\n+        return threadname;\r\n+    }\r\n+\r\n+    public void setThreadname(String threadname) {\r\n+        this.threadname = threadname;\r\n+    }\r\n+\r\n+    public Integer getCorethreads() {\r\n+        return corethreads;\r\n+    }\r\n+\r\n+    public void setCorethreads(Integer corethreads) {\r\n+        this.corethreads = corethreads;\r\n+    }\r\n+\r\n+    public Integer getThreads() {\r\n+        return threads;\r\n+    }\r\n+\r\n+    public void setThreads(Integer threads) {\r\n+        this.threads = threads;\r\n+    }\r\n+\r\n+    public Integer getIothreads() {\r\n+        return iothreads;\r\n+    }\r\n+\r\n+    public void setIothreads(Integer iothreads) {\r\n+        this.iothreads = iothreads;\r\n+    }\r\n+\r\n+    public Integer getAlive() {\r\n+        return alive;\r\n+    }\r\n+\r\n+    public void setAlive(Integer alive) {\r\n+        this.alive = alive;\r\n+    }\r\n+\r\n+    public Integer getQueues() {\r\n+        return queues;\r\n+    }\r\n+\r\n+    public void setQueues(Integer queues) {\r\n+        this.queues = queues;\r\n+    }\r\n+\r\n+    public Integer getAccepts() {\r\n+        return accepts;\r\n+    }\r\n+\r\n+    public void setAccepts(Integer accepts) {\r\n+        this.accepts = accepts;\r\n+    }\r\n+\r\n+    public String getCodec() {\r\n+        return codec;\r\n+    }\r\n+\r\n+    public void setCodec(String codec) {\r\n+        this.codec = codec;\r\n+    }\r\n+\r\n+    public String getSerialization() {\r\n+        return serialization;\r\n+    }\r\n+\r\n+    public void setSerialization(String serialization) {\r\n+        this.serialization = serialization;\r\n+    }\r\n+\r\n+    public String getCharset() {\r\n+        return charset;\r\n+    }\r\n+\r\n+    public void setCharset(String charset) {\r\n+        this.charset = charset;\r\n+    }\r\n+\r\n+    public Integer getPayload() {\r\n+        return payload;\r\n+    }\r\n+\r\n+    public void setPayload(Integer payload) {\r\n+        this.payload = payload;\r\n+    }\r\n+\r\n+    public Integer getBuffer() {\r\n+        return buffer;\r\n+    }\r\n+\r\n+    public void setBuffer(Integer buffer) {\r\n+        this.buffer = buffer;\r\n+    }\r\n+\r\n+    public Integer getHeartbeat() {\r\n+        return heartbeat;\r\n+    }\r\n+\r\n+    public void setHeartbeat(Integer heartbeat) {\r\n+        this.heartbeat = heartbeat;\r\n+    }\r\n+\r\n+    public String getServer() {\r\n+        return server;\r\n+    }\r\n+\r\n+    public void setServer(String server) {\r\n+        this.server = server;\r\n+    }\r\n+\r\n+    public String getClient() {\r\n+        return client;\r\n+    }\r\n+\r\n+    public void setClient(String client) {\r\n+        this.client = client;\r\n+    }\r\n+\r\n+    public String getAccesslog() {\r\n+        return accesslog;\r\n+    }\r\n+\r\n+    public void setAccesslog(String accesslog) {\r\n+        this.accesslog = accesslog;\r\n+    }\r\n+\r\n+    public String getTelnet() {\r\n+        return telnet;\r\n+    }\r\n+\r\n+    public void setTelnet(String telnet) {\r\n+        this.telnet = telnet;\r\n+    }\r\n+\r\n+    @Parameter(escaped = true)\r\n+    public String getPrompt() {\r\n+        return prompt;\r\n+    }\r\n+\r\n+    public void setPrompt(String prompt) {\r\n+        this.prompt = prompt;\r\n+    }\r\n+\r\n+    public String getStatus() {\r\n+        return status;\r\n+    }\r\n+\r\n+    public void setStatus(String status) {\r\n+        this.status = status;\r\n+    }\r\n+\r\n+    public Boolean isRegister() {\r\n+        return register;\r\n+    }\r\n+\r\n+    public void setRegister(Boolean register) {\r\n+        this.register = register;\r\n+    }\r\n+\r\n+    public String getTransporter() {\r\n+        return transporter;\r\n+    }\r\n+\r\n+    public void setTransporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+    }\r\n+\r\n+    public String getExchanger() {\r\n+        return exchanger;\r\n+    }\r\n+\r\n+    public void setExchanger(String exchanger) {\r\n+        this.exchanger = exchanger;\r\n+    }\r\n+\r\n+    /**\r\n+     * typo, switch to use {@link #getDispatcher()}\r\n+     *\r\n+     * @deprecated {@link #getDispatcher()}\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public String getDispather() {\r\n+        return getDispatcher();\r\n+    }\r\n+\r\n+    /**\r\n+     * typo, switch to use {@link #getDispatcher()}\r\n+     *\r\n+     * @deprecated {@link #setDispatcher(String)}\r\n+     */\r\n+    @Deprecated\r\n+    public void setDispather(String dispather) {\r\n+        setDispatcher(dispather);\r\n+    }\r\n+\r\n+    public String getDispatcher() {\r\n+        return dispatcher;\r\n+    }\r\n+\r\n+    public void setDispatcher(String dispatcher) {\r\n+        this.dispatcher = dispatcher;\r\n+    }\r\n+\r\n+    public String getNetworker() {\r\n+        return networker;\r\n+    }\r\n+\r\n+    public void setNetworker(String networker) {\r\n+        this.networker = networker;\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+    @Parameter(key = SSL_ENABLED_KEY)\r\n+    public Boolean getSslEnabled() {\r\n+        return sslEnabled;\r\n+    }\r\n+\r\n+    public void setSslEnabled(Boolean sslEnabled) {\r\n+        this.sslEnabled = sslEnabled;\r\n+    }\r\n+\r\n+    public Boolean getKeepAlive() {\r\n+        return keepAlive;\r\n+    }\r\n+\r\n+    public void setKeepAlive(Boolean keepAlive) {\r\n+        this.keepAlive = keepAlive;\r\n+    }\r\n+\r\n+    public String getOptimizer() {\r\n+        return optimizer;\r\n+    }\r\n+\r\n+    public void setOptimizer(String optimizer) {\r\n+        this.optimizer = optimizer;\r\n+    }\r\n+\r\n+    public String getExtension() {\r\n+        return extension;\r\n+    }\r\n+\r\n+    public void setExtension(String extension) {\r\n+        this.extension = extension;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void refresh() {\r\n+        if (StringUtils.isEmpty(this.getName())) {\r\n+            this.setName(DUBBO_VERSION_KEY);\r\n+        }\r\n+        super.refresh();\r\n+        if (StringUtils.isNotEmpty(this.getId())) {\r\n+            this.setPrefix(PROTOCOLS_SUFFIX);\r\n+            super.refresh();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        return StringUtils.isNotEmpty(name);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        final StringBuilder sb = new StringBuilder(\"ProtocolConfig{\");\r\n+        sb.append(\"name='\").append(name).append('\\'');\r\n+        sb.append(\", host='\").append(host).append('\\'');\r\n+        sb.append(\", port=\").append(port);\r\n+        sb.append(\", contextpath='\").append(contextpath).append('\\'');\r\n+        sb.append(\", threadpool='\").append(threadpool).append('\\'');\r\n+        sb.append(\", threadname='\").append(threadname).append('\\'');\r\n+        sb.append(\", corethreads=\").append(corethreads);\r\n+        sb.append(\", threads=\").append(threads);\r\n+        sb.append(\", iothreads=\").append(iothreads);\r\n+        sb.append(\", alive=\").append(alive);\r\n+        sb.append(\", queues=\").append(queues);\r\n+        sb.append(\", accepts=\").append(accepts);\r\n+        sb.append(\", codec='\").append(codec).append('\\'');\r\n+        sb.append(\", serialization='\").append(serialization).append('\\'');\r\n+        sb.append(\", charset='\").append(charset).append('\\'');\r\n+        sb.append(\", payload=\").append(payload);\r\n+        sb.append(\", buffer=\").append(buffer);\r\n+        sb.append(\", heartbeat=\").append(heartbeat);\r\n+        sb.append(\", accesslog='\").append(accesslog).append('\\'');\r\n+        sb.append(\", transporter='\").append(transporter).append('\\'');\r\n+        sb.append(\", exchanger='\").append(exchanger).append('\\'');\r\n+        sb.append(\", dispatcher='\").append(dispatcher).append('\\'');\r\n+        sb.append(\", networker='\").append(networker).append('\\'');\r\n+        sb.append(\", server='\").append(server).append('\\'');\r\n+        sb.append(\", client='\").append(client).append('\\'');\r\n+        sb.append(\", telnet='\").append(telnet).append('\\'');\r\n+        sb.append(\", prompt='\").append(prompt).append('\\'');\r\n+        sb.append(\", status='\").append(status).append('\\'');\r\n+        sb.append(\", register=\").append(register);\r\n+        sb.append(\", keepAlive=\").append(keepAlive);\r\n+        sb.append(\", optimizer='\").append(optimizer).append('\\'');\r\n+        sb.append(\", extension='\").append(extension).append('\\'');\r\n+        sb.append(\", parameters=\").append(parameters);\r\n+        sb.append(\", isDefault=\").append(isDefault);\r\n+        sb.append(\", sslEnabled=\").append(sslEnabled);\r\n+        sb.append('}');\r\n+        return sb.toString();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ProviderConfig.java", "source2": "org/apache/dubbo/config/ProviderConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,472 +1,472 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-\n-/**\n- * The service provider default configuration\n- *\n- * @export\n- * @see org.apache.dubbo.config.ProtocolConfig\n- * @see ServiceConfigBase\n- */\n-public class ProviderConfig extends AbstractServiceConfig {\n-\n-    private static final long serialVersionUID = 6913423882496634749L;\n-\n-    // ======== protocol default values, it'll take effect when protocol's attributes are not set ========\n-\n-    /**\n-     * Service ip addresses (used when there are multiple network cards available)\n-     */\n-    private String host;\n-\n-    /**\n-     * Service port\n-     */\n-    private Integer port;\n-\n-    /**\n-     * Context path\n-     */\n-    private String contextpath;\n-\n-    /**\n-     * Thread pool\n-     */\n-    private String threadpool;\n-\n-    /**\n-     * Thread pool name\n-     */\n-    private String threadname;\n-\n-    /**\n-     * Thread pool size (fixed size)\n-     */\n-    private Integer threads;\n-\n-    /**\n-     * IO thread pool size (fixed size)\n-     */\n-    private Integer iothreads;\n-\n-    /**\n-     * Thread pool keepAliveTime, default unit TimeUnit.MILLISECONDS\n-     */\n-    private Integer alive;\n-\n-    /**\n-     * Thread pool queue length\n-     */\n-    private Integer queues;\n-\n-    /**\n-     * Max acceptable connections\n-     */\n-    private Integer accepts;\n-\n-    /**\n-     * Protocol codec\n-     */\n-    private String codec;\n-\n-    /**\n-     * The serialization charset\n-     */\n-    private String charset;\n-\n-    /**\n-     * Payload max length\n-     */\n-    private Integer payload;\n-\n-    /**\n-     * The network io buffer size\n-     */\n-    private Integer buffer;\n-\n-    /**\n-     * Transporter\n-     */\n-    private String transporter;\n-\n-    /**\n-     * How information gets exchanged\n-     */\n-    private String exchanger;\n-\n-    /**\n-     * Thread dispatching mode\n-     */\n-    private String dispatcher;\n-\n-    /**\n-     * Networker\n-     */\n-    private String networker;\n-\n-    /**\n-     * The server-side implementation model of the protocol\n-     */\n-    private String server;\n-\n-    /**\n-     * The client-side implementation model of the protocol\n-     */\n-    private String client;\n-\n-    /**\n-     * Supported telnet commands, separated with comma.\n-     */\n-    private String telnet;\n-\n-    /**\n-     * Command line prompt\n-     */\n-    private String prompt;\n-\n-    /**\n-     * Status check\n-     */\n-    private String status;\n-\n-    /**\n-     * Wait time when stop\n-     */\n-    private Integer wait;\n-\n-    /**\n-     * Whether to use the default protocol\n-     */\n-    private Boolean isDefault;\n-\n-    @Deprecated\n-    public void setProtocol(String protocol) {\n-        this.protocols = new ArrayList<>(Arrays.asList(new ProtocolConfig(protocol)));\n-    }\n-\n-    @Parameter(excluded = true)\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    @Deprecated\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getHost() {\n-        return host;\n-    }\n-\n-    public void setHost(String host) {\n-        this.host = host;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public Integer getPort() {\n-        return port;\n-    }\n-\n-    @Deprecated\n-    public void setPort(Integer port) {\n-        this.port = port;\n-    }\n-\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public String getPath() {\n-        return getContextpath();\n-    }\n-\n-    @Deprecated\n-    public void setPath(String path) {\n-        setContextpath(path);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getContextpath() {\n-        return contextpath;\n-    }\n-\n-    public void setContextpath(String contextpath) {\n-        this.contextpath = contextpath;\n-    }\n-\n-    public String getThreadpool() {\n-        return threadpool;\n-    }\n-\n-    public void setThreadpool(String threadpool) {\n-        this.threadpool = threadpool;\n-    }\n-\n-    public String getThreadname() {\n-        return threadname;\n-    }\n-\n-    public void setThreadname(String threadname) {\n-        this.threadname = threadname;\n-    }\n-\n-    public Integer getThreads() {\n-        return threads;\n-    }\n-\n-    public void setThreads(Integer threads) {\n-        this.threads = threads;\n-    }\n-\n-    public Integer getIothreads() {\n-        return iothreads;\n-    }\n-\n-    public void setIothreads(Integer iothreads) {\n-        this.iothreads = iothreads;\n-    }\n-\n-    public Integer getAlive() {\n-        return alive;\n-    }\n-\n-    public void setAlive(Integer alive) {\n-        this.alive = alive;\n-    }\n-\n-    public Integer getQueues() {\n-        return queues;\n-    }\n-\n-    public void setQueues(Integer queues) {\n-        this.queues = queues;\n-    }\n-\n-    public Integer getAccepts() {\n-        return accepts;\n-    }\n-\n-    public void setAccepts(Integer accepts) {\n-        this.accepts = accepts;\n-    }\n-\n-    public String getCodec() {\n-        return codec;\n-    }\n-\n-    public void setCodec(String codec) {\n-        this.codec = codec;\n-    }\n-\n-    public String getCharset() {\n-        return charset;\n-    }\n-\n-    public void setCharset(String charset) {\n-        this.charset = charset;\n-    }\n-\n-    public Integer getPayload() {\n-        return payload;\n-    }\n-\n-    public void setPayload(Integer payload) {\n-        this.payload = payload;\n-    }\n-\n-    public Integer getBuffer() {\n-        return buffer;\n-    }\n-\n-    public void setBuffer(Integer buffer) {\n-        this.buffer = buffer;\n-    }\n-\n-    public String getServer() {\n-        return server;\n-    }\n-\n-    public void setServer(String server) {\n-        this.server = server;\n-    }\n-\n-    public String getClient() {\n-        return client;\n-    }\n-\n-    public void setClient(String client) {\n-        this.client = client;\n-    }\n-\n-    public String getTelnet() {\n-        return telnet;\n-    }\n-\n-    public void setTelnet(String telnet) {\n-        this.telnet = telnet;\n-    }\n-\n-    @Parameter(escaped = true)\n-    public String getPrompt() {\n-        return prompt;\n-    }\n-\n-    public void setPrompt(String prompt) {\n-        this.prompt = prompt;\n-    }\n-\n-    public String getStatus() {\n-        return status;\n-    }\n-\n-    public void setStatus(String status) {\n-        this.status = status;\n-    }\n-\n-    @Override\n-    public String getCluster() {\n-        return super.getCluster();\n-    }\n-\n-    @Override\n-    public Integer getConnections() {\n-        return super.getConnections();\n-    }\n-\n-    @Override\n-    public Integer getTimeout() {\n-        return super.getTimeout();\n-    }\n-\n-    @Override\n-    public Integer getRetries() {\n-        return super.getRetries();\n-    }\n-\n-    @Override\n-    public String getLoadbalance() {\n-        return super.getLoadbalance();\n-    }\n-\n-    @Override\n-    public Boolean isAsync() {\n-        return super.isAsync();\n-    }\n-\n-    @Override\n-    public Integer getActives() {\n-        return super.getActives();\n-    }\n-\n-    public String getTransporter() {\n-        return transporter;\n-    }\n-\n-    public void setTransporter(String transporter) {\n-        this.transporter = transporter;\n-    }\n-\n-    public String getExchanger() {\n-        return exchanger;\n-    }\n-\n-    public void setExchanger(String exchanger) {\n-        this.exchanger = exchanger;\n-    }\n-\n-    /**\n-     * typo, switch to use {@link #getDispatcher()}\n-     *\n-     * @deprecated {@link #getDispatcher()}\n-     */\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public String getDispather() {\n-        return getDispatcher();\n-    }\n-\n-    /**\n-     * typo, switch to use {@link #getDispatcher()}\n-     *\n-     * @deprecated {@link #setDispatcher(String)}\n-     */\n-    @Deprecated\n-    public void setDispather(String dispather) {\n-        setDispatcher(dispather);\n-    }\n-\n-    public String getDispatcher() {\n-        return dispatcher;\n-    }\n-\n-    public void setDispatcher(String dispatcher) {\n-        this.dispatcher = dispatcher;\n-    }\n-\n-    public String getNetworker() {\n-        return networker;\n-    }\n-\n-    public void setNetworker(String networker) {\n-        this.networker = networker;\n-    }\n-\n-    public Integer getWait() {\n-        return wait;\n-    }\n-\n-    public void setWait(Integer wait) {\n-        this.wait = wait;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        final StringBuilder sb = new StringBuilder(\"ProviderConfig{\");\n-        sb.append(\"host='\").append(host).append('\\'');\n-        sb.append(\", port=\").append(port);\n-        sb.append(\", contextpath='\").append(contextpath).append('\\'');\n-        sb.append(\", threadpool='\").append(threadpool).append('\\'');\n-        sb.append(\", threadname='\").append(threadname).append('\\'');\n-        sb.append(\", threads=\").append(threads);\n-        sb.append(\", iothreads=\").append(iothreads);\n-        sb.append(\", alive=\").append(alive);\n-        sb.append(\", queues=\").append(queues);\n-        sb.append(\", accepts=\").append(accepts);\n-        sb.append(\", codec='\").append(codec).append('\\'');\n-        sb.append(\", charset='\").append(charset).append('\\'');\n-        sb.append(\", payload=\").append(payload);\n-        sb.append(\", buffer=\").append(buffer);\n-        sb.append(\", transporter='\").append(transporter).append('\\'');\n-        sb.append(\", exchanger='\").append(exchanger).append('\\'');\n-        sb.append(\", dispatcher='\").append(dispatcher).append('\\'');\n-        sb.append(\", networker='\").append(networker).append('\\'');\n-        sb.append(\", server='\").append(server).append('\\'');\n-        sb.append(\", client='\").append(client).append('\\'');\n-        sb.append(\", telnet='\").append(telnet).append('\\'');\n-        sb.append(\", prompt='\").append(prompt).append('\\'');\n-        sb.append(\", status='\").append(status).append('\\'');\n-        sb.append(\", wait=\").append(wait);\n-        sb.append(\", isDefault=\").append(isDefault);\n-        sb.append('}');\n-        return sb.toString();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+\r\n+/**\r\n+ * The service provider default configuration\r\n+ *\r\n+ * @export\r\n+ * @see org.apache.dubbo.config.ProtocolConfig\r\n+ * @see ServiceConfigBase\r\n+ */\r\n+public class ProviderConfig extends AbstractServiceConfig {\r\n+\r\n+    private static final long serialVersionUID = 6913423882496634749L;\r\n+\r\n+    // ======== protocol default values, it'll take effect when protocol's attributes are not set ========\r\n+\r\n+    /**\r\n+     * Service ip addresses (used when there are multiple network cards available)\r\n+     */\r\n+    private String host;\r\n+\r\n+    /**\r\n+     * Service port\r\n+     */\r\n+    private Integer port;\r\n+\r\n+    /**\r\n+     * Context path\r\n+     */\r\n+    private String contextpath;\r\n+\r\n+    /**\r\n+     * Thread pool\r\n+     */\r\n+    private String threadpool;\r\n+\r\n+    /**\r\n+     * Thread pool name\r\n+     */\r\n+    private String threadname;\r\n+\r\n+    /**\r\n+     * Thread pool size (fixed size)\r\n+     */\r\n+    private Integer threads;\r\n+\r\n+    /**\r\n+     * IO thread pool size (fixed size)\r\n+     */\r\n+    private Integer iothreads;\r\n+\r\n+    /**\r\n+     * Thread pool keepAliveTime, default unit TimeUnit.MILLISECONDS\r\n+     */\r\n+    private Integer alive;\r\n+\r\n+    /**\r\n+     * Thread pool queue length\r\n+     */\r\n+    private Integer queues;\r\n+\r\n+    /**\r\n+     * Max acceptable connections\r\n+     */\r\n+    private Integer accepts;\r\n+\r\n+    /**\r\n+     * Protocol codec\r\n+     */\r\n+    private String codec;\r\n+\r\n+    /**\r\n+     * The serialization charset\r\n+     */\r\n+    private String charset;\r\n+\r\n+    /**\r\n+     * Payload max length\r\n+     */\r\n+    private Integer payload;\r\n+\r\n+    /**\r\n+     * The network io buffer size\r\n+     */\r\n+    private Integer buffer;\r\n+\r\n+    /**\r\n+     * Transporter\r\n+     */\r\n+    private String transporter;\r\n+\r\n+    /**\r\n+     * How information gets exchanged\r\n+     */\r\n+    private String exchanger;\r\n+\r\n+    /**\r\n+     * Thread dispatching mode\r\n+     */\r\n+    private String dispatcher;\r\n+\r\n+    /**\r\n+     * Networker\r\n+     */\r\n+    private String networker;\r\n+\r\n+    /**\r\n+     * The server-side implementation model of the protocol\r\n+     */\r\n+    private String server;\r\n+\r\n+    /**\r\n+     * The client-side implementation model of the protocol\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Supported telnet commands, separated with comma.\r\n+     */\r\n+    private String telnet;\r\n+\r\n+    /**\r\n+     * Command line prompt\r\n+     */\r\n+    private String prompt;\r\n+\r\n+    /**\r\n+     * Status check\r\n+     */\r\n+    private String status;\r\n+\r\n+    /**\r\n+     * Wait time when stop\r\n+     */\r\n+    private Integer wait;\r\n+\r\n+    /**\r\n+     * Whether to use the default protocol\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    @Deprecated\r\n+    public void setProtocol(String protocol) {\r\n+        this.protocols = new ArrayList<>(Arrays.asList(new ProtocolConfig(protocol)));\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getHost() {\r\n+        return host;\r\n+    }\r\n+\r\n+    public void setHost(String host) {\r\n+        this.host = host;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public Integer getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setPort(Integer port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public String getPath() {\r\n+        return getContextpath();\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void setPath(String path) {\r\n+        setContextpath(path);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getContextpath() {\r\n+        return contextpath;\r\n+    }\r\n+\r\n+    public void setContextpath(String contextpath) {\r\n+        this.contextpath = contextpath;\r\n+    }\r\n+\r\n+    public String getThreadpool() {\r\n+        return threadpool;\r\n+    }\r\n+\r\n+    public void setThreadpool(String threadpool) {\r\n+        this.threadpool = threadpool;\r\n+    }\r\n+\r\n+    public String getThreadname() {\r\n+        return threadname;\r\n+    }\r\n+\r\n+    public void setThreadname(String threadname) {\r\n+        this.threadname = threadname;\r\n+    }\r\n+\r\n+    public Integer getThreads() {\r\n+        return threads;\r\n+    }\r\n+\r\n+    public void setThreads(Integer threads) {\r\n+        this.threads = threads;\r\n+    }\r\n+\r\n+    public Integer getIothreads() {\r\n+        return iothreads;\r\n+    }\r\n+\r\n+    public void setIothreads(Integer iothreads) {\r\n+        this.iothreads = iothreads;\r\n+    }\r\n+\r\n+    public Integer getAlive() {\r\n+        return alive;\r\n+    }\r\n+\r\n+    public void setAlive(Integer alive) {\r\n+        this.alive = alive;\r\n+    }\r\n+\r\n+    public Integer getQueues() {\r\n+        return queues;\r\n+    }\r\n+\r\n+    public void setQueues(Integer queues) {\r\n+        this.queues = queues;\r\n+    }\r\n+\r\n+    public Integer getAccepts() {\r\n+        return accepts;\r\n+    }\r\n+\r\n+    public void setAccepts(Integer accepts) {\r\n+        this.accepts = accepts;\r\n+    }\r\n+\r\n+    public String getCodec() {\r\n+        return codec;\r\n+    }\r\n+\r\n+    public void setCodec(String codec) {\r\n+        this.codec = codec;\r\n+    }\r\n+\r\n+    public String getCharset() {\r\n+        return charset;\r\n+    }\r\n+\r\n+    public void setCharset(String charset) {\r\n+        this.charset = charset;\r\n+    }\r\n+\r\n+    public Integer getPayload() {\r\n+        return payload;\r\n+    }\r\n+\r\n+    public void setPayload(Integer payload) {\r\n+        this.payload = payload;\r\n+    }\r\n+\r\n+    public Integer getBuffer() {\r\n+        return buffer;\r\n+    }\r\n+\r\n+    public void setBuffer(Integer buffer) {\r\n+        this.buffer = buffer;\r\n+    }\r\n+\r\n+    public String getServer() {\r\n+        return server;\r\n+    }\r\n+\r\n+    public void setServer(String server) {\r\n+        this.server = server;\r\n+    }\r\n+\r\n+    public String getClient() {\r\n+        return client;\r\n+    }\r\n+\r\n+    public void setClient(String client) {\r\n+        this.client = client;\r\n+    }\r\n+\r\n+    public String getTelnet() {\r\n+        return telnet;\r\n+    }\r\n+\r\n+    public void setTelnet(String telnet) {\r\n+        this.telnet = telnet;\r\n+    }\r\n+\r\n+    @Parameter(escaped = true)\r\n+    public String getPrompt() {\r\n+        return prompt;\r\n+    }\r\n+\r\n+    public void setPrompt(String prompt) {\r\n+        this.prompt = prompt;\r\n+    }\r\n+\r\n+    public String getStatus() {\r\n+        return status;\r\n+    }\r\n+\r\n+    public void setStatus(String status) {\r\n+        this.status = status;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getCluster() {\r\n+        return super.getCluster();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getConnections() {\r\n+        return super.getConnections();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getTimeout() {\r\n+        return super.getTimeout();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getRetries() {\r\n+        return super.getRetries();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getLoadbalance() {\r\n+        return super.getLoadbalance();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Boolean isAsync() {\r\n+        return super.isAsync();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getActives() {\r\n+        return super.getActives();\r\n+    }\r\n+\r\n+    public String getTransporter() {\r\n+        return transporter;\r\n+    }\r\n+\r\n+    public void setTransporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+    }\r\n+\r\n+    public String getExchanger() {\r\n+        return exchanger;\r\n+    }\r\n+\r\n+    public void setExchanger(String exchanger) {\r\n+        this.exchanger = exchanger;\r\n+    }\r\n+\r\n+    /**\r\n+     * typo, switch to use {@link #getDispatcher()}\r\n+     *\r\n+     * @deprecated {@link #getDispatcher()}\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public String getDispather() {\r\n+        return getDispatcher();\r\n+    }\r\n+\r\n+    /**\r\n+     * typo, switch to use {@link #getDispatcher()}\r\n+     *\r\n+     * @deprecated {@link #setDispatcher(String)}\r\n+     */\r\n+    @Deprecated\r\n+    public void setDispather(String dispather) {\r\n+        setDispatcher(dispather);\r\n+    }\r\n+\r\n+    public String getDispatcher() {\r\n+        return dispatcher;\r\n+    }\r\n+\r\n+    public void setDispatcher(String dispatcher) {\r\n+        this.dispatcher = dispatcher;\r\n+    }\r\n+\r\n+    public String getNetworker() {\r\n+        return networker;\r\n+    }\r\n+\r\n+    public void setNetworker(String networker) {\r\n+        this.networker = networker;\r\n+    }\r\n+\r\n+    public Integer getWait() {\r\n+        return wait;\r\n+    }\r\n+\r\n+    public void setWait(Integer wait) {\r\n+        this.wait = wait;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        final StringBuilder sb = new StringBuilder(\"ProviderConfig{\");\r\n+        sb.append(\"host='\").append(host).append('\\'');\r\n+        sb.append(\", port=\").append(port);\r\n+        sb.append(\", contextpath='\").append(contextpath).append('\\'');\r\n+        sb.append(\", threadpool='\").append(threadpool).append('\\'');\r\n+        sb.append(\", threadname='\").append(threadname).append('\\'');\r\n+        sb.append(\", threads=\").append(threads);\r\n+        sb.append(\", iothreads=\").append(iothreads);\r\n+        sb.append(\", alive=\").append(alive);\r\n+        sb.append(\", queues=\").append(queues);\r\n+        sb.append(\", accepts=\").append(accepts);\r\n+        sb.append(\", codec='\").append(codec).append('\\'');\r\n+        sb.append(\", charset='\").append(charset).append('\\'');\r\n+        sb.append(\", payload=\").append(payload);\r\n+        sb.append(\", buffer=\").append(buffer);\r\n+        sb.append(\", transporter='\").append(transporter).append('\\'');\r\n+        sb.append(\", exchanger='\").append(exchanger).append('\\'');\r\n+        sb.append(\", dispatcher='\").append(dispatcher).append('\\'');\r\n+        sb.append(\", networker='\").append(networker).append('\\'');\r\n+        sb.append(\", server='\").append(server).append('\\'');\r\n+        sb.append(\", client='\").append(client).append('\\'');\r\n+        sb.append(\", telnet='\").append(telnet).append('\\'');\r\n+        sb.append(\", prompt='\").append(prompt).append('\\'');\r\n+        sb.append(\", status='\").append(status).append('\\'');\r\n+        sb.append(\", wait=\").append(wait);\r\n+        sb.append(\", isDefault=\").append(isDefault);\r\n+        sb.append('}');\r\n+        return sb.toString();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ReferenceConfigBase.java", "source2": "org/apache/dubbo/config/ReferenceConfigBase.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,264 +1,264 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ServiceMetadata;\n-import org.apache.dubbo.rpc.service.GenericService;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import java.io.File;\n-import java.io.FileInputStream;\n-import java.io.IOException;\n-import java.util.Properties;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-\n-/**\n- * ReferenceConfig\n- *\n- * @export\n- */\n-public abstract class ReferenceConfigBase<T> extends AbstractReferenceConfig {\n-\n-    private static final long serialVersionUID = -5864351140409987595L;\n-\n-    /**\n-     * The interface class of the reference service\n-     */\n-    protected Class<?> interfaceClass;\n-\n-    /**\n-     * client type\n-     */\n-    protected String client;\n-\n-    /**\n-     * The url for peer-to-peer invocation\n-     */\n-    protected String url;\n-\n-    /**\n-     * The consumer config (default)\n-     */\n-    protected ConsumerConfig consumer;\n-\n-    /**\n-     * Only the service provider of the specified protocol is invoked, and other protocols are ignored.\n-     */\n-    protected String protocol;\n-\n-\n-    public ReferenceConfigBase() {\n-        serviceMetadata = new ServiceMetadata();\n-        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\n-    }\n-\n-    public ReferenceConfigBase(Reference reference) {\n-        serviceMetadata = new ServiceMetadata();\n-        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\n-        appendAnnotation(Reference.class, reference);\n-        setMethods(MethodConfig.constructMethodConfig(reference.methods()));\n-    }\n-\n-    public boolean shouldCheck() {\n-        Boolean shouldCheck = isCheck();\n-        if (shouldCheck == null && getConsumer() != null) {\n-            shouldCheck = getConsumer().isCheck();\n-        }\n-        if (shouldCheck == null) {\n-            // default true\n-            shouldCheck = true;\n-        }\n-        return shouldCheck;\n-    }\n-\n-    public boolean shouldInit() {\n-        Boolean shouldInit = isInit();\n-        if (shouldInit == null && getConsumer() != null) {\n-            shouldInit = getConsumer().isInit();\n-        }\n-        if (shouldInit == null) {\n-            // default is true, spring will still init lazily by setting init's default value to false,\n-            // the def default setting happens in {@link ReferenceBean#afterPropertiesSet}.\n-            return true;\n-        }\n-        return shouldInit;\n-    }\n-\n-    public void checkDefault() throws IllegalStateException {\n-        if (consumer == null) {\n-            consumer = ApplicationModel.getConfigManager()\n-                    .getDefaultConsumer()\n-                    .orElse(new ConsumerConfig());\n-        }\n-    }\n-\n-    public Class<?> getActualInterface() {\n-        Class actualInterface = interfaceClass;\n-        if (interfaceClass == GenericService.class) {\n-            try {\n-                actualInterface = Class.forName(interfaceName);\n-            } catch (ClassNotFoundException e) {\n-                // ignore\n-            }\n-        }\n-        return actualInterface;\n-    }\n-\n-    public Class<?> getInterfaceClass() {\n-        if (interfaceClass != null) {\n-            return interfaceClass;\n-        }\n-        if (ProtocolUtils.isGeneric(getGeneric())\n-                || (getConsumer() != null && ProtocolUtils.isGeneric(getConsumer().getGeneric()))) {\n-            return GenericService.class;\n-        }\n-        try {\n-            if (interfaceName != null && interfaceName.length() > 0) {\n-                interfaceClass = Class.forName(interfaceName, true, ClassUtils.getClassLoader());\n-            }\n-        } catch (ClassNotFoundException t) {\n-            throw new IllegalStateException(t.getMessage(), t);\n-        }\n-\n-        return interfaceClass;\n-    }\n-\n-    /**\n-     * @param interfaceClass\n-     * @see #setInterface(Class)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public void setInterfaceClass(Class<?> interfaceClass) {\n-        setInterface(interfaceClass);\n-    }\n-\n-    public void setInterface(Class<?> interfaceClass) {\n-        if (interfaceClass != null && !interfaceClass.isInterface()) {\n-            throw new IllegalStateException(\"The interface class \" + interfaceClass + \" is not a interface!\");\n-        }\n-        this.interfaceClass = interfaceClass;\n-        setInterface(interfaceClass == null ? null : interfaceClass.getName());\n-    }\n-\n-    public String getClient() {\n-        return client;\n-    }\n-\n-    public void setClient(String client) {\n-        this.client = client;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getUrl() {\n-        return url;\n-    }\n-\n-    public void setUrl(String url) {\n-        this.url = url;\n-    }\n-\n-    public ConsumerConfig getConsumer() {\n-        return consumer;\n-    }\n-\n-    public void setConsumer(ConsumerConfig consumer) {\n-        this.consumer = consumer;\n-    }\n-\n-    public String getProtocol() {\n-        return protocol;\n-    }\n-\n-    public void setProtocol(String protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    public ServiceMetadata getServiceMetadata() {\n-        return serviceMetadata;\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public String getPrefix() {\n-        return DUBBO + \".reference.\" + interfaceName;\n-    }\n-\n-    public void resolveFile() {\n-        String resolve = System.getProperty(interfaceName);\n-        String resolveFile = null;\n-        if (StringUtils.isEmpty(resolve)) {\n-            resolveFile = System.getProperty(\"dubbo.resolve.file\");\n-            if (StringUtils.isEmpty(resolveFile)) {\n-                File userResolveFile = new File(new File(System.getProperty(\"user.home\")), \"dubbo-resolve.properties\");\n-                if (userResolveFile.exists()) {\n-                    resolveFile = userResolveFile.getAbsolutePath();\n-                }\n-            }\n-            if (resolveFile != null && resolveFile.length() > 0) {\n-                Properties properties = new Properties();\n-                try (FileInputStream fis = new FileInputStream(new File(resolveFile))) {\n-                    properties.load(fis);\n-                } catch (IOException e) {\n-                    throw new IllegalStateException(\"Failed to load \" + resolveFile + \", cause: \" + e.getMessage(), e);\n-                }\n-\n-                resolve = properties.getProperty(interfaceName);\n-            }\n-        }\n-        if (resolve != null && resolve.length() > 0) {\n-            url = resolve;\n-            if (logger.isWarnEnabled()) {\n-                if (resolveFile != null) {\n-                    logger.warn(\"Using default dubbo resolve file \" + resolveFile + \" replace \" + interfaceName + \"\" + resolve + \" to p2p invoke remote service.\");\n-                } else {\n-                    logger.warn(\"Using -D\" + interfaceName + \"=\" + resolve + \" to p2p invoke remote service.\");\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    protected void computeValidRegistryIds() {\n-        if (consumer != null) {\n-            if (notHasSelfRegistryProperty()) {\n-                setRegistries(consumer.getRegistries());\n-                setRegistryIds(consumer.getRegistryIds());\n-            }\n-        }\n-\n-        super.computeValidRegistryIds();\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getUniqueServiceName() {\n-        return URL.buildKey(interfaceName, getGroup(), getVersion());\n-    }\n-\n-    public abstract T get();\n-\n-    public abstract void destroy();\n-\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.annotation.Reference;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ServiceMetadata;\r\n+import org.apache.dubbo.rpc.service.GenericService;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import java.io.File;\r\n+import java.io.FileInputStream;\r\n+import java.io.IOException;\r\n+import java.util.Properties;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+\r\n+/**\r\n+ * ReferenceConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public abstract class ReferenceConfigBase<T> extends AbstractReferenceConfig {\r\n+\r\n+    private static final long serialVersionUID = -5864351140409987595L;\r\n+\r\n+    /**\r\n+     * The interface class of the reference service\r\n+     */\r\n+    protected Class<?> interfaceClass;\r\n+\r\n+    /**\r\n+     * client type\r\n+     */\r\n+    protected String client;\r\n+\r\n+    /**\r\n+     * The url for peer-to-peer invocation\r\n+     */\r\n+    protected String url;\r\n+\r\n+    /**\r\n+     * The consumer config (default)\r\n+     */\r\n+    protected ConsumerConfig consumer;\r\n+\r\n+    /**\r\n+     * Only the service provider of the specified protocol is invoked, and other protocols are ignored.\r\n+     */\r\n+    protected String protocol;\r\n+\r\n+\r\n+    public ReferenceConfigBase() {\r\n+        serviceMetadata = new ServiceMetadata();\r\n+        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\r\n+    }\r\n+\r\n+    public ReferenceConfigBase(Reference reference) {\r\n+        serviceMetadata = new ServiceMetadata();\r\n+        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\r\n+        appendAnnotation(Reference.class, reference);\r\n+        setMethods(MethodConfig.constructMethodConfig(reference.methods()));\r\n+    }\r\n+\r\n+    public boolean shouldCheck() {\r\n+        Boolean shouldCheck = isCheck();\r\n+        if (shouldCheck == null && getConsumer() != null) {\r\n+            shouldCheck = getConsumer().isCheck();\r\n+        }\r\n+        if (shouldCheck == null) {\r\n+            // default true\r\n+            shouldCheck = true;\r\n+        }\r\n+        return shouldCheck;\r\n+    }\r\n+\r\n+    public boolean shouldInit() {\r\n+        Boolean shouldInit = isInit();\r\n+        if (shouldInit == null && getConsumer() != null) {\r\n+            shouldInit = getConsumer().isInit();\r\n+        }\r\n+        if (shouldInit == null) {\r\n+            // default is true, spring will still init lazily by setting init's default value to false,\r\n+            // the def default setting happens in {@link ReferenceBean#afterPropertiesSet}.\r\n+            return true;\r\n+        }\r\n+        return shouldInit;\r\n+    }\r\n+\r\n+    public void checkDefault() throws IllegalStateException {\r\n+        if (consumer == null) {\r\n+            consumer = ApplicationModel.getConfigManager()\r\n+                    .getDefaultConsumer()\r\n+                    .orElse(new ConsumerConfig());\r\n+        }\r\n+    }\r\n+\r\n+    public Class<?> getActualInterface() {\r\n+        Class actualInterface = interfaceClass;\r\n+        if (interfaceClass == GenericService.class) {\r\n+            try {\r\n+                actualInterface = Class.forName(interfaceName);\r\n+            } catch (ClassNotFoundException e) {\r\n+                // ignore\r\n+            }\r\n+        }\r\n+        return actualInterface;\r\n+    }\r\n+\r\n+    public Class<?> getInterfaceClass() {\r\n+        if (interfaceClass != null) {\r\n+            return interfaceClass;\r\n+        }\r\n+        if (ProtocolUtils.isGeneric(getGeneric())\r\n+                || (getConsumer() != null && ProtocolUtils.isGeneric(getConsumer().getGeneric()))) {\r\n+            return GenericService.class;\r\n+        }\r\n+        try {\r\n+            if (interfaceName != null && interfaceName.length() > 0) {\r\n+                interfaceClass = Class.forName(interfaceName, true, ClassUtils.getClassLoader());\r\n+            }\r\n+        } catch (ClassNotFoundException t) {\r\n+            throw new IllegalStateException(t.getMessage(), t);\r\n+        }\r\n+\r\n+        return interfaceClass;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param interfaceClass\r\n+     * @see #setInterface(Class)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public void setInterfaceClass(Class<?> interfaceClass) {\r\n+        setInterface(interfaceClass);\r\n+    }\r\n+\r\n+    public void setInterface(Class<?> interfaceClass) {\r\n+        if (interfaceClass != null && !interfaceClass.isInterface()) {\r\n+            throw new IllegalStateException(\"The interface class \" + interfaceClass + \" is not a interface!\");\r\n+        }\r\n+        this.interfaceClass = interfaceClass;\r\n+        setInterface(interfaceClass == null ? null : interfaceClass.getName());\r\n+    }\r\n+\r\n+    public String getClient() {\r\n+        return client;\r\n+    }\r\n+\r\n+    public void setClient(String client) {\r\n+        this.client = client;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getUrl() {\r\n+        return url;\r\n+    }\r\n+\r\n+    public void setUrl(String url) {\r\n+        this.url = url;\r\n+    }\r\n+\r\n+    public ConsumerConfig getConsumer() {\r\n+        return consumer;\r\n+    }\r\n+\r\n+    public void setConsumer(ConsumerConfig consumer) {\r\n+        this.consumer = consumer;\r\n+    }\r\n+\r\n+    public String getProtocol() {\r\n+        return protocol;\r\n+    }\r\n+\r\n+    public void setProtocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    public ServiceMetadata getServiceMetadata() {\r\n+        return serviceMetadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public String getPrefix() {\r\n+        return DUBBO + \".reference.\" + interfaceName;\r\n+    }\r\n+\r\n+    public void resolveFile() {\r\n+        String resolve = System.getProperty(interfaceName);\r\n+        String resolveFile = null;\r\n+        if (StringUtils.isEmpty(resolve)) {\r\n+            resolveFile = System.getProperty(\"dubbo.resolve.file\");\r\n+            if (StringUtils.isEmpty(resolveFile)) {\r\n+                File userResolveFile = new File(new File(System.getProperty(\"user.home\")), \"dubbo-resolve.properties\");\r\n+                if (userResolveFile.exists()) {\r\n+                    resolveFile = userResolveFile.getAbsolutePath();\r\n+                }\r\n+            }\r\n+            if (resolveFile != null && resolveFile.length() > 0) {\r\n+                Properties properties = new Properties();\r\n+                try (FileInputStream fis = new FileInputStream(new File(resolveFile))) {\r\n+                    properties.load(fis);\r\n+                } catch (IOException e) {\r\n+                    throw new IllegalStateException(\"Failed to load \" + resolveFile + \", cause: \" + e.getMessage(), e);\r\n+                }\r\n+\r\n+                resolve = properties.getProperty(interfaceName);\r\n+            }\r\n+        }\r\n+        if (resolve != null && resolve.length() > 0) {\r\n+            url = resolve;\r\n+            if (logger.isWarnEnabled()) {\r\n+                if (resolveFile != null) {\r\n+                    logger.warn(\"Using default dubbo resolve file \" + resolveFile + \" replace \" + interfaceName + \"\" + resolve + \" to p2p invoke remote service.\");\r\n+                } else {\r\n+                    logger.warn(\"Using -D\" + interfaceName + \"=\" + resolve + \" to p2p invoke remote service.\");\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void computeValidRegistryIds() {\r\n+        if (consumer != null) {\r\n+            if (notHasSelfRegistryProperty()) {\r\n+                setRegistries(consumer.getRegistries());\r\n+                setRegistryIds(consumer.getRegistryIds());\r\n+            }\r\n+        }\r\n+\r\n+        super.computeValidRegistryIds();\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getUniqueServiceName() {\r\n+        return URL.buildKey(interfaceName, getGroup(), getVersion());\r\n+    }\r\n+\r\n+    public abstract T get();\r\n+\r\n+    public abstract void destroy();\r\n+\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/RegistryConfig.java", "source2": "org/apache/dubbo/config/RegistryConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,533 +1,533 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\n-import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\n-import static org.apache.dubbo.common.utils.PojoUtils.updatePropertyIfAbsent;\n-import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX;\n-\n-/**\n- * RegistryConfig\n- *\n- * @export\n- */\n-public class RegistryConfig extends AbstractConfig {\n-\n-    public static final String NO_AVAILABLE = \"N/A\";\n-    private static final long serialVersionUID = 5508512956753757169L;\n-\n-    /**\n-     * Register center address\n-     */\n-    private String address;\n-\n-    /**\n-     * Username to login register center\n-     */\n-    private String username;\n-\n-    /**\n-     * Password to login register center\n-     */\n-    private String password;\n-\n-    /**\n-     * Default port for register center\n-     */\n-    private Integer port;\n-\n-    /**\n-     * Protocol for register center\n-     */\n-    private String protocol;\n-\n-    /**\n-     * Network transmission type\n-     */\n-    private String transporter;\n-\n-    private String server;\n-\n-    private String client;\n-\n-    /**\n-     * Affects how traffic distributes among registries, useful when subscribing multiple registries, available options:\n-     * 1. zone-aware, a certain type of traffic always goes to one Registry according to where the traffic is originated.\n-     */\n-    private String cluster;\n-\n-    /**\n-     * The region where the registry belongs, usually used to isolate traffics\n-     */\n-    private String zone;\n-\n-    /**\n-     * The group the services registry in\n-     */\n-    private String group;\n-\n-    private String version;\n-\n-    /**\n-     * Request timeout in milliseconds for register center\n-     */\n-    private Integer timeout;\n-\n-    /**\n-     * Session timeout in milliseconds for register center\n-     */\n-    private Integer session;\n-\n-    /**\n-     * File for saving register center dynamic list\n-     */\n-    private String file;\n-\n-    /**\n-     * Wait time before stop\n-     */\n-    private Integer wait;\n-\n-    /**\n-     * Whether to check if register center is available when boot up\n-     */\n-    private Boolean check;\n-\n-    /**\n-     * Whether to allow dynamic service to register on the register center\n-     */\n-    private Boolean dynamic;\n-\n-    /**\n-     * Whether to export service on the register center\n-     */\n-    private Boolean register;\n-\n-    /**\n-     * Whether allow to subscribe service on the register center\n-     */\n-    private Boolean subscribe;\n-\n-    /**\n-     * The customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * Whether it's default\n-     */\n-    private Boolean isDefault;\n-\n-    /**\n-     * Simple the registry. both useful for provider and consumer\n-     *\n-     * @since 2.7.0\n-     */\n-    private Boolean simplified;\n-    /**\n-     * After simplify the registry, should add some parameter individually. just for provider.\n-     * <p>\n-     * such as: extra-keys = A,b,c,d\n-     *\n-     * @since 2.7.0\n-     */\n-    private String extraKeys;\n-\n-    /**\n-     * the address work as config center or not\n-     */\n-    private Boolean useAsConfigCenter;\n-\n-    /**\n-     * the address work as remote metadata center or not\n-     */\n-    private Boolean useAsMetadataCenter;\n-\n-    /**\n-     * list of rpc protocols accepted by this registry, for example, \"dubbo,rest\"\n-     */\n-    private String accepts;\n-\n-    /**\n-     * Always use this registry first if set to true, useful when subscribe to multiple registries\n-     */\n-    private Boolean preferred;\n-\n-    /**\n-     * Affects traffic distribution among registries, useful when subscribe to multiple registries\n-     * Take effect only when no preferred registry is specified.\n-     */\n-    private Integer weight;\n-\n-    public RegistryConfig() {\n-    }\n-\n-    public RegistryConfig(String address) {\n-        setAddress(address);\n-    }\n-\n-    public RegistryConfig(String address, String protocol) {\n-        setAddress(address);\n-        setProtocol(protocol);\n-    }\n-\n-    @Override\n-    public String getId() {\n-        return super.getId();\n-    }\n-\n-    public String getProtocol() {\n-        return protocol;\n-    }\n-\n-    public void setProtocol(String protocol) {\n-        this.protocol = protocol;\n-//        this.updateIdIfAbsent(protocol);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getAddress() {\n-        return address;\n-    }\n-\n-    public void setAddress(String address) {\n-        this.address = address;\n-        if (address != null) {\n-            try {\n-                URL url = URL.valueOf(address);\n-\n-                // Refactor since 2.7.8\n-                updatePropertyIfAbsent(this::getUsername, this::setUsername, url.getUsername());\n-                updatePropertyIfAbsent(this::getPassword, this::setPassword, url.getPassword());\n-                updatePropertyIfAbsent(this::getProtocol, this::setProtocol, url.getProtocol());\n-                updatePropertyIfAbsent(this::getPort, this::setPort, url.getPort());\n-\n-//                setUsername(url.getUsername());\n-//                setPassword(url.getPassword());\n-//                updateIdIfAbsent(url.getProtocol());\n-//                updateProtocolIfAbsent(url.getProtocol());\n-//                updatePortIfAbsent(url.getPort());\n-                Map<String, String> params = url.getParameters();\n-                if (CollectionUtils.isNotEmptyMap(params)) {\n-                    params.remove(BACKUP_KEY);\n-                }\n-                updateParameters(params);\n-            } catch (Exception ignored) {\n-            }\n-        }\n-    }\n-\n-    public Integer getPort() {\n-        return port;\n-    }\n-\n-    public void setPort(Integer port) {\n-        this.port = port;\n-    }\n-\n-    public String getUsername() {\n-        return username;\n-    }\n-\n-    public void setUsername(String username) {\n-        this.username = username;\n-    }\n-\n-    public String getPassword() {\n-        return password;\n-    }\n-\n-    public void setPassword(String password) {\n-        this.password = password;\n-    }\n-\n-    /**\n-     * @return wait\n-     * @see org.apache.dubbo.config.ProviderConfig#getWait()\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public Integer getWait() {\n-        return wait;\n-    }\n-\n-    /**\n-     * @param wait\n-     * @see org.apache.dubbo.config.ProviderConfig#setWait(Integer)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public void setWait(Integer wait) {\n-        this.wait = wait;\n-        if (wait != null && wait > 0) {\n-            System.setProperty(SHUTDOWN_WAIT_KEY, String.valueOf(wait));\n-        }\n-    }\n-\n-    public Boolean isCheck() {\n-        return check;\n-    }\n-\n-    public void setCheck(Boolean check) {\n-        this.check = check;\n-    }\n-\n-    public String getFile() {\n-        return file;\n-    }\n-\n-    public void setFile(String file) {\n-        this.file = file;\n-    }\n-\n-    /**\n-     * @return transport\n-     * @see #getTransporter()\n-     * @deprecated\n-     */\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public String getTransport() {\n-        return getTransporter();\n-    }\n-\n-    /**\n-     * @param transport\n-     * @see #setTransporter(String)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public void setTransport(String transport) {\n-        setTransporter(transport);\n-    }\n-\n-    public String getTransporter() {\n-        return transporter;\n-    }\n-\n-    public void setTransporter(String transporter) {\n-        /*if(transporter != null && transporter.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(transporter)){\n-            throw new IllegalStateException(\"No such transporter type : \" + transporter);\n-        }*/\n-        this.transporter = transporter;\n-    }\n-\n-    public String getServer() {\n-        return server;\n-    }\n-\n-    public void setServer(String server) {\n-        /*if(server != null && server.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(server)){\n-            throw new IllegalStateException(\"No such server type : \" + server);\n-        }*/\n-        this.server = server;\n-    }\n-\n-    public String getClient() {\n-        return client;\n-    }\n-\n-    public void setClient(String client) {\n-        /*if(client != null && client.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(client)){\n-            throw new IllegalStateException(\"No such client type : \" + client);\n-        }*/\n-        this.client = client;\n-    }\n-\n-    public Integer getTimeout() {\n-        return timeout;\n-    }\n-\n-    public void setTimeout(Integer timeout) {\n-        this.timeout = timeout;\n-    }\n-\n-    public Integer getSession() {\n-        return session;\n-    }\n-\n-    public void setSession(Integer session) {\n-        this.session = session;\n-    }\n-\n-    public Boolean isDynamic() {\n-        return dynamic;\n-    }\n-\n-    public void setDynamic(Boolean dynamic) {\n-        this.dynamic = dynamic;\n-    }\n-\n-    public Boolean isRegister() {\n-        return register;\n-    }\n-\n-    public void setRegister(Boolean register) {\n-        this.register = register;\n-    }\n-\n-    public Boolean isSubscribe() {\n-        return subscribe;\n-    }\n-\n-    public void setSubscribe(Boolean subscribe) {\n-        this.subscribe = subscribe;\n-    }\n-\n-    public String getCluster() {\n-        return cluster;\n-    }\n-\n-    public void setCluster(String cluster) {\n-        this.cluster = cluster;\n-    }\n-\n-    public String getZone() {\n-        return zone;\n-    }\n-\n-    public void setZone(String zone) {\n-        this.zone = zone;\n-    }\n-\n-    public String getGroup() {\n-        return group;\n-    }\n-\n-    public void setGroup(String group) {\n-        this.group = group;\n-    }\n-\n-    public String getVersion() {\n-        return version;\n-    }\n-\n-    public void setVersion(String version) {\n-        this.version = version;\n-    }\n-\n-    public Map<String, String> getParameters() {\n-        return parameters;\n-    }\n-\n-    public void setParameters(Map<String, String> parameters) {\n-        this.parameters = parameters;\n-    }\n-\n-    public void updateParameters(Map<String, String> parameters) {\n-        if (CollectionUtils.isEmptyMap(parameters)) {\n-            return;\n-        }\n-        if (this.parameters == null) {\n-            this.parameters = parameters;\n-        } else {\n-            this.parameters.putAll(parameters);\n-        }\n-    }\n-\n-    public Boolean isDefault() {\n-        return isDefault;\n-    }\n-\n-    public void setDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-    }\n-\n-    public Boolean getSimplified() {\n-        return simplified;\n-    }\n-\n-    public void setSimplified(Boolean simplified) {\n-        this.simplified = simplified;\n-    }\n-\n-    @Parameter(key = EXTRA_KEYS_KEY)\n-    public String getExtraKeys() {\n-        return extraKeys;\n-    }\n-\n-    public void setExtraKeys(String extraKeys) {\n-        this.extraKeys = extraKeys;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public Boolean getUseAsConfigCenter() {\n-        return useAsConfigCenter;\n-    }\n-\n-    public void setUseAsConfigCenter(Boolean useAsConfigCenter) {\n-        this.useAsConfigCenter = useAsConfigCenter;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public Boolean getUseAsMetadataCenter() {\n-        return useAsMetadataCenter;\n-    }\n-\n-    public void setUseAsMetadataCenter(Boolean useAsMetadataCenter) {\n-        this.useAsMetadataCenter = useAsMetadataCenter;\n-    }\n-\n-    public String getAccepts() {\n-        return accepts;\n-    }\n-\n-    public void setAccepts(String accepts) {\n-        this.accepts = accepts;\n-    }\n-\n-    public Boolean getPreferred() {\n-        return preferred;\n-    }\n-\n-    public void setPreferred(Boolean preferred) {\n-        this.preferred = preferred;\n-    }\n-\n-    public Integer getWeight() {\n-        return weight;\n-    }\n-\n-    public void setWeight(Integer weight) {\n-        this.weight = weight;\n-    }\n-\n-    @Override\n-    public void refresh() {\n-        super.refresh();\n-        if (StringUtils.isNotEmpty(this.getId())) {\n-            this.setPrefix(REGISTRIES_SUFFIX);\n-            super.refresh();\n-        }\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public boolean isValid() {\n-        // empty protocol will default to 'dubbo'\n-        return !StringUtils.isEmpty(address);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\r\n+import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\r\n+import static org.apache.dubbo.common.utils.PojoUtils.updatePropertyIfAbsent;\r\n+import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX;\r\n+\r\n+/**\r\n+ * RegistryConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class RegistryConfig extends AbstractConfig {\r\n+\r\n+    public static final String NO_AVAILABLE = \"N/A\";\r\n+    private static final long serialVersionUID = 5508512956753757169L;\r\n+\r\n+    /**\r\n+     * Register center address\r\n+     */\r\n+    private String address;\r\n+\r\n+    /**\r\n+     * Username to login register center\r\n+     */\r\n+    private String username;\r\n+\r\n+    /**\r\n+     * Password to login register center\r\n+     */\r\n+    private String password;\r\n+\r\n+    /**\r\n+     * Default port for register center\r\n+     */\r\n+    private Integer port;\r\n+\r\n+    /**\r\n+     * Protocol for register center\r\n+     */\r\n+    private String protocol;\r\n+\r\n+    /**\r\n+     * Network transmission type\r\n+     */\r\n+    private String transporter;\r\n+\r\n+    private String server;\r\n+\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Affects how traffic distributes among registries, useful when subscribing multiple registries, available options:\r\n+     * 1. zone-aware, a certain type of traffic always goes to one Registry according to where the traffic is originated.\r\n+     */\r\n+    private String cluster;\r\n+\r\n+    /**\r\n+     * The region where the registry belongs, usually used to isolate traffics\r\n+     */\r\n+    private String zone;\r\n+\r\n+    /**\r\n+     * The group the services registry in\r\n+     */\r\n+    private String group;\r\n+\r\n+    private String version;\r\n+\r\n+    /**\r\n+     * Request timeout in milliseconds for register center\r\n+     */\r\n+    private Integer timeout;\r\n+\r\n+    /**\r\n+     * Session timeout in milliseconds for register center\r\n+     */\r\n+    private Integer session;\r\n+\r\n+    /**\r\n+     * File for saving register center dynamic list\r\n+     */\r\n+    private String file;\r\n+\r\n+    /**\r\n+     * Wait time before stop\r\n+     */\r\n+    private Integer wait;\r\n+\r\n+    /**\r\n+     * Whether to check if register center is available when boot up\r\n+     */\r\n+    private Boolean check;\r\n+\r\n+    /**\r\n+     * Whether to allow dynamic service to register on the register center\r\n+     */\r\n+    private Boolean dynamic;\r\n+\r\n+    /**\r\n+     * Whether to export service on the register center\r\n+     */\r\n+    private Boolean register;\r\n+\r\n+    /**\r\n+     * Whether allow to subscribe service on the register center\r\n+     */\r\n+    private Boolean subscribe;\r\n+\r\n+    /**\r\n+     * The customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * Whether it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    /**\r\n+     * Simple the registry. both useful for provider and consumer\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    private Boolean simplified;\r\n+    /**\r\n+     * After simplify the registry, should add some parameter individually. just for provider.\r\n+     * <p>\r\n+     * such as: extra-keys = A,b,c,d\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    private String extraKeys;\r\n+\r\n+    /**\r\n+     * the address work as config center or not\r\n+     */\r\n+    private Boolean useAsConfigCenter;\r\n+\r\n+    /**\r\n+     * the address work as remote metadata center or not\r\n+     */\r\n+    private Boolean useAsMetadataCenter;\r\n+\r\n+    /**\r\n+     * list of rpc protocols accepted by this registry, for example, \"dubbo,rest\"\r\n+     */\r\n+    private String accepts;\r\n+\r\n+    /**\r\n+     * Always use this registry first if set to true, useful when subscribe to multiple registries\r\n+     */\r\n+    private Boolean preferred;\r\n+\r\n+    /**\r\n+     * Affects traffic distribution among registries, useful when subscribe to multiple registries\r\n+     * Take effect only when no preferred registry is specified.\r\n+     */\r\n+    private Integer weight;\r\n+\r\n+    public RegistryConfig() {\r\n+    }\r\n+\r\n+    public RegistryConfig(String address) {\r\n+        setAddress(address);\r\n+    }\r\n+\r\n+    public RegistryConfig(String address, String protocol) {\r\n+        setAddress(address);\r\n+        setProtocol(protocol);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getId() {\r\n+        return super.getId();\r\n+    }\r\n+\r\n+    public String getProtocol() {\r\n+        return protocol;\r\n+    }\r\n+\r\n+    public void setProtocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+//        this.updateIdIfAbsent(protocol);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getAddress() {\r\n+        return address;\r\n+    }\r\n+\r\n+    public void setAddress(String address) {\r\n+        this.address = address;\r\n+        if (address != null) {\r\n+            try {\r\n+                URL url = URL.valueOf(address);\r\n+\r\n+                // Refactor since 2.7.8\r\n+                updatePropertyIfAbsent(this::getUsername, this::setUsername, url.getUsername());\r\n+                updatePropertyIfAbsent(this::getPassword, this::setPassword, url.getPassword());\r\n+                updatePropertyIfAbsent(this::getProtocol, this::setProtocol, url.getProtocol());\r\n+                updatePropertyIfAbsent(this::getPort, this::setPort, url.getPort());\r\n+\r\n+//                setUsername(url.getUsername());\r\n+//                setPassword(url.getPassword());\r\n+//                updateIdIfAbsent(url.getProtocol());\r\n+//                updateProtocolIfAbsent(url.getProtocol());\r\n+//                updatePortIfAbsent(url.getPort());\r\n+                Map<String, String> params = url.getParameters();\r\n+                if (CollectionUtils.isNotEmptyMap(params)) {\r\n+                    params.remove(BACKUP_KEY);\r\n+                }\r\n+                updateParameters(params);\r\n+            } catch (Exception ignored) {\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public Integer getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    public void setPort(Integer port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    public String getUsername() {\r\n+        return username;\r\n+    }\r\n+\r\n+    public void setUsername(String username) {\r\n+        this.username = username;\r\n+    }\r\n+\r\n+    public String getPassword() {\r\n+        return password;\r\n+    }\r\n+\r\n+    public void setPassword(String password) {\r\n+        this.password = password;\r\n+    }\r\n+\r\n+    /**\r\n+     * @return wait\r\n+     * @see org.apache.dubbo.config.ProviderConfig#getWait()\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public Integer getWait() {\r\n+        return wait;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param wait\r\n+     * @see org.apache.dubbo.config.ProviderConfig#setWait(Integer)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public void setWait(Integer wait) {\r\n+        this.wait = wait;\r\n+        if (wait != null && wait > 0) {\r\n+            System.setProperty(SHUTDOWN_WAIT_KEY, String.valueOf(wait));\r\n+        }\r\n+    }\r\n+\r\n+    public Boolean isCheck() {\r\n+        return check;\r\n+    }\r\n+\r\n+    public void setCheck(Boolean check) {\r\n+        this.check = check;\r\n+    }\r\n+\r\n+    public String getFile() {\r\n+        return file;\r\n+    }\r\n+\r\n+    public void setFile(String file) {\r\n+        this.file = file;\r\n+    }\r\n+\r\n+    /**\r\n+     * @return transport\r\n+     * @see #getTransporter()\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public String getTransport() {\r\n+        return getTransporter();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param transport\r\n+     * @see #setTransporter(String)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public void setTransport(String transport) {\r\n+        setTransporter(transport);\r\n+    }\r\n+\r\n+    public String getTransporter() {\r\n+        return transporter;\r\n+    }\r\n+\r\n+    public void setTransporter(String transporter) {\r\n+        /*if(transporter != null && transporter.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(transporter)){\r\n+            throw new IllegalStateException(\"No such transporter type : \" + transporter);\r\n+        }*/\r\n+        this.transporter = transporter;\r\n+    }\r\n+\r\n+    public String getServer() {\r\n+        return server;\r\n+    }\r\n+\r\n+    public void setServer(String server) {\r\n+        /*if(server != null && server.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(server)){\r\n+            throw new IllegalStateException(\"No such server type : \" + server);\r\n+        }*/\r\n+        this.server = server;\r\n+    }\r\n+\r\n+    public String getClient() {\r\n+        return client;\r\n+    }\r\n+\r\n+    public void setClient(String client) {\r\n+        /*if(client != null && client.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(client)){\r\n+            throw new IllegalStateException(\"No such client type : \" + client);\r\n+        }*/\r\n+        this.client = client;\r\n+    }\r\n+\r\n+    public Integer getTimeout() {\r\n+        return timeout;\r\n+    }\r\n+\r\n+    public void setTimeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+    }\r\n+\r\n+    public Integer getSession() {\r\n+        return session;\r\n+    }\r\n+\r\n+    public void setSession(Integer session) {\r\n+        this.session = session;\r\n+    }\r\n+\r\n+    public Boolean isDynamic() {\r\n+        return dynamic;\r\n+    }\r\n+\r\n+    public void setDynamic(Boolean dynamic) {\r\n+        this.dynamic = dynamic;\r\n+    }\r\n+\r\n+    public Boolean isRegister() {\r\n+        return register;\r\n+    }\r\n+\r\n+    public void setRegister(Boolean register) {\r\n+        this.register = register;\r\n+    }\r\n+\r\n+    public Boolean isSubscribe() {\r\n+        return subscribe;\r\n+    }\r\n+\r\n+    public void setSubscribe(Boolean subscribe) {\r\n+        this.subscribe = subscribe;\r\n+    }\r\n+\r\n+    public String getCluster() {\r\n+        return cluster;\r\n+    }\r\n+\r\n+    public void setCluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+    }\r\n+\r\n+    public String getZone() {\r\n+        return zone;\r\n+    }\r\n+\r\n+    public void setZone(String zone) {\r\n+        this.zone = zone;\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return group;\r\n+    }\r\n+\r\n+    public void setGroup(String group) {\r\n+        this.group = group;\r\n+    }\r\n+\r\n+    public String getVersion() {\r\n+        return version;\r\n+    }\r\n+\r\n+    public void setVersion(String version) {\r\n+        this.version = version;\r\n+    }\r\n+\r\n+    public Map<String, String> getParameters() {\r\n+        return parameters;\r\n+    }\r\n+\r\n+    public void setParameters(Map<String, String> parameters) {\r\n+        this.parameters = parameters;\r\n+    }\r\n+\r\n+    public void updateParameters(Map<String, String> parameters) {\r\n+        if (CollectionUtils.isEmptyMap(parameters)) {\r\n+            return;\r\n+        }\r\n+        if (this.parameters == null) {\r\n+            this.parameters = parameters;\r\n+        } else {\r\n+            this.parameters.putAll(parameters);\r\n+        }\r\n+    }\r\n+\r\n+    public Boolean isDefault() {\r\n+        return isDefault;\r\n+    }\r\n+\r\n+    public void setDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+    }\r\n+\r\n+    public Boolean getSimplified() {\r\n+        return simplified;\r\n+    }\r\n+\r\n+    public void setSimplified(Boolean simplified) {\r\n+        this.simplified = simplified;\r\n+    }\r\n+\r\n+    @Parameter(key = EXTRA_KEYS_KEY)\r\n+    public String getExtraKeys() {\r\n+        return extraKeys;\r\n+    }\r\n+\r\n+    public void setExtraKeys(String extraKeys) {\r\n+        this.extraKeys = extraKeys;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public Boolean getUseAsConfigCenter() {\r\n+        return useAsConfigCenter;\r\n+    }\r\n+\r\n+    public void setUseAsConfigCenter(Boolean useAsConfigCenter) {\r\n+        this.useAsConfigCenter = useAsConfigCenter;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public Boolean getUseAsMetadataCenter() {\r\n+        return useAsMetadataCenter;\r\n+    }\r\n+\r\n+    public void setUseAsMetadataCenter(Boolean useAsMetadataCenter) {\r\n+        this.useAsMetadataCenter = useAsMetadataCenter;\r\n+    }\r\n+\r\n+    public String getAccepts() {\r\n+        return accepts;\r\n+    }\r\n+\r\n+    public void setAccepts(String accepts) {\r\n+        this.accepts = accepts;\r\n+    }\r\n+\r\n+    public Boolean getPreferred() {\r\n+        return preferred;\r\n+    }\r\n+\r\n+    public void setPreferred(Boolean preferred) {\r\n+        this.preferred = preferred;\r\n+    }\r\n+\r\n+    public Integer getWeight() {\r\n+        return weight;\r\n+    }\r\n+\r\n+    public void setWeight(Integer weight) {\r\n+        this.weight = weight;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void refresh() {\r\n+        super.refresh();\r\n+        if (StringUtils.isNotEmpty(this.getId())) {\r\n+            this.setPrefix(REGISTRIES_SUFFIX);\r\n+            super.refresh();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public boolean isValid() {\r\n+        // empty protocol will default to 'dubbo'\r\n+        return !StringUtils.isEmpty(address);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ServiceConfigBase.java", "source2": "org/apache/dubbo/config/ServiceConfigBase.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,416 +1,416 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.annotation.Service;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ServiceMetadata;\n-import org.apache.dubbo.rpc.service.GenericService;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.List;\n-import java.util.Optional;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-\n-/**\n- * ServiceConfig\n- *\n- * @export\n- */\n-public abstract class ServiceConfigBase<T> extends AbstractServiceConfig {\n-\n-    private static final long serialVersionUID = 3033787999037024738L;\n-\n-\n-\n-    /**\n-     * The interface class of the exported service\n-     */\n-    protected Class<?> interfaceClass;\n-\n-    /**\n-     * The reference of the interface implementation\n-     */\n-    protected T ref;\n-\n-    /**\n-     * The service name\n-     */\n-    protected String path;\n-\n-    /**\n-     * The provider configuration\n-     */\n-    protected ProviderConfig provider;\n-\n-    /**\n-     * The providerIds\n-     */\n-    protected String providerIds;\n-\n-    /**\n-     * whether it is a GenericService\n-     */\n-    protected volatile String generic;\n-\n-\n-\n-    public ServiceConfigBase() {\n-        serviceMetadata = new ServiceMetadata();\n-        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\n-    }\n-\n-    public ServiceConfigBase(Service service) {\n-        serviceMetadata = new ServiceMetadata();\n-        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\n-        appendAnnotation(Service.class, service);\n-        setMethods(MethodConfig.constructMethodConfig(service.methods()));\n-    }\n-\n-    @Deprecated\n-    private static List<ProtocolConfig> convertProviderToProtocol(List<ProviderConfig> providers) {\n-        if (CollectionUtils.isEmpty(providers)) {\n-            return null;\n-        }\n-        List<ProtocolConfig> protocols = new ArrayList<ProtocolConfig>(providers.size());\n-        for (ProviderConfig provider : providers) {\n-            protocols.add(convertProviderToProtocol(provider));\n-        }\n-        return protocols;\n-    }\n-\n-    @Deprecated\n-    private static List<ProviderConfig> convertProtocolToProvider(List<ProtocolConfig> protocols) {\n-        if (CollectionUtils.isEmpty(protocols)) {\n-            return null;\n-        }\n-        List<ProviderConfig> providers = new ArrayList<ProviderConfig>(protocols.size());\n-        for (ProtocolConfig provider : protocols) {\n-            providers.add(convertProtocolToProvider(provider));\n-        }\n-        return providers;\n-    }\n-\n-    @Deprecated\n-    private static ProtocolConfig convertProviderToProtocol(ProviderConfig provider) {\n-        ProtocolConfig protocol = new ProtocolConfig();\n-        protocol.setName(provider.getProtocol().getName());\n-        protocol.setServer(provider.getServer());\n-        protocol.setClient(provider.getClient());\n-        protocol.setCodec(provider.getCodec());\n-        protocol.setHost(provider.getHost());\n-        protocol.setPort(provider.getPort());\n-        protocol.setPath(provider.getPath());\n-        protocol.setPayload(provider.getPayload());\n-        protocol.setThreads(provider.getThreads());\n-        protocol.setParameters(provider.getParameters());\n-        return protocol;\n-    }\n-\n-    @Deprecated\n-    private static ProviderConfig convertProtocolToProvider(ProtocolConfig protocol) {\n-        ProviderConfig provider = new ProviderConfig();\n-        provider.setProtocol(protocol);\n-        provider.setServer(protocol.getServer());\n-        provider.setClient(protocol.getClient());\n-        provider.setCodec(protocol.getCodec());\n-        provider.setHost(protocol.getHost());\n-        provider.setPort(protocol.getPort());\n-        provider.setPath(protocol.getPath());\n-        provider.setPayload(protocol.getPayload());\n-        provider.setThreads(protocol.getThreads());\n-        provider.setParameters(protocol.getParameters());\n-        return provider;\n-    }\n-\n-    public boolean shouldExport() {\n-        Boolean export = getExport();\n-        // default value is true\n-        return export == null ? true : export;\n-    }\n-\n-    @Override\n-    public Boolean getExport() {\n-        return (export == null && provider != null) ? provider.getExport() : export;\n-    }\n-\n-    public boolean shouldDelay() {\n-        Integer delay = getDelay();\n-        return delay != null && delay > 0;\n-    }\n-\n-    @Override\n-    public Integer getDelay() {\n-        return (delay == null && provider != null) ? provider.getDelay() : delay;\n-    }\n-\n-    public void checkRef() {\n-        // reference should not be null, and is the implementation of the given interface\n-        if (ref == null) {\n-            throw new IllegalStateException(\"ref not allow null!\");\n-        }\n-        if (!interfaceClass.isInstance(ref)) {\n-            throw new IllegalStateException(\"The class \"\n-                    + ref.getClass().getName() + \" unimplemented interface \"\n-                    + interfaceClass + \"!\");\n-        }\n-    }\n-\n-    public Optional<String> getContextPath(ProtocolConfig protocolConfig) {\n-        String contextPath = protocolConfig.getContextpath();\n-        if (StringUtils.isEmpty(contextPath) && provider != null) {\n-            contextPath = provider.getContextpath();\n-        }\n-        return Optional.ofNullable(contextPath);\n-    }\n-\n-    protected Class getServiceClass(T ref) {\n-        return ref.getClass();\n-    }\n-\n-    public void checkDefault() throws IllegalStateException {\n-        if (provider == null) {\n-            provider = ApplicationModel.getConfigManager()\n-                    .getDefaultProvider()\n-                    .orElse(new ProviderConfig());\n-        }\n-    }\n-\n-    public void checkProtocol() {\n-        if (provider != null && notHasSelfProtocolProperty()) {\n-            setProtocols(provider.getProtocols());\n-            setProtocolIds(provider.getProtocolIds());\n-        }\n-\n-        if (CollectionUtils.isEmpty(protocols) && provider != null) {\n-            setProtocols(provider.getProtocols());\n-        }\n-        convertProtocolIdsToProtocols();\n-    }\n-\n-    private boolean notHasSelfProtocolProperty() {\n-        return CollectionUtils.isEmpty(protocols) && StringUtils.isEmpty(protocolIds);\n-    }\n-\n-    public void completeCompoundConfigs() {\n-        super.completeCompoundConfigs(provider);\n-        if (provider != null) {\n-            if (notHasSelfProtocolProperty()) {\n-                setProtocols(provider.getProtocols());\n-                setProtocolIds(provider.getProtocolIds());\n-            }\n-            if (configCenter == null) {\n-                setConfigCenter(provider.getConfigCenter());\n-            }\n-        }\n-    }\n-\n-    private void convertProtocolIdsToProtocols() {\n-        if (StringUtils.isEmpty(protocolIds)) {\n-            if (CollectionUtils.isEmpty(protocols)) {\n-                List<ProtocolConfig> protocolConfigs = ApplicationModel.getConfigManager().getDefaultProtocols();\n-                if (protocolConfigs.isEmpty()) {\n-                    protocolConfigs = new ArrayList<>(1);\n-                    ProtocolConfig protocolConfig = new ProtocolConfig();\n-                    protocolConfig.setDefault(true);\n-                    protocolConfig.refresh();\n-                    protocolConfigs.add(protocolConfig);\n-                    ApplicationModel.getConfigManager().addProtocol(protocolConfig);\n-                }\n-                setProtocols(protocolConfigs);\n-            }\n-        } else {\n-            String[] arr = COMMA_SPLIT_PATTERN.split(protocolIds);\n-            List<ProtocolConfig> tmpProtocols = new ArrayList<>();\n-            Arrays.stream(arr).forEach(id -> {\n-                if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {\n-                    Optional<ProtocolConfig> globalProtocol = ApplicationModel.getConfigManager().getProtocol(id);\n-                    if (globalProtocol.isPresent()) {\n-                        tmpProtocols.add(globalProtocol.get());\n-                    } else {\n-                        ProtocolConfig protocolConfig = new ProtocolConfig();\n-                        protocolConfig.setId(id);\n-                        protocolConfig.refresh();\n-                        tmpProtocols.add(protocolConfig);\n-                    }\n-                }\n-            });\n-            if (tmpProtocols.size() > arr.length) {\n-                throw new IllegalStateException(\"Too much protocols found, the protocols comply to this service are :\" + protocolIds + \" but got \" + protocols\n-                        .size() + \" registries!\");\n-            }\n-            setProtocols(tmpProtocols);\n-        }\n-    }\n-\n-    public Class<?> getInterfaceClass() {\n-        if (interfaceClass != null) {\n-            return interfaceClass;\n-        }\n-        if (ref instanceof GenericService) {\n-            return GenericService.class;\n-        }\n-        try {\n-            if (interfaceName != null && interfaceName.length() > 0) {\n-                this.interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\n-                        .getContextClassLoader());\n-            }\n-        } catch (ClassNotFoundException t) {\n-            throw new IllegalStateException(t.getMessage(), t);\n-        }\n-        return interfaceClass;\n-    }\n-\n-    /**\n-     * @param interfaceClass\n-     * @see #setInterface(Class)\n-     * @deprecated\n-     */\n-    public void setInterfaceClass(Class<?> interfaceClass) {\n-        setInterface(interfaceClass);\n-    }\n-\n-\n-\n-    public void setInterface(Class<?> interfaceClass) {\n-        if (interfaceClass != null && !interfaceClass.isInterface()) {\n-            throw new IllegalStateException(\"The interface class \" + interfaceClass + \" is not a interface!\");\n-        }\n-        this.interfaceClass = interfaceClass;\n-        setInterface(interfaceClass == null ? null : interfaceClass.getName());\n-    }\n-\n-    public T getRef() {\n-        return ref;\n-    }\n-\n-    public void setRef(T ref) {\n-        this.ref = ref;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getPath() {\n-        return path;\n-    }\n-\n-    public void setPath(String path) {\n-        this.path = path;\n-    }\n-\n-    public ProviderConfig getProvider() {\n-        return provider;\n-    }\n-\n-    public void setProvider(ProviderConfig provider) {\n-        ApplicationModel.getConfigManager().addProvider(provider);\n-        this.provider = provider;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getProviderIds() {\n-        return providerIds;\n-    }\n-\n-    public void setProviderIds(String providerIds) {\n-        this.providerIds = providerIds;\n-    }\n-\n-    public String getGeneric() {\n-        return generic;\n-    }\n-\n-    public void setGeneric(String generic) {\n-        if (StringUtils.isEmpty(generic)) {\n-            return;\n-        }\n-        if (ProtocolUtils.isValidGenericValue(generic)) {\n-            this.generic = generic;\n-        } else {\n-            throw new IllegalArgumentException(\"Unsupported generic type \" + generic);\n-        }\n-    }\n-\n-//    @Override\n-//    public void setMock(String mock) {\n-//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\n-//    }\n-//\n-//    @Override\n-//    public void setMock(Object mock) {\n-//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\n-//    }\n-\n-    public ServiceMetadata getServiceMetadata() {\n-        return serviceMetadata;\n-    }\n-\n-    /**\n-     * @deprecated Replace to getProtocols()\n-     */\n-    @Deprecated\n-    public List<ProviderConfig> getProviders() {\n-        return convertProtocolToProvider(protocols);\n-    }\n-\n-    /**\n-     * @deprecated Replace to setProtocols()\n-     */\n-    @Deprecated\n-    public void setProviders(List<ProviderConfig> providers) {\n-        this.protocols = convertProviderToProtocol(providers);\n-    }\n-\n-    @Override\n-    @Parameter(excluded = true)\n-    public String getPrefix() {\n-        return DUBBO + \".service.\" + interfaceName;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public String getUniqueServiceName() {\n-        return URL.buildKey(interfaceName, getGroup(), getVersion());\n-    }\n-\n-\n-\n-    @Override\n-    protected void computeValidRegistryIds() {\n-        if (provider != null && notHasSelfRegistryProperty()) {\n-            setRegistries(provider.getRegistries());\n-            setRegistryIds(provider.getRegistryIds());\n-        }\n-\n-        super.computeValidRegistryIds();\n-    }\n-\n-    public abstract void export();\n-\n-    public abstract void unexport();\n-\n-    public abstract boolean isExported();\n-\n-    public abstract boolean isUnexported();\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.annotation.Service;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ServiceMetadata;\r\n+import org.apache.dubbo.rpc.service.GenericService;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.List;\r\n+import java.util.Optional;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+\r\n+/**\r\n+ * ServiceConfig\r\n+ *\r\n+ * @export\r\n+ */\r\n+public abstract class ServiceConfigBase<T> extends AbstractServiceConfig {\r\n+\r\n+    private static final long serialVersionUID = 3033787999037024738L;\r\n+\r\n+\r\n+\r\n+    /**\r\n+     * The interface class of the exported service\r\n+     */\r\n+    protected Class<?> interfaceClass;\r\n+\r\n+    /**\r\n+     * The reference of the interface implementation\r\n+     */\r\n+    protected T ref;\r\n+\r\n+    /**\r\n+     * The service name\r\n+     */\r\n+    protected String path;\r\n+\r\n+    /**\r\n+     * The provider configuration\r\n+     */\r\n+    protected ProviderConfig provider;\r\n+\r\n+    /**\r\n+     * The providerIds\r\n+     */\r\n+    protected String providerIds;\r\n+\r\n+    /**\r\n+     * whether it is a GenericService\r\n+     */\r\n+    protected volatile String generic;\r\n+\r\n+\r\n+\r\n+    public ServiceConfigBase() {\r\n+        serviceMetadata = new ServiceMetadata();\r\n+        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\r\n+    }\r\n+\r\n+    public ServiceConfigBase(Service service) {\r\n+        serviceMetadata = new ServiceMetadata();\r\n+        serviceMetadata.addAttribute(\"ORIGIN_CONFIG\", this);\r\n+        appendAnnotation(Service.class, service);\r\n+        setMethods(MethodConfig.constructMethodConfig(service.methods()));\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    private static List<ProtocolConfig> convertProviderToProtocol(List<ProviderConfig> providers) {\r\n+        if (CollectionUtils.isEmpty(providers)) {\r\n+            return null;\r\n+        }\r\n+        List<ProtocolConfig> protocols = new ArrayList<ProtocolConfig>(providers.size());\r\n+        for (ProviderConfig provider : providers) {\r\n+            protocols.add(convertProviderToProtocol(provider));\r\n+        }\r\n+        return protocols;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    private static List<ProviderConfig> convertProtocolToProvider(List<ProtocolConfig> protocols) {\r\n+        if (CollectionUtils.isEmpty(protocols)) {\r\n+            return null;\r\n+        }\r\n+        List<ProviderConfig> providers = new ArrayList<ProviderConfig>(protocols.size());\r\n+        for (ProtocolConfig provider : protocols) {\r\n+            providers.add(convertProtocolToProvider(provider));\r\n+        }\r\n+        return providers;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    private static ProtocolConfig convertProviderToProtocol(ProviderConfig provider) {\r\n+        ProtocolConfig protocol = new ProtocolConfig();\r\n+        protocol.setName(provider.getProtocol().getName());\r\n+        protocol.setServer(provider.getServer());\r\n+        protocol.setClient(provider.getClient());\r\n+        protocol.setCodec(provider.getCodec());\r\n+        protocol.setHost(provider.getHost());\r\n+        protocol.setPort(provider.getPort());\r\n+        protocol.setPath(provider.getPath());\r\n+        protocol.setPayload(provider.getPayload());\r\n+        protocol.setThreads(provider.getThreads());\r\n+        protocol.setParameters(provider.getParameters());\r\n+        return protocol;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    private static ProviderConfig convertProtocolToProvider(ProtocolConfig protocol) {\r\n+        ProviderConfig provider = new ProviderConfig();\r\n+        provider.setProtocol(protocol);\r\n+        provider.setServer(protocol.getServer());\r\n+        provider.setClient(protocol.getClient());\r\n+        provider.setCodec(protocol.getCodec());\r\n+        provider.setHost(protocol.getHost());\r\n+        provider.setPort(protocol.getPort());\r\n+        provider.setPath(protocol.getPath());\r\n+        provider.setPayload(protocol.getPayload());\r\n+        provider.setThreads(protocol.getThreads());\r\n+        provider.setParameters(protocol.getParameters());\r\n+        return provider;\r\n+    }\r\n+\r\n+    public boolean shouldExport() {\r\n+        Boolean export = getExport();\r\n+        // default value is true\r\n+        return export == null ? true : export;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Boolean getExport() {\r\n+        return (export == null && provider != null) ? provider.getExport() : export;\r\n+    }\r\n+\r\n+    public boolean shouldDelay() {\r\n+        Integer delay = getDelay();\r\n+        return delay != null && delay > 0;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getDelay() {\r\n+        return (delay == null && provider != null) ? provider.getDelay() : delay;\r\n+    }\r\n+\r\n+    public void checkRef() {\r\n+        // reference should not be null, and is the implementation of the given interface\r\n+        if (ref == null) {\r\n+            throw new IllegalStateException(\"ref not allow null!\");\r\n+        }\r\n+        if (!interfaceClass.isInstance(ref)) {\r\n+            throw new IllegalStateException(\"The class \"\r\n+                    + ref.getClass().getName() + \" unimplemented interface \"\r\n+                    + interfaceClass + \"!\");\r\n+        }\r\n+    }\r\n+\r\n+    public Optional<String> getContextPath(ProtocolConfig protocolConfig) {\r\n+        String contextPath = protocolConfig.getContextpath();\r\n+        if (StringUtils.isEmpty(contextPath) && provider != null) {\r\n+            contextPath = provider.getContextpath();\r\n+        }\r\n+        return Optional.ofNullable(contextPath);\r\n+    }\r\n+\r\n+    protected Class getServiceClass(T ref) {\r\n+        return ref.getClass();\r\n+    }\r\n+\r\n+    public void checkDefault() throws IllegalStateException {\r\n+        if (provider == null) {\r\n+            provider = ApplicationModel.getConfigManager()\r\n+                    .getDefaultProvider()\r\n+                    .orElse(new ProviderConfig());\r\n+        }\r\n+    }\r\n+\r\n+    public void checkProtocol() {\r\n+        if (provider != null && notHasSelfProtocolProperty()) {\r\n+            setProtocols(provider.getProtocols());\r\n+            setProtocolIds(provider.getProtocolIds());\r\n+        }\r\n+\r\n+        if (CollectionUtils.isEmpty(protocols) && provider != null) {\r\n+            setProtocols(provider.getProtocols());\r\n+        }\r\n+        convertProtocolIdsToProtocols();\r\n+    }\r\n+\r\n+    private boolean notHasSelfProtocolProperty() {\r\n+        return CollectionUtils.isEmpty(protocols) && StringUtils.isEmpty(protocolIds);\r\n+    }\r\n+\r\n+    public void completeCompoundConfigs() {\r\n+        super.completeCompoundConfigs(provider);\r\n+        if (provider != null) {\r\n+            if (notHasSelfProtocolProperty()) {\r\n+                setProtocols(provider.getProtocols());\r\n+                setProtocolIds(provider.getProtocolIds());\r\n+            }\r\n+            if (configCenter == null) {\r\n+                setConfigCenter(provider.getConfigCenter());\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void convertProtocolIdsToProtocols() {\r\n+        if (StringUtils.isEmpty(protocolIds)) {\r\n+            if (CollectionUtils.isEmpty(protocols)) {\r\n+                List<ProtocolConfig> protocolConfigs = ApplicationModel.getConfigManager().getDefaultProtocols();\r\n+                if (protocolConfigs.isEmpty()) {\r\n+                    protocolConfigs = new ArrayList<>(1);\r\n+                    ProtocolConfig protocolConfig = new ProtocolConfig();\r\n+                    protocolConfig.setDefault(true);\r\n+                    protocolConfig.refresh();\r\n+                    protocolConfigs.add(protocolConfig);\r\n+                    ApplicationModel.getConfigManager().addProtocol(protocolConfig);\r\n+                }\r\n+                setProtocols(protocolConfigs);\r\n+            }\r\n+        } else {\r\n+            String[] arr = COMMA_SPLIT_PATTERN.split(protocolIds);\r\n+            List<ProtocolConfig> tmpProtocols = new ArrayList<>();\r\n+            Arrays.stream(arr).forEach(id -> {\r\n+                if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {\r\n+                    Optional<ProtocolConfig> globalProtocol = ApplicationModel.getConfigManager().getProtocol(id);\r\n+                    if (globalProtocol.isPresent()) {\r\n+                        tmpProtocols.add(globalProtocol.get());\r\n+                    } else {\r\n+                        ProtocolConfig protocolConfig = new ProtocolConfig();\r\n+                        protocolConfig.setId(id);\r\n+                        protocolConfig.refresh();\r\n+                        tmpProtocols.add(protocolConfig);\r\n+                    }\r\n+                }\r\n+            });\r\n+            if (tmpProtocols.size() > arr.length) {\r\n+                throw new IllegalStateException(\"Too much protocols found, the protocols comply to this service are :\" + protocolIds + \" but got \" + protocols\r\n+                        .size() + \" registries!\");\r\n+            }\r\n+            setProtocols(tmpProtocols);\r\n+        }\r\n+    }\r\n+\r\n+    public Class<?> getInterfaceClass() {\r\n+        if (interfaceClass != null) {\r\n+            return interfaceClass;\r\n+        }\r\n+        if (ref instanceof GenericService) {\r\n+            return GenericService.class;\r\n+        }\r\n+        try {\r\n+            if (interfaceName != null && interfaceName.length() > 0) {\r\n+                this.interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\r\n+                        .getContextClassLoader());\r\n+            }\r\n+        } catch (ClassNotFoundException t) {\r\n+            throw new IllegalStateException(t.getMessage(), t);\r\n+        }\r\n+        return interfaceClass;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param interfaceClass\r\n+     * @see #setInterface(Class)\r\n+     * @deprecated\r\n+     */\r\n+    public void setInterfaceClass(Class<?> interfaceClass) {\r\n+        setInterface(interfaceClass);\r\n+    }\r\n+\r\n+\r\n+\r\n+    public void setInterface(Class<?> interfaceClass) {\r\n+        if (interfaceClass != null && !interfaceClass.isInterface()) {\r\n+            throw new IllegalStateException(\"The interface class \" + interfaceClass + \" is not a interface!\");\r\n+        }\r\n+        this.interfaceClass = interfaceClass;\r\n+        setInterface(interfaceClass == null ? null : interfaceClass.getName());\r\n+    }\r\n+\r\n+    public T getRef() {\r\n+        return ref;\r\n+    }\r\n+\r\n+    public void setRef(T ref) {\r\n+        this.ref = ref;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getPath() {\r\n+        return path;\r\n+    }\r\n+\r\n+    public void setPath(String path) {\r\n+        this.path = path;\r\n+    }\r\n+\r\n+    public ProviderConfig getProvider() {\r\n+        return provider;\r\n+    }\r\n+\r\n+    public void setProvider(ProviderConfig provider) {\r\n+        ApplicationModel.getConfigManager().addProvider(provider);\r\n+        this.provider = provider;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getProviderIds() {\r\n+        return providerIds;\r\n+    }\r\n+\r\n+    public void setProviderIds(String providerIds) {\r\n+        this.providerIds = providerIds;\r\n+    }\r\n+\r\n+    public String getGeneric() {\r\n+        return generic;\r\n+    }\r\n+\r\n+    public void setGeneric(String generic) {\r\n+        if (StringUtils.isEmpty(generic)) {\r\n+            return;\r\n+        }\r\n+        if (ProtocolUtils.isValidGenericValue(generic)) {\r\n+            this.generic = generic;\r\n+        } else {\r\n+            throw new IllegalArgumentException(\"Unsupported generic type \" + generic);\r\n+        }\r\n+    }\r\n+\r\n+//    @Override\r\n+//    public void setMock(String mock) {\r\n+//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\r\n+//    }\r\n+//\r\n+//    @Override\r\n+//    public void setMock(Object mock) {\r\n+//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\r\n+//    }\r\n+\r\n+    public ServiceMetadata getServiceMetadata() {\r\n+        return serviceMetadata;\r\n+    }\r\n+\r\n+    /**\r\n+     * @deprecated Replace to getProtocols()\r\n+     */\r\n+    @Deprecated\r\n+    public List<ProviderConfig> getProviders() {\r\n+        return convertProtocolToProvider(protocols);\r\n+    }\r\n+\r\n+    /**\r\n+     * @deprecated Replace to setProtocols()\r\n+     */\r\n+    @Deprecated\r\n+    public void setProviders(List<ProviderConfig> providers) {\r\n+        this.protocols = convertProviderToProtocol(providers);\r\n+    }\r\n+\r\n+    @Override\r\n+    @Parameter(excluded = true)\r\n+    public String getPrefix() {\r\n+        return DUBBO + \".service.\" + interfaceName;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public String getUniqueServiceName() {\r\n+        return URL.buildKey(interfaceName, getGroup(), getVersion());\r\n+    }\r\n+\r\n+\r\n+\r\n+    @Override\r\n+    protected void computeValidRegistryIds() {\r\n+        if (provider != null && notHasSelfRegistryProperty()) {\r\n+            setRegistries(provider.getRegistries());\r\n+            setRegistryIds(provider.getRegistryIds());\r\n+        }\r\n+\r\n+        super.computeValidRegistryIds();\r\n+    }\r\n+\r\n+    public abstract void export();\r\n+\r\n+    public abstract void unexport();\r\n+\r\n+    public abstract boolean isExported();\r\n+\r\n+    public abstract boolean isUnexported();\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/config/SslConfig.java", "source2": "org/apache/dubbo/config/SslConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,188 +1,188 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.IOUtils;\n-import org.apache.dubbo.config.support.Parameter;\n-\n-import java.io.IOException;\n-import java.io.InputStream;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-public class SslConfig extends AbstractConfig {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(SslConfig.class);\n-    private AtomicBoolean inited = new AtomicBoolean(false);\n-\n-    private String serverKeyCertChainPath;\n-    private String serverPrivateKeyPath;\n-    private String serverKeyPassword;\n-    private String serverTrustCertCollectionPath;\n-\n-    private String clientKeyCertChainPath;\n-    private String clientPrivateKeyPath;\n-    private String clientKeyPassword;\n-    private String clientTrustCertCollectionPath;\n-\n-    private InputStream serverKeyCertChainPathStream;\n-    private InputStream serverPrivateKeyPathStream;\n-    private InputStream serverTrustCertCollectionPathStream;\n-\n-    private InputStream clientKeyCertChainPathStream;\n-    private InputStream clientPrivateKeyPathStream;\n-    private InputStream clientTrustCertCollectionPathStream;\n-\n-    @Parameter(key = \"server-key-cert-chain-path\")\n-    public String getServerKeyCertChainPath() {\n-        return serverKeyCertChainPath;\n-    }\n-\n-    public void setServerKeyCertChainPath(String serverKeyCertChainPath) {\n-        this.serverKeyCertChainPath = serverKeyCertChainPath;\n-    }\n-\n-    @Parameter(key = \"server-private-key-path\")\n-    public String getServerPrivateKeyPath() {\n-        return serverPrivateKeyPath;\n-    }\n-\n-    public void setServerPrivateKeyPath(String serverPrivateKeyPath) {\n-        this.serverPrivateKeyPath = serverPrivateKeyPath;\n-    }\n-\n-    @Parameter(key = \"server-key-password\")\n-    public String getServerKeyPassword() {\n-        return serverKeyPassword;\n-    }\n-\n-    public void setServerKeyPassword(String serverKeyPassword) {\n-        this.serverKeyPassword = serverKeyPassword;\n-    }\n-\n-    @Parameter(key = \"server-trust-cert-collection-path\")\n-    public String getServerTrustCertCollectionPath() {\n-        return serverTrustCertCollectionPath;\n-    }\n-\n-    public void setServerTrustCertCollectionPath(String serverTrustCertCollectionPath) {\n-        this.serverTrustCertCollectionPath = serverTrustCertCollectionPath;\n-    }\n-\n-    @Parameter(key = \"client-key-cert-chain-path\")\n-    public String getClientKeyCertChainPath() {\n-        return clientKeyCertChainPath;\n-    }\n-\n-    public void setClientKeyCertChainPath(String clientKeyCertChainPath) {\n-        this.clientKeyCertChainPath = clientKeyCertChainPath;\n-    }\n-\n-    @Parameter(key = \"client-private-key-path\")\n-    public String getClientPrivateKeyPath() {\n-        return clientPrivateKeyPath;\n-    }\n-\n-    public void setClientPrivateKeyPath(String clientPrivateKeyPath) {\n-        this.clientPrivateKeyPath = clientPrivateKeyPath;\n-    }\n-\n-    @Parameter(key = \"client-key-password\")\n-    public String getClientKeyPassword() {\n-        return clientKeyPassword;\n-    }\n-\n-    public void setClientKeyPassword(String clientKeyPassword) {\n-        this.clientKeyPassword = clientKeyPassword;\n-    }\n-\n-    @Parameter(key = \"client-trust-cert-collection-path\")\n-    public String getClientTrustCertCollectionPath() {\n-        return clientTrustCertCollectionPath;\n-    }\n-\n-    public void setClientTrustCertCollectionPath(String clientTrustCertCollectionPath) {\n-        this.clientTrustCertCollectionPath = clientTrustCertCollectionPath;\n-    }\n-\n-    public InputStream getServerKeyCertChainPathStream() throws IOException {\n-        if (serverKeyCertChainPath != null) {\n-            serverKeyCertChainPathStream = IOUtils.getURL(serverKeyCertChainPath).openStream();\n-        }\n-        return serverKeyCertChainPathStream;\n-    }\n-\n-    public void setServerKeyCertChainPathStream(InputStream serverKeyCertChainPathStream) {\n-        this.serverKeyCertChainPathStream = serverKeyCertChainPathStream;\n-    }\n-\n-    public InputStream getServerPrivateKeyPathStream() throws IOException {\n-        if (serverPrivateKeyPath != null) {\n-            serverPrivateKeyPathStream = IOUtils.getURL(serverPrivateKeyPath).openStream();\n-        }\n-        return serverPrivateKeyPathStream;\n-    }\n-\n-    public void setServerPrivateKeyPathStream(InputStream serverPrivateKeyPathStream) {\n-        this.serverPrivateKeyPathStream = serverPrivateKeyPathStream;\n-    }\n-\n-    public InputStream getServerTrustCertCollectionPathStream() throws IOException {\n-        if (serverTrustCertCollectionPath != null) {\n-            serverTrustCertCollectionPathStream = IOUtils.getURL(serverTrustCertCollectionPath).openStream();\n-        }\n-        return serverTrustCertCollectionPathStream;\n-    }\n-\n-    public void setServerTrustCertCollectionPathStream(InputStream serverTrustCertCollectionPathStream) {\n-        this.serverTrustCertCollectionPathStream = serverTrustCertCollectionPathStream;\n-    }\n-\n-    public InputStream getClientKeyCertChainPathStream() throws IOException {\n-        if (clientKeyCertChainPath != null) {\n-            clientKeyCertChainPathStream = IOUtils.getURL(clientKeyCertChainPath).openStream();\n-        }\n-        return clientKeyCertChainPathStream;\n-    }\n-\n-    public void setClientKeyCertChainPathStream(InputStream clientKeyCertChainPathStream) {\n-        this.clientKeyCertChainPathStream = clientKeyCertChainPathStream;\n-    }\n-\n-    public InputStream getClientPrivateKeyPathStream() throws IOException {\n-        if (clientPrivateKeyPath != null) {\n-            clientPrivateKeyPathStream = IOUtils.getURL(clientPrivateKeyPath).openStream();\n-        }\n-        return clientPrivateKeyPathStream;\n-    }\n-\n-    public void setClientPrivateKeyPathStream(InputStream clientPrivateKeyPathStream) {\n-        this.clientPrivateKeyPathStream = clientPrivateKeyPathStream;\n-    }\n-\n-    public InputStream getClientTrustCertCollectionPathStream() throws IOException {\n-        if (clientTrustCertCollectionPath != null) {\n-            clientTrustCertCollectionPathStream = IOUtils.getURL(clientTrustCertCollectionPath).openStream();\n-        }\n-        return clientTrustCertCollectionPathStream;\n-    }\n-\n-    public void setClientTrustCertCollectionPathStream(InputStream clientTrustCertCollectionPathStream) {\n-        this.clientTrustCertCollectionPathStream = clientTrustCertCollectionPathStream;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.IOUtils;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.InputStream;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+public class SslConfig extends AbstractConfig {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(SslConfig.class);\r\n+    private AtomicBoolean inited = new AtomicBoolean(false);\r\n+\r\n+    private String serverKeyCertChainPath;\r\n+    private String serverPrivateKeyPath;\r\n+    private String serverKeyPassword;\r\n+    private String serverTrustCertCollectionPath;\r\n+\r\n+    private String clientKeyCertChainPath;\r\n+    private String clientPrivateKeyPath;\r\n+    private String clientKeyPassword;\r\n+    private String clientTrustCertCollectionPath;\r\n+\r\n+    private InputStream serverKeyCertChainPathStream;\r\n+    private InputStream serverPrivateKeyPathStream;\r\n+    private InputStream serverTrustCertCollectionPathStream;\r\n+\r\n+    private InputStream clientKeyCertChainPathStream;\r\n+    private InputStream clientPrivateKeyPathStream;\r\n+    private InputStream clientTrustCertCollectionPathStream;\r\n+\r\n+    @Parameter(key = \"server-key-cert-chain-path\")\r\n+    public String getServerKeyCertChainPath() {\r\n+        return serverKeyCertChainPath;\r\n+    }\r\n+\r\n+    public void setServerKeyCertChainPath(String serverKeyCertChainPath) {\r\n+        this.serverKeyCertChainPath = serverKeyCertChainPath;\r\n+    }\r\n+\r\n+    @Parameter(key = \"server-private-key-path\")\r\n+    public String getServerPrivateKeyPath() {\r\n+        return serverPrivateKeyPath;\r\n+    }\r\n+\r\n+    public void setServerPrivateKeyPath(String serverPrivateKeyPath) {\r\n+        this.serverPrivateKeyPath = serverPrivateKeyPath;\r\n+    }\r\n+\r\n+    @Parameter(key = \"server-key-password\")\r\n+    public String getServerKeyPassword() {\r\n+        return serverKeyPassword;\r\n+    }\r\n+\r\n+    public void setServerKeyPassword(String serverKeyPassword) {\r\n+        this.serverKeyPassword = serverKeyPassword;\r\n+    }\r\n+\r\n+    @Parameter(key = \"server-trust-cert-collection-path\")\r\n+    public String getServerTrustCertCollectionPath() {\r\n+        return serverTrustCertCollectionPath;\r\n+    }\r\n+\r\n+    public void setServerTrustCertCollectionPath(String serverTrustCertCollectionPath) {\r\n+        this.serverTrustCertCollectionPath = serverTrustCertCollectionPath;\r\n+    }\r\n+\r\n+    @Parameter(key = \"client-key-cert-chain-path\")\r\n+    public String getClientKeyCertChainPath() {\r\n+        return clientKeyCertChainPath;\r\n+    }\r\n+\r\n+    public void setClientKeyCertChainPath(String clientKeyCertChainPath) {\r\n+        this.clientKeyCertChainPath = clientKeyCertChainPath;\r\n+    }\r\n+\r\n+    @Parameter(key = \"client-private-key-path\")\r\n+    public String getClientPrivateKeyPath() {\r\n+        return clientPrivateKeyPath;\r\n+    }\r\n+\r\n+    public void setClientPrivateKeyPath(String clientPrivateKeyPath) {\r\n+        this.clientPrivateKeyPath = clientPrivateKeyPath;\r\n+    }\r\n+\r\n+    @Parameter(key = \"client-key-password\")\r\n+    public String getClientKeyPassword() {\r\n+        return clientKeyPassword;\r\n+    }\r\n+\r\n+    public void setClientKeyPassword(String clientKeyPassword) {\r\n+        this.clientKeyPassword = clientKeyPassword;\r\n+    }\r\n+\r\n+    @Parameter(key = \"client-trust-cert-collection-path\")\r\n+    public String getClientTrustCertCollectionPath() {\r\n+        return clientTrustCertCollectionPath;\r\n+    }\r\n+\r\n+    public void setClientTrustCertCollectionPath(String clientTrustCertCollectionPath) {\r\n+        this.clientTrustCertCollectionPath = clientTrustCertCollectionPath;\r\n+    }\r\n+\r\n+    public InputStream getServerKeyCertChainPathStream() throws IOException {\r\n+        if (serverKeyCertChainPath != null) {\r\n+            serverKeyCertChainPathStream = IOUtils.getURL(serverKeyCertChainPath).openStream();\r\n+        }\r\n+        return serverKeyCertChainPathStream;\r\n+    }\r\n+\r\n+    public void setServerKeyCertChainPathStream(InputStream serverKeyCertChainPathStream) {\r\n+        this.serverKeyCertChainPathStream = serverKeyCertChainPathStream;\r\n+    }\r\n+\r\n+    public InputStream getServerPrivateKeyPathStream() throws IOException {\r\n+        if (serverPrivateKeyPath != null) {\r\n+            serverPrivateKeyPathStream = IOUtils.getURL(serverPrivateKeyPath).openStream();\r\n+        }\r\n+        return serverPrivateKeyPathStream;\r\n+    }\r\n+\r\n+    public void setServerPrivateKeyPathStream(InputStream serverPrivateKeyPathStream) {\r\n+        this.serverPrivateKeyPathStream = serverPrivateKeyPathStream;\r\n+    }\r\n+\r\n+    public InputStream getServerTrustCertCollectionPathStream() throws IOException {\r\n+        if (serverTrustCertCollectionPath != null) {\r\n+            serverTrustCertCollectionPathStream = IOUtils.getURL(serverTrustCertCollectionPath).openStream();\r\n+        }\r\n+        return serverTrustCertCollectionPathStream;\r\n+    }\r\n+\r\n+    public void setServerTrustCertCollectionPathStream(InputStream serverTrustCertCollectionPathStream) {\r\n+        this.serverTrustCertCollectionPathStream = serverTrustCertCollectionPathStream;\r\n+    }\r\n+\r\n+    public InputStream getClientKeyCertChainPathStream() throws IOException {\r\n+        if (clientKeyCertChainPath != null) {\r\n+            clientKeyCertChainPathStream = IOUtils.getURL(clientKeyCertChainPath).openStream();\r\n+        }\r\n+        return clientKeyCertChainPathStream;\r\n+    }\r\n+\r\n+    public void setClientKeyCertChainPathStream(InputStream clientKeyCertChainPathStream) {\r\n+        this.clientKeyCertChainPathStream = clientKeyCertChainPathStream;\r\n+    }\r\n+\r\n+    public InputStream getClientPrivateKeyPathStream() throws IOException {\r\n+        if (clientPrivateKeyPath != null) {\r\n+            clientPrivateKeyPathStream = IOUtils.getURL(clientPrivateKeyPath).openStream();\r\n+        }\r\n+        return clientPrivateKeyPathStream;\r\n+    }\r\n+\r\n+    public void setClientPrivateKeyPathStream(InputStream clientPrivateKeyPathStream) {\r\n+        this.clientPrivateKeyPathStream = clientPrivateKeyPathStream;\r\n+    }\r\n+\r\n+    public InputStream getClientTrustCertCollectionPathStream() throws IOException {\r\n+        if (clientTrustCertCollectionPath != null) {\r\n+            clientTrustCertCollectionPathStream = IOUtils.getURL(clientTrustCertCollectionPath).openStream();\r\n+        }\r\n+        return clientTrustCertCollectionPathStream;\r\n+    }\r\n+\r\n+    public void setClientTrustCertCollectionPathStream(InputStream clientTrustCertCollectionPathStream) {\r\n+        this.clientTrustCertCollectionPathStream = clientTrustCertCollectionPathStream;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/annotation/Argument.java", "source2": "org/apache/dubbo/config/annotation/Argument.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,44 +1,44 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.annotation;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Inherited;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * @since 2.6.5\n- *\n- * 2018/9/29\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.ANNOTATION_TYPE})\n-@Inherited\n-public @interface Argument {\n-    //argument: index -1 represents not set\n-    int index() default -1;\n-\n-    //argument type\n-    String type() default \"\";\n-\n-    //callback interface\n-    boolean callback() default false;\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.annotation;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Inherited;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * @since 2.6.5\r\n+ *\r\n+ * 2018/9/29\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.ANNOTATION_TYPE})\r\n+@Inherited\r\n+public @interface Argument {\r\n+    //argument: index -1 represents not set\r\n+    int index() default -1;\r\n+\r\n+    //argument type\r\n+    String type() default \"\";\r\n+\r\n+    //callback interface\r\n+    boolean callback() default false;\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/annotation/DubboReference.java", "source2": "org/apache/dubbo/config/annotation/DubboReference.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,298 +1,298 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.annotation;\n-\n-import org.apache.dubbo.common.constants.RegistryConstants;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * An annotation used for referencing a Dubbo service\n- *\n- * @since 2.7.7\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\n-public @interface DubboReference {\n-\n-    /**\n-     * Interface class, default value is void.class\n-     */\n-    Class<?> interfaceClass() default void.class;\n-\n-    /**\n-     * Interface class name, default value is empty string\n-     */\n-    String interfaceName() default \"\";\n-\n-    /**\n-     * Service version, default value is empty string\n-     */\n-    String version() default \"\";\n-\n-    /**\n-     * Service group, default value is empty string\n-     */\n-    String group() default \"\";\n-\n-    /**\n-     * Service target URL for direct invocation, if this is specified, then registry center takes no effect.\n-     */\n-    String url() default \"\";\n-\n-    /**\n-     * Client transport type, default value is \"netty\"\n-     */\n-    String client() default \"\";\n-\n-    /**\n-     * Whether to enable generic invocation, default value is false\n-     */\n-    boolean generic() default false;\n-\n-    /**\n-     * When enable, prefer to call local service in the same JVM if it's present, default value is true\n-     */\n-    boolean injvm() default true;\n-\n-    /**\n-     * Check if service provider is available during boot up, default value is true\n-     */\n-    boolean check() default true;\n-\n-    /**\n-     * Whether eager initialize the reference bean when all properties are set, default value is false\n-     */\n-    boolean init() default false;\n-\n-    /**\n-     * Whether to make connection when the client is created, the default value is false\n-     */\n-    boolean lazy() default false;\n-\n-    /**\n-     * Export an stub service for event dispatch, default value is false.\n-     * <p>\n-     * see org.apache.dubbo.rpc.Constants#STUB_EVENT_METHODS_KEY\n-     */\n-    boolean stubevent() default false;\n-\n-    /**\n-     * Whether to reconnect if connection is lost, if not specify, reconnect is enabled by default, and the interval\n-     * for retry connecting is 2000 ms\n-     * <p>\n-     * see org.apache.dubbo.remoting.Constants#DEFAULT_RECONNECT_PERIOD\n-     */\n-    String reconnect() default \"\";\n-\n-    /**\n-     * Whether to stick to the same node in the cluster, the default value is false\n-     * <p>\n-     * see Constants#DEFAULT_CLUSTER_STICKY\n-     */\n-    boolean sticky() default false;\n-\n-    /**\n-     * How the proxy is generated, legal values include: jdk, javassist\n-     */\n-    String proxy() default \"\";\n-\n-    /**\n-     * Service stub name, use interface name + Local if not set\n-     */\n-    String stub() default \"\";\n-\n-    /**\n-     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\n-     */\n-    String cluster() default \"\";\n-\n-    /**\n-     * Maximum connections service provider can accept, default value is 0 - connection is shared\n-     */\n-    int connections() default 0;\n-\n-    /**\n-     * The callback instance limit peer connection\n-     * <p>\n-     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\n-     */\n-    int callbacks() default 0;\n-\n-    /**\n-     * Callback method name when connected, default value is empty string\n-     */\n-    String onconnect() default \"\";\n-\n-    /**\n-     * Callback method name when disconnected, default value is empty string\n-     */\n-    String ondisconnect() default \"\";\n-\n-    /**\n-     * Service owner, default value is empty string\n-     */\n-    String owner() default \"\";\n-\n-    /**\n-     * Service layer, default value is empty string\n-     */\n-    String layer() default \"\";\n-\n-    /**\n-     * Service invocation retry times\n-     * <p>\n-     * see Constants#DEFAULT_RETRIES\n-     */\n-    int retries() default 2;\n-\n-    /**\n-     * Load balance strategy, legal values include: random, roundrobin, leastactive\n-     * <p>\n-     * see Constants#DEFAULT_LOADBALANCE\n-     */\n-    String loadbalance() default \"\";\n-\n-    /**\n-     * Whether to enable async invocation, default value is false\n-     */\n-    boolean async() default false;\n-\n-    /**\n-     * Maximum active requests allowed, default value is 0\n-     */\n-    int actives() default 0;\n-\n-    /**\n-     * Whether the async request has already been sent, the default value is false\n-     */\n-    boolean sent() default false;\n-\n-    /**\n-     * Service mock name, use interface name + Mock if not set\n-     */\n-    String mock() default \"\";\n-\n-    /**\n-     * Whether to use JSR303 validation, legal values are: true, false\n-     */\n-    String validation() default \"\";\n-\n-    /**\n-     * Timeout value for service invocation, default value is 0\n-     */\n-    int timeout() default 0;\n-\n-    /**\n-     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\n-     */\n-    String cache() default \"\";\n-\n-    /**\n-     * Filters for service invocation\n-     * <p>\n-     * see Filter\n-     */\n-    String[] filter() default {};\n-\n-    /**\n-     * Listeners for service exporting and unexporting\n-     * <p>\n-     * see ExporterListener\n-     */\n-    String[] listener() default {};\n-\n-    /**\n-     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\n-     */\n-    String[] parameters() default {};\n-\n-    /**\n-     * Application associated name\n-     */\n-    String application() default \"\";\n-\n-    /**\n-     * Module associated name\n-     */\n-    String module() default \"\";\n-\n-    /**\n-     * Consumer associated name\n-     */\n-    String consumer() default \"\";\n-\n-    /**\n-     * Monitor associated name\n-     */\n-    String monitor() default \"\";\n-\n-    /**\n-     * Registry associated name\n-     */\n-    String[] registry() default {};\n-\n-    /**\n-     * The communication protocol of Dubbo Service\n-     *\n-     * @return the default value is \"\"\n-     * @since 2.6.6\n-     */\n-    String protocol() default \"\";\n-\n-    /**\n-     * Service tag name\n-     */\n-    String tag() default \"\";\n-\n-    /**\n-     * Service merger\n-     */\n-    String merger() default \"\";\n-\n-    /**\n-     * methods support\n-     */\n-    Method[] methods() default {};\n-\n-    /**\n-     * The id\n-     *\n-     * @return default value is empty\n-     * @since 2.7.3\n-     */\n-    String id() default \"\";\n-\n-    /**\n-     * @return The service names that the Dubbo interface subscribed\n-     * @see RegistryConstants#SUBSCRIBED_SERVICE_NAMES_KEY\n-     * @deprecated using {@link DubboReference#providedBy()}\n-     * @since 2.7.8\n-     */\n-    String[] services() default {};\n-\n-    /**\n-     * declares which app or service this interface belongs to\n-     * @see RegistryConstants#PROVIDED_BY\n-     */\n-    String[] providedBy() default {};\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.annotation;\r\n+\r\n+import org.apache.dubbo.common.constants.RegistryConstants;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * An annotation used for referencing a Dubbo service\r\n+ *\r\n+ * @since 2.7.7\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\r\n+public @interface DubboReference {\r\n+\r\n+    /**\r\n+     * Interface class, default value is void.class\r\n+     */\r\n+    Class<?> interfaceClass() default void.class;\r\n+\r\n+    /**\r\n+     * Interface class name, default value is empty string\r\n+     */\r\n+    String interfaceName() default \"\";\r\n+\r\n+    /**\r\n+     * Service version, default value is empty string\r\n+     */\r\n+    String version() default \"\";\r\n+\r\n+    /**\r\n+     * Service group, default value is empty string\r\n+     */\r\n+    String group() default \"\";\r\n+\r\n+    /**\r\n+     * Service target URL for direct invocation, if this is specified, then registry center takes no effect.\r\n+     */\r\n+    String url() default \"\";\r\n+\r\n+    /**\r\n+     * Client transport type, default value is \"netty\"\r\n+     */\r\n+    String client() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to enable generic invocation, default value is false\r\n+     */\r\n+    boolean generic() default false;\r\n+\r\n+    /**\r\n+     * When enable, prefer to call local service in the same JVM if it's present, default value is true\r\n+     */\r\n+    boolean injvm() default true;\r\n+\r\n+    /**\r\n+     * Check if service provider is available during boot up, default value is true\r\n+     */\r\n+    boolean check() default true;\r\n+\r\n+    /**\r\n+     * Whether eager initialize the reference bean when all properties are set, default value is false\r\n+     */\r\n+    boolean init() default false;\r\n+\r\n+    /**\r\n+     * Whether to make connection when the client is created, the default value is false\r\n+     */\r\n+    boolean lazy() default false;\r\n+\r\n+    /**\r\n+     * Export an stub service for event dispatch, default value is false.\r\n+     * <p>\r\n+     * see org.apache.dubbo.rpc.Constants#STUB_EVENT_METHODS_KEY\r\n+     */\r\n+    boolean stubevent() default false;\r\n+\r\n+    /**\r\n+     * Whether to reconnect if connection is lost, if not specify, reconnect is enabled by default, and the interval\r\n+     * for retry connecting is 2000 ms\r\n+     * <p>\r\n+     * see org.apache.dubbo.remoting.Constants#DEFAULT_RECONNECT_PERIOD\r\n+     */\r\n+    String reconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to stick to the same node in the cluster, the default value is false\r\n+     * <p>\r\n+     * see Constants#DEFAULT_CLUSTER_STICKY\r\n+     */\r\n+    boolean sticky() default false;\r\n+\r\n+    /**\r\n+     * How the proxy is generated, legal values include: jdk, javassist\r\n+     */\r\n+    String proxy() default \"\";\r\n+\r\n+    /**\r\n+     * Service stub name, use interface name + Local if not set\r\n+     */\r\n+    String stub() default \"\";\r\n+\r\n+    /**\r\n+     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\r\n+     */\r\n+    String cluster() default \"\";\r\n+\r\n+    /**\r\n+     * Maximum connections service provider can accept, default value is 0 - connection is shared\r\n+     */\r\n+    int connections() default 0;\r\n+\r\n+    /**\r\n+     * The callback instance limit peer connection\r\n+     * <p>\r\n+     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\r\n+     */\r\n+    int callbacks() default 0;\r\n+\r\n+    /**\r\n+     * Callback method name when connected, default value is empty string\r\n+     */\r\n+    String onconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Callback method name when disconnected, default value is empty string\r\n+     */\r\n+    String ondisconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Service owner, default value is empty string\r\n+     */\r\n+    String owner() default \"\";\r\n+\r\n+    /**\r\n+     * Service layer, default value is empty string\r\n+     */\r\n+    String layer() default \"\";\r\n+\r\n+    /**\r\n+     * Service invocation retry times\r\n+     * <p>\r\n+     * see Constants#DEFAULT_RETRIES\r\n+     */\r\n+    int retries() default 2;\r\n+\r\n+    /**\r\n+     * Load balance strategy, legal values include: random, roundrobin, leastactive\r\n+     * <p>\r\n+     * see Constants#DEFAULT_LOADBALANCE\r\n+     */\r\n+    String loadbalance() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to enable async invocation, default value is false\r\n+     */\r\n+    boolean async() default false;\r\n+\r\n+    /**\r\n+     * Maximum active requests allowed, default value is 0\r\n+     */\r\n+    int actives() default 0;\r\n+\r\n+    /**\r\n+     * Whether the async request has already been sent, the default value is false\r\n+     */\r\n+    boolean sent() default false;\r\n+\r\n+    /**\r\n+     * Service mock name, use interface name + Mock if not set\r\n+     */\r\n+    String mock() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to use JSR303 validation, legal values are: true, false\r\n+     */\r\n+    String validation() default \"\";\r\n+\r\n+    /**\r\n+     * Timeout value for service invocation, default value is 0\r\n+     */\r\n+    int timeout() default 0;\r\n+\r\n+    /**\r\n+     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\r\n+     */\r\n+    String cache() default \"\";\r\n+\r\n+    /**\r\n+     * Filters for service invocation\r\n+     * <p>\r\n+     * see Filter\r\n+     */\r\n+    String[] filter() default {};\r\n+\r\n+    /**\r\n+     * Listeners for service exporting and unexporting\r\n+     * <p>\r\n+     * see ExporterListener\r\n+     */\r\n+    String[] listener() default {};\r\n+\r\n+    /**\r\n+     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\r\n+     */\r\n+    String[] parameters() default {};\r\n+\r\n+    /**\r\n+     * Application associated name\r\n+     */\r\n+    String application() default \"\";\r\n+\r\n+    /**\r\n+     * Module associated name\r\n+     */\r\n+    String module() default \"\";\r\n+\r\n+    /**\r\n+     * Consumer associated name\r\n+     */\r\n+    String consumer() default \"\";\r\n+\r\n+    /**\r\n+     * Monitor associated name\r\n+     */\r\n+    String monitor() default \"\";\r\n+\r\n+    /**\r\n+     * Registry associated name\r\n+     */\r\n+    String[] registry() default {};\r\n+\r\n+    /**\r\n+     * The communication protocol of Dubbo Service\r\n+     *\r\n+     * @return the default value is \"\"\r\n+     * @since 2.6.6\r\n+     */\r\n+    String protocol() default \"\";\r\n+\r\n+    /**\r\n+     * Service tag name\r\n+     */\r\n+    String tag() default \"\";\r\n+\r\n+    /**\r\n+     * Service merger\r\n+     */\r\n+    String merger() default \"\";\r\n+\r\n+    /**\r\n+     * methods support\r\n+     */\r\n+    Method[] methods() default {};\r\n+\r\n+    /**\r\n+     * The id\r\n+     *\r\n+     * @return default value is empty\r\n+     * @since 2.7.3\r\n+     */\r\n+    String id() default \"\";\r\n+\r\n+    /**\r\n+     * @return The service names that the Dubbo interface subscribed\r\n+     * @see RegistryConstants#SUBSCRIBED_SERVICE_NAMES_KEY\r\n+     * @deprecated using {@link DubboReference#providedBy()}\r\n+     * @since 2.7.8\r\n+     */\r\n+    String[] services() default {};\r\n+\r\n+    /**\r\n+     * declares which app or service this interface belongs to\r\n+     * @see RegistryConstants#PROVIDED_BY\r\n+     */\r\n+    String[] providedBy() default {};\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/annotation/DubboService.java", "source2": "org/apache/dubbo/config/annotation/DubboService.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,278 +1,278 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.annotation;\n-\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Inherited;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_LOADBALANCE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_RETRIES;\n-\n-/**\n- * Class-level annotation used for declaring Dubbo service\n- *\n- * @since 2.7.7\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.TYPE})\n-@Inherited\n-public @interface DubboService {\n-\n-    /**\n-     * Interface class, default value is void.class\n-     */\n-    Class<?> interfaceClass() default void.class;\n-\n-    /**\n-     * Interface class name, default value is empty string\n-     */\n-    String interfaceName() default \"\";\n-\n-    /**\n-     * Service version, default value is empty string\n-     */\n-    String version() default \"\";\n-\n-    /**\n-     * Service group, default value is empty string\n-     */\n-    String group() default \"\";\n-\n-    /**\n-     * Service path, default value is empty string\n-     */\n-    String path() default \"\";\n-\n-    /**\n-     * Whether to export service, default value is true\n-     */\n-    boolean export() default true;\n-\n-    /**\n-     * Service token, default value is false\n-     */\n-    String token() default \"\";\n-\n-    /**\n-     * Whether the service is deprecated, default value is false\n-     */\n-    boolean deprecated() default false;\n-\n-    /**\n-     * Whether the service is dynamic, default value is true\n-     */\n-    boolean dynamic() default true;\n-\n-    /**\n-     * Access log for the service, default value is \"\"\n-     */\n-    String accesslog() default \"\";\n-\n-    /**\n-     * Maximum concurrent executes for the service, default value is 0 - no limits\n-     */\n-    int executes() default 0;\n-\n-    /**\n-     * Whether to register the service to register center, default value is true\n-     */\n-    boolean register() default true;\n-\n-    /**\n-     * Service weight value, default value is 0\n-     */\n-    int weight() default 0;\n-\n-    /**\n-     * Service doc, default value is \"\"\n-     */\n-    String document() default \"\";\n-\n-    /**\n-     * Delay time for service registration, default value is 0\n-     */\n-    int delay() default 0;\n-\n-    /**\n-     * @see DubboService#stub()\n-     * @deprecated\n-     */\n-    String local() default \"\";\n-\n-    /**\n-     * Service stub name, use interface name + Local if not set\n-     */\n-    String stub() default \"\";\n-\n-    /**\n-     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\n-     */\n-    String cluster() default \"\";\n-\n-    /**\n-     * How the proxy is generated, legal values include: jdk, javassist\n-     */\n-    String proxy() default \"\";\n-\n-    /**\n-     * Maximum connections service provider can accept, default value is 0 - connection is shared\n-     */\n-    int connections() default 0;\n-\n-    /**\n-     * The callback instance limit peer connection\n-     * <p>\n-     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\n-     */\n-    int callbacks() default org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CALLBACK_INSTANCES;\n-\n-    /**\n-     * Callback method name when connected, default value is empty string\n-     */\n-    String onconnect() default \"\";\n-\n-    /**\n-     * Callback method name when disconnected, default value is empty string\n-     */\n-    String ondisconnect() default \"\";\n-\n-    /**\n-     * Service owner, default value is empty string\n-     */\n-    String owner() default \"\";\n-\n-    /**\n-     * Service layer, default value is empty string\n-     */\n-    String layer() default \"\";\n-\n-    /**\n-     * Service invocation retry times\n-     *\n-     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_RETRIES\n-     */\n-    int retries() default DEFAULT_RETRIES;\n-\n-    /**\n-     * Load balance strategy, legal values include: random, roundrobin, leastactive\n-     *\n-     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_LOADBALANCE\n-     */\n-    String loadbalance() default DEFAULT_LOADBALANCE;\n-\n-    /**\n-     * Whether to enable async invocation, default value is false\n-     */\n-    boolean async() default false;\n-\n-    /**\n-     * Maximum active requests allowed, default value is 0\n-     */\n-    int actives() default 0;\n-\n-    /**\n-     * Whether the async request has already been sent, the default value is false\n-     */\n-    boolean sent() default false;\n-\n-    /**\n-     * Service mock name, use interface name + Mock if not set\n-     */\n-    String mock() default \"\";\n-\n-    /**\n-     * Whether to use JSR303 validation, legal values are: true, false\n-     */\n-    String validation() default \"\";\n-\n-    /**\n-     * Timeout value for service invocation, default value is 0\n-     */\n-    int timeout() default 0;\n-\n-    /**\n-     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\n-     */\n-    String cache() default \"\";\n-\n-    /**\n-     * Filters for service invocation\n-     *\n-     * @see Filter\n-     */\n-    String[] filter() default {};\n-\n-    /**\n-     * Listeners for service exporting and unexporting\n-     *\n-     * @see ExporterListener\n-     */\n-    String[] listener() default {};\n-\n-    /**\n-     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\n-     */\n-    String[] parameters() default {};\n-\n-    /**\n-     * Application spring bean name\n-     */\n-    String application() default \"\";\n-\n-    /**\n-     * Module spring bean name\n-     */\n-    String module() default \"\";\n-\n-    /**\n-     * Provider spring bean name\n-     */\n-    String provider() default \"\";\n-\n-    /**\n-     * Protocol spring bean names\n-     */\n-    String[] protocol() default {};\n-\n-    /**\n-     * Monitor spring bean name\n-     */\n-    String monitor() default \"\";\n-\n-    /**\n-     * Registry spring bean name\n-     */\n-    String[] registry() default {};\n-\n-    /**\n-     * Service tag name\n-     */\n-    String tag() default \"\";\n-\n-    /**\n-     * methods support\n-     *\n-     * @return\n-     */\n-    Method[] methods() default {};\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.annotation;\r\n+\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Inherited;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_LOADBALANCE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_RETRIES;\r\n+\r\n+/**\r\n+ * Class-level annotation used for declaring Dubbo service\r\n+ *\r\n+ * @since 2.7.7\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.TYPE})\r\n+@Inherited\r\n+public @interface DubboService {\r\n+\r\n+    /**\r\n+     * Interface class, default value is void.class\r\n+     */\r\n+    Class<?> interfaceClass() default void.class;\r\n+\r\n+    /**\r\n+     * Interface class name, default value is empty string\r\n+     */\r\n+    String interfaceName() default \"\";\r\n+\r\n+    /**\r\n+     * Service version, default value is empty string\r\n+     */\r\n+    String version() default \"\";\r\n+\r\n+    /**\r\n+     * Service group, default value is empty string\r\n+     */\r\n+    String group() default \"\";\r\n+\r\n+    /**\r\n+     * Service path, default value is empty string\r\n+     */\r\n+    String path() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to export service, default value is true\r\n+     */\r\n+    boolean export() default true;\r\n+\r\n+    /**\r\n+     * Service token, default value is false\r\n+     */\r\n+    String token() default \"\";\r\n+\r\n+    /**\r\n+     * Whether the service is deprecated, default value is false\r\n+     */\r\n+    boolean deprecated() default false;\r\n+\r\n+    /**\r\n+     * Whether the service is dynamic, default value is true\r\n+     */\r\n+    boolean dynamic() default true;\r\n+\r\n+    /**\r\n+     * Access log for the service, default value is \"\"\r\n+     */\r\n+    String accesslog() default \"\";\r\n+\r\n+    /**\r\n+     * Maximum concurrent executes for the service, default value is 0 - no limits\r\n+     */\r\n+    int executes() default 0;\r\n+\r\n+    /**\r\n+     * Whether to register the service to register center, default value is true\r\n+     */\r\n+    boolean register() default true;\r\n+\r\n+    /**\r\n+     * Service weight value, default value is 0\r\n+     */\r\n+    int weight() default 0;\r\n+\r\n+    /**\r\n+     * Service doc, default value is \"\"\r\n+     */\r\n+    String document() default \"\";\r\n+\r\n+    /**\r\n+     * Delay time for service registration, default value is 0\r\n+     */\r\n+    int delay() default 0;\r\n+\r\n+    /**\r\n+     * @see DubboService#stub()\r\n+     * @deprecated\r\n+     */\r\n+    String local() default \"\";\r\n+\r\n+    /**\r\n+     * Service stub name, use interface name + Local if not set\r\n+     */\r\n+    String stub() default \"\";\r\n+\r\n+    /**\r\n+     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\r\n+     */\r\n+    String cluster() default \"\";\r\n+\r\n+    /**\r\n+     * How the proxy is generated, legal values include: jdk, javassist\r\n+     */\r\n+    String proxy() default \"\";\r\n+\r\n+    /**\r\n+     * Maximum connections service provider can accept, default value is 0 - connection is shared\r\n+     */\r\n+    int connections() default 0;\r\n+\r\n+    /**\r\n+     * The callback instance limit peer connection\r\n+     * <p>\r\n+     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\r\n+     */\r\n+    int callbacks() default org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CALLBACK_INSTANCES;\r\n+\r\n+    /**\r\n+     * Callback method name when connected, default value is empty string\r\n+     */\r\n+    String onconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Callback method name when disconnected, default value is empty string\r\n+     */\r\n+    String ondisconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Service owner, default value is empty string\r\n+     */\r\n+    String owner() default \"\";\r\n+\r\n+    /**\r\n+     * Service layer, default value is empty string\r\n+     */\r\n+    String layer() default \"\";\r\n+\r\n+    /**\r\n+     * Service invocation retry times\r\n+     *\r\n+     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_RETRIES\r\n+     */\r\n+    int retries() default DEFAULT_RETRIES;\r\n+\r\n+    /**\r\n+     * Load balance strategy, legal values include: random, roundrobin, leastactive\r\n+     *\r\n+     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_LOADBALANCE\r\n+     */\r\n+    String loadbalance() default DEFAULT_LOADBALANCE;\r\n+\r\n+    /**\r\n+     * Whether to enable async invocation, default value is false\r\n+     */\r\n+    boolean async() default false;\r\n+\r\n+    /**\r\n+     * Maximum active requests allowed, default value is 0\r\n+     */\r\n+    int actives() default 0;\r\n+\r\n+    /**\r\n+     * Whether the async request has already been sent, the default value is false\r\n+     */\r\n+    boolean sent() default false;\r\n+\r\n+    /**\r\n+     * Service mock name, use interface name + Mock if not set\r\n+     */\r\n+    String mock() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to use JSR303 validation, legal values are: true, false\r\n+     */\r\n+    String validation() default \"\";\r\n+\r\n+    /**\r\n+     * Timeout value for service invocation, default value is 0\r\n+     */\r\n+    int timeout() default 0;\r\n+\r\n+    /**\r\n+     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\r\n+     */\r\n+    String cache() default \"\";\r\n+\r\n+    /**\r\n+     * Filters for service invocation\r\n+     *\r\n+     * @see Filter\r\n+     */\r\n+    String[] filter() default {};\r\n+\r\n+    /**\r\n+     * Listeners for service exporting and unexporting\r\n+     *\r\n+     * @see ExporterListener\r\n+     */\r\n+    String[] listener() default {};\r\n+\r\n+    /**\r\n+     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\r\n+     */\r\n+    String[] parameters() default {};\r\n+\r\n+    /**\r\n+     * Application spring bean name\r\n+     */\r\n+    String application() default \"\";\r\n+\r\n+    /**\r\n+     * Module spring bean name\r\n+     */\r\n+    String module() default \"\";\r\n+\r\n+    /**\r\n+     * Provider spring bean name\r\n+     */\r\n+    String provider() default \"\";\r\n+\r\n+    /**\r\n+     * Protocol spring bean names\r\n+     */\r\n+    String[] protocol() default {};\r\n+\r\n+    /**\r\n+     * Monitor spring bean name\r\n+     */\r\n+    String monitor() default \"\";\r\n+\r\n+    /**\r\n+     * Registry spring bean name\r\n+     */\r\n+    String[] registry() default {};\r\n+\r\n+    /**\r\n+     * Service tag name\r\n+     */\r\n+    String tag() default \"\";\r\n+\r\n+    /**\r\n+     * methods support\r\n+     *\r\n+     * @return\r\n+     */\r\n+    Method[] methods() default {};\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/annotation/Method.java", "source2": "org/apache/dubbo/config/annotation/Method.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.annotation;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Inherited;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * @since 2.6.5\n- *  *\n- *  * 2018/9/29\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.ANNOTATION_TYPE})\n-@Inherited\n-public @interface Method {\n-    String name();\n-\n-    int timeout() default -1;\n-\n-    int retries() default -1;\n-\n-    String loadbalance() default \"\";\n-\n-    boolean async() default false;\n-\n-    boolean sent() default true;\n-\n-    int actives() default 0;\n-\n-    int executes() default 0;\n-\n-    boolean deprecated() default false;\n-\n-    boolean sticky() default false;\n-\n-    boolean isReturn() default true;\n-\n-    String oninvoke() default \"\";\n-\n-    String onreturn() default \"\";\n-\n-    String onthrow() default \"\";\n-\n-    String cache() default \"\";\n-\n-    String validation() default \"\";\n-\n-    String merger() default \"\";\n-\n-    Argument[] arguments() default {};\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.annotation;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Inherited;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * @since 2.6.5\r\n+ *  *\r\n+ *  * 2018/9/29\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.ANNOTATION_TYPE})\r\n+@Inherited\r\n+public @interface Method {\r\n+    String name();\r\n+\r\n+    int timeout() default -1;\r\n+\r\n+    int retries() default -1;\r\n+\r\n+    String loadbalance() default \"\";\r\n+\r\n+    boolean async() default false;\r\n+\r\n+    boolean sent() default true;\r\n+\r\n+    int actives() default 0;\r\n+\r\n+    int executes() default 0;\r\n+\r\n+    boolean deprecated() default false;\r\n+\r\n+    boolean sticky() default false;\r\n+\r\n+    boolean isReturn() default true;\r\n+\r\n+    String oninvoke() default \"\";\r\n+\r\n+    String onreturn() default \"\";\r\n+\r\n+    String onthrow() default \"\";\r\n+\r\n+    String cache() default \"\";\r\n+\r\n+    String validation() default \"\";\r\n+\r\n+    String merger() default \"\";\r\n+\r\n+    Argument[] arguments() default {};\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/annotation/Reference.java", "source2": "org/apache/dubbo/config/annotation/Reference.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,282 +1,282 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.annotation;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * Reference\n- * <p>\n- *\n- * @see DubboReference\n- * @since 2.7.0\n- * @deprecated Recommend {@link DubboReference} as the substitute\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\n-@Deprecated\n-public @interface Reference {\n-    /**\n-     * Interface class, default value is void.class\n-     */\n-    Class<?> interfaceClass() default void.class;\n-\n-    /**\n-     * Interface class name, default value is empty string\n-     */\n-    String interfaceName() default \"\";\n-\n-    /**\n-     * Service version, default value is empty string\n-     */\n-    String version() default \"\";\n-\n-    /**\n-     * Service group, default value is empty string\n-     */\n-    String group() default \"\";\n-\n-    /**\n-     * Service target URL for direct invocation, if this is specified, then registry center takes no effect.\n-     */\n-    String url() default \"\";\n-\n-    /**\n-     * Client transport type, default value is \"netty\"\n-     */\n-    String client() default \"\";\n-\n-    /**\n-     * Whether to enable generic invocation, default value is false\n-     */\n-    boolean generic() default false;\n-\n-    /**\n-     * When enable, prefer to call local service in the same JVM if it's present, default value is true\n-     */\n-    boolean injvm() default true;\n-\n-    /**\n-     * Check if service provider is available during boot up, default value is true\n-     */\n-    boolean check() default true;\n-\n-    /**\n-     * Whether eager initialize the reference bean when all properties are set, default value is false\n-     */\n-    boolean init() default false;\n-\n-    /**\n-     * Whether to make connection when the client is created, the default value is false\n-     */\n-    boolean lazy() default false;\n-\n-    /**\n-     * Export an stub service for event dispatch, default value is false.\n-     * <p>\n-     * see org.apache.dubbo.rpc.Constants#STUB_EVENT_METHODS_KEY\n-     */\n-    boolean stubevent() default false;\n-\n-    /**\n-     * Whether to reconnect if connection is lost, if not specify, reconnect is enabled by default, and the interval\n-     * for retry connecting is 2000 ms\n-     * <p>\n-     * see org.apache.dubbo.remoting.Constants#DEFAULT_RECONNECT_PERIOD\n-     */\n-    String reconnect() default \"\";\n-\n-    /**\n-     * Whether to stick to the same node in the cluster, the default value is false\n-     * <p>\n-     * see Constants#DEFAULT_CLUSTER_STICKY\n-     */\n-    boolean sticky() default false;\n-\n-    /**\n-     * How the proxy is generated, legal values include: jdk, javassist\n-     */\n-    String proxy() default \"\";\n-\n-    /**\n-     * Service stub name, use interface name + Local if not set\n-     */\n-    String stub() default \"\";\n-\n-    /**\n-     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\n-     */\n-    String cluster() default \"\";\n-\n-    /**\n-     * Maximum connections service provider can accept, default value is 0 - connection is shared\n-     */\n-    int connections() default 0;\n-\n-    /**\n-     * The callback instance limit peer connection\n-     * <p>\n-     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\n-     */\n-    int callbacks() default 0;\n-\n-    /**\n-     * Callback method name when connected, default value is empty string\n-     */\n-    String onconnect() default \"\";\n-\n-    /**\n-     * Callback method name when disconnected, default value is empty string\n-     */\n-    String ondisconnect() default \"\";\n-\n-    /**\n-     * Service owner, default value is empty string\n-     */\n-    String owner() default \"\";\n-\n-    /**\n-     * Service layer, default value is empty string\n-     */\n-    String layer() default \"\";\n-\n-    /**\n-     * Service invocation retry times\n-     * <p>\n-     * see Constants#DEFAULT_RETRIES\n-     */\n-    int retries() default 2;\n-\n-    /**\n-     * Load balance strategy, legal values include: random, roundrobin, leastactive\n-     * <p>\n-     * see Constants#DEFAULT_LOADBALANCE\n-     */\n-    String loadbalance() default \"\";\n-\n-    /**\n-     * Whether to enable async invocation, default value is false\n-     */\n-    boolean async() default false;\n-\n-    /**\n-     * Maximum active requests allowed, default value is 0\n-     */\n-    int actives() default 0;\n-\n-    /**\n-     * Whether the async request has already been sent, the default value is false\n-     */\n-    boolean sent() default false;\n-\n-    /**\n-     * Service mock name, use interface name + Mock if not set\n-     */\n-    String mock() default \"\";\n-\n-    /**\n-     * Whether to use JSR303 validation, legal values are: true, false\n-     */\n-    String validation() default \"\";\n-\n-    /**\n-     * Timeout value for service invocation, default value is 0\n-     */\n-    int timeout() default 0;\n-\n-    /**\n-     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\n-     */\n-    String cache() default \"\";\n-\n-    /**\n-     * Filters for service invocation\n-     * <p>\n-     * see Filter\n-     */\n-    String[] filter() default {};\n-\n-    /**\n-     * Listeners for service exporting and unexporting\n-     * <p>\n-     * see ExporterListener\n-     */\n-    String[] listener() default {};\n-\n-    /**\n-     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\n-     */\n-    String[] parameters() default {};\n-\n-    /**\n-     * Application associated name\n-     */\n-    String application() default \"\";\n-\n-    /**\n-     * Module associated name\n-     */\n-    String module() default \"\";\n-\n-    /**\n-     * Consumer associated name\n-     */\n-    String consumer() default \"\";\n-\n-    /**\n-     * Monitor associated name\n-     */\n-    String monitor() default \"\";\n-\n-    /**\n-     * Registry associated name\n-     */\n-    String[] registry() default {};\n-\n-    /**\n-     * The communication protocol of Dubbo Service\n-     *\n-     * @return the default value is \"\"\n-     * @since 2.6.6\n-     */\n-    String protocol() default \"\";\n-\n-    /**\n-     * Service tag name\n-     */\n-    String tag() default \"\";\n-\n-    /**\n-     * methods support\n-     *\n-     * @return\n-     */\n-    Method[] methods() default {};\n-\n-    /**\n-     * The id\n-     *\n-     * @return default value is empty\n-     * @since 2.7.3\n-     */\n-    String id() default \"\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.annotation;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * Reference\r\n+ * <p>\r\n+ *\r\n+ * @see DubboReference\r\n+ * @since 2.7.0\r\n+ * @deprecated Recommend {@link DubboReference} as the substitute\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\r\n+@Deprecated\r\n+public @interface Reference {\r\n+    /**\r\n+     * Interface class, default value is void.class\r\n+     */\r\n+    Class<?> interfaceClass() default void.class;\r\n+\r\n+    /**\r\n+     * Interface class name, default value is empty string\r\n+     */\r\n+    String interfaceName() default \"\";\r\n+\r\n+    /**\r\n+     * Service version, default value is empty string\r\n+     */\r\n+    String version() default \"\";\r\n+\r\n+    /**\r\n+     * Service group, default value is empty string\r\n+     */\r\n+    String group() default \"\";\r\n+\r\n+    /**\r\n+     * Service target URL for direct invocation, if this is specified, then registry center takes no effect.\r\n+     */\r\n+    String url() default \"\";\r\n+\r\n+    /**\r\n+     * Client transport type, default value is \"netty\"\r\n+     */\r\n+    String client() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to enable generic invocation, default value is false\r\n+     */\r\n+    boolean generic() default false;\r\n+\r\n+    /**\r\n+     * When enable, prefer to call local service in the same JVM if it's present, default value is true\r\n+     */\r\n+    boolean injvm() default true;\r\n+\r\n+    /**\r\n+     * Check if service provider is available during boot up, default value is true\r\n+     */\r\n+    boolean check() default true;\r\n+\r\n+    /**\r\n+     * Whether eager initialize the reference bean when all properties are set, default value is false\r\n+     */\r\n+    boolean init() default false;\r\n+\r\n+    /**\r\n+     * Whether to make connection when the client is created, the default value is false\r\n+     */\r\n+    boolean lazy() default false;\r\n+\r\n+    /**\r\n+     * Export an stub service for event dispatch, default value is false.\r\n+     * <p>\r\n+     * see org.apache.dubbo.rpc.Constants#STUB_EVENT_METHODS_KEY\r\n+     */\r\n+    boolean stubevent() default false;\r\n+\r\n+    /**\r\n+     * Whether to reconnect if connection is lost, if not specify, reconnect is enabled by default, and the interval\r\n+     * for retry connecting is 2000 ms\r\n+     * <p>\r\n+     * see org.apache.dubbo.remoting.Constants#DEFAULT_RECONNECT_PERIOD\r\n+     */\r\n+    String reconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to stick to the same node in the cluster, the default value is false\r\n+     * <p>\r\n+     * see Constants#DEFAULT_CLUSTER_STICKY\r\n+     */\r\n+    boolean sticky() default false;\r\n+\r\n+    /**\r\n+     * How the proxy is generated, legal values include: jdk, javassist\r\n+     */\r\n+    String proxy() default \"\";\r\n+\r\n+    /**\r\n+     * Service stub name, use interface name + Local if not set\r\n+     */\r\n+    String stub() default \"\";\r\n+\r\n+    /**\r\n+     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\r\n+     */\r\n+    String cluster() default \"\";\r\n+\r\n+    /**\r\n+     * Maximum connections service provider can accept, default value is 0 - connection is shared\r\n+     */\r\n+    int connections() default 0;\r\n+\r\n+    /**\r\n+     * The callback instance limit peer connection\r\n+     * <p>\r\n+     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\r\n+     */\r\n+    int callbacks() default 0;\r\n+\r\n+    /**\r\n+     * Callback method name when connected, default value is empty string\r\n+     */\r\n+    String onconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Callback method name when disconnected, default value is empty string\r\n+     */\r\n+    String ondisconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Service owner, default value is empty string\r\n+     */\r\n+    String owner() default \"\";\r\n+\r\n+    /**\r\n+     * Service layer, default value is empty string\r\n+     */\r\n+    String layer() default \"\";\r\n+\r\n+    /**\r\n+     * Service invocation retry times\r\n+     * <p>\r\n+     * see Constants#DEFAULT_RETRIES\r\n+     */\r\n+    int retries() default 2;\r\n+\r\n+    /**\r\n+     * Load balance strategy, legal values include: random, roundrobin, leastactive\r\n+     * <p>\r\n+     * see Constants#DEFAULT_LOADBALANCE\r\n+     */\r\n+    String loadbalance() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to enable async invocation, default value is false\r\n+     */\r\n+    boolean async() default false;\r\n+\r\n+    /**\r\n+     * Maximum active requests allowed, default value is 0\r\n+     */\r\n+    int actives() default 0;\r\n+\r\n+    /**\r\n+     * Whether the async request has already been sent, the default value is false\r\n+     */\r\n+    boolean sent() default false;\r\n+\r\n+    /**\r\n+     * Service mock name, use interface name + Mock if not set\r\n+     */\r\n+    String mock() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to use JSR303 validation, legal values are: true, false\r\n+     */\r\n+    String validation() default \"\";\r\n+\r\n+    /**\r\n+     * Timeout value for service invocation, default value is 0\r\n+     */\r\n+    int timeout() default 0;\r\n+\r\n+    /**\r\n+     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\r\n+     */\r\n+    String cache() default \"\";\r\n+\r\n+    /**\r\n+     * Filters for service invocation\r\n+     * <p>\r\n+     * see Filter\r\n+     */\r\n+    String[] filter() default {};\r\n+\r\n+    /**\r\n+     * Listeners for service exporting and unexporting\r\n+     * <p>\r\n+     * see ExporterListener\r\n+     */\r\n+    String[] listener() default {};\r\n+\r\n+    /**\r\n+     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\r\n+     */\r\n+    String[] parameters() default {};\r\n+\r\n+    /**\r\n+     * Application associated name\r\n+     */\r\n+    String application() default \"\";\r\n+\r\n+    /**\r\n+     * Module associated name\r\n+     */\r\n+    String module() default \"\";\r\n+\r\n+    /**\r\n+     * Consumer associated name\r\n+     */\r\n+    String consumer() default \"\";\r\n+\r\n+    /**\r\n+     * Monitor associated name\r\n+     */\r\n+    String monitor() default \"\";\r\n+\r\n+    /**\r\n+     * Registry associated name\r\n+     */\r\n+    String[] registry() default {};\r\n+\r\n+    /**\r\n+     * The communication protocol of Dubbo Service\r\n+     *\r\n+     * @return the default value is \"\"\r\n+     * @since 2.6.6\r\n+     */\r\n+    String protocol() default \"\";\r\n+\r\n+    /**\r\n+     * Service tag name\r\n+     */\r\n+    String tag() default \"\";\r\n+\r\n+    /**\r\n+     * methods support\r\n+     *\r\n+     * @return\r\n+     */\r\n+    Method[] methods() default {};\r\n+\r\n+    /**\r\n+     * The id\r\n+     *\r\n+     * @return default value is empty\r\n+     * @since 2.7.3\r\n+     */\r\n+    String id() default \"\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/annotation/Service.java", "source2": "org/apache/dubbo/config/annotation/Service.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,281 +1,281 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.annotation;\n-\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Inherited;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_LOADBALANCE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_RETRIES;\n-\n-/**\n- * Service annotation\n- *\n- * @see DubboService\n- * @since 2.7.0\n- * @deprecated Recommend {@link DubboService} as the substitute\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.TYPE})\n-@Inherited\n-@Deprecated\n-public @interface Service {\n-\n-    /**\n-     * Interface class, default value is void.class\n-     */\n-    Class<?> interfaceClass() default void.class;\n-\n-    /**\n-     * Interface class name, default value is empty string\n-     */\n-    String interfaceName() default \"\";\n-\n-    /**\n-     * Service version, default value is empty string\n-     */\n-    String version() default \"\";\n-\n-    /**\n-     * Service group, default value is empty string\n-     */\n-    String group() default \"\";\n-\n-    /**\n-     * Service path, default value is empty string\n-     */\n-    String path() default \"\";\n-\n-    /**\n-     * Whether to export service, default value is true\n-     */\n-    boolean export() default true;\n-\n-    /**\n-     * Service token, default value is false\n-     */\n-    String token() default \"\";\n-\n-    /**\n-     * Whether the service is deprecated, default value is false\n-     */\n-    boolean deprecated() default false;\n-\n-    /**\n-     * Whether the service is dynamic, default value is true\n-     */\n-    boolean dynamic() default true;\n-\n-    /**\n-     * Access log for the service, default value is \"\"\n-     */\n-    String accesslog() default \"\";\n-\n-    /**\n-     * Maximum concurrent executes for the service, default value is 0 - no limits\n-     */\n-    int executes() default 0;\n-\n-    /**\n-     * Whether to register the service to register center, default value is true\n-     */\n-    boolean register() default true;\n-\n-    /**\n-     * Service weight value, default value is 0\n-     */\n-    int weight() default 0;\n-\n-    /**\n-     * Service doc, default value is \"\"\n-     */\n-    String document() default \"\";\n-\n-    /**\n-     * Delay time for service registration, default value is 0\n-     */\n-    int delay() default 0;\n-\n-    /**\n-     * @see Service#stub()\n-     * @deprecated\n-     */\n-    String local() default \"\";\n-\n-    /**\n-     * Service stub name, use interface name + Local if not set\n-     */\n-    String stub() default \"\";\n-\n-    /**\n-     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\n-     */\n-    String cluster() default \"\";\n-\n-    /**\n-     * How the proxy is generated, legal values include: jdk, javassist\n-     */\n-    String proxy() default \"\";\n-\n-    /**\n-     * Maximum connections service provider can accept, default value is 0 - connection is shared\n-     */\n-    int connections() default 0;\n-\n-    /**\n-     * The callback instance limit peer connection\n-     * <p>\n-     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\n-     */\n-    int callbacks() default org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CALLBACK_INSTANCES;\n-\n-    /**\n-     * Callback method name when connected, default value is empty string\n-     */\n-    String onconnect() default \"\";\n-\n-    /**\n-     * Callback method name when disconnected, default value is empty string\n-     */\n-    String ondisconnect() default \"\";\n-\n-    /**\n-     * Service owner, default value is empty string\n-     */\n-    String owner() default \"\";\n-\n-    /**\n-     * Service layer, default value is empty string\n-     */\n-    String layer() default \"\";\n-\n-    /**\n-     * Service invocation retry times\n-     *\n-     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_RETRIES\n-     */\n-    int retries() default DEFAULT_RETRIES;\n-\n-    /**\n-     * Load balance strategy, legal values include: random, roundrobin, leastactive\n-     *\n-     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_LOADBALANCE\n-     */\n-    String loadbalance() default DEFAULT_LOADBALANCE;\n-\n-    /**\n-     * Whether to enable async invocation, default value is false\n-     */\n-    boolean async() default false;\n-\n-    /**\n-     * Maximum active requests allowed, default value is 0\n-     */\n-    int actives() default 0;\n-\n-    /**\n-     * Whether the async request has already been sent, the default value is false\n-     */\n-    boolean sent() default false;\n-\n-    /**\n-     * Service mock name, use interface name + Mock if not set\n-     */\n-    String mock() default \"\";\n-\n-    /**\n-     * Whether to use JSR303 validation, legal values are: true, false\n-     */\n-    String validation() default \"\";\n-\n-    /**\n-     * Timeout value for service invocation, default value is 0\n-     */\n-    int timeout() default 0;\n-\n-    /**\n-     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\n-     */\n-    String cache() default \"\";\n-\n-    /**\n-     * Filters for service invocation\n-     *\n-     * @see Filter\n-     */\n-    String[] filter() default {};\n-\n-    /**\n-     * Listeners for service exporting and unexporting\n-     *\n-     * @see ExporterListener\n-     */\n-    String[] listener() default {};\n-\n-    /**\n-     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\n-     */\n-    String[] parameters() default {};\n-\n-    /**\n-     * Application spring bean name\n-     */\n-    String application() default \"\";\n-\n-    /**\n-     * Module spring bean name\n-     */\n-    String module() default \"\";\n-\n-    /**\n-     * Provider spring bean name\n-     */\n-    String provider() default \"\";\n-\n-    /**\n-     * Protocol spring bean names\n-     */\n-    String[] protocol() default {};\n-\n-    /**\n-     * Monitor spring bean name\n-     */\n-    String monitor() default \"\";\n-\n-    /**\n-     * Registry spring bean name\n-     */\n-    String[] registry() default {};\n-\n-    /**\n-     * Service tag name\n-     */\n-    String tag() default \"\";\n-\n-    /**\n-     * methods support\n-     *\n-     * @return\n-     */\n-    Method[] methods() default {};\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.annotation;\r\n+\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Inherited;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_LOADBALANCE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_RETRIES;\r\n+\r\n+/**\r\n+ * Service annotation\r\n+ *\r\n+ * @see DubboService\r\n+ * @since 2.7.0\r\n+ * @deprecated Recommend {@link DubboService} as the substitute\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.TYPE})\r\n+@Inherited\r\n+@Deprecated\r\n+public @interface Service {\r\n+\r\n+    /**\r\n+     * Interface class, default value is void.class\r\n+     */\r\n+    Class<?> interfaceClass() default void.class;\r\n+\r\n+    /**\r\n+     * Interface class name, default value is empty string\r\n+     */\r\n+    String interfaceName() default \"\";\r\n+\r\n+    /**\r\n+     * Service version, default value is empty string\r\n+     */\r\n+    String version() default \"\";\r\n+\r\n+    /**\r\n+     * Service group, default value is empty string\r\n+     */\r\n+    String group() default \"\";\r\n+\r\n+    /**\r\n+     * Service path, default value is empty string\r\n+     */\r\n+    String path() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to export service, default value is true\r\n+     */\r\n+    boolean export() default true;\r\n+\r\n+    /**\r\n+     * Service token, default value is false\r\n+     */\r\n+    String token() default \"\";\r\n+\r\n+    /**\r\n+     * Whether the service is deprecated, default value is false\r\n+     */\r\n+    boolean deprecated() default false;\r\n+\r\n+    /**\r\n+     * Whether the service is dynamic, default value is true\r\n+     */\r\n+    boolean dynamic() default true;\r\n+\r\n+    /**\r\n+     * Access log for the service, default value is \"\"\r\n+     */\r\n+    String accesslog() default \"\";\r\n+\r\n+    /**\r\n+     * Maximum concurrent executes for the service, default value is 0 - no limits\r\n+     */\r\n+    int executes() default 0;\r\n+\r\n+    /**\r\n+     * Whether to register the service to register center, default value is true\r\n+     */\r\n+    boolean register() default true;\r\n+\r\n+    /**\r\n+     * Service weight value, default value is 0\r\n+     */\r\n+    int weight() default 0;\r\n+\r\n+    /**\r\n+     * Service doc, default value is \"\"\r\n+     */\r\n+    String document() default \"\";\r\n+\r\n+    /**\r\n+     * Delay time for service registration, default value is 0\r\n+     */\r\n+    int delay() default 0;\r\n+\r\n+    /**\r\n+     * @see Service#stub()\r\n+     * @deprecated\r\n+     */\r\n+    String local() default \"\";\r\n+\r\n+    /**\r\n+     * Service stub name, use interface name + Local if not set\r\n+     */\r\n+    String stub() default \"\";\r\n+\r\n+    /**\r\n+     * Cluster strategy, legal values include: failover, failfast, failsafe, failback, forking\r\n+     */\r\n+    String cluster() default \"\";\r\n+\r\n+    /**\r\n+     * How the proxy is generated, legal values include: jdk, javassist\r\n+     */\r\n+    String proxy() default \"\";\r\n+\r\n+    /**\r\n+     * Maximum connections service provider can accept, default value is 0 - connection is shared\r\n+     */\r\n+    int connections() default 0;\r\n+\r\n+    /**\r\n+     * The callback instance limit peer connection\r\n+     * <p>\r\n+     * see org.apache.dubbo.rpc.Constants#DEFAULT_CALLBACK_INSTANCES\r\n+     */\r\n+    int callbacks() default org.apache.dubbo.common.constants.CommonConstants.DEFAULT_CALLBACK_INSTANCES;\r\n+\r\n+    /**\r\n+     * Callback method name when connected, default value is empty string\r\n+     */\r\n+    String onconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Callback method name when disconnected, default value is empty string\r\n+     */\r\n+    String ondisconnect() default \"\";\r\n+\r\n+    /**\r\n+     * Service owner, default value is empty string\r\n+     */\r\n+    String owner() default \"\";\r\n+\r\n+    /**\r\n+     * Service layer, default value is empty string\r\n+     */\r\n+    String layer() default \"\";\r\n+\r\n+    /**\r\n+     * Service invocation retry times\r\n+     *\r\n+     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_RETRIES\r\n+     */\r\n+    int retries() default DEFAULT_RETRIES;\r\n+\r\n+    /**\r\n+     * Load balance strategy, legal values include: random, roundrobin, leastactive\r\n+     *\r\n+     * @see org.apache.dubbo.common.constants.CommonConstants#DEFAULT_LOADBALANCE\r\n+     */\r\n+    String loadbalance() default DEFAULT_LOADBALANCE;\r\n+\r\n+    /**\r\n+     * Whether to enable async invocation, default value is false\r\n+     */\r\n+    boolean async() default false;\r\n+\r\n+    /**\r\n+     * Maximum active requests allowed, default value is 0\r\n+     */\r\n+    int actives() default 0;\r\n+\r\n+    /**\r\n+     * Whether the async request has already been sent, the default value is false\r\n+     */\r\n+    boolean sent() default false;\r\n+\r\n+    /**\r\n+     * Service mock name, use interface name + Mock if not set\r\n+     */\r\n+    String mock() default \"\";\r\n+\r\n+    /**\r\n+     * Whether to use JSR303 validation, legal values are: true, false\r\n+     */\r\n+    String validation() default \"\";\r\n+\r\n+    /**\r\n+     * Timeout value for service invocation, default value is 0\r\n+     */\r\n+    int timeout() default 0;\r\n+\r\n+    /**\r\n+     * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache\r\n+     */\r\n+    String cache() default \"\";\r\n+\r\n+    /**\r\n+     * Filters for service invocation\r\n+     *\r\n+     * @see Filter\r\n+     */\r\n+    String[] filter() default {};\r\n+\r\n+    /**\r\n+     * Listeners for service exporting and unexporting\r\n+     *\r\n+     * @see ExporterListener\r\n+     */\r\n+    String[] listener() default {};\r\n+\r\n+    /**\r\n+     * Customized parameter key-value pair, for example: {key1, value1, key2, value2}\r\n+     */\r\n+    String[] parameters() default {};\r\n+\r\n+    /**\r\n+     * Application spring bean name\r\n+     */\r\n+    String application() default \"\";\r\n+\r\n+    /**\r\n+     * Module spring bean name\r\n+     */\r\n+    String module() default \"\";\r\n+\r\n+    /**\r\n+     * Provider spring bean name\r\n+     */\r\n+    String provider() default \"\";\r\n+\r\n+    /**\r\n+     * Protocol spring bean names\r\n+     */\r\n+    String[] protocol() default {};\r\n+\r\n+    /**\r\n+     * Monitor spring bean name\r\n+     */\r\n+    String monitor() default \"\";\r\n+\r\n+    /**\r\n+     * Registry spring bean name\r\n+     */\r\n+    String[] registry() default {};\r\n+\r\n+    /**\r\n+     * Service tag name\r\n+     */\r\n+    String tag() default \"\";\r\n+\r\n+    /**\r\n+     * methods support\r\n+     *\r\n+     * @return\r\n+     */\r\n+    Method[] methods() default {};\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/context/ConfigConfigurationAdapter.java", "source2": "org/apache/dubbo/config/context/ConfigConfigurationAdapter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,48 +1,48 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.context;\n-\n-import org.apache.dubbo.common.config.Configuration;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractConfig;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-/**\n- * This class receives an {@link AbstractConfig} and exposes its attributes through {@link Configuration}\n- */\n-public class ConfigConfigurationAdapter implements Configuration {\n-\n-    private Map<String, String> metaData;\n-\n-    public ConfigConfigurationAdapter(AbstractConfig config) {\n-        Map<String, String> configMetadata = config.getMetaData();\n-        metaData = new HashMap<>(configMetadata.size(), 1.0f);\n-        for (Map.Entry<String, String> entry : configMetadata.entrySet()) {\n-            String prefix = config.getPrefix().endsWith(\".\") ? config.getPrefix() : config.getPrefix() + \".\";\n-            String id = StringUtils.isEmpty(config.getId()) ? \"\" : config.getId() + \".\";\n-            metaData.put(prefix + id + entry.getKey(), entry.getValue());\n-        }\n-    }\n-\n-    @Override\n-    public Object getInternalProperty(String key) {\n-        return metaData.get(key);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.context;\r\n+\r\n+import org.apache.dubbo.common.config.Configuration;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractConfig;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This class receives an {@link AbstractConfig} and exposes its attributes through {@link Configuration}\r\n+ */\r\n+public class ConfigConfigurationAdapter implements Configuration {\r\n+\r\n+    private Map<String, String> metaData;\r\n+\r\n+    public ConfigConfigurationAdapter(AbstractConfig config) {\r\n+        Map<String, String> configMetadata = config.getMetaData();\r\n+        metaData = new HashMap<>(configMetadata.size(), 1.0f);\r\n+        for (Map.Entry<String, String> entry : configMetadata.entrySet()) {\r\n+            String prefix = config.getPrefix().endsWith(\".\") ? config.getPrefix() : config.getPrefix() + \".\";\r\n+            String id = StringUtils.isEmpty(config.getId()) ? \"\" : config.getId() + \".\";\r\n+            metaData.put(prefix + id + entry.getKey(), entry.getValue());\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object getInternalProperty(String key) {\r\n+        return metaData.get(key);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/context/ConfigManager.java", "source2": "org/apache/dubbo/config/context/ConfigManager.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,531 +1,531 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.context;\n-\n-import org.apache.dubbo.common.context.FrameworkExt;\n-import org.apache.dubbo.common.context.LifecycleAdapter;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.config.AbstractConfig;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-import org.apache.dubbo.config.ConsumerConfig;\n-import org.apache.dubbo.config.MetadataReportConfig;\n-import org.apache.dubbo.config.MetricsConfig;\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.config.ProviderConfig;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-import org.apache.dubbo.config.SslConfig;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Collection;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.concurrent.Callable;\n-import java.util.concurrent.locks.Lock;\n-import java.util.concurrent.locks.ReadWriteLock;\n-import java.util.concurrent.locks.ReentrantReadWriteLock;\n-import java.util.stream.Collectors;\n-\n-import static java.lang.Boolean.TRUE;\n-import static java.util.Collections.emptyMap;\n-import static java.util.Collections.unmodifiableSet;\n-import static java.util.Optional.ofNullable;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-import static org.apache.dubbo.common.utils.ReflectUtils.getProperty;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-import static org.apache.dubbo.config.AbstractConfig.getTagName;\n-import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX;\n-import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX;\n-\n-public class ConfigManager extends LifecycleAdapter implements FrameworkExt {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(ConfigManager.class);\n-\n-    public static final String NAME = \"config\";\n-\n-    private final ReadWriteLock lock = new ReentrantReadWriteLock();\n-\n-    final Map<String, Map<String, AbstractConfig>> configsCache = newMap();\n-\n-    public ConfigManager() {\n-    }\n-\n-    // ApplicationConfig correlative methods\n-\n-    public void setApplication(ApplicationConfig application) {\n-        addConfig(application, true);\n-    }\n-\n-    public Optional<ApplicationConfig> getApplication() {\n-        return ofNullable(getConfig(getTagName(ApplicationConfig.class)));\n-    }\n-\n-    public ApplicationConfig getApplicationOrElseThrow() {\n-        return getApplication().orElseThrow(() -> new IllegalStateException(\"There's no ApplicationConfig specified.\"));\n-    }\n-\n-    // MonitorConfig correlative methods\n-\n-    public void setMonitor(MonitorConfig monitor) {\n-        addConfig(monitor, true);\n-    }\n-\n-    public Optional<MonitorConfig> getMonitor() {\n-        return ofNullable(getConfig(getTagName(MonitorConfig.class)));\n-    }\n-\n-    // ModuleConfig correlative methods\n-\n-    public void setModule(ModuleConfig module) {\n-        addConfig(module, true);\n-    }\n-\n-    public Optional<ModuleConfig> getModule() {\n-        return ofNullable(getConfig(getTagName(ModuleConfig.class)));\n-    }\n-\n-    public void setMetrics(MetricsConfig metrics) {\n-        addConfig(metrics, true);\n-    }\n-\n-    public Optional<MetricsConfig> getMetrics() {\n-        return ofNullable(getConfig(getTagName(MetricsConfig.class)));\n-    }\n-\n-    public void setSsl(SslConfig sslConfig) {\n-        addConfig(sslConfig, true);\n-    }\n-\n-    public Optional<SslConfig> getSsl() {\n-        return ofNullable(getConfig(getTagName(SslConfig.class)));\n-    }\n-\n-    // ConfigCenterConfig correlative methods\n-\n-    public void addConfigCenter(ConfigCenterConfig configCenter) {\n-        addConfig(configCenter);\n-    }\n-\n-    public void addConfigCenters(Iterable<ConfigCenterConfig> configCenters) {\n-        configCenters.forEach(this::addConfigCenter);\n-    }\n-\n-    public Optional<Collection<ConfigCenterConfig>> getDefaultConfigCenter() {\n-        Collection<ConfigCenterConfig> defaults = getDefaultConfigs(getConfigsMap(getTagName(ConfigCenterConfig.class)));\n-        if (CollectionUtils.isEmpty(defaults)) {\n-            defaults = getConfigCenters();\n-        }\n-        return Optional.ofNullable(defaults);\n-    }\n-\n-    public ConfigCenterConfig getConfigCenter(String id) {\n-        return getConfig(getTagName(ConfigCenterConfig.class), id);\n-    }\n-\n-    public Collection<ConfigCenterConfig> getConfigCenters() {\n-        return getConfigs(getTagName(ConfigCenterConfig.class));\n-    }\n-\n-    // MetadataReportConfig correlative methods\n-\n-    public void addMetadataReport(MetadataReportConfig metadataReportConfig) {\n-        addConfig(metadataReportConfig);\n-    }\n-\n-    public void addMetadataReports(Iterable<MetadataReportConfig> metadataReportConfigs) {\n-        metadataReportConfigs.forEach(this::addMetadataReport);\n-    }\n-\n-    public Collection<MetadataReportConfig> getMetadataConfigs() {\n-        return getConfigs(getTagName(MetadataReportConfig.class));\n-    }\n-\n-    public Collection<MetadataReportConfig> getDefaultMetadataConfigs() {\n-        Collection<MetadataReportConfig> defaults = getDefaultConfigs(getConfigsMap(getTagName(MetadataReportConfig.class)));\n-        if (CollectionUtils.isEmpty(defaults)) {\n-            return getMetadataConfigs();\n-        }\n-        return defaults;\n-    }\n-\n-    // MetadataReportConfig correlative methods\n-\n-    public void addProvider(ProviderConfig providerConfig) {\n-        addConfig(providerConfig);\n-    }\n-\n-    public void addProviders(Iterable<ProviderConfig> providerConfigs) {\n-        providerConfigs.forEach(this::addProvider);\n-    }\n-\n-    public Optional<ProviderConfig> getProvider(String id) {\n-        return ofNullable(getConfig(getTagName(ProviderConfig.class), id));\n-    }\n-\n-    /**\n-     * Only allows one default ProviderConfig\n-     */\n-    public Optional<ProviderConfig> getDefaultProvider() {\n-        List<ProviderConfig> providerConfigs = getDefaultConfigs(getConfigsMap(getTagName(ProviderConfig.class)));\n-        if (CollectionUtils.isNotEmpty(providerConfigs)) {\n-            return Optional.of(providerConfigs.get(0));\n-        }\n-        return Optional.empty();\n-    }\n-\n-    public Collection<ProviderConfig> getProviders() {\n-        return getConfigs(getTagName(ProviderConfig.class));\n-    }\n-\n-    // ConsumerConfig correlative methods\n-\n-    public void addConsumer(ConsumerConfig consumerConfig) {\n-        addConfig(consumerConfig);\n-    }\n-\n-    public void addConsumers(Iterable<ConsumerConfig> consumerConfigs) {\n-        consumerConfigs.forEach(this::addConsumer);\n-    }\n-\n-    public Optional<ConsumerConfig> getConsumer(String id) {\n-        return ofNullable(getConfig(getTagName(ConsumerConfig.class), id));\n-    }\n-\n-    /**\n-     * Only allows one default ConsumerConfig\n-     */\n-    public Optional<ConsumerConfig> getDefaultConsumer() {\n-        List<ConsumerConfig> consumerConfigs = getDefaultConfigs(getConfigsMap(getTagName(ConsumerConfig.class)));\n-        if (CollectionUtils.isNotEmpty(consumerConfigs)) {\n-            return Optional.of(consumerConfigs.get(0));\n-        }\n-        return Optional.empty();\n-    }\n-\n-    public Collection<ConsumerConfig> getConsumers() {\n-        return getConfigs(getTagName(ConsumerConfig.class));\n-    }\n-\n-    // ProtocolConfig correlative methods\n-\n-    public void addProtocol(ProtocolConfig protocolConfig) {\n-        addConfig(protocolConfig);\n-    }\n-\n-    public void addProtocols(Iterable<ProtocolConfig> protocolConfigs) {\n-        if (protocolConfigs != null) {\n-            protocolConfigs.forEach(this::addProtocol);\n-        }\n-    }\n-\n-    public Optional<ProtocolConfig> getProtocol(String id) {\n-        return ofNullable(getConfig(getTagName(ProtocolConfig.class), id));\n-    }\n-\n-    public List<ProtocolConfig> getDefaultProtocols() {\n-        return getDefaultConfigs(getConfigsMap(getTagName(ProtocolConfig.class)));\n-    }\n-\n-    public Collection<ProtocolConfig> getProtocols() {\n-        return getConfigs(getTagName(ProtocolConfig.class));\n-    }\n-\n-    public Set<String> getProtocolIds() {\n-        Set<String> protocolIds = new HashSet<>();\n-        protocolIds.addAll(getSubProperties(ApplicationModel.getEnvironment()\n-                .getExternalConfigurationMap(), PROTOCOLS_SUFFIX));\n-        protocolIds.addAll(getSubProperties(ApplicationModel.getEnvironment()\n-                .getAppExternalConfigurationMap(), PROTOCOLS_SUFFIX));\n-\n-        return unmodifiableSet(protocolIds);\n-    }\n-\n-\n-    // RegistryConfig correlative methods\n-\n-    public void addRegistry(RegistryConfig registryConfig) {\n-        addConfig(registryConfig);\n-    }\n-\n-    public void addRegistries(Iterable<RegistryConfig> registryConfigs) {\n-        if (registryConfigs != null) {\n-            registryConfigs.forEach(this::addRegistry);\n-        }\n-    }\n-\n-    public Optional<RegistryConfig> getRegistry(String id) {\n-        return ofNullable(getConfig(getTagName(RegistryConfig.class), id));\n-    }\n-\n-    public List<RegistryConfig> getDefaultRegistries() {\n-        return getDefaultConfigs(getConfigsMap(getTagName(RegistryConfig.class)));\n-    }\n-\n-    public Collection<RegistryConfig> getRegistries() {\n-        return getConfigs(getTagName(RegistryConfig.class));\n-    }\n-\n-    public Set<String> getRegistryIds() {\n-        Set<String> registryIds = new HashSet<>();\n-        registryIds.addAll(getSubProperties(ApplicationModel.getEnvironment().getExternalConfigurationMap(),\n-                REGISTRIES_SUFFIX));\n-        registryIds.addAll(getSubProperties(ApplicationModel.getEnvironment().getAppExternalConfigurationMap(),\n-                REGISTRIES_SUFFIX));\n-\n-        return unmodifiableSet(registryIds);\n-    }\n-\n-    // ServiceConfig correlative methods\n-\n-    public void addService(ServiceConfigBase<?> serviceConfig) {\n-        addConfig(serviceConfig);\n-    }\n-\n-    public void addServices(Iterable<ServiceConfigBase<?>> serviceConfigs) {\n-        serviceConfigs.forEach(this::addService);\n-    }\n-\n-    public Collection<ServiceConfigBase> getServices() {\n-        return getConfigs(getTagName(ServiceConfigBase.class));\n-    }\n-\n-    public <T> ServiceConfigBase<T> getService(String id) {\n-        return getConfig(getTagName(ServiceConfigBase.class), id);\n-    }\n-\n-    // ReferenceConfig correlative methods\n-\n-    public void addReference(ReferenceConfigBase<?> referenceConfig) {\n-        addConfig(referenceConfig);\n-    }\n-\n-    public void addReferences(Iterable<ReferenceConfigBase<?>> referenceConfigs) {\n-        referenceConfigs.forEach(this::addReference);\n-    }\n-\n-    public Collection<ReferenceConfigBase<?>> getReferences() {\n-        return getConfigs(getTagName(ReferenceConfigBase.class));\n-    }\n-\n-    public <T> ReferenceConfigBase<T> getReference(String id) {\n-        return getConfig(getTagName(ReferenceConfigBase.class), id);\n-    }\n-\n-    protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {\n-        return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {\n-            k = k.substring(prefix.length());\n-            return k.substring(0, k.indexOf(\".\"));\n-        }).collect(Collectors.toSet());\n-    }\n-\n-    public void refreshAll() {\n-        write(() -> {\n-            // refresh all configs here,\n-            getApplication().ifPresent(ApplicationConfig::refresh);\n-            getMonitor().ifPresent(MonitorConfig::refresh);\n-            getModule().ifPresent(ModuleConfig::refresh);\n-\n-            getProtocols().forEach(ProtocolConfig::refresh);\n-            getRegistries().forEach(RegistryConfig::refresh);\n-            getProviders().forEach(ProviderConfig::refresh);\n-            getConsumers().forEach(ConsumerConfig::refresh);\n-        });\n-\n-    }\n-\n-    /**\n-     * In some scenario,  we may nee to add and remove ServiceConfig or ReferenceConfig dynamically.\n-     *\n-     * @param config the config instance to remove.\n-     */\n-    public void removeConfig(AbstractConfig config) {\n-        if (config == null) {\n-            return;\n-        }\n-\n-        Map<String, AbstractConfig> configs = configsCache.get(getTagName(config.getClass()));\n-        if (CollectionUtils.isNotEmptyMap(configs)) {\n-            configs.remove(getId(config));\n-        }\n-    }\n-\n-    public void clear() {\n-        write(this.configsCache::clear);\n-    }\n-\n-    /**\n-     * @throws IllegalStateException\n-     * @since 2.7.8\n-     */\n-    @Override\n-    public void destroy() throws IllegalStateException {\n-        clear();\n-    }\n-\n-    /**\n-     * Add the dubbo {@link AbstractConfig config}\n-     *\n-     * @param config the dubbo {@link AbstractConfig config}\n-     */\n-    public void addConfig(AbstractConfig config) {\n-        addConfig(config, false);\n-    }\n-\n-    protected void addConfig(AbstractConfig config, boolean unique) {\n-        if (config == null) {\n-            return;\n-        }\n-        write(() -> {\n-            Map<String, AbstractConfig> configsMap = configsCache.computeIfAbsent(getTagName(config.getClass()), type -> newMap());\n-            addIfAbsent(config, configsMap, unique);\n-        });\n-    }\n-\n-    protected <C extends AbstractConfig> Map<String, C> getConfigsMap(String configType) {\n-        return (Map<String, C>) read(() -> configsCache.getOrDefault(configType, emptyMap()));\n-    }\n-\n-    protected <C extends AbstractConfig> Collection<C> getConfigs(String configType) {\n-        return (Collection<C>) read(() -> getConfigsMap(configType).values());\n-    }\n-\n-    protected <C extends AbstractConfig> C getConfig(String configType, String id) {\n-        return read(() -> {\n-            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());\n-            return configsMap.get(id);\n-        });\n-    }\n-\n-    protected <C extends AbstractConfig> C getConfig(String configType) throws IllegalStateException {\n-        return read(() -> {\n-            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());\n-            int size = configsMap.size();\n-            if (size < 1) {\n-//                throw new IllegalStateException(\"No such \" + configType.getName() + \" is found\");\n-                return null;\n-            } else if (size > 1) {\n-                logger.warn(\"Expected single matching of \" + configType + \", but found \" + size + \" instances, will randomly pick the first one.\");\n-            }\n-\n-            return configsMap.values().iterator().next();\n-        });\n-    }\n-\n-    private <V> V write(Callable<V> callable) {\n-        V value = null;\n-        Lock writeLock = lock.writeLock();\n-        try {\n-            writeLock.lock();\n-            value = callable.call();\n-        } catch (RuntimeException e) {\n-            throw e;\n-        } catch (Throwable e) {\n-            throw new RuntimeException(e.getCause());\n-        } finally {\n-            writeLock.unlock();\n-        }\n-        return value;\n-    }\n-\n-    private void write(Runnable runnable) {\n-        write(() -> {\n-            runnable.run();\n-            return null;\n-        });\n-    }\n-\n-    private <V> V read(Callable<V> callable) {\n-        Lock readLock = lock.readLock();\n-        V value = null;\n-        try {\n-            readLock.lock();\n-            value = callable.call();\n-        } catch (Throwable e) {\n-            throw new RuntimeException(e);\n-        } finally {\n-            readLock.unlock();\n-        }\n-        return value;\n-    }\n-\n-    private static void checkDuplicate(AbstractConfig oldOne, AbstractConfig newOne) throws IllegalStateException {\n-        if (oldOne != null && !oldOne.equals(newOne)) {\n-            String configName = oldOne.getClass().getSimpleName();\n-            logger.warn(\"Duplicate Config found for \" + configName + \", you should use only one unique \" + configName + \" for one application.\");\n-        }\n-    }\n-\n-    private static Map newMap() {\n-        return new HashMap<>();\n-    }\n-\n-    static <C extends AbstractConfig> void addIfAbsent(C config, Map<String, C> configsMap, boolean unique)\n-            throws IllegalStateException {\n-\n-        if (config == null || configsMap == null) {\n-            return;\n-        }\n-\n-        if (unique) { // check duplicate\n-            configsMap.values().forEach(c -> {\n-                checkDuplicate(c, config);\n-            });\n-        }\n-\n-        String key = getId(config);\n-\n-        C existedConfig = configsMap.get(key);\n-\n-        if (existedConfig != null && !config.equals(existedConfig)) {\n-            if (logger.isWarnEnabled()) {\n-                String type = config.getClass().getSimpleName();\n-                logger.warn(String.format(\"Duplicate %s found, there already has one default %s or more than two %ss have the same id, \" +\n-                        \"you can try to give each %s a different id : %s\", type, type, type, type, config));\n-            }\n-        } else {\n-            configsMap.put(key, config);\n-        }\n-    }\n-\n-    static <C extends AbstractConfig> String getId(C config) {\n-        String id = config.getId();\n-        return isNotEmpty(id) ? id : isDefaultConfig(config) ?\n-                config.getClass().getSimpleName() + \"#\" + DEFAULT_KEY : null;\n-    }\n-\n-    static <C extends AbstractConfig> boolean isDefaultConfig(C config) {\n-        Boolean isDefault = getProperty(config, \"isDefault\");\n-        return isDefault == null || TRUE.equals(isDefault);\n-    }\n-\n-    static <C extends AbstractConfig> List<C> getDefaultConfigs(Map<String, C> configsMap) {\n-        return configsMap.values()\n-                .stream()\n-                .filter(ConfigManager::isDefaultConfig)\n-                .collect(Collectors.toList());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.context;\r\n+\r\n+import org.apache.dubbo.common.context.FrameworkExt;\r\n+import org.apache.dubbo.common.context.LifecycleAdapter;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.config.AbstractConfig;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+import org.apache.dubbo.config.MetricsConfig;\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+import org.apache.dubbo.config.ReferenceConfigBase;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+import org.apache.dubbo.config.SslConfig;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.concurrent.Callable;\r\n+import java.util.concurrent.locks.Lock;\r\n+import java.util.concurrent.locks.ReadWriteLock;\r\n+import java.util.concurrent.locks.ReentrantReadWriteLock;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.lang.Boolean.TRUE;\r\n+import static java.util.Collections.emptyMap;\r\n+import static java.util.Collections.unmodifiableSet;\r\n+import static java.util.Optional.ofNullable;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.utils.ReflectUtils.getProperty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+import static org.apache.dubbo.config.AbstractConfig.getTagName;\r\n+import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX;\r\n+import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX;\r\n+\r\n+public class ConfigManager extends LifecycleAdapter implements FrameworkExt {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(ConfigManager.class);\r\n+\r\n+    public static final String NAME = \"config\";\r\n+\r\n+    private final ReadWriteLock lock = new ReentrantReadWriteLock();\r\n+\r\n+    final Map<String, Map<String, AbstractConfig>> configsCache = newMap();\r\n+\r\n+    public ConfigManager() {\r\n+    }\r\n+\r\n+    // ApplicationConfig correlative methods\r\n+\r\n+    public void setApplication(ApplicationConfig application) {\r\n+        addConfig(application, true);\r\n+    }\r\n+\r\n+    public Optional<ApplicationConfig> getApplication() {\r\n+        return ofNullable(getConfig(getTagName(ApplicationConfig.class)));\r\n+    }\r\n+\r\n+    public ApplicationConfig getApplicationOrElseThrow() {\r\n+        return getApplication().orElseThrow(() -> new IllegalStateException(\"There's no ApplicationConfig specified.\"));\r\n+    }\r\n+\r\n+    // MonitorConfig correlative methods\r\n+\r\n+    public void setMonitor(MonitorConfig monitor) {\r\n+        addConfig(monitor, true);\r\n+    }\r\n+\r\n+    public Optional<MonitorConfig> getMonitor() {\r\n+        return ofNullable(getConfig(getTagName(MonitorConfig.class)));\r\n+    }\r\n+\r\n+    // ModuleConfig correlative methods\r\n+\r\n+    public void setModule(ModuleConfig module) {\r\n+        addConfig(module, true);\r\n+    }\r\n+\r\n+    public Optional<ModuleConfig> getModule() {\r\n+        return ofNullable(getConfig(getTagName(ModuleConfig.class)));\r\n+    }\r\n+\r\n+    public void setMetrics(MetricsConfig metrics) {\r\n+        addConfig(metrics, true);\r\n+    }\r\n+\r\n+    public Optional<MetricsConfig> getMetrics() {\r\n+        return ofNullable(getConfig(getTagName(MetricsConfig.class)));\r\n+    }\r\n+\r\n+    public void setSsl(SslConfig sslConfig) {\r\n+        addConfig(sslConfig, true);\r\n+    }\r\n+\r\n+    public Optional<SslConfig> getSsl() {\r\n+        return ofNullable(getConfig(getTagName(SslConfig.class)));\r\n+    }\r\n+\r\n+    // ConfigCenterConfig correlative methods\r\n+\r\n+    public void addConfigCenter(ConfigCenterConfig configCenter) {\r\n+        addConfig(configCenter);\r\n+    }\r\n+\r\n+    public void addConfigCenters(Iterable<ConfigCenterConfig> configCenters) {\r\n+        configCenters.forEach(this::addConfigCenter);\r\n+    }\r\n+\r\n+    public Optional<Collection<ConfigCenterConfig>> getDefaultConfigCenter() {\r\n+        Collection<ConfigCenterConfig> defaults = getDefaultConfigs(getConfigsMap(getTagName(ConfigCenterConfig.class)));\r\n+        if (CollectionUtils.isEmpty(defaults)) {\r\n+            defaults = getConfigCenters();\r\n+        }\r\n+        return Optional.ofNullable(defaults);\r\n+    }\r\n+\r\n+    public ConfigCenterConfig getConfigCenter(String id) {\r\n+        return getConfig(getTagName(ConfigCenterConfig.class), id);\r\n+    }\r\n+\r\n+    public Collection<ConfigCenterConfig> getConfigCenters() {\r\n+        return getConfigs(getTagName(ConfigCenterConfig.class));\r\n+    }\r\n+\r\n+    // MetadataReportConfig correlative methods\r\n+\r\n+    public void addMetadataReport(MetadataReportConfig metadataReportConfig) {\r\n+        addConfig(metadataReportConfig);\r\n+    }\r\n+\r\n+    public void addMetadataReports(Iterable<MetadataReportConfig> metadataReportConfigs) {\r\n+        metadataReportConfigs.forEach(this::addMetadataReport);\r\n+    }\r\n+\r\n+    public Collection<MetadataReportConfig> getMetadataConfigs() {\r\n+        return getConfigs(getTagName(MetadataReportConfig.class));\r\n+    }\r\n+\r\n+    public Collection<MetadataReportConfig> getDefaultMetadataConfigs() {\r\n+        Collection<MetadataReportConfig> defaults = getDefaultConfigs(getConfigsMap(getTagName(MetadataReportConfig.class)));\r\n+        if (CollectionUtils.isEmpty(defaults)) {\r\n+            return getMetadataConfigs();\r\n+        }\r\n+        return defaults;\r\n+    }\r\n+\r\n+    // MetadataReportConfig correlative methods\r\n+\r\n+    public void addProvider(ProviderConfig providerConfig) {\r\n+        addConfig(providerConfig);\r\n+    }\r\n+\r\n+    public void addProviders(Iterable<ProviderConfig> providerConfigs) {\r\n+        providerConfigs.forEach(this::addProvider);\r\n+    }\r\n+\r\n+    public Optional<ProviderConfig> getProvider(String id) {\r\n+        return ofNullable(getConfig(getTagName(ProviderConfig.class), id));\r\n+    }\r\n+\r\n+    /**\r\n+     * Only allows one default ProviderConfig\r\n+     */\r\n+    public Optional<ProviderConfig> getDefaultProvider() {\r\n+        List<ProviderConfig> providerConfigs = getDefaultConfigs(getConfigsMap(getTagName(ProviderConfig.class)));\r\n+        if (CollectionUtils.isNotEmpty(providerConfigs)) {\r\n+            return Optional.of(providerConfigs.get(0));\r\n+        }\r\n+        return Optional.empty();\r\n+    }\r\n+\r\n+    public Collection<ProviderConfig> getProviders() {\r\n+        return getConfigs(getTagName(ProviderConfig.class));\r\n+    }\r\n+\r\n+    // ConsumerConfig correlative methods\r\n+\r\n+    public void addConsumer(ConsumerConfig consumerConfig) {\r\n+        addConfig(consumerConfig);\r\n+    }\r\n+\r\n+    public void addConsumers(Iterable<ConsumerConfig> consumerConfigs) {\r\n+        consumerConfigs.forEach(this::addConsumer);\r\n+    }\r\n+\r\n+    public Optional<ConsumerConfig> getConsumer(String id) {\r\n+        return ofNullable(getConfig(getTagName(ConsumerConfig.class), id));\r\n+    }\r\n+\r\n+    /**\r\n+     * Only allows one default ConsumerConfig\r\n+     */\r\n+    public Optional<ConsumerConfig> getDefaultConsumer() {\r\n+        List<ConsumerConfig> consumerConfigs = getDefaultConfigs(getConfigsMap(getTagName(ConsumerConfig.class)));\r\n+        if (CollectionUtils.isNotEmpty(consumerConfigs)) {\r\n+            return Optional.of(consumerConfigs.get(0));\r\n+        }\r\n+        return Optional.empty();\r\n+    }\r\n+\r\n+    public Collection<ConsumerConfig> getConsumers() {\r\n+        return getConfigs(getTagName(ConsumerConfig.class));\r\n+    }\r\n+\r\n+    // ProtocolConfig correlative methods\r\n+\r\n+    public void addProtocol(ProtocolConfig protocolConfig) {\r\n+        addConfig(protocolConfig);\r\n+    }\r\n+\r\n+    public void addProtocols(Iterable<ProtocolConfig> protocolConfigs) {\r\n+        if (protocolConfigs != null) {\r\n+            protocolConfigs.forEach(this::addProtocol);\r\n+        }\r\n+    }\r\n+\r\n+    public Optional<ProtocolConfig> getProtocol(String id) {\r\n+        return ofNullable(getConfig(getTagName(ProtocolConfig.class), id));\r\n+    }\r\n+\r\n+    public List<ProtocolConfig> getDefaultProtocols() {\r\n+        return getDefaultConfigs(getConfigsMap(getTagName(ProtocolConfig.class)));\r\n+    }\r\n+\r\n+    public Collection<ProtocolConfig> getProtocols() {\r\n+        return getConfigs(getTagName(ProtocolConfig.class));\r\n+    }\r\n+\r\n+    public Set<String> getProtocolIds() {\r\n+        Set<String> protocolIds = new HashSet<>();\r\n+        protocolIds.addAll(getSubProperties(ApplicationModel.getEnvironment()\r\n+                .getExternalConfigurationMap(), PROTOCOLS_SUFFIX));\r\n+        protocolIds.addAll(getSubProperties(ApplicationModel.getEnvironment()\r\n+                .getAppExternalConfigurationMap(), PROTOCOLS_SUFFIX));\r\n+\r\n+        return unmodifiableSet(protocolIds);\r\n+    }\r\n+\r\n+\r\n+    // RegistryConfig correlative methods\r\n+\r\n+    public void addRegistry(RegistryConfig registryConfig) {\r\n+        addConfig(registryConfig);\r\n+    }\r\n+\r\n+    public void addRegistries(Iterable<RegistryConfig> registryConfigs) {\r\n+        if (registryConfigs != null) {\r\n+            registryConfigs.forEach(this::addRegistry);\r\n+        }\r\n+    }\r\n+\r\n+    public Optional<RegistryConfig> getRegistry(String id) {\r\n+        return ofNullable(getConfig(getTagName(RegistryConfig.class), id));\r\n+    }\r\n+\r\n+    public List<RegistryConfig> getDefaultRegistries() {\r\n+        return getDefaultConfigs(getConfigsMap(getTagName(RegistryConfig.class)));\r\n+    }\r\n+\r\n+    public Collection<RegistryConfig> getRegistries() {\r\n+        return getConfigs(getTagName(RegistryConfig.class));\r\n+    }\r\n+\r\n+    public Set<String> getRegistryIds() {\r\n+        Set<String> registryIds = new HashSet<>();\r\n+        registryIds.addAll(getSubProperties(ApplicationModel.getEnvironment().getExternalConfigurationMap(),\r\n+                REGISTRIES_SUFFIX));\r\n+        registryIds.addAll(getSubProperties(ApplicationModel.getEnvironment().getAppExternalConfigurationMap(),\r\n+                REGISTRIES_SUFFIX));\r\n+\r\n+        return unmodifiableSet(registryIds);\r\n+    }\r\n+\r\n+    // ServiceConfig correlative methods\r\n+\r\n+    public void addService(ServiceConfigBase<?> serviceConfig) {\r\n+        addConfig(serviceConfig);\r\n+    }\r\n+\r\n+    public void addServices(Iterable<ServiceConfigBase<?>> serviceConfigs) {\r\n+        serviceConfigs.forEach(this::addService);\r\n+    }\r\n+\r\n+    public Collection<ServiceConfigBase> getServices() {\r\n+        return getConfigs(getTagName(ServiceConfigBase.class));\r\n+    }\r\n+\r\n+    public <T> ServiceConfigBase<T> getService(String id) {\r\n+        return getConfig(getTagName(ServiceConfigBase.class), id);\r\n+    }\r\n+\r\n+    // ReferenceConfig correlative methods\r\n+\r\n+    public void addReference(ReferenceConfigBase<?> referenceConfig) {\r\n+        addConfig(referenceConfig);\r\n+    }\r\n+\r\n+    public void addReferences(Iterable<ReferenceConfigBase<?>> referenceConfigs) {\r\n+        referenceConfigs.forEach(this::addReference);\r\n+    }\r\n+\r\n+    public Collection<ReferenceConfigBase<?>> getReferences() {\r\n+        return getConfigs(getTagName(ReferenceConfigBase.class));\r\n+    }\r\n+\r\n+    public <T> ReferenceConfigBase<T> getReference(String id) {\r\n+        return getConfig(getTagName(ReferenceConfigBase.class), id);\r\n+    }\r\n+\r\n+    protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {\r\n+        return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {\r\n+            k = k.substring(prefix.length());\r\n+            return k.substring(0, k.indexOf(\".\"));\r\n+        }).collect(Collectors.toSet());\r\n+    }\r\n+\r\n+    public void refreshAll() {\r\n+        write(() -> {\r\n+            // refresh all configs here,\r\n+            getApplication().ifPresent(ApplicationConfig::refresh);\r\n+            getMonitor().ifPresent(MonitorConfig::refresh);\r\n+            getModule().ifPresent(ModuleConfig::refresh);\r\n+\r\n+            getProtocols().forEach(ProtocolConfig::refresh);\r\n+            getRegistries().forEach(RegistryConfig::refresh);\r\n+            getProviders().forEach(ProviderConfig::refresh);\r\n+            getConsumers().forEach(ConsumerConfig::refresh);\r\n+        });\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * In some scenario,  we may nee to add and remove ServiceConfig or ReferenceConfig dynamically.\r\n+     *\r\n+     * @param config the config instance to remove.\r\n+     */\r\n+    public void removeConfig(AbstractConfig config) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        Map<String, AbstractConfig> configs = configsCache.get(getTagName(config.getClass()));\r\n+        if (CollectionUtils.isNotEmptyMap(configs)) {\r\n+            configs.remove(getId(config));\r\n+        }\r\n+    }\r\n+\r\n+    public void clear() {\r\n+        write(this.configsCache::clear);\r\n+    }\r\n+\r\n+    /**\r\n+     * @throws IllegalStateException\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Override\r\n+    public void destroy() throws IllegalStateException {\r\n+        clear();\r\n+    }\r\n+\r\n+    /**\r\n+     * Add the dubbo {@link AbstractConfig config}\r\n+     *\r\n+     * @param config the dubbo {@link AbstractConfig config}\r\n+     */\r\n+    public void addConfig(AbstractConfig config) {\r\n+        addConfig(config, false);\r\n+    }\r\n+\r\n+    protected void addConfig(AbstractConfig config, boolean unique) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+        write(() -> {\r\n+            Map<String, AbstractConfig> configsMap = configsCache.computeIfAbsent(getTagName(config.getClass()), type -> newMap());\r\n+            addIfAbsent(config, configsMap, unique);\r\n+        });\r\n+    }\r\n+\r\n+    protected <C extends AbstractConfig> Map<String, C> getConfigsMap(String configType) {\r\n+        return (Map<String, C>) read(() -> configsCache.getOrDefault(configType, emptyMap()));\r\n+    }\r\n+\r\n+    protected <C extends AbstractConfig> Collection<C> getConfigs(String configType) {\r\n+        return (Collection<C>) read(() -> getConfigsMap(configType).values());\r\n+    }\r\n+\r\n+    protected <C extends AbstractConfig> C getConfig(String configType, String id) {\r\n+        return read(() -> {\r\n+            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());\r\n+            return configsMap.get(id);\r\n+        });\r\n+    }\r\n+\r\n+    protected <C extends AbstractConfig> C getConfig(String configType) throws IllegalStateException {\r\n+        return read(() -> {\r\n+            Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());\r\n+            int size = configsMap.size();\r\n+            if (size < 1) {\r\n+//                throw new IllegalStateException(\"No such \" + configType.getName() + \" is found\");\r\n+                return null;\r\n+            } else if (size > 1) {\r\n+                logger.warn(\"Expected single matching of \" + configType + \", but found \" + size + \" instances, will randomly pick the first one.\");\r\n+            }\r\n+\r\n+            return configsMap.values().iterator().next();\r\n+        });\r\n+    }\r\n+\r\n+    private <V> V write(Callable<V> callable) {\r\n+        V value = null;\r\n+        Lock writeLock = lock.writeLock();\r\n+        try {\r\n+            writeLock.lock();\r\n+            value = callable.call();\r\n+        } catch (RuntimeException e) {\r\n+            throw e;\r\n+        } catch (Throwable e) {\r\n+            throw new RuntimeException(e.getCause());\r\n+        } finally {\r\n+            writeLock.unlock();\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    private void write(Runnable runnable) {\r\n+        write(() -> {\r\n+            runnable.run();\r\n+            return null;\r\n+        });\r\n+    }\r\n+\r\n+    private <V> V read(Callable<V> callable) {\r\n+        Lock readLock = lock.readLock();\r\n+        V value = null;\r\n+        try {\r\n+            readLock.lock();\r\n+            value = callable.call();\r\n+        } catch (Throwable e) {\r\n+            throw new RuntimeException(e);\r\n+        } finally {\r\n+            readLock.unlock();\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    private static void checkDuplicate(AbstractConfig oldOne, AbstractConfig newOne) throws IllegalStateException {\r\n+        if (oldOne != null && !oldOne.equals(newOne)) {\r\n+            String configName = oldOne.getClass().getSimpleName();\r\n+            logger.warn(\"Duplicate Config found for \" + configName + \", you should use only one unique \" + configName + \" for one application.\");\r\n+        }\r\n+    }\r\n+\r\n+    private static Map newMap() {\r\n+        return new HashMap<>();\r\n+    }\r\n+\r\n+    static <C extends AbstractConfig> void addIfAbsent(C config, Map<String, C> configsMap, boolean unique)\r\n+            throws IllegalStateException {\r\n+\r\n+        if (config == null || configsMap == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (unique) { // check duplicate\r\n+            configsMap.values().forEach(c -> {\r\n+                checkDuplicate(c, config);\r\n+            });\r\n+        }\r\n+\r\n+        String key = getId(config);\r\n+\r\n+        C existedConfig = configsMap.get(key);\r\n+\r\n+        if (existedConfig != null && !config.equals(existedConfig)) {\r\n+            if (logger.isWarnEnabled()) {\r\n+                String type = config.getClass().getSimpleName();\r\n+                logger.warn(String.format(\"Duplicate %s found, there already has one default %s or more than two %ss have the same id, \" +\r\n+                        \"you can try to give each %s a different id : %s\", type, type, type, type, config));\r\n+            }\r\n+        } else {\r\n+            configsMap.put(key, config);\r\n+        }\r\n+    }\r\n+\r\n+    static <C extends AbstractConfig> String getId(C config) {\r\n+        String id = config.getId();\r\n+        return isNotEmpty(id) ? id : isDefaultConfig(config) ?\r\n+                config.getClass().getSimpleName() + \"#\" + DEFAULT_KEY : null;\r\n+    }\r\n+\r\n+    static <C extends AbstractConfig> boolean isDefaultConfig(C config) {\r\n+        Boolean isDefault = getProperty(config, \"isDefault\");\r\n+        return isDefault == null || TRUE.equals(isDefault);\r\n+    }\r\n+\r\n+    static <C extends AbstractConfig> List<C> getDefaultConfigs(Map<String, C> configsMap) {\r\n+        return configsMap.values()\r\n+                .stream()\r\n+                .filter(ConfigManager::isDefaultConfig)\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/support/Parameter.java", "source2": "org/apache/dubbo/config/support/Parameter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,62 +1,62 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.config.support;\n-\n-import java.lang.annotation.Documented;\n-import java.lang.annotation.ElementType;\n-import java.lang.annotation.Retention;\n-import java.lang.annotation.RetentionPolicy;\n-import java.lang.annotation.Target;\n-\n-/**\n- * Parameter\n- */\n-@Documented\n-@Retention(RetentionPolicy.RUNTIME)\n-@Target({ElementType.METHOD})\n-public @interface Parameter {\n-\n-    String key() default \"\";\n-\n-    boolean required() default false;\n-\n-    boolean excluded() default false;\n-\n-    boolean escaped() default false;\n-\n-    boolean attribute() default false;\n-\n-    boolean append() default false;\n-\n-    /**\n-     * if {@link #key()} is specified, it will be used as the key for the annotated property when generating url.\n-     * by default, this key will also be used to retrieve the config value:\n-     * <pre>\n-     * {@code\n-     *  class ExampleConfig {\n-     *      // Dubbo will try to get \"dubbo.example.alias_for_item=xxx\" from .properties, if you want to use the original property\n-     *      // \"dubbo.example.item=xxx\", you need to set useKeyAsProperty=false.\n-     *      @Parameter(key = \"alias_for_item\")\n-     *      public getItem();\n-     *  }\n-     * }\n-     *\n-     * </pre>\n-     */\n-    boolean useKeyAsProperty() default true;\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.config.support;\r\n+\r\n+import java.lang.annotation.Documented;\r\n+import java.lang.annotation.ElementType;\r\n+import java.lang.annotation.Retention;\r\n+import java.lang.annotation.RetentionPolicy;\r\n+import java.lang.annotation.Target;\r\n+\r\n+/**\r\n+ * Parameter\r\n+ */\r\n+@Documented\r\n+@Retention(RetentionPolicy.RUNTIME)\r\n+@Target({ElementType.METHOD})\r\n+public @interface Parameter {\r\n+\r\n+    String key() default \"\";\r\n+\r\n+    boolean required() default false;\r\n+\r\n+    boolean excluded() default false;\r\n+\r\n+    boolean escaped() default false;\r\n+\r\n+    boolean attribute() default false;\r\n+\r\n+    boolean append() default false;\r\n+\r\n+    /**\r\n+     * if {@link #key()} is specified, it will be used as the key for the annotated property when generating url.\r\n+     * by default, this key will also be used to retrieve the config value:\r\n+     * <pre>\r\n+     * {@code\r\n+     *  class ExampleConfig {\r\n+     *      // Dubbo will try to get \"dubbo.example.alias_for_item=xxx\" from .properties, if you want to use the original property\r\n+     *      // \"dubbo.example.item=xxx\", you need to set useKeyAsProperty=false.\r\n+     *      @Parameter(key = \"alias_for_item\")\r\n+     *      public getItem();\r\n+     *  }\r\n+     * }\r\n+     *\r\n+     * </pre>\r\n+     */\r\n+    boolean useKeyAsProperty() default true;\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/event/AbstractEventDispatcher.java", "source2": "org/apache/dubbo/event/AbstractEventDispatcher.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,168 +1,168 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-\n-import java.util.Collection;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.ServiceLoader;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.Executor;\n-import java.util.function.Consumer;\n-import java.util.function.Predicate;\n-import java.util.stream.Stream;\n-\n-import static java.util.Collections.sort;\n-import static java.util.Collections.unmodifiableList;\n-import static org.apache.dubbo.event.EventListener.findEventType;\n-\n-/**\n- * The abstract {@link EventDispatcher} providers the common implementation.\n- *\n- * @see EventDispatcher\n- * @see Listenable\n- * @see ServiceLoader\n- * @see EventListener\n- * @see Event\n- * @since 2.7.5\n- */\n-public abstract class AbstractEventDispatcher implements EventDispatcher {\n-\n-    private final Object mutex = new Object();\n-\n-    private final ConcurrentMap<Class<? extends Event>, List<EventListener>> listenersCache = new ConcurrentHashMap<>();\n-\n-    private final Executor executor;\n-\n-    /**\n-     * Constructor with an instance of {@link Executor}\n-     *\n-     * @param executor {@link Executor}\n-     * @throws NullPointerException <code>executor</code> is <code>null</code>\n-     */\n-    protected AbstractEventDispatcher(Executor executor) {\n-        if (executor == null) {\n-            throw new NullPointerException(\"executor must not be null\");\n-        }\n-        this.executor = executor;\n-        this.loadEventListenerInstances();\n-    }\n-\n-    @Override\n-    public void addEventListener(EventListener<?> listener) throws NullPointerException, IllegalArgumentException {\n-        Listenable.assertListener(listener);\n-        doInListener(listener, listeners -> {\n-            addIfAbsent(listeners, listener);\n-        });\n-    }\n-\n-    @Override\n-    public void removeEventListener(EventListener<?> listener) throws NullPointerException, IllegalArgumentException {\n-        Listenable.assertListener(listener);\n-        doInListener(listener, listeners -> listeners.remove(listener));\n-    }\n-\n-    @Override\n-    public List<EventListener<?>> getAllEventListeners() {\n-        List<EventListener<?>> listeners = new LinkedList<>();\n-\n-        sortedListeners().forEach(listener -> {\n-            addIfAbsent(listeners, listener);\n-        });\n-\n-        return unmodifiableList(listeners);\n-    }\n-\n-    protected Stream<EventListener> sortedListeners() {\n-        return sortedListeners(e -> true);\n-    }\n-\n-    protected Stream<EventListener> sortedListeners(Predicate<Map.Entry<Class<? extends Event>, List<EventListener>>> predicate) {\n-        return listenersCache\n-                .entrySet()\n-                .stream()\n-                .filter(predicate)\n-                .map(Map.Entry::getValue)\n-                .flatMap(Collection::stream)\n-                .sorted();\n-    }\n-\n-    private <E> void addIfAbsent(Collection<E> collection, E element) {\n-        if (!collection.contains(element)) {\n-            collection.add(element);\n-        }\n-    }\n-\n-    @Override\n-    public void dispatch(Event event) {\n-\n-        Executor executor = getExecutor();\n-\n-        // execute in sequential or parallel execution model\n-        executor.execute(() -> {\n-            sortedListeners(entry -> entry.getKey().isAssignableFrom(event.getClass()))\n-                    .forEach(listener -> {\n-                        if (listener instanceof ConditionalEventListener) {\n-                            ConditionalEventListener predicateEventListener = (ConditionalEventListener) listener;\n-                            if (!predicateEventListener.accept(event)) { // No accept\n-                                return;\n-                            }\n-                        }\n-                        // Handle the event\n-                        listener.onEvent(event);\n-                    });\n-        });\n-    }\n-\n-    /**\n-     * @return the non-null {@link Executor}\n-     */\n-    @Override\n-    public final Executor getExecutor() {\n-        return executor;\n-    }\n-\n-    protected void doInListener(EventListener<?> listener, Consumer<Collection<EventListener>> consumer) {\n-        Class<? extends Event> eventType = findEventType(listener);\n-        if (eventType != null) {\n-            synchronized (mutex) {\n-                List<EventListener> listeners = listenersCache.computeIfAbsent(eventType, e -> new LinkedList<>());\n-                // consume\n-                consumer.accept(listeners);\n-                // sort\n-                sort(listeners);\n-            }\n-        }\n-    }\n-\n-    /**\n-     * Default, load the instances of {@link EventListener event listeners} by {@link ServiceLoader}\n-     * <p>\n-     * It could be override by the sub-class\n-     *\n-     * @see EventListener\n-     * @see ServiceLoader#load(Class)\n-     */\n-    protected void loadEventListenerInstances() {\n-        ExtensionLoader<EventListener> loader = ExtensionLoader.getExtensionLoader(EventListener.class);\n-        loader.getSupportedExtensionInstances().forEach(this::addEventListener);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.ServiceLoader;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.Executor;\r\n+import java.util.function.Consumer;\r\n+import java.util.function.Predicate;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static java.util.Collections.sort;\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static org.apache.dubbo.event.EventListener.findEventType;\r\n+\r\n+/**\r\n+ * The abstract {@link EventDispatcher} providers the common implementation.\r\n+ *\r\n+ * @see EventDispatcher\r\n+ * @see Listenable\r\n+ * @see ServiceLoader\r\n+ * @see EventListener\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class AbstractEventDispatcher implements EventDispatcher {\r\n+\r\n+    private final Object mutex = new Object();\r\n+\r\n+    private final ConcurrentMap<Class<? extends Event>, List<EventListener>> listenersCache = new ConcurrentHashMap<>();\r\n+\r\n+    private final Executor executor;\r\n+\r\n+    /**\r\n+     * Constructor with an instance of {@link Executor}\r\n+     *\r\n+     * @param executor {@link Executor}\r\n+     * @throws NullPointerException <code>executor</code> is <code>null</code>\r\n+     */\r\n+    protected AbstractEventDispatcher(Executor executor) {\r\n+        if (executor == null) {\r\n+            throw new NullPointerException(\"executor must not be null\");\r\n+        }\r\n+        this.executor = executor;\r\n+        this.loadEventListenerInstances();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addEventListener(EventListener<?> listener) throws NullPointerException, IllegalArgumentException {\r\n+        Listenable.assertListener(listener);\r\n+        doInListener(listener, listeners -> {\r\n+            addIfAbsent(listeners, listener);\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeEventListener(EventListener<?> listener) throws NullPointerException, IllegalArgumentException {\r\n+        Listenable.assertListener(listener);\r\n+        doInListener(listener, listeners -> listeners.remove(listener));\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<EventListener<?>> getAllEventListeners() {\r\n+        List<EventListener<?>> listeners = new LinkedList<>();\r\n+\r\n+        sortedListeners().forEach(listener -> {\r\n+            addIfAbsent(listeners, listener);\r\n+        });\r\n+\r\n+        return unmodifiableList(listeners);\r\n+    }\r\n+\r\n+    protected Stream<EventListener> sortedListeners() {\r\n+        return sortedListeners(e -> true);\r\n+    }\r\n+\r\n+    protected Stream<EventListener> sortedListeners(Predicate<Map.Entry<Class<? extends Event>, List<EventListener>>> predicate) {\r\n+        return listenersCache\r\n+                .entrySet()\r\n+                .stream()\r\n+                .filter(predicate)\r\n+                .map(Map.Entry::getValue)\r\n+                .flatMap(Collection::stream)\r\n+                .sorted();\r\n+    }\r\n+\r\n+    private <E> void addIfAbsent(Collection<E> collection, E element) {\r\n+        if (!collection.contains(element)) {\r\n+            collection.add(element);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void dispatch(Event event) {\r\n+\r\n+        Executor executor = getExecutor();\r\n+\r\n+        // execute in sequential or parallel execution model\r\n+        executor.execute(() -> {\r\n+            sortedListeners(entry -> entry.getKey().isAssignableFrom(event.getClass()))\r\n+                    .forEach(listener -> {\r\n+                        if (listener instanceof ConditionalEventListener) {\r\n+                            ConditionalEventListener predicateEventListener = (ConditionalEventListener) listener;\r\n+                            if (!predicateEventListener.accept(event)) { // No accept\r\n+                                return;\r\n+                            }\r\n+                        }\r\n+                        // Handle the event\r\n+                        listener.onEvent(event);\r\n+                    });\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * @return the non-null {@link Executor}\r\n+     */\r\n+    @Override\r\n+    public final Executor getExecutor() {\r\n+        return executor;\r\n+    }\r\n+\r\n+    protected void doInListener(EventListener<?> listener, Consumer<Collection<EventListener>> consumer) {\r\n+        Class<? extends Event> eventType = findEventType(listener);\r\n+        if (eventType != null) {\r\n+            synchronized (mutex) {\r\n+                List<EventListener> listeners = listenersCache.computeIfAbsent(eventType, e -> new LinkedList<>());\r\n+                // consume\r\n+                consumer.accept(listeners);\r\n+                // sort\r\n+                sort(listeners);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Default, load the instances of {@link EventListener event listeners} by {@link ServiceLoader}\r\n+     * <p>\r\n+     * It could be override by the sub-class\r\n+     *\r\n+     * @see EventListener\r\n+     * @see ServiceLoader#load(Class)\r\n+     */\r\n+    protected void loadEventListenerInstances() {\r\n+        ExtensionLoader<EventListener> loader = ExtensionLoader.getExtensionLoader(EventListener.class);\r\n+        loader.getSupportedExtensionInstances().forEach(this::addEventListener);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/ConditionalEventListener.java", "source2": "org/apache/dubbo/event/ConditionalEventListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-/**\n- * An {@link EventListener} extending the the conditional feature that {@link #accept(Event) decides} some\n- * {@link Event event} is handled or not by current listener.\n- *\n- * @see EventListener\n- * @since 2.7.5\n- */\n-public interface ConditionalEventListener<E extends Event> extends EventListener<E> {\n-\n-    /**\n-     * Accept the event is handled or not by current listener\n-     *\n-     * @param event {@link Event event}\n-     * @return if handled, return <code>true</code>, or <code>false</code>\n-     */\n-    boolean accept(E event);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+/**\r\n+ * An {@link EventListener} extending the the conditional feature that {@link #accept(Event) decides} some\r\n+ * {@link Event event} is handled or not by current listener.\r\n+ *\r\n+ * @see EventListener\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface ConditionalEventListener<E extends Event> extends EventListener<E> {\r\n+\r\n+    /**\r\n+     * Accept the event is handled or not by current listener\r\n+     *\r\n+     * @param event {@link Event event}\r\n+     * @return if handled, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean accept(E event);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/DirectEventDispatcher.java", "source2": "org/apache/dubbo/event/DirectEventDispatcher.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,30 +1,30 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-/**\n- * Direct {@link EventDispatcher} implementation uses current thread execution model\n- *\n- * @see EventDispatcher\n- * @since 2.7.5\n- */\n-public final class DirectEventDispatcher extends AbstractEventDispatcher {\n-\n-    public DirectEventDispatcher() {\n-        super(DIRECT_EXECUTOR);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+/**\r\n+ * Direct {@link EventDispatcher} implementation uses current thread execution model\r\n+ *\r\n+ * @see EventDispatcher\r\n+ * @since 2.7.5\r\n+ */\r\n+public final class DirectEventDispatcher extends AbstractEventDispatcher {\r\n+\r\n+    public DirectEventDispatcher() {\r\n+        super(DIRECT_EXECUTOR);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/Event.java", "source2": "org/apache/dubbo/event/Event.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,49 +1,49 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import java.util.EventObject;\n-\n-/**\n- * An event object of Dubbo is based on the Java standard {@link EventObject event}\n- *\n- * @since 2.7.5\n- */\n-public abstract class Event extends EventObject {\n-\n-    private static final long serialVersionUID = -1704315605423947137L;\n-\n-    /**\n-     * The timestamp of event occurs\n-     */\n-    private final long timestamp;\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param source The object on which the Event initially occurred.\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public Event(Object source) {\n-        super(source);\n-        this.timestamp = System.currentTimeMillis();\n-    }\n-\n-    public long getTimestamp() {\n-        return timestamp;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import java.util.EventObject;\r\n+\r\n+/**\r\n+ * An event object of Dubbo is based on the Java standard {@link EventObject event}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class Event extends EventObject {\r\n+\r\n+    private static final long serialVersionUID = -1704315605423947137L;\r\n+\r\n+    /**\r\n+     * The timestamp of event occurs\r\n+     */\r\n+    private final long timestamp;\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param source The object on which the Event initially occurred.\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public Event(Object source) {\r\n+        super(source);\r\n+        this.timestamp = System.currentTimeMillis();\r\n+    }\r\n+\r\n+    public long getTimestamp() {\r\n+        return timestamp;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/EventDispatcher.java", "source2": "org/apache/dubbo/event/EventDispatcher.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,66 +1,66 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import java.util.concurrent.Executor;\n-\n-/**\n- * {@link Event Dubbo Event} Dispatcher\n- *\n- * @see Event\n- * @see EventListener\n- * @see DirectEventDispatcher\n- * @since 2.7.5\n- */\n-@SPI(\"direct\")\n-public interface EventDispatcher extends Listenable<EventListener<?>> {\n-\n-    /**\n-     * Direct {@link Executor} uses sequential execution model\n-     */\n-    Executor DIRECT_EXECUTOR = Runnable::run;\n-\n-    /**\n-     * Dispatch a Dubbo event to the registered {@link EventListener Dubbo event listeners}\n-     *\n-     * @param event a {@link Event Dubbo event}\n-     */\n-    void dispatch(Event event);\n-\n-    /**\n-     * The {@link Executor} to dispatch a {@link Event Dubbo event}\n-     *\n-     * @return default implementation directly invoke {@link Runnable#run()} method, rather than multiple-threaded\n-     * {@link Executor}. If the return value is <code>null</code>, the behavior is same as default.\n-     * @see #DIRECT_EXECUTOR\n-     */\n-    default Executor getExecutor() {\n-        return DIRECT_EXECUTOR;\n-    }\n-\n-    /**\n-     * The default extension of {@link EventDispatcher} is loaded by {@link ExtensionLoader}\n-     *\n-     * @return the default extension of {@link EventDispatcher}\n-     */\n-    static EventDispatcher getDefaultExtension() {\n-        return ExtensionLoader.getExtensionLoader(EventDispatcher.class).getDefaultExtension();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import java.util.concurrent.Executor;\r\n+\r\n+/**\r\n+ * {@link Event Dubbo Event} Dispatcher\r\n+ *\r\n+ * @see Event\r\n+ * @see EventListener\r\n+ * @see DirectEventDispatcher\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"direct\")\r\n+public interface EventDispatcher extends Listenable<EventListener<?>> {\r\n+\r\n+    /**\r\n+     * Direct {@link Executor} uses sequential execution model\r\n+     */\r\n+    Executor DIRECT_EXECUTOR = Runnable::run;\r\n+\r\n+    /**\r\n+     * Dispatch a Dubbo event to the registered {@link EventListener Dubbo event listeners}\r\n+     *\r\n+     * @param event a {@link Event Dubbo event}\r\n+     */\r\n+    void dispatch(Event event);\r\n+\r\n+    /**\r\n+     * The {@link Executor} to dispatch a {@link Event Dubbo event}\r\n+     *\r\n+     * @return default implementation directly invoke {@link Runnable#run()} method, rather than multiple-threaded\r\n+     * {@link Executor}. If the return value is <code>null</code>, the behavior is same as default.\r\n+     * @see #DIRECT_EXECUTOR\r\n+     */\r\n+    default Executor getExecutor() {\r\n+        return DIRECT_EXECUTOR;\r\n+    }\r\n+\r\n+    /**\r\n+     * The default extension of {@link EventDispatcher} is loaded by {@link ExtensionLoader}\r\n+     *\r\n+     * @return the default extension of {@link EventDispatcher}\r\n+     */\r\n+    static EventDispatcher getDefaultExtension() {\r\n+        return ExtensionLoader.getExtensionLoader(EventDispatcher.class).getDefaultExtension();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/EventListener.java", "source2": "org/apache/dubbo/event/EventListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,119 +1,119 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-\n-import java.lang.reflect.ParameterizedType;\n-import java.lang.reflect.Type;\n-import java.util.Objects;\n-\n-import static org.apache.dubbo.common.utils.ReflectUtils.findParameterizedTypes;\n-\n-/**\n- * The {@link Event Dubbo Event} Listener that is based on Java standard {@link java.util.EventListener} interface supports\n- * the generic {@link Event}.\n- * <p>\n- * The {@link #onEvent(Event) handle method} will be notified when the matched-type {@link Event Dubbo Event} is\n- * published, whose priority could be changed by {@link #getPriority()} method.\n- *\n- * @param <E> the concrete class of {@link Event Dubbo Event}\n- * @see Event \n- * @see java.util.EventListener\n- * @since 2.7.5\n- */\n-@SPI\n-@FunctionalInterface\n-public interface EventListener<E extends Event> extends java.util.EventListener, Prioritized {\n-\n-    /**\n-     * Handle a {@link Event Dubbo Event} when it's be published\n-     *\n-     * @param event a {@link Event Dubbo Event}\n-     */\n-    void onEvent(E event);\n-\n-    /**\n-     * The priority of {@link EventListener current listener}.\n-     *\n-     * @return the value is more greater, the priority is more lower.\n-     * {@link Integer#MIN_VALUE} indicates the highest priority. The default value is {@link Integer#MAX_VALUE}.\n-     * The comparison rule , refer to {@link #compareTo}.\n-     */\n-    default int getPriority() {\n-        return NORMAL_PRIORITY;\n-    }\n-\n-    /**\n-     * Find the {@link Class type} {@link Event Dubbo event} from the specified {@link EventListener Dubbo event listener}\n-     *\n-     * @param listener the {@link Class class} of {@link EventListener Dubbo event listener}\n-     * @return <code>null</code> if not found\n-     */\n-    static Class<? extends Event> findEventType(EventListener<?> listener) {\n-        return findEventType(listener.getClass());\n-    }\n-\n-    /**\n-     * Find the {@link Class type} {@link Event Dubbo event} from the specified {@link EventListener Dubbo event listener}\n-     *\n-     * @param listenerClass the {@link Class class} of {@link EventListener Dubbo event listener}\n-     * @return <code>null</code> if not found\n-     */\n-    static Class<? extends Event> findEventType(Class<?> listenerClass) {\n-        Class<? extends Event> eventType = null;\n-\n-        if (listenerClass != null && EventListener.class.isAssignableFrom(listenerClass)) {\n-            eventType = findParameterizedTypes(listenerClass)\n-                    .stream()\n-                    .map(EventListener::findEventType)\n-                    .filter(Objects::nonNull)\n-                    .findAny()\n-                    .orElse((Class) findEventType(listenerClass.getSuperclass()));\n-        }\n-\n-        return eventType;\n-    }\n-\n-    /**\n-     * Find the type {@link Event Dubbo event} from the specified {@link ParameterizedType} presents\n-     * a class of {@link EventListener Dubbo event listener}\n-     *\n-     * @param parameterizedType the {@link ParameterizedType} presents a class of {@link EventListener Dubbo event listener}\n-     * @return <code>null</code> if not found\n-     */\n-    static Class<? extends Event> findEventType(ParameterizedType parameterizedType) {\n-        Class<? extends Event> eventType = null;\n-\n-        Type rawType = parameterizedType.getRawType();\n-        if ((rawType instanceof Class) && EventListener.class.isAssignableFrom((Class) rawType)) {\n-            Type[] typeArguments = parameterizedType.getActualTypeArguments();\n-            for (Type typeArgument : typeArguments) {\n-                if (typeArgument instanceof Class) {\n-                    Class argumentClass = (Class) typeArgument;\n-                    if (Event.class.isAssignableFrom(argumentClass)) {\n-                        eventType = argumentClass;\n-                        break;\n-                    }\n-                }\n-            }\n-        }\n-\n-        return eventType;\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+\r\n+import java.lang.reflect.ParameterizedType;\r\n+import java.lang.reflect.Type;\r\n+import java.util.Objects;\r\n+\r\n+import static org.apache.dubbo.common.utils.ReflectUtils.findParameterizedTypes;\r\n+\r\n+/**\r\n+ * The {@link Event Dubbo Event} Listener that is based on Java standard {@link java.util.EventListener} interface supports\r\n+ * the generic {@link Event}.\r\n+ * <p>\r\n+ * The {@link #onEvent(Event) handle method} will be notified when the matched-type {@link Event Dubbo Event} is\r\n+ * published, whose priority could be changed by {@link #getPriority()} method.\r\n+ *\r\n+ * @param <E> the concrete class of {@link Event Dubbo Event}\r\n+ * @see Event \r\n+ * @see java.util.EventListener\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+@FunctionalInterface\r\n+public interface EventListener<E extends Event> extends java.util.EventListener, Prioritized {\r\n+\r\n+    /**\r\n+     * Handle a {@link Event Dubbo Event} when it's be published\r\n+     *\r\n+     * @param event a {@link Event Dubbo Event}\r\n+     */\r\n+    void onEvent(E event);\r\n+\r\n+    /**\r\n+     * The priority of {@link EventListener current listener}.\r\n+     *\r\n+     * @return the value is more greater, the priority is more lower.\r\n+     * {@link Integer#MIN_VALUE} indicates the highest priority. The default value is {@link Integer#MAX_VALUE}.\r\n+     * The comparison rule , refer to {@link #compareTo}.\r\n+     */\r\n+    default int getPriority() {\r\n+        return NORMAL_PRIORITY;\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link Class type} {@link Event Dubbo event} from the specified {@link EventListener Dubbo event listener}\r\n+     *\r\n+     * @param listener the {@link Class class} of {@link EventListener Dubbo event listener}\r\n+     * @return <code>null</code> if not found\r\n+     */\r\n+    static Class<? extends Event> findEventType(EventListener<?> listener) {\r\n+        return findEventType(listener.getClass());\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the {@link Class type} {@link Event Dubbo event} from the specified {@link EventListener Dubbo event listener}\r\n+     *\r\n+     * @param listenerClass the {@link Class class} of {@link EventListener Dubbo event listener}\r\n+     * @return <code>null</code> if not found\r\n+     */\r\n+    static Class<? extends Event> findEventType(Class<?> listenerClass) {\r\n+        Class<? extends Event> eventType = null;\r\n+\r\n+        if (listenerClass != null && EventListener.class.isAssignableFrom(listenerClass)) {\r\n+            eventType = findParameterizedTypes(listenerClass)\r\n+                    .stream()\r\n+                    .map(EventListener::findEventType)\r\n+                    .filter(Objects::nonNull)\r\n+                    .findAny()\r\n+                    .orElse((Class) findEventType(listenerClass.getSuperclass()));\r\n+        }\r\n+\r\n+        return eventType;\r\n+    }\r\n+\r\n+    /**\r\n+     * Find the type {@link Event Dubbo event} from the specified {@link ParameterizedType} presents\r\n+     * a class of {@link EventListener Dubbo event listener}\r\n+     *\r\n+     * @param parameterizedType the {@link ParameterizedType} presents a class of {@link EventListener Dubbo event listener}\r\n+     * @return <code>null</code> if not found\r\n+     */\r\n+    static Class<? extends Event> findEventType(ParameterizedType parameterizedType) {\r\n+        Class<? extends Event> eventType = null;\r\n+\r\n+        Type rawType = parameterizedType.getRawType();\r\n+        if ((rawType instanceof Class) && EventListener.class.isAssignableFrom((Class) rawType)) {\r\n+            Type[] typeArguments = parameterizedType.getActualTypeArguments();\r\n+            for (Type typeArgument : typeArguments) {\r\n+                if (typeArgument instanceof Class) {\r\n+                    Class argumentClass = (Class) typeArgument;\r\n+                    if (Event.class.isAssignableFrom(argumentClass)) {\r\n+                        eventType = argumentClass;\r\n+                        break;\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        return eventType;\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/event/GenericEvent.java", "source2": "org/apache/dubbo/event/GenericEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-/**\n- * Generic {@link Event Dubbo event}\n- *\n- * @param <S> the type of event source\n- * @since 2.7.5\n- */\n-public class GenericEvent<S> extends Event {\n-\n-    public GenericEvent(S source) {\n-        super(source);\n-    }\n-\n-    public S getSource() {\n-        return (S) super.getSource();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+/**\r\n+ * Generic {@link Event Dubbo event}\r\n+ *\r\n+ * @param <S> the type of event source\r\n+ * @since 2.7.5\r\n+ */\r\n+public class GenericEvent<S> extends Event {\r\n+\r\n+    public GenericEvent(S source) {\r\n+        super(source);\r\n+    }\r\n+\r\n+    public S getSource() {\r\n+        return (S) super.getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/GenericEventListener.java", "source2": "org/apache/dubbo/event/GenericEventListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,130 +1,130 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import org.apache.dubbo.common.function.ThrowableConsumer;\n-\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Modifier;\n-import java.util.HashMap;\n-import java.util.LinkedHashSet;\n-import java.util.Map;\n-import java.util.Set;\n-\n-import static java.util.Collections.emptySet;\n-import static java.util.stream.Stream.of;\n-import static org.apache.dubbo.common.function.ThrowableFunction.execute;\n-\n-/**\n- * An abstract class of {@link EventListener} for Generic events, the sub class could add more {@link Event event}\n- * handle methods, rather than only binds the {@link EventListener#onEvent(Event)} method that is declared to be\n- * <code>final</code> the implementation can't override. It's notable that all {@link Event event} handle methods must\n- * meet following conditions:\n- * <ul>\n- * <li>not {@link #onEvent(Event)} method</li>\n- * <li><code>public</code> accessibility</li>\n- * <li><code>void</code> return type</li>\n- * <li>no {@link Exception exception} declaration</li>\n- * <li>only one {@link Event} type argument</li>\n- * </ul>\n- *\n- * @see Event\n- * @see EventListener\n- * @since 2.7.5\n- */\n-public abstract class GenericEventListener implements EventListener<Event> {\n-\n-    private final Method onEventMethod;\n-\n-    private final Map<Class<?>, Set<Method>> handleEventMethods;\n-\n-    protected GenericEventListener() {\n-        this.onEventMethod = findOnEventMethod();\n-        this.handleEventMethods = findHandleEventMethods();\n-    }\n-\n-    private Method findOnEventMethod() {\n-        return execute(getClass(), listenerClass -> listenerClass.getMethod(\"onEvent\", Event.class));\n-    }\n-\n-    private Map<Class<?>, Set<Method>> findHandleEventMethods() {\n-        // Event class for key, the eventMethods' Set as value\n-        Map<Class<?>, Set<Method>> eventMethods = new HashMap<>();\n-        of(getClass().getMethods())\n-                .filter(this::isHandleEventMethod)\n-                .forEach(method -> {\n-                    Class<?> paramType = method.getParameterTypes()[0];\n-                    Set<Method> methods = eventMethods.computeIfAbsent(paramType, key -> new LinkedHashSet<>());\n-                    methods.add(method);\n-                });\n-        return eventMethods;\n-    }\n-\n-    public final void onEvent(Event event) {\n-        Class<?> eventClass = event.getClass();\n-        handleEventMethods.getOrDefault(eventClass, emptySet()).forEach(method -> {\n-            ThrowableConsumer.execute(method, m -> {\n-                m.invoke(this, event);\n-            });\n-        });\n-    }\n-\n-    /**\n-     * The {@link Event event} handle methods must meet following conditions:\n-     * <ul>\n-     * <li>not {@link #onEvent(Event)} method</li>\n-     * <li><code>public</code> accessibility</li>\n-     * <li><code>void</code> return type</li>\n-     * <li>no {@link Exception exception} declaration</li>\n-     * <li>only one {@link Event} type argument</li>\n-     * </ul>\n-     *\n-     * @param method\n-     * @return\n-     */\n-    private boolean isHandleEventMethod(Method method) {\n-\n-        if (onEventMethod.equals(method)) { // not {@link #onEvent(Event)} method\n-            return false;\n-        }\n-\n-        if (!Modifier.isPublic(method.getModifiers())) { // not public\n-            return false;\n-        }\n-\n-        if (!void.class.equals(method.getReturnType())) { // void return type\n-            return false;\n-        }\n-\n-        Class[] exceptionTypes = method.getExceptionTypes();\n-\n-        if (exceptionTypes.length > 0) { // no exception declaration\n-            return false;\n-        }\n-\n-        Class[] paramTypes = method.getParameterTypes();\n-        if (paramTypes.length != 1) { // not only one argument\n-            return false;\n-        }\n-\n-        if (!Event.class.isAssignableFrom(paramTypes[0])) { // not Event type argument\n-            return false;\n-        }\n-\n-        return true;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import org.apache.dubbo.common.function.ThrowableConsumer;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Modifier;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+import static java.util.Collections.emptySet;\r\n+import static java.util.stream.Stream.of;\r\n+import static org.apache.dubbo.common.function.ThrowableFunction.execute;\r\n+\r\n+/**\r\n+ * An abstract class of {@link EventListener} for Generic events, the sub class could add more {@link Event event}\r\n+ * handle methods, rather than only binds the {@link EventListener#onEvent(Event)} method that is declared to be\r\n+ * <code>final</code> the implementation can't override. It's notable that all {@link Event event} handle methods must\r\n+ * meet following conditions:\r\n+ * <ul>\r\n+ * <li>not {@link #onEvent(Event)} method</li>\r\n+ * <li><code>public</code> accessibility</li>\r\n+ * <li><code>void</code> return type</li>\r\n+ * <li>no {@link Exception exception} declaration</li>\r\n+ * <li>only one {@link Event} type argument</li>\r\n+ * </ul>\r\n+ *\r\n+ * @see Event\r\n+ * @see EventListener\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class GenericEventListener implements EventListener<Event> {\r\n+\r\n+    private final Method onEventMethod;\r\n+\r\n+    private final Map<Class<?>, Set<Method>> handleEventMethods;\r\n+\r\n+    protected GenericEventListener() {\r\n+        this.onEventMethod = findOnEventMethod();\r\n+        this.handleEventMethods = findHandleEventMethods();\r\n+    }\r\n+\r\n+    private Method findOnEventMethod() {\r\n+        return execute(getClass(), listenerClass -> listenerClass.getMethod(\"onEvent\", Event.class));\r\n+    }\r\n+\r\n+    private Map<Class<?>, Set<Method>> findHandleEventMethods() {\r\n+        // Event class for key, the eventMethods' Set as value\r\n+        Map<Class<?>, Set<Method>> eventMethods = new HashMap<>();\r\n+        of(getClass().getMethods())\r\n+                .filter(this::isHandleEventMethod)\r\n+                .forEach(method -> {\r\n+                    Class<?> paramType = method.getParameterTypes()[0];\r\n+                    Set<Method> methods = eventMethods.computeIfAbsent(paramType, key -> new LinkedHashSet<>());\r\n+                    methods.add(method);\r\n+                });\r\n+        return eventMethods;\r\n+    }\r\n+\r\n+    public final void onEvent(Event event) {\r\n+        Class<?> eventClass = event.getClass();\r\n+        handleEventMethods.getOrDefault(eventClass, emptySet()).forEach(method -> {\r\n+            ThrowableConsumer.execute(method, m -> {\r\n+                m.invoke(this, event);\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * The {@link Event event} handle methods must meet following conditions:\r\n+     * <ul>\r\n+     * <li>not {@link #onEvent(Event)} method</li>\r\n+     * <li><code>public</code> accessibility</li>\r\n+     * <li><code>void</code> return type</li>\r\n+     * <li>no {@link Exception exception} declaration</li>\r\n+     * <li>only one {@link Event} type argument</li>\r\n+     * </ul>\r\n+     *\r\n+     * @param method\r\n+     * @return\r\n+     */\r\n+    private boolean isHandleEventMethod(Method method) {\r\n+\r\n+        if (onEventMethod.equals(method)) { // not {@link #onEvent(Event)} method\r\n+            return false;\r\n+        }\r\n+\r\n+        if (!Modifier.isPublic(method.getModifiers())) { // not public\r\n+            return false;\r\n+        }\r\n+\r\n+        if (!void.class.equals(method.getReturnType())) { // void return type\r\n+            return false;\r\n+        }\r\n+\r\n+        Class[] exceptionTypes = method.getExceptionTypes();\r\n+\r\n+        if (exceptionTypes.length > 0) { // no exception declaration\r\n+            return false;\r\n+        }\r\n+\r\n+        Class[] paramTypes = method.getParameterTypes();\r\n+        if (paramTypes.length != 1) { // not only one argument\r\n+            return false;\r\n+        }\r\n+\r\n+        if (!Event.class.isAssignableFrom(paramTypes[0])) { // not Event type argument\r\n+            return false;\r\n+        }\r\n+\r\n+        return true;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/Listenable.java", "source2": "org/apache/dubbo/event/Listenable.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,131 +1,131 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import java.lang.reflect.Modifier;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.List;\n-\n-import static java.util.stream.StreamSupport.stream;\n-\n-/**\n- * Dubbo Event Listenable\n- *\n- * @see EventDispatcher\n- * @since 2.7.5\n- */\n-public interface Listenable<E extends EventListener<?>> {\n-\n-    /**\n-     * Add a {@link EventListener Dubbo event listener}\n-     *\n-     * @param listener a {@link EventListener Dubbo event listener}\n-     *                 If current {@link EventListener} is existed, return <code>false</code>\n-     * @throws NullPointerException     if <code>listener</code> argument is <code>null</code>\n-     * @throws IllegalArgumentException if <code>listener</code> argument is not concrete instance\n-     */\n-    void addEventListener(E listener) throws NullPointerException, IllegalArgumentException;\n-\n-    /**\n-     * Add one or more {@link EventListener Dubbo event listeners}\n-     *\n-     * @param listener a {@link EventListener Dubbo event listener}\n-     * @param others   an optional {@link EventListener Dubbo event listeners}\n-     * @throws NullPointerException     if one of arguments is <code>null</code>\n-     * @throws IllegalArgumentException if one of arguments argument is not concrete instance\n-     */\n-    default void addEventListeners(E listener, E... others) throws NullPointerException,\n-            IllegalArgumentException {\n-        List<E> listeners = new ArrayList<>(1 + others.length);\n-        listeners.add(listener);\n-        listeners.addAll(Arrays.asList(others));\n-        addEventListeners(listeners);\n-    }\n-\n-    /**\n-     * Add multiple {@link EventListener Dubbo event listeners}\n-     *\n-     * @param listeners the {@link EventListener Dubbo event listeners}\n-     * @throws NullPointerException     if <code>listeners</code> argument is <code>null</code>\n-     * @throws IllegalArgumentException if any element of <code>listeners</code> is not concrete instance\n-     */\n-    default void addEventListeners(Iterable<E> listeners) throws NullPointerException, IllegalArgumentException {\n-        stream(listeners.spliterator(), false).forEach(this::addEventListener);\n-    }\n-\n-    /**\n-     * Remove a {@link EventListener Dubbo event listener}\n-     *\n-     * @param listener a {@link EventListener Dubbo event listener}\n-     * @return If remove successfully, return <code>true</code>.\n-     * If current {@link EventListener} is existed, return <code>false</code>\n-     * @throws NullPointerException if <code>listener</code> argument is <code>null</code>\n-     */\n-    void removeEventListener(E listener) throws NullPointerException, IllegalArgumentException;\n-\n-    /**\n-     * Remove a {@link EventListener Dubbo event listener}\n-     *\n-     * @param listeners the {@link EventListener Dubbo event listeners}\n-     * @return If remove successfully, return <code>true</code>.\n-     * If current {@link EventListener} is existed, return <code>false</code>\n-     * @throws NullPointerException     if <code>listener</code> argument is <code>null</code>\n-     * @throws IllegalArgumentException if any element of <code>listeners</code> is not concrete instance\n-     */\n-    default void removeEventListeners(Iterable<E> listeners) throws NullPointerException, IllegalArgumentException {\n-        stream(listeners.spliterator(), false).forEach(this::removeEventListener);\n-    }\n-\n-    /**\n-     * Remove all {@link EventListener Dubbo event listeners}\n-     *\n-     * @return a amount of removed listeners\n-     */\n-    default void removeAllEventListeners() {\n-        removeEventListeners(getAllEventListeners());\n-    }\n-\n-    /**\n-     * Get all registered {@link EventListener Dubbo event listeners}\n-     *\n-     * @return non-null read-only ordered {@link EventListener Dubbo event listeners}\n-     * @see EventListener#getPriority()\n-     */\n-    List<E> getAllEventListeners();\n-\n-\n-    /**\n-     * Assets the listener is valid or not\n-     *\n-     * @param listener the instance of {@link EventListener}\n-     * @throws NullPointerException\n-     */\n-    static void assertListener(EventListener<?> listener) throws NullPointerException {\n-        if (listener == null) {\n-            throw new NullPointerException(\"The listener must not be null.\");\n-        }\n-\n-        Class<?> listenerClass = listener.getClass();\n-\n-        int modifiers = listenerClass.getModifiers();\n-\n-        if (Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers)) {\n-            throw new IllegalArgumentException(\"The listener must be concrete class\");\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import java.lang.reflect.Modifier;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.List;\r\n+\r\n+import static java.util.stream.StreamSupport.stream;\r\n+\r\n+/**\r\n+ * Dubbo Event Listenable\r\n+ *\r\n+ * @see EventDispatcher\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface Listenable<E extends EventListener<?>> {\r\n+\r\n+    /**\r\n+     * Add a {@link EventListener Dubbo event listener}\r\n+     *\r\n+     * @param listener a {@link EventListener Dubbo event listener}\r\n+     *                 If current {@link EventListener} is existed, return <code>false</code>\r\n+     * @throws NullPointerException     if <code>listener</code> argument is <code>null</code>\r\n+     * @throws IllegalArgumentException if <code>listener</code> argument is not concrete instance\r\n+     */\r\n+    void addEventListener(E listener) throws NullPointerException, IllegalArgumentException;\r\n+\r\n+    /**\r\n+     * Add one or more {@link EventListener Dubbo event listeners}\r\n+     *\r\n+     * @param listener a {@link EventListener Dubbo event listener}\r\n+     * @param others   an optional {@link EventListener Dubbo event listeners}\r\n+     * @throws NullPointerException     if one of arguments is <code>null</code>\r\n+     * @throws IllegalArgumentException if one of arguments argument is not concrete instance\r\n+     */\r\n+    default void addEventListeners(E listener, E... others) throws NullPointerException,\r\n+            IllegalArgumentException {\r\n+        List<E> listeners = new ArrayList<>(1 + others.length);\r\n+        listeners.add(listener);\r\n+        listeners.addAll(Arrays.asList(others));\r\n+        addEventListeners(listeners);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add multiple {@link EventListener Dubbo event listeners}\r\n+     *\r\n+     * @param listeners the {@link EventListener Dubbo event listeners}\r\n+     * @throws NullPointerException     if <code>listeners</code> argument is <code>null</code>\r\n+     * @throws IllegalArgumentException if any element of <code>listeners</code> is not concrete instance\r\n+     */\r\n+    default void addEventListeners(Iterable<E> listeners) throws NullPointerException, IllegalArgumentException {\r\n+        stream(listeners.spliterator(), false).forEach(this::addEventListener);\r\n+    }\r\n+\r\n+    /**\r\n+     * Remove a {@link EventListener Dubbo event listener}\r\n+     *\r\n+     * @param listener a {@link EventListener Dubbo event listener}\r\n+     * @return If remove successfully, return <code>true</code>.\r\n+     * If current {@link EventListener} is existed, return <code>false</code>\r\n+     * @throws NullPointerException if <code>listener</code> argument is <code>null</code>\r\n+     */\r\n+    void removeEventListener(E listener) throws NullPointerException, IllegalArgumentException;\r\n+\r\n+    /**\r\n+     * Remove a {@link EventListener Dubbo event listener}\r\n+     *\r\n+     * @param listeners the {@link EventListener Dubbo event listeners}\r\n+     * @return If remove successfully, return <code>true</code>.\r\n+     * If current {@link EventListener} is existed, return <code>false</code>\r\n+     * @throws NullPointerException     if <code>listener</code> argument is <code>null</code>\r\n+     * @throws IllegalArgumentException if any element of <code>listeners</code> is not concrete instance\r\n+     */\r\n+    default void removeEventListeners(Iterable<E> listeners) throws NullPointerException, IllegalArgumentException {\r\n+        stream(listeners.spliterator(), false).forEach(this::removeEventListener);\r\n+    }\r\n+\r\n+    /**\r\n+     * Remove all {@link EventListener Dubbo event listeners}\r\n+     *\r\n+     * @return a amount of removed listeners\r\n+     */\r\n+    default void removeAllEventListeners() {\r\n+        removeEventListeners(getAllEventListeners());\r\n+    }\r\n+\r\n+    /**\r\n+     * Get all registered {@link EventListener Dubbo event listeners}\r\n+     *\r\n+     * @return non-null read-only ordered {@link EventListener Dubbo event listeners}\r\n+     * @see EventListener#getPriority()\r\n+     */\r\n+    List<E> getAllEventListeners();\r\n+\r\n+\r\n+    /**\r\n+     * Assets the listener is valid or not\r\n+     *\r\n+     * @param listener the instance of {@link EventListener}\r\n+     * @throws NullPointerException\r\n+     */\r\n+    static void assertListener(EventListener<?> listener) throws NullPointerException {\r\n+        if (listener == null) {\r\n+            throw new NullPointerException(\"The listener must not be null.\");\r\n+        }\r\n+\r\n+        Class<?> listenerClass = listener.getClass();\r\n+\r\n+        int modifiers = listenerClass.getModifiers();\r\n+\r\n+        if (Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers)) {\r\n+            throw new IllegalArgumentException(\"The listener must be concrete class\");\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/event/ParallelEventDispatcher.java", "source2": "org/apache/dubbo/event/ParallelEventDispatcher.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,32 +1,32 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.event;\n-\n-import java.util.concurrent.ForkJoinPool;\n-\n-/**\n- * Parallel {@link EventDispatcher} implementation uses {@link ForkJoinPool#commonPool() JDK common thread pool}\n- *\n- * @see ForkJoinPool#commonPool()\n- * @since 2.7.5\n- */\n-public class ParallelEventDispatcher extends AbstractEventDispatcher {\n-\n-    public ParallelEventDispatcher() {\n-        super(ForkJoinPool.commonPool());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.event;\r\n+\r\n+import java.util.concurrent.ForkJoinPool;\r\n+\r\n+/**\r\n+ * Parallel {@link EventDispatcher} implementation uses {@link ForkJoinPool#commonPool() JDK common thread pool}\r\n+ *\r\n+ * @see ForkJoinPool#commonPool()\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ParallelEventDispatcher extends AbstractEventDispatcher {\r\n+\r\n+    public ParallelEventDispatcher() {\r\n+        super(ForkJoinPool.commonPool());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ApplicationInitListener.java", "source2": "org/apache/dubbo/rpc/model/ApplicationInitListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,27 +1,27 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-@SPI\n-public interface ApplicationInitListener {\n-    /**\n-     * init the application\n-     */\n-    void init();\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+@SPI\r\n+public interface ApplicationInitListener {\r\n+    /**\r\n+     * init the application\r\n+     */\r\n+    void init();\r\n }\n"}, {"source1": "org/apache/dubbo/rpc/model/ApplicationModel.java", "source2": "org/apache/dubbo/rpc/model/ApplicationModel.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,128 +1,128 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.config.Environment;\n-import org.apache.dubbo.common.context.FrameworkExt;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.context.ConfigManager;\n-\n-import java.util.Collection;\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-/**\n- * {@link ExtensionLoader}, {@code DubboBootstrap} and this class are at present designed to be\n- * singleton or static (by itself totally static or uses some static fields). So the instances\n- * returned from them are of process scope. If you want to support multiple dubbo servers in one\n- * single process, you may need to refactor those three classes.\n- *\n- * Represent a application which is using Dubbo and store basic metadata info for using\n- * during the processing of RPC invoking.\n- * <p>\n- * ApplicationModel includes many ProviderModel which is about published services\n- * and many Consumer Model which is about subscribed services.\n- * <p>\n- *\n- */\n-\n-public class ApplicationModel {\n-    protected static final Logger LOGGER = LoggerFactory.getLogger(ApplicationModel.class);\n-    public static final String NAME = \"application\";\n-\n-    private static AtomicBoolean INIT_FLAG = new AtomicBoolean(false);\n-\n-    public static void init() {\n-        if (INIT_FLAG.compareAndSet(false, true)) {\n-            ExtensionLoader<ApplicationInitListener> extensionLoader = ExtensionLoader.getExtensionLoader(ApplicationInitListener.class);\n-            Set<String> listenerNames = extensionLoader.getSupportedExtensions();\n-            for (String listenerName : listenerNames) {\n-                extensionLoader.getExtension(listenerName).init();\n-            }\n-        }\n-    }\n-\n-    public static Collection<ConsumerModel> allConsumerModels() {\n-        return getServiceRepository().getReferredServices();\n-    }\n-\n-    public static Collection<ProviderModel> allProviderModels() {\n-        return getServiceRepository().getExportedServices();\n-    }\n-\n-    public static ProviderModel getProviderModel(String serviceKey) {\n-        return getServiceRepository().lookupExportedService(serviceKey);\n-    }\n-\n-    public static ConsumerModel getConsumerModel(String serviceKey) {\n-        return getServiceRepository().lookupReferredService(serviceKey);\n-    }\n-\n-    private static final ExtensionLoader<FrameworkExt> LOADER = ExtensionLoader.getExtensionLoader(FrameworkExt.class);\n-\n-    public static void initFrameworkExts() {\n-        Set<FrameworkExt> exts = ExtensionLoader.getExtensionLoader(FrameworkExt.class).getSupportedExtensionInstances();\n-        for (FrameworkExt ext : exts) {\n-            ext.initialize();\n-        }\n-    }\n-\n-    public static Environment getEnvironment() {\n-        return (Environment) LOADER.getExtension(Environment.NAME);\n-    }\n-\n-    public static ConfigManager getConfigManager() {\n-        return (ConfigManager) LOADER.getExtension(ConfigManager.NAME);\n-    }\n-\n-    public static ServiceRepository getServiceRepository() {\n-        return (ServiceRepository) LOADER.getExtension(ServiceRepository.NAME);\n-    }\n-\n-    public static ApplicationConfig getApplicationConfig() {\n-        return getConfigManager().getApplicationOrElseThrow();\n-    }\n-\n-    public static String getName() {\n-        return getApplicationConfig().getName();\n-    }\n-\n-    @Deprecated\n-    private static String application;\n-\n-    @Deprecated\n-    public static String getApplication() {\n-        return application == null ? getName() : application;\n-    }\n-\n-    // Currently used by UT.\n-    @Deprecated\n-    public static void setApplication(String application) {\n-        ApplicationModel.application = application;\n-    }\n-\n-    // only for unit test\n-    public static void reset() {\n-        getServiceRepository().destroy();\n-        getConfigManager().destroy();\n-        getEnvironment().destroy();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.config.Environment;\r\n+import org.apache.dubbo.common.context.FrameworkExt;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+/**\r\n+ * {@link ExtensionLoader}, {@code DubboBootstrap} and this class are at present designed to be\r\n+ * singleton or static (by itself totally static or uses some static fields). So the instances\r\n+ * returned from them are of process scope. If you want to support multiple dubbo servers in one\r\n+ * single process, you may need to refactor those three classes.\r\n+ *\r\n+ * Represent a application which is using Dubbo and store basic metadata info for using\r\n+ * during the processing of RPC invoking.\r\n+ * <p>\r\n+ * ApplicationModel includes many ProviderModel which is about published services\r\n+ * and many Consumer Model which is about subscribed services.\r\n+ * <p>\r\n+ *\r\n+ */\r\n+\r\n+public class ApplicationModel {\r\n+    protected static final Logger LOGGER = LoggerFactory.getLogger(ApplicationModel.class);\r\n+    public static final String NAME = \"application\";\r\n+\r\n+    private static AtomicBoolean INIT_FLAG = new AtomicBoolean(false);\r\n+\r\n+    public static void init() {\r\n+        if (INIT_FLAG.compareAndSet(false, true)) {\r\n+            ExtensionLoader<ApplicationInitListener> extensionLoader = ExtensionLoader.getExtensionLoader(ApplicationInitListener.class);\r\n+            Set<String> listenerNames = extensionLoader.getSupportedExtensions();\r\n+            for (String listenerName : listenerNames) {\r\n+                extensionLoader.getExtension(listenerName).init();\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static Collection<ConsumerModel> allConsumerModels() {\r\n+        return getServiceRepository().getReferredServices();\r\n+    }\r\n+\r\n+    public static Collection<ProviderModel> allProviderModels() {\r\n+        return getServiceRepository().getExportedServices();\r\n+    }\r\n+\r\n+    public static ProviderModel getProviderModel(String serviceKey) {\r\n+        return getServiceRepository().lookupExportedService(serviceKey);\r\n+    }\r\n+\r\n+    public static ConsumerModel getConsumerModel(String serviceKey) {\r\n+        return getServiceRepository().lookupReferredService(serviceKey);\r\n+    }\r\n+\r\n+    private static final ExtensionLoader<FrameworkExt> LOADER = ExtensionLoader.getExtensionLoader(FrameworkExt.class);\r\n+\r\n+    public static void initFrameworkExts() {\r\n+        Set<FrameworkExt> exts = ExtensionLoader.getExtensionLoader(FrameworkExt.class).getSupportedExtensionInstances();\r\n+        for (FrameworkExt ext : exts) {\r\n+            ext.initialize();\r\n+        }\r\n+    }\r\n+\r\n+    public static Environment getEnvironment() {\r\n+        return (Environment) LOADER.getExtension(Environment.NAME);\r\n+    }\r\n+\r\n+    public static ConfigManager getConfigManager() {\r\n+        return (ConfigManager) LOADER.getExtension(ConfigManager.NAME);\r\n+    }\r\n+\r\n+    public static ServiceRepository getServiceRepository() {\r\n+        return (ServiceRepository) LOADER.getExtension(ServiceRepository.NAME);\r\n+    }\r\n+\r\n+    public static ApplicationConfig getApplicationConfig() {\r\n+        return getConfigManager().getApplicationOrElseThrow();\r\n+    }\r\n+\r\n+    public static String getName() {\r\n+        return getApplicationConfig().getName();\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    private static String application;\r\n+\r\n+    @Deprecated\r\n+    public static String getApplication() {\r\n+        return application == null ? getName() : application;\r\n+    }\r\n+\r\n+    // Currently used by UT.\r\n+    @Deprecated\r\n+    public static void setApplication(String application) {\r\n+        ApplicationModel.application = application;\r\n+    }\r\n+\r\n+    // only for unit test\r\n+    public static void reset() {\r\n+        getServiceRepository().destroy();\r\n+        getConfigManager().destroy();\r\n+        getEnvironment().destroy();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/AsyncMethodInfo.java", "source2": "org/apache/dubbo/rpc/model/AsyncMethodInfo.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,87 +1,87 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import java.lang.reflect.Method;\n-\n-public class AsyncMethodInfo {\n-    // callback instance when async-call is invoked\n-    private Object oninvokeInstance;\n-\n-    // callback method when async-call is invoked\n-    private Method oninvokeMethod;\n-\n-    // callback instance when async-call is returned\n-    private Object onreturnInstance;\n-\n-    // callback method when async-call is returned\n-    private Method onreturnMethod;\n-\n-    // callback instance when async-call has exception thrown\n-    private Object onthrowInstance;\n-\n-    // callback method when async-call has exception thrown\n-    private Method onthrowMethod;\n-\n-    public Object getOninvokeInstance() {\n-        return oninvokeInstance;\n-    }\n-\n-    public void setOninvokeInstance(Object oninvokeInstance) {\n-        this.oninvokeInstance = oninvokeInstance;\n-    }\n-\n-    public Method getOninvokeMethod() {\n-        return oninvokeMethod;\n-    }\n-\n-    public void setOninvokeMethod(Method oninvokeMethod) {\n-        this.oninvokeMethod = oninvokeMethod;\n-    }\n-\n-    public Object getOnreturnInstance() {\n-        return onreturnInstance;\n-    }\n-\n-    public void setOnreturnInstance(Object onreturnInstance) {\n-        this.onreturnInstance = onreturnInstance;\n-    }\n-\n-    public Method getOnreturnMethod() {\n-        return onreturnMethod;\n-    }\n-\n-    public void setOnreturnMethod(Method onreturnMethod) {\n-        this.onreturnMethod = onreturnMethod;\n-    }\n-\n-    public Object getOnthrowInstance() {\n-        return onthrowInstance;\n-    }\n-\n-    public void setOnthrowInstance(Object onthrowInstance) {\n-        this.onthrowInstance = onthrowInstance;\n-    }\n-\n-    public Method getOnthrowMethod() {\n-        return onthrowMethod;\n-    }\n-\n-    public void setOnthrowMethod(Method onthrowMethod) {\n-        this.onthrowMethod = onthrowMethod;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import java.lang.reflect.Method;\r\n+\r\n+public class AsyncMethodInfo {\r\n+    // callback instance when async-call is invoked\r\n+    private Object oninvokeInstance;\r\n+\r\n+    // callback method when async-call is invoked\r\n+    private Method oninvokeMethod;\r\n+\r\n+    // callback instance when async-call is returned\r\n+    private Object onreturnInstance;\r\n+\r\n+    // callback method when async-call is returned\r\n+    private Method onreturnMethod;\r\n+\r\n+    // callback instance when async-call has exception thrown\r\n+    private Object onthrowInstance;\r\n+\r\n+    // callback method when async-call has exception thrown\r\n+    private Method onthrowMethod;\r\n+\r\n+    public Object getOninvokeInstance() {\r\n+        return oninvokeInstance;\r\n+    }\r\n+\r\n+    public void setOninvokeInstance(Object oninvokeInstance) {\r\n+        this.oninvokeInstance = oninvokeInstance;\r\n+    }\r\n+\r\n+    public Method getOninvokeMethod() {\r\n+        return oninvokeMethod;\r\n+    }\r\n+\r\n+    public void setOninvokeMethod(Method oninvokeMethod) {\r\n+        this.oninvokeMethod = oninvokeMethod;\r\n+    }\r\n+\r\n+    public Object getOnreturnInstance() {\r\n+        return onreturnInstance;\r\n+    }\r\n+\r\n+    public void setOnreturnInstance(Object onreturnInstance) {\r\n+        this.onreturnInstance = onreturnInstance;\r\n+    }\r\n+\r\n+    public Method getOnreturnMethod() {\r\n+        return onreturnMethod;\r\n+    }\r\n+\r\n+    public void setOnreturnMethod(Method onreturnMethod) {\r\n+        this.onreturnMethod = onreturnMethod;\r\n+    }\r\n+\r\n+    public Object getOnthrowInstance() {\r\n+        return onthrowInstance;\r\n+    }\r\n+\r\n+    public void setOnthrowInstance(Object onthrowInstance) {\r\n+        this.onthrowInstance = onthrowInstance;\r\n+    }\r\n+\r\n+    public Method getOnthrowMethod() {\r\n+        return onthrowMethod;\r\n+    }\r\n+\r\n+    public void setOnthrowMethod(Method onthrowMethod) {\r\n+        this.onthrowMethod = onthrowMethod;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/BuiltinServiceDetector.java", "source2": "org/apache/dubbo/rpc/model/BuiltinServiceDetector.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,26 +1,26 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-@SPI\n-public interface BuiltinServiceDetector {\n-\n-    Class<?> getService();\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+@SPI\r\n+public interface BuiltinServiceDetector {\r\n+\r\n+    Class<?> getService();\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ConsumerMethodModel.java", "source2": "org/apache/dubbo/rpc/model/ConsumerMethodModel.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,101 +1,101 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import java.lang.reflect.Method;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;\n-\n-/**\n- * Replaced with {@link MethodDescriptor}\n- */\n-@Deprecated\n-public class ConsumerMethodModel {\n-    private final Method method;\n-    //    private final boolean isCallBack;\n-//    private final boolean isFuture;\n-    private final String[] parameterTypes;\n-    private final Class<?>[] parameterClasses;\n-    private final Class<?> returnClass;\n-    private final String methodName;\n-    private final boolean generic;\n-\n-    private final ConcurrentMap<String, Object> attributeMap = new ConcurrentHashMap<>();\n-\n-\n-    public ConsumerMethodModel(Method method) {\n-        this.method = method;\n-        this.parameterClasses = method.getParameterTypes();\n-        this.returnClass = method.getReturnType();\n-        this.parameterTypes = this.createParamSignature(parameterClasses);\n-        this.methodName = method.getName();\n-        this.generic = methodName.equals($INVOKE) && parameterTypes != null && parameterTypes.length == 3;\n-    }\n-\n-    public Method getMethod() {\n-        return method;\n-    }\n-\n-//    public ConcurrentMap<String, Object> getAttributeMap() {\n-//        return attributeMap;\n-//    }\n-\n-    public void addAttribute(String key, Object value) {\n-        this.attributeMap.put(key, value);\n-    }\n-\n-    public Object getAttribute(String key) {\n-        return this.attributeMap.get(key);\n-    }\n-\n-\n-    public Class<?> getReturnClass() {\n-        return returnClass;\n-    }\n-\n-    public String getMethodName() {\n-        return methodName;\n-    }\n-\n-    public String[] getParameterTypes() {\n-        return parameterTypes;\n-    }\n-\n-    private String[] createParamSignature(Class<?>[] args) {\n-        if (args == null || args.length == 0) {\n-            return new String[]{};\n-        }\n-        String[] paramSig = new String[args.length];\n-        for (int x = 0; x < args.length; x++) {\n-            paramSig[x] = args[x].getName();\n-        }\n-        return paramSig;\n-    }\n-\n-\n-    public boolean isGeneric() {\n-        return generic;\n-    }\n-\n-    public Class<?>[] getParameterClasses() {\n-        return parameterClasses;\n-    }\n-\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;\r\n+\r\n+/**\r\n+ * Replaced with {@link MethodDescriptor}\r\n+ */\r\n+@Deprecated\r\n+public class ConsumerMethodModel {\r\n+    private final Method method;\r\n+    //    private final boolean isCallBack;\r\n+//    private final boolean isFuture;\r\n+    private final String[] parameterTypes;\r\n+    private final Class<?>[] parameterClasses;\r\n+    private final Class<?> returnClass;\r\n+    private final String methodName;\r\n+    private final boolean generic;\r\n+\r\n+    private final ConcurrentMap<String, Object> attributeMap = new ConcurrentHashMap<>();\r\n+\r\n+\r\n+    public ConsumerMethodModel(Method method) {\r\n+        this.method = method;\r\n+        this.parameterClasses = method.getParameterTypes();\r\n+        this.returnClass = method.getReturnType();\r\n+        this.parameterTypes = this.createParamSignature(parameterClasses);\r\n+        this.methodName = method.getName();\r\n+        this.generic = methodName.equals($INVOKE) && parameterTypes != null && parameterTypes.length == 3;\r\n+    }\r\n+\r\n+    public Method getMethod() {\r\n+        return method;\r\n+    }\r\n+\r\n+//    public ConcurrentMap<String, Object> getAttributeMap() {\r\n+//        return attributeMap;\r\n+//    }\r\n+\r\n+    public void addAttribute(String key, Object value) {\r\n+        this.attributeMap.put(key, value);\r\n+    }\r\n+\r\n+    public Object getAttribute(String key) {\r\n+        return this.attributeMap.get(key);\r\n+    }\r\n+\r\n+\r\n+    public Class<?> getReturnClass() {\r\n+        return returnClass;\r\n+    }\r\n+\r\n+    public String getMethodName() {\r\n+        return methodName;\r\n+    }\r\n+\r\n+    public String[] getParameterTypes() {\r\n+        return parameterTypes;\r\n+    }\r\n+\r\n+    private String[] createParamSignature(Class<?>[] args) {\r\n+        if (args == null || args.length == 0) {\r\n+            return new String[]{};\r\n+        }\r\n+        String[] paramSig = new String[args.length];\r\n+        for (int x = 0; x < args.length; x++) {\r\n+            paramSig[x] = args[x].getName();\r\n+        }\r\n+        return paramSig;\r\n+    }\r\n+\r\n+\r\n+    public boolean isGeneric() {\r\n+        return generic;\r\n+    }\r\n+\r\n+    public Class<?>[] getParameterClasses() {\r\n+        return parameterClasses;\r\n+    }\r\n+\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ConsumerModel.java", "source2": "org/apache/dubbo/rpc/model/ConsumerModel.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,219 +1,219 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.BaseServiceMetadata;\n-import org.apache.dubbo.common.utils.Assert;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-\n-import java.lang.reflect.Method;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.TreeSet;\n-\n-/**\n- * This model is bound to your reference's configuration, for example, group, version or method level configuration.\n- */\n-public class ConsumerModel {\n-    private String serviceKey;\n-    private final ServiceDescriptor serviceModel;\n-    private final ReferenceConfigBase<?> referenceConfig;\n-    private final Set<String> apps = new TreeSet<>();\n-\n-    private Object proxyObject;\n-\n-    private Map<String, AsyncMethodInfo> methodConfigs = new HashMap<>();\n-\n-    /**\n-     *  This constructor create an instance of ConsumerModel and passed objects should not be null.\n-     *  If service name, service instance, proxy object,methods should not be null. If these are null\n-     *  then this constructor will throw {@link IllegalArgumentException}\n-     * @param serviceKey Name of the service.\n-     * @param proxyObject  Proxy object.\n-     */\n-    public ConsumerModel(String serviceKey\n-            , Object proxyObject\n-            , ServiceDescriptor serviceModel\n-            , ReferenceConfigBase<?> referenceConfig) {\n-\n-        Assert.notEmptyString(serviceKey, \"Service name can't be null or blank\");\n-\n-        this.serviceKey = serviceKey;\n-        this.proxyObject = proxyObject;\n-        this.serviceModel = serviceModel;\n-        this.referenceConfig = referenceConfig;\n-    }\n-\n-    public void init(Map<String, AsyncMethodInfo> attributes) {\n-        if (attributes != null) {\n-            this.methodConfigs = attributes;\n-        }\n-\n-        initMethodModels();\n-    }\n-\n-    /**\n-     * Return the proxy object used by called while creating instance of ConsumerModel\n-     * @return\n-     */\n-    public Object getProxyObject() {\n-        return proxyObject;\n-    }\n-\n-    public void setProxyObject(Object proxyObject) {\n-        this.proxyObject = proxyObject;\n-    }\n-\n-    /**\n-     * Return all method models for the current service\n-     *\n-     * @return method model list\n-     */\n-    public Set<MethodDescriptor> getAllMethods() {\n-        return serviceModel.getAllMethods();\n-    }\n-\n-    public Class<?> getServiceInterfaceClass() {\n-        return serviceModel.getServiceInterfaceClass();\n-    }\n-\n-    public String getServiceKey() {\n-        return serviceKey;\n-    }\n-\n-    public AsyncMethodInfo getMethodConfig(String methodName) {\n-        return methodConfigs.get(methodName);\n-    }\n-\n-    public ServiceDescriptor getServiceModel() {\n-        return serviceModel;\n-    }\n-\n-    public ReferenceConfigBase getReferenceConfig() {\n-        return referenceConfig;\n-    }\n-\n-    public Set<String> getApps() {\n-        return apps;\n-    }\n-\n-    public AsyncMethodInfo getAsyncInfo(String methodName) {\n-        return methodConfigs.get(methodName);\n-    }\n-\n-    /* *************** Start, metadata compatible **************** */\n-\n-    private ServiceMetadata serviceMetadata;\n-    private Map<Method, ConsumerMethodModel> methodModels = new HashMap<>();\n-\n-    public ConsumerModel(String serviceKey\n-            , Object proxyObject\n-            , ServiceDescriptor serviceModel\n-            , ReferenceConfigBase<?> referenceConfig\n-            , ServiceMetadata metadata) {\n-\n-        this(serviceKey, proxyObject, serviceModel, referenceConfig);\n-        this.serviceMetadata = metadata;\n-    }\n-\n-    public void setServiceKey(String serviceKey) {\n-        this.serviceKey = serviceKey;\n-        if (serviceMetadata != null) {\n-            serviceMetadata.setServiceKey(serviceKey);\n-            serviceMetadata.setGroup(BaseServiceMetadata.groupFromServiceKey(serviceKey));\n-        }\n-    }\n-\n-    public void initMethodModels() {\n-        Class[] interfaceList = null;\n-        if (proxyObject == null) {\n-            interfaceList = new Class[]{referenceConfig.getActualInterface()};\n-        } else {\n-            interfaceList = proxyObject.getClass().getInterfaces();\n-        }\n-        for (Class interfaceClass : interfaceList) {\n-            for (Method method : interfaceClass.getMethods()) {\n-                methodModels.put(method, new ConsumerMethodModel(method));\n-            }\n-        }\n-    }\n-\n-    public ClassLoader getClassLoader() {\n-        return serviceMetadata.getServiceType().getClassLoader();\n-    }\n-\n-    /**\n-     * @return serviceMetadata\n-     */\n-    public ServiceMetadata getServiceMetadata() {\n-        return serviceMetadata;\n-    }\n-\n-    /**\n-     * Return method model for the given method on consumer side\n-     *\n-     * @param method method object\n-     * @return method model\n-     */\n-    public ConsumerMethodModel getMethodModel(Method method) {\n-        return methodModels.get(method);\n-    }\n-\n-    /**\n-     * Return method model for the given method on consumer side\n-     *\n-     * @param method method object\n-     * @return method model\n-     */\n-    public ConsumerMethodModel getMethodModel(String method) {\n-        Optional<Map.Entry<Method, ConsumerMethodModel>> consumerMethodModelEntry = methodModels.entrySet().stream().filter(entry -> entry.getKey().getName().equals(method)).findFirst();\n-        return consumerMethodModelEntry.map(Map.Entry::getValue).orElse(null);\n-    }\n-\n-    /**\n-     * @param method   methodName\n-     * @param argsType method arguments type\n-     * @return\n-     */\n-    public ConsumerMethodModel getMethodModel(String method, String[] argsType) {\n-        Optional<ConsumerMethodModel> consumerMethodModel = methodModels.entrySet().stream()\n-                .filter(entry -> entry.getKey().getName().equals(method))\n-                .map(Map.Entry::getValue).filter(methodModel -> Arrays.equals(argsType, methodModel.getParameterTypes()))\n-                .findFirst();\n-        return consumerMethodModel.orElse(null);\n-    }\n-\n-    /**\n-     * Return all method models for the current service\n-     *\n-     * @return method model list\n-     */\n-    public List<ConsumerMethodModel> getAllMethodModels() {\n-        return new ArrayList<>(methodModels.values());\n-    }\n-\n-    public String getServiceName() {\n-        return this.serviceMetadata.getServiceKey();\n-    }\n-\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.BaseServiceMetadata;\r\n+import org.apache.dubbo.common.utils.Assert;\r\n+import org.apache.dubbo.config.ReferenceConfigBase;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+\r\n+/**\r\n+ * This model is bound to your reference's configuration, for example, group, version or method level configuration.\r\n+ */\r\n+public class ConsumerModel {\r\n+    private String serviceKey;\r\n+    private final ServiceDescriptor serviceModel;\r\n+    private final ReferenceConfigBase<?> referenceConfig;\r\n+    private final Set<String> apps = new TreeSet<>();\r\n+\r\n+    private Object proxyObject;\r\n+\r\n+    private Map<String, AsyncMethodInfo> methodConfigs = new HashMap<>();\r\n+\r\n+    /**\r\n+     *  This constructor create an instance of ConsumerModel and passed objects should not be null.\r\n+     *  If service name, service instance, proxy object,methods should not be null. If these are null\r\n+     *  then this constructor will throw {@link IllegalArgumentException}\r\n+     * @param serviceKey Name of the service.\r\n+     * @param proxyObject  Proxy object.\r\n+     */\r\n+    public ConsumerModel(String serviceKey\r\n+            , Object proxyObject\r\n+            , ServiceDescriptor serviceModel\r\n+            , ReferenceConfigBase<?> referenceConfig) {\r\n+\r\n+        Assert.notEmptyString(serviceKey, \"Service name can't be null or blank\");\r\n+\r\n+        this.serviceKey = serviceKey;\r\n+        this.proxyObject = proxyObject;\r\n+        this.serviceModel = serviceModel;\r\n+        this.referenceConfig = referenceConfig;\r\n+    }\r\n+\r\n+    public void init(Map<String, AsyncMethodInfo> attributes) {\r\n+        if (attributes != null) {\r\n+            this.methodConfigs = attributes;\r\n+        }\r\n+\r\n+        initMethodModels();\r\n+    }\r\n+\r\n+    /**\r\n+     * Return the proxy object used by called while creating instance of ConsumerModel\r\n+     * @return\r\n+     */\r\n+    public Object getProxyObject() {\r\n+        return proxyObject;\r\n+    }\r\n+\r\n+    public void setProxyObject(Object proxyObject) {\r\n+        this.proxyObject = proxyObject;\r\n+    }\r\n+\r\n+    /**\r\n+     * Return all method models for the current service\r\n+     *\r\n+     * @return method model list\r\n+     */\r\n+    public Set<MethodDescriptor> getAllMethods() {\r\n+        return serviceModel.getAllMethods();\r\n+    }\r\n+\r\n+    public Class<?> getServiceInterfaceClass() {\r\n+        return serviceModel.getServiceInterfaceClass();\r\n+    }\r\n+\r\n+    public String getServiceKey() {\r\n+        return serviceKey;\r\n+    }\r\n+\r\n+    public AsyncMethodInfo getMethodConfig(String methodName) {\r\n+        return methodConfigs.get(methodName);\r\n+    }\r\n+\r\n+    public ServiceDescriptor getServiceModel() {\r\n+        return serviceModel;\r\n+    }\r\n+\r\n+    public ReferenceConfigBase getReferenceConfig() {\r\n+        return referenceConfig;\r\n+    }\r\n+\r\n+    public Set<String> getApps() {\r\n+        return apps;\r\n+    }\r\n+\r\n+    public AsyncMethodInfo getAsyncInfo(String methodName) {\r\n+        return methodConfigs.get(methodName);\r\n+    }\r\n+\r\n+    /* *************** Start, metadata compatible **************** */\r\n+\r\n+    private ServiceMetadata serviceMetadata;\r\n+    private Map<Method, ConsumerMethodModel> methodModels = new HashMap<>();\r\n+\r\n+    public ConsumerModel(String serviceKey\r\n+            , Object proxyObject\r\n+            , ServiceDescriptor serviceModel\r\n+            , ReferenceConfigBase<?> referenceConfig\r\n+            , ServiceMetadata metadata) {\r\n+\r\n+        this(serviceKey, proxyObject, serviceModel, referenceConfig);\r\n+        this.serviceMetadata = metadata;\r\n+    }\r\n+\r\n+    public void setServiceKey(String serviceKey) {\r\n+        this.serviceKey = serviceKey;\r\n+        if (serviceMetadata != null) {\r\n+            serviceMetadata.setServiceKey(serviceKey);\r\n+            serviceMetadata.setGroup(BaseServiceMetadata.groupFromServiceKey(serviceKey));\r\n+        }\r\n+    }\r\n+\r\n+    public void initMethodModels() {\r\n+        Class[] interfaceList = null;\r\n+        if (proxyObject == null) {\r\n+            interfaceList = new Class[]{referenceConfig.getActualInterface()};\r\n+        } else {\r\n+            interfaceList = proxyObject.getClass().getInterfaces();\r\n+        }\r\n+        for (Class interfaceClass : interfaceList) {\r\n+            for (Method method : interfaceClass.getMethods()) {\r\n+                methodModels.put(method, new ConsumerMethodModel(method));\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public ClassLoader getClassLoader() {\r\n+        return serviceMetadata.getServiceType().getClassLoader();\r\n+    }\r\n+\r\n+    /**\r\n+     * @return serviceMetadata\r\n+     */\r\n+    public ServiceMetadata getServiceMetadata() {\r\n+        return serviceMetadata;\r\n+    }\r\n+\r\n+    /**\r\n+     * Return method model for the given method on consumer side\r\n+     *\r\n+     * @param method method object\r\n+     * @return method model\r\n+     */\r\n+    public ConsumerMethodModel getMethodModel(Method method) {\r\n+        return methodModels.get(method);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return method model for the given method on consumer side\r\n+     *\r\n+     * @param method method object\r\n+     * @return method model\r\n+     */\r\n+    public ConsumerMethodModel getMethodModel(String method) {\r\n+        Optional<Map.Entry<Method, ConsumerMethodModel>> consumerMethodModelEntry = methodModels.entrySet().stream().filter(entry -> entry.getKey().getName().equals(method)).findFirst();\r\n+        return consumerMethodModelEntry.map(Map.Entry::getValue).orElse(null);\r\n+    }\r\n+\r\n+    /**\r\n+     * @param method   methodName\r\n+     * @param argsType method arguments type\r\n+     * @return\r\n+     */\r\n+    public ConsumerMethodModel getMethodModel(String method, String[] argsType) {\r\n+        Optional<ConsumerMethodModel> consumerMethodModel = methodModels.entrySet().stream()\r\n+                .filter(entry -> entry.getKey().getName().equals(method))\r\n+                .map(Map.Entry::getValue).filter(methodModel -> Arrays.equals(argsType, methodModel.getParameterTypes()))\r\n+                .findFirst();\r\n+        return consumerMethodModel.orElse(null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return all method models for the current service\r\n+     *\r\n+     * @return method model list\r\n+     */\r\n+    public List<ConsumerMethodModel> getAllMethodModels() {\r\n+        return new ArrayList<>(methodModels.values());\r\n+    }\r\n+\r\n+    public String getServiceName() {\r\n+        return this.serviceMetadata.getServiceKey();\r\n+    }\r\n+\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/MethodDescriptor.java", "source2": "org/apache/dubbo/rpc/model/MethodDescriptor.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,93 +1,93 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Type;\n-import java.util.stream.Stream;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;\n-import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE_ASYNC;\n-\n-/**\n- *\n- */\n-public class MethodDescriptor {\n-    private final Method method;\n-    //    private final boolean isCallBack;\n-//    private final boolean isFuture;\n-    private final String paramDesc;\n-    // duplicate filed as paramDesc, but with different format.\n-    private final String[] compatibleParamSignatures;\n-    private final Class<?>[] parameterClasses;\n-    private final Class<?> returnClass;\n-    private final Type[] returnTypes;\n-    private final String methodName;\n-    private final boolean generic;\n-\n-    public MethodDescriptor(Method method) {\n-        this.method = method;\n-        this.parameterClasses = method.getParameterTypes();\n-        this.returnClass = method.getReturnType();\n-        this.returnTypes = ReflectUtils.getReturnTypes(method);\n-        this.paramDesc = ReflectUtils.getDesc(parameterClasses);\n-        this.compatibleParamSignatures = Stream.of(parameterClasses)\n-                .map(Class::getName)\n-                .toArray(String[]::new);\n-        this.methodName = method.getName();\n-        this.generic = (methodName.equals($INVOKE) || methodName.equals($INVOKE_ASYNC)) && parameterClasses.length == 3;\n-    }\n-\n-    public boolean matchParams (String params) {\n-        return paramDesc.equalsIgnoreCase(params);\n-    }\n-\n-    public Method getMethod() {\n-        return method;\n-    }\n-\n-    public String getParamDesc() {\n-        return paramDesc;\n-    }\n-\n-    public String[] getCompatibleParamSignatures() {\n-        return compatibleParamSignatures;\n-    }\n-\n-    public Class<?>[] getParameterClasses() {\n-        return parameterClasses;\n-    }\n-\n-    public Class<?> getReturnClass() {\n-        return returnClass;\n-    }\n-\n-    public Type[] getReturnTypes() {\n-        return returnTypes;\n-    }\n-\n-    public String getMethodName() {\n-        return methodName;\n-    }\n-\n-    public boolean isGeneric() {\n-        return generic;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Type;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE_ASYNC;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public class MethodDescriptor {\r\n+    private final Method method;\r\n+    //    private final boolean isCallBack;\r\n+//    private final boolean isFuture;\r\n+    private final String paramDesc;\r\n+    // duplicate filed as paramDesc, but with different format.\r\n+    private final String[] compatibleParamSignatures;\r\n+    private final Class<?>[] parameterClasses;\r\n+    private final Class<?> returnClass;\r\n+    private final Type[] returnTypes;\r\n+    private final String methodName;\r\n+    private final boolean generic;\r\n+\r\n+    public MethodDescriptor(Method method) {\r\n+        this.method = method;\r\n+        this.parameterClasses = method.getParameterTypes();\r\n+        this.returnClass = method.getReturnType();\r\n+        this.returnTypes = ReflectUtils.getReturnTypes(method);\r\n+        this.paramDesc = ReflectUtils.getDesc(parameterClasses);\r\n+        this.compatibleParamSignatures = Stream.of(parameterClasses)\r\n+                .map(Class::getName)\r\n+                .toArray(String[]::new);\r\n+        this.methodName = method.getName();\r\n+        this.generic = (methodName.equals($INVOKE) || methodName.equals($INVOKE_ASYNC)) && parameterClasses.length == 3;\r\n+    }\r\n+\r\n+    public boolean matchParams (String params) {\r\n+        return paramDesc.equalsIgnoreCase(params);\r\n+    }\r\n+\r\n+    public Method getMethod() {\r\n+        return method;\r\n+    }\r\n+\r\n+    public String getParamDesc() {\r\n+        return paramDesc;\r\n+    }\r\n+\r\n+    public String[] getCompatibleParamSignatures() {\r\n+        return compatibleParamSignatures;\r\n+    }\r\n+\r\n+    public Class<?>[] getParameterClasses() {\r\n+        return parameterClasses;\r\n+    }\r\n+\r\n+    public Class<?> getReturnClass() {\r\n+        return returnClass;\r\n+    }\r\n+\r\n+    public Type[] getReturnTypes() {\r\n+        return returnTypes;\r\n+    }\r\n+\r\n+    public String getMethodName() {\r\n+        return methodName;\r\n+    }\r\n+\r\n+    public boolean isGeneric() {\r\n+        return generic;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ProviderMethodModel.java", "source2": "org/apache/dubbo/rpc/model/ProviderMethodModel.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,80 +1,80 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import java.lang.reflect.Method;\n-import java.lang.reflect.Type;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-/**\n- * Replaced with {@link MethodDescriptor}\n- */\n-@Deprecated\n-public class ProviderMethodModel {\n-    private final Method method;\n-    private final String methodName;\n-    private final Class<?>[] parameterClasses;\n-    private final String[] methodArgTypes;\n-    private final Type[] genericParameterTypes;\n-    private final ConcurrentMap<String, Object> attributeMap = new ConcurrentHashMap<>();\n-\n-    public ProviderMethodModel(Method method) {\n-        this.method = method;\n-        this.methodName = method.getName();\n-        this.parameterClasses = method.getParameterTypes();\n-        this.methodArgTypes = getArgTypes(method);\n-        this.genericParameterTypes = method.getGenericParameterTypes();\n-    }\n-\n-    public Method getMethod() {\n-        return method;\n-    }\n-\n-    public String getMethodName() {\n-        return methodName;\n-    }\n-\n-    public String[] getMethodArgTypes() {\n-        return methodArgTypes;\n-    }\n-\n-    public ConcurrentMap<String, Object> getAttributeMap() {\n-        return attributeMap;\n-    }\n-\n-    private static String[] getArgTypes(Method method) {\n-        String[] methodArgTypes = new String[0];\n-        Class<?>[] parameterTypes = method.getParameterTypes();\n-        if (parameterTypes.length > 0) {\n-            methodArgTypes = new String[parameterTypes.length];\n-            int index = 0;\n-            for (Class<?> paramType : parameterTypes) {\n-                methodArgTypes[index++] = paramType.getName();\n-            }\n-        }\n-        return methodArgTypes;\n-    }\n-\n-    public Class<?>[] getParameterClasses() {\n-        return parameterClasses;\n-    }\n-\n-    public Type[] getGenericParameterTypes() {\n-        return genericParameterTypes;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.lang.reflect.Type;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+/**\r\n+ * Replaced with {@link MethodDescriptor}\r\n+ */\r\n+@Deprecated\r\n+public class ProviderMethodModel {\r\n+    private final Method method;\r\n+    private final String methodName;\r\n+    private final Class<?>[] parameterClasses;\r\n+    private final String[] methodArgTypes;\r\n+    private final Type[] genericParameterTypes;\r\n+    private final ConcurrentMap<String, Object> attributeMap = new ConcurrentHashMap<>();\r\n+\r\n+    public ProviderMethodModel(Method method) {\r\n+        this.method = method;\r\n+        this.methodName = method.getName();\r\n+        this.parameterClasses = method.getParameterTypes();\r\n+        this.methodArgTypes = getArgTypes(method);\r\n+        this.genericParameterTypes = method.getGenericParameterTypes();\r\n+    }\r\n+\r\n+    public Method getMethod() {\r\n+        return method;\r\n+    }\r\n+\r\n+    public String getMethodName() {\r\n+        return methodName;\r\n+    }\r\n+\r\n+    public String[] getMethodArgTypes() {\r\n+        return methodArgTypes;\r\n+    }\r\n+\r\n+    public ConcurrentMap<String, Object> getAttributeMap() {\r\n+        return attributeMap;\r\n+    }\r\n+\r\n+    private static String[] getArgTypes(Method method) {\r\n+        String[] methodArgTypes = new String[0];\r\n+        Class<?>[] parameterTypes = method.getParameterTypes();\r\n+        if (parameterTypes.length > 0) {\r\n+            methodArgTypes = new String[parameterTypes.length];\r\n+            int index = 0;\r\n+            for (Class<?> paramType : parameterTypes) {\r\n+                methodArgTypes[index++] = paramType.getName();\r\n+            }\r\n+        }\r\n+        return methodArgTypes;\r\n+    }\r\n+\r\n+    public Class<?>[] getParameterClasses() {\r\n+        return parameterClasses;\r\n+    }\r\n+\r\n+    public Type[] getGenericParameterTypes() {\r\n+        return genericParameterTypes;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ProviderModel.java", "source2": "org/apache/dubbo/rpc/model/ProviderModel.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,205 +1,205 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.BaseServiceMetadata;\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-\n-import java.lang.reflect.Method;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-\n-/**\n- * ProviderModel is about published services\n- */\n-public class ProviderModel {\n-    private String serviceKey;\n-    private final Object serviceInstance;\n-    private final ServiceDescriptor serviceModel;\n-    private final ServiceConfigBase<?> serviceConfig;\n-    private final List<RegisterStatedURL> urls;\n-\n-    public ProviderModel(String serviceKey,\n-                         Object serviceInstance,\n-                         ServiceDescriptor serviceModel,\n-                         ServiceConfigBase<?> serviceConfig) {\n-        if (null == serviceInstance) {\n-            throw new IllegalArgumentException(\"Service[\" + serviceKey + \"]Target is NULL.\");\n-        }\n-\n-        this.serviceKey = serviceKey;\n-        this.serviceInstance = serviceInstance;\n-        this.serviceModel = serviceModel;\n-        this.serviceConfig = serviceConfig;\n-        this.urls = new ArrayList<>(1);\n-    }\n-\n-    public String getServiceKey() {\n-        return serviceKey;\n-    }\n-\n-\n-    public Class<?> getServiceInterfaceClass() {\n-        return serviceModel.getServiceInterfaceClass();\n-    }\n-\n-    public Object getServiceInstance() {\n-        return serviceInstance;\n-    }\n-\n-    public Set<MethodDescriptor> getAllMethods() {\n-        return serviceModel.getAllMethods();\n-    }\n-\n-    public ServiceDescriptor getServiceModel() {\n-        return serviceModel;\n-    }\n-\n-    public ServiceConfigBase getServiceConfig() {\n-        return serviceConfig;\n-    }\n-\n-    public List<RegisterStatedURL> getStatedUrl() {\n-        return urls;\n-    }\n-\n-    public void addStatedUrl(RegisterStatedURL url) {\n-        this.urls.add(url);\n-    }\n-\n-    public static class RegisterStatedURL {\n-        private volatile URL registryUrl;\n-        private volatile URL providerUrl;\n-        private volatile boolean registered;\n-\n-        public RegisterStatedURL(URL providerUrl,\n-                                 URL registryUrl,\n-                                 boolean registered) {\n-            this.providerUrl = providerUrl;\n-            this.registered = registered;\n-            this.registryUrl = registryUrl;\n-        }\n-\n-        public URL getProviderUrl() {\n-            return providerUrl;\n-        }\n-\n-        public void setProviderUrl(URL providerUrl) {\n-            this.providerUrl = providerUrl;\n-        }\n-\n-        public boolean isRegistered() {\n-            return registered;\n-        }\n-\n-        public void setRegistered(boolean registered) {\n-            this.registered = registered;\n-        }\n-\n-        public URL getRegistryUrl() {\n-            return registryUrl;\n-        }\n-\n-        public void setRegistryUrl(URL registryUrl) {\n-            this.registryUrl = registryUrl;\n-        }\n-    }\n-\n-    /* *************** Start, metadata compatible **************** */\n-\n-    private ServiceMetadata serviceMetadata;\n-    private final Map<String, List<ProviderMethodModel>> methods = new HashMap<String, List<ProviderMethodModel>>();\n-\n-    public ProviderModel(String serviceKey,\n-                         Object serviceInstance,\n-                         ServiceDescriptor serviceModel,\n-                         ServiceConfigBase<?> serviceConfig,\n-                         ServiceMetadata serviceMetadata) {\n-        this(serviceKey, serviceInstance, serviceModel, serviceConfig);\n-\n-        this.serviceMetadata = serviceMetadata;\n-        initMethod(serviceModel.getServiceInterfaceClass());\n-    }\n-\n-\n-    public void setServiceKey(String serviceKey) {\n-        this.serviceKey = serviceKey;\n-        if (serviceMetadata != null) {\n-            serviceMetadata.setServiceKey(serviceKey);\n-            serviceMetadata.setGroup(BaseServiceMetadata.groupFromServiceKey(serviceKey));\n-        }\n-    }\n-\n-    public String getServiceName() {\n-        return this.serviceMetadata.getServiceKey();\n-    }\n-\n-    public List<ProviderMethodModel> getAllMethodModels() {\n-        List<ProviderMethodModel> result = new ArrayList<ProviderMethodModel>();\n-        for (List<ProviderMethodModel> models : methods.values()) {\n-            result.addAll(models);\n-        }\n-        return result;\n-    }\n-\n-    public ProviderMethodModel getMethodModel(String methodName, String[] argTypes) {\n-        List<ProviderMethodModel> methodModels = methods.get(methodName);\n-        if (methodModels != null) {\n-            for (ProviderMethodModel methodModel : methodModels) {\n-                if (Arrays.equals(argTypes, methodModel.getMethodArgTypes())) {\n-                    return methodModel;\n-                }\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public List<ProviderMethodModel> getMethodModelList(String methodName) {\n-        List<ProviderMethodModel> resultList = methods.get(methodName);\n-        return resultList == null ? Collections.emptyList() : resultList;\n-    }\n-\n-    private void initMethod(Class<?> serviceInterfaceClass) {\n-        Method[] methodsToExport;\n-        methodsToExport = serviceInterfaceClass.getMethods();\n-\n-        for (Method method : methodsToExport) {\n-            ReflectUtils.makeAccessible(method);\n-\n-            List<ProviderMethodModel> methodModels = methods.get(method.getName());\n-            if (methodModels == null) {\n-                methodModels = new ArrayList<ProviderMethodModel>();\n-                methods.put(method.getName(), methodModels);\n-            }\n-            methodModels.add(new ProviderMethodModel(method));\n-        }\n-    }\n-\n-    /**\n-     * @return serviceMetadata\n-     */\n-    public ServiceMetadata getServiceMetadata() {\n-        return serviceMetadata;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.BaseServiceMetadata;\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+/**\r\n+ * ProviderModel is about published services\r\n+ */\r\n+public class ProviderModel {\r\n+    private String serviceKey;\r\n+    private final Object serviceInstance;\r\n+    private final ServiceDescriptor serviceModel;\r\n+    private final ServiceConfigBase<?> serviceConfig;\r\n+    private final List<RegisterStatedURL> urls;\r\n+\r\n+    public ProviderModel(String serviceKey,\r\n+                         Object serviceInstance,\r\n+                         ServiceDescriptor serviceModel,\r\n+                         ServiceConfigBase<?> serviceConfig) {\r\n+        if (null == serviceInstance) {\r\n+            throw new IllegalArgumentException(\"Service[\" + serviceKey + \"]Target is NULL.\");\r\n+        }\r\n+\r\n+        this.serviceKey = serviceKey;\r\n+        this.serviceInstance = serviceInstance;\r\n+        this.serviceModel = serviceModel;\r\n+        this.serviceConfig = serviceConfig;\r\n+        this.urls = new ArrayList<>(1);\r\n+    }\r\n+\r\n+    public String getServiceKey() {\r\n+        return serviceKey;\r\n+    }\r\n+\r\n+\r\n+    public Class<?> getServiceInterfaceClass() {\r\n+        return serviceModel.getServiceInterfaceClass();\r\n+    }\r\n+\r\n+    public Object getServiceInstance() {\r\n+        return serviceInstance;\r\n+    }\r\n+\r\n+    public Set<MethodDescriptor> getAllMethods() {\r\n+        return serviceModel.getAllMethods();\r\n+    }\r\n+\r\n+    public ServiceDescriptor getServiceModel() {\r\n+        return serviceModel;\r\n+    }\r\n+\r\n+    public ServiceConfigBase getServiceConfig() {\r\n+        return serviceConfig;\r\n+    }\r\n+\r\n+    public List<RegisterStatedURL> getStatedUrl() {\r\n+        return urls;\r\n+    }\r\n+\r\n+    public void addStatedUrl(RegisterStatedURL url) {\r\n+        this.urls.add(url);\r\n+    }\r\n+\r\n+    public static class RegisterStatedURL {\r\n+        private volatile URL registryUrl;\r\n+        private volatile URL providerUrl;\r\n+        private volatile boolean registered;\r\n+\r\n+        public RegisterStatedURL(URL providerUrl,\r\n+                                 URL registryUrl,\r\n+                                 boolean registered) {\r\n+            this.providerUrl = providerUrl;\r\n+            this.registered = registered;\r\n+            this.registryUrl = registryUrl;\r\n+        }\r\n+\r\n+        public URL getProviderUrl() {\r\n+            return providerUrl;\r\n+        }\r\n+\r\n+        public void setProviderUrl(URL providerUrl) {\r\n+            this.providerUrl = providerUrl;\r\n+        }\r\n+\r\n+        public boolean isRegistered() {\r\n+            return registered;\r\n+        }\r\n+\r\n+        public void setRegistered(boolean registered) {\r\n+            this.registered = registered;\r\n+        }\r\n+\r\n+        public URL getRegistryUrl() {\r\n+            return registryUrl;\r\n+        }\r\n+\r\n+        public void setRegistryUrl(URL registryUrl) {\r\n+            this.registryUrl = registryUrl;\r\n+        }\r\n+    }\r\n+\r\n+    /* *************** Start, metadata compatible **************** */\r\n+\r\n+    private ServiceMetadata serviceMetadata;\r\n+    private final Map<String, List<ProviderMethodModel>> methods = new HashMap<String, List<ProviderMethodModel>>();\r\n+\r\n+    public ProviderModel(String serviceKey,\r\n+                         Object serviceInstance,\r\n+                         ServiceDescriptor serviceModel,\r\n+                         ServiceConfigBase<?> serviceConfig,\r\n+                         ServiceMetadata serviceMetadata) {\r\n+        this(serviceKey, serviceInstance, serviceModel, serviceConfig);\r\n+\r\n+        this.serviceMetadata = serviceMetadata;\r\n+        initMethod(serviceModel.getServiceInterfaceClass());\r\n+    }\r\n+\r\n+\r\n+    public void setServiceKey(String serviceKey) {\r\n+        this.serviceKey = serviceKey;\r\n+        if (serviceMetadata != null) {\r\n+            serviceMetadata.setServiceKey(serviceKey);\r\n+            serviceMetadata.setGroup(BaseServiceMetadata.groupFromServiceKey(serviceKey));\r\n+        }\r\n+    }\r\n+\r\n+    public String getServiceName() {\r\n+        return this.serviceMetadata.getServiceKey();\r\n+    }\r\n+\r\n+    public List<ProviderMethodModel> getAllMethodModels() {\r\n+        List<ProviderMethodModel> result = new ArrayList<ProviderMethodModel>();\r\n+        for (List<ProviderMethodModel> models : methods.values()) {\r\n+            result.addAll(models);\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    public ProviderMethodModel getMethodModel(String methodName, String[] argTypes) {\r\n+        List<ProviderMethodModel> methodModels = methods.get(methodName);\r\n+        if (methodModels != null) {\r\n+            for (ProviderMethodModel methodModel : methodModels) {\r\n+                if (Arrays.equals(argTypes, methodModel.getMethodArgTypes())) {\r\n+                    return methodModel;\r\n+                }\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public List<ProviderMethodModel> getMethodModelList(String methodName) {\r\n+        List<ProviderMethodModel> resultList = methods.get(methodName);\r\n+        return resultList == null ? Collections.emptyList() : resultList;\r\n+    }\r\n+\r\n+    private void initMethod(Class<?> serviceInterfaceClass) {\r\n+        Method[] methodsToExport;\r\n+        methodsToExport = serviceInterfaceClass.getMethods();\r\n+\r\n+        for (Method method : methodsToExport) {\r\n+            ReflectUtils.makeAccessible(method);\r\n+\r\n+            List<ProviderMethodModel> methodModels = methods.get(method.getName());\r\n+            if (methodModels == null) {\r\n+                methodModels = new ArrayList<ProviderMethodModel>();\r\n+                methods.put(method.getName(), methodModels);\r\n+            }\r\n+            methodModels.add(new ProviderMethodModel(method));\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * @return serviceMetadata\r\n+     */\r\n+    public ServiceMetadata getServiceMetadata() {\r\n+        return serviceMetadata;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ServiceDescriptor.java", "source2": "org/apache/dubbo/rpc/model/ServiceDescriptor.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,119 +1,119 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-\n-import java.lang.reflect.Method;\n-import java.util.Arrays;\n-import java.util.ArrayList;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-\n-/**\n- * ServiceModel and ServiceMetadata are to some extend duplicated with each other.\n- * We should merge them in the future.\n- */\n-public class ServiceDescriptor {\n-    private final String serviceName;\n-    private final Class<?> serviceInterfaceClass;\n-    // to accelerate search\n-    private final Map<String, List<MethodDescriptor>> methods = new HashMap<>();\n-    private final Map<String, Map<String, MethodDescriptor>> descToMethods = new HashMap<>();\n-\n-    public ServiceDescriptor(Class<?> interfaceClass) {\n-        this.serviceInterfaceClass = interfaceClass;\n-        this.serviceName = interfaceClass.getName();\n-        initMethods();\n-    }\n-\n-    private void initMethods() {\n-        Method[] methodsToExport = this.serviceInterfaceClass.getMethods();\n-        for (Method method : methodsToExport) {\n-            ReflectUtils.makeAccessible(method);\n-\n-            List<MethodDescriptor> methodModels = methods.computeIfAbsent(method.getName(), (k) -> new ArrayList<>(1));\n-            methodModels.add(new MethodDescriptor(method));\n-        }\n-\n-        methods.forEach((methodName, methodList) -> {\n-            Map<String, MethodDescriptor> descMap = descToMethods.computeIfAbsent(methodName, k -> new HashMap<>());\n-            methodList.forEach(methodModel -> descMap.put(methodModel.getParamDesc(), methodModel));\n-\n-//            Map<Class<?>[], MethodModel> typesMap = typeToMethods.computeIfAbsent(methodName, k -> new HashMap<>());\n-//            methodList.forEach(methodModel -> typesMap.put(methodModel.getParameterClasses(), methodModel));\n-        });\n-    }\n-\n-    public String getServiceName() {\n-        return serviceName;\n-    }\n-\n-    public Class<?> getServiceInterfaceClass() {\n-        return serviceInterfaceClass;\n-    }\n-\n-    public Set<MethodDescriptor> getAllMethods() {\n-        Set<MethodDescriptor> methodModels = new HashSet<>();\n-        methods.forEach((k, v) -> methodModels.addAll(v));\n-        return methodModels;\n-    }\n-\n-    /**\n-     * Does not use Optional as return type to avoid potential performance decrease.\n-     *\n-     * @param methodName\n-     * @param params\n-     * @return\n-     */\n-    public MethodDescriptor getMethod(String methodName, String params) {\n-        Map<String, MethodDescriptor> methods = descToMethods.get(methodName);\n-        if (CollectionUtils.isNotEmptyMap(methods)) {\n-            return methods.get(params);\n-        }\n-        return null;\n-    }\n-\n-    /**\n-     * Does not use Optional as return type to avoid potential performance decrease.\n-     *\n-     * @param methodName\n-     * @param paramTypes\n-     * @return\n-     */\n-    public MethodDescriptor getMethod(String methodName, Class<?>[] paramTypes) {\n-        List<MethodDescriptor> methodModels = methods.get(methodName);\n-        if (CollectionUtils.isNotEmpty(methodModels)) {\n-            for (int i = 0; i < methodModels.size(); i++) {\n-                MethodDescriptor descriptor = methodModels.get(i);\n-                if (Arrays.equals(paramTypes, descriptor.getParameterClasses())) {\n-                    return descriptor;\n-                }\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public List<MethodDescriptor> getMethods(String methodName) {\n-        return methods.get(methodName);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.util.Arrays;\r\n+import java.util.ArrayList;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+/**\r\n+ * ServiceModel and ServiceMetadata are to some extend duplicated with each other.\r\n+ * We should merge them in the future.\r\n+ */\r\n+public class ServiceDescriptor {\r\n+    private final String serviceName;\r\n+    private final Class<?> serviceInterfaceClass;\r\n+    // to accelerate search\r\n+    private final Map<String, List<MethodDescriptor>> methods = new HashMap<>();\r\n+    private final Map<String, Map<String, MethodDescriptor>> descToMethods = new HashMap<>();\r\n+\r\n+    public ServiceDescriptor(Class<?> interfaceClass) {\r\n+        this.serviceInterfaceClass = interfaceClass;\r\n+        this.serviceName = interfaceClass.getName();\r\n+        initMethods();\r\n+    }\r\n+\r\n+    private void initMethods() {\r\n+        Method[] methodsToExport = this.serviceInterfaceClass.getMethods();\r\n+        for (Method method : methodsToExport) {\r\n+            ReflectUtils.makeAccessible(method);\r\n+\r\n+            List<MethodDescriptor> methodModels = methods.computeIfAbsent(method.getName(), (k) -> new ArrayList<>(1));\r\n+            methodModels.add(new MethodDescriptor(method));\r\n+        }\r\n+\r\n+        methods.forEach((methodName, methodList) -> {\r\n+            Map<String, MethodDescriptor> descMap = descToMethods.computeIfAbsent(methodName, k -> new HashMap<>());\r\n+            methodList.forEach(methodModel -> descMap.put(methodModel.getParamDesc(), methodModel));\r\n+\r\n+//            Map<Class<?>[], MethodModel> typesMap = typeToMethods.computeIfAbsent(methodName, k -> new HashMap<>());\r\n+//            methodList.forEach(methodModel -> typesMap.put(methodModel.getParameterClasses(), methodModel));\r\n+        });\r\n+    }\r\n+\r\n+    public String getServiceName() {\r\n+        return serviceName;\r\n+    }\r\n+\r\n+    public Class<?> getServiceInterfaceClass() {\r\n+        return serviceInterfaceClass;\r\n+    }\r\n+\r\n+    public Set<MethodDescriptor> getAllMethods() {\r\n+        Set<MethodDescriptor> methodModels = new HashSet<>();\r\n+        methods.forEach((k, v) -> methodModels.addAll(v));\r\n+        return methodModels;\r\n+    }\r\n+\r\n+    /**\r\n+     * Does not use Optional as return type to avoid potential performance decrease.\r\n+     *\r\n+     * @param methodName\r\n+     * @param params\r\n+     * @return\r\n+     */\r\n+    public MethodDescriptor getMethod(String methodName, String params) {\r\n+        Map<String, MethodDescriptor> methods = descToMethods.get(methodName);\r\n+        if (CollectionUtils.isNotEmptyMap(methods)) {\r\n+            return methods.get(params);\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Does not use Optional as return type to avoid potential performance decrease.\r\n+     *\r\n+     * @param methodName\r\n+     * @param paramTypes\r\n+     * @return\r\n+     */\r\n+    public MethodDescriptor getMethod(String methodName, Class<?>[] paramTypes) {\r\n+        List<MethodDescriptor> methodModels = methods.get(methodName);\r\n+        if (CollectionUtils.isNotEmpty(methodModels)) {\r\n+            for (int i = 0; i < methodModels.size(); i++) {\r\n+                MethodDescriptor descriptor = methodModels.get(i);\r\n+                if (Arrays.equals(paramTypes, descriptor.getParameterClasses())) {\r\n+                    return descriptor;\r\n+                }\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public List<MethodDescriptor> getMethods(String methodName) {\r\n+        return methods.get(methodName);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ServiceMetadata.java", "source2": "org/apache/dubbo/rpc/model/ServiceMetadata.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,102 +1,102 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.BaseServiceMetadata;\n-import org.apache.dubbo.common.URL;\n-\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-\n-/**\n- * Notice, this class currently has no usage inside Dubbo.\n- *\n- * data related to service level such as name, version, classloader of business service,\n- * security info, etc. Also with a AttributeMap for extension.\n- */\n-public class ServiceMetadata extends BaseServiceMetadata {\n-\n-    private String defaultGroup;\n-    private Class<?> serviceType;\n-\n-    private Object target;\n-\n-    /* will be transferred to remote side */\n-    private final Map<String, Object> attachments = new ConcurrentHashMap<String, Object>();\n-    /* used locally*/\n-    private final Map<String, Object> attributeMap = new ConcurrentHashMap<String, Object>();\n-\n-    public ServiceMetadata(String serviceInterfaceName, String group, String version, Class<?> serviceType) {\n-        this.serviceInterfaceName = serviceInterfaceName;\n-        this.defaultGroup = group;\n-        this.group = group;\n-        this.version = version;\n-        this.serviceKey = URL.buildKey(serviceInterfaceName, group, version);\n-        this.serviceType = serviceType;\n-    }\n-\n-    public ServiceMetadata() {\n-    }\n-\n-    public String getServiceKey() {\n-        return serviceKey;\n-    }\n-\n-    public Map<String, Object> getAttachments() {\n-        return attachments;\n-    }\n-\n-    public Map<String, Object> getAttributeMap() {\n-        return attributeMap;\n-    }\n-\n-    public Object getAttribute(String key) {\n-        return attributeMap.get(key);\n-    }\n-\n-    public void addAttribute(String key, Object value) {\n-        this.attributeMap.put(key, value);\n-    }\n-\n-    public void addAttachment(String key, Object value) {\n-        this.attachments.put(key, value);\n-    }\n-\n-    public Class<?> getServiceType() {\n-        return serviceType;\n-    }\n-\n-    public String getDefaultGroup() {\n-        return defaultGroup;\n-    }\n-\n-    public void setDefaultGroup(String defaultGroup) {\n-        this.defaultGroup = defaultGroup;\n-    }\n-\n-    public void setServiceType(Class<?> serviceType) {\n-        this.serviceType = serviceType;\n-    }\n-\n-    public Object getTarget() {\n-        return target;\n-    }\n-\n-    public void setTarget(Object target) {\n-        this.target = target;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.BaseServiceMetadata;\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+\r\n+/**\r\n+ * Notice, this class currently has no usage inside Dubbo.\r\n+ *\r\n+ * data related to service level such as name, version, classloader of business service,\r\n+ * security info, etc. Also with a AttributeMap for extension.\r\n+ */\r\n+public class ServiceMetadata extends BaseServiceMetadata {\r\n+\r\n+    private String defaultGroup;\r\n+    private Class<?> serviceType;\r\n+\r\n+    private Object target;\r\n+\r\n+    /* will be transferred to remote side */\r\n+    private final Map<String, Object> attachments = new ConcurrentHashMap<String, Object>();\r\n+    /* used locally*/\r\n+    private final Map<String, Object> attributeMap = new ConcurrentHashMap<String, Object>();\r\n+\r\n+    public ServiceMetadata(String serviceInterfaceName, String group, String version, Class<?> serviceType) {\r\n+        this.serviceInterfaceName = serviceInterfaceName;\r\n+        this.defaultGroup = group;\r\n+        this.group = group;\r\n+        this.version = version;\r\n+        this.serviceKey = URL.buildKey(serviceInterfaceName, group, version);\r\n+        this.serviceType = serviceType;\r\n+    }\r\n+\r\n+    public ServiceMetadata() {\r\n+    }\r\n+\r\n+    public String getServiceKey() {\r\n+        return serviceKey;\r\n+    }\r\n+\r\n+    public Map<String, Object> getAttachments() {\r\n+        return attachments;\r\n+    }\r\n+\r\n+    public Map<String, Object> getAttributeMap() {\r\n+        return attributeMap;\r\n+    }\r\n+\r\n+    public Object getAttribute(String key) {\r\n+        return attributeMap.get(key);\r\n+    }\r\n+\r\n+    public void addAttribute(String key, Object value) {\r\n+        this.attributeMap.put(key, value);\r\n+    }\r\n+\r\n+    public void addAttachment(String key, Object value) {\r\n+        this.attachments.put(key, value);\r\n+    }\r\n+\r\n+    public Class<?> getServiceType() {\r\n+        return serviceType;\r\n+    }\r\n+\r\n+    public String getDefaultGroup() {\r\n+        return defaultGroup;\r\n+    }\r\n+\r\n+    public void setDefaultGroup(String defaultGroup) {\r\n+        this.defaultGroup = defaultGroup;\r\n+    }\r\n+\r\n+    public void setServiceType(Class<?> serviceType) {\r\n+        this.serviceType = serviceType;\r\n+    }\r\n+\r\n+    public Object getTarget() {\r\n+        return target;\r\n+    }\r\n+\r\n+    public void setTarget(Object target) {\r\n+        this.target = target;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/model/ServiceRepository.java", "source2": "org/apache/dubbo/rpc/model/ServiceRepository.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,185 +1,185 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.model;\n-\n-import org.apache.dubbo.common.context.FrameworkExt;\n-import org.apache.dubbo.common.context.LifecycleAdapter;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.common.BaseServiceMetadata.interfaceFromServiceKey;\n-import static org.apache.dubbo.common.BaseServiceMetadata.versionFromServiceKey;\n-\n-public class ServiceRepository extends LifecycleAdapter implements FrameworkExt {\n-\n-    public static final String NAME = \"repository\";\n-\n-    // services\n-    private ConcurrentMap<String, ServiceDescriptor> services = new ConcurrentHashMap<>();\n-\n-    // consumers\n-    private ConcurrentMap<String, ConsumerModel> consumers = new ConcurrentHashMap<>();\n-\n-    // providers\n-    private ConcurrentMap<String, ProviderModel> providers = new ConcurrentHashMap<>();\n-\n-    // useful to find a provider model quickly with serviceInterfaceName:version\n-    private ConcurrentMap<String, ProviderModel> providersWithoutGroup = new ConcurrentHashMap<>();\n-\n-    public ServiceRepository() {\n-        Set<BuiltinServiceDetector> builtinServices\n-                = ExtensionLoader.getExtensionLoader(BuiltinServiceDetector.class).getSupportedExtensionInstances();\n-        if (CollectionUtils.isNotEmpty(builtinServices)) {\n-            for (BuiltinServiceDetector service : builtinServices) {\n-                registerService(service.getService());\n-            }\n-        }\n-    }\n-\n-    public ServiceDescriptor registerService(Class<?> interfaceClazz) {\n-        return services.computeIfAbsent(interfaceClazz.getName(),\n-                _k -> new ServiceDescriptor(interfaceClazz));\n-    }\n-\n-    /**\n-     * See {@link #registerService(Class)}\n-     * <p>\n-     * we assume:\n-     * 1. services with different interfaces are not allowed to have the same path.\n-     * 2. services share the same interface but has different group/version can share the same path.\n-     * 3. path's default value is the name of the interface.\n-     *\n-     * @param path\n-     * @param interfaceClass\n-     * @return\n-     */\n-    public ServiceDescriptor registerService(String path, Class<?> interfaceClass) {\n-        ServiceDescriptor serviceDescriptor = registerService(interfaceClass);\n-        // if path is different with interface name, add extra path mapping\n-        if (!interfaceClass.getName().equals(path)) {\n-            services.putIfAbsent(path, serviceDescriptor);\n-        }\n-        return serviceDescriptor;\n-    }\n-\n-    public void unregisterService(Class<?> interfaceClazz) {\n-        unregisterService(interfaceClazz.getName());\n-    }\n-\n-    public void unregisterService(String path) {\n-        services.remove(path);\n-    }\n-\n-    public void registerConsumer(String serviceKey,\n-                                 ServiceDescriptor serviceDescriptor,\n-                                 ReferenceConfigBase<?> rc,\n-                                 Object proxy,\n-                                 ServiceMetadata serviceMetadata) {\n-        ConsumerModel consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), proxy, serviceDescriptor, rc,\n-                serviceMetadata);\n-        consumers.putIfAbsent(serviceKey, consumerModel);\n-    }\n-\n-    public void reRegisterConsumer(String newServiceKey, String serviceKey) {\n-        ConsumerModel consumerModel = consumers.get(serviceKey);\n-        consumerModel.setServiceKey(newServiceKey);\n-        consumers.putIfAbsent(newServiceKey, consumerModel);\n-        consumers.remove(serviceKey);\n-\n-    }\n-\n-    public void registerProvider(String serviceKey,\n-                                 Object serviceInstance,\n-                                 ServiceDescriptor serviceModel,\n-                                 ServiceConfigBase<?> serviceConfig,\n-                                 ServiceMetadata serviceMetadata) {\n-        ProviderModel providerModel = new ProviderModel(serviceKey, serviceInstance, serviceModel, serviceConfig,\n-                serviceMetadata);\n-        providers.putIfAbsent(serviceKey, providerModel);\n-        providersWithoutGroup.putIfAbsent(keyWithoutGroup(serviceKey), providerModel);\n-    }\n-\n-    private static String keyWithoutGroup(String serviceKey) {\n-        return interfaceFromServiceKey(serviceKey) + \":\" + versionFromServiceKey(serviceKey);\n-    }\n-\n-    public void reRegisterProvider(String newServiceKey, String serviceKey) {\n-        ProviderModel providerModel = providers.get(serviceKey);\n-        providerModel.setServiceKey(newServiceKey);\n-        providers.putIfAbsent(newServiceKey, providerModel);\n-        providers.remove(serviceKey);\n-    }\n-\n-    public List<ServiceDescriptor> getAllServices() {\n-        return Collections.unmodifiableList(new ArrayList<>(services.values()));\n-    }\n-\n-    public ServiceDescriptor lookupService(String interfaceName) {\n-        return services.get(interfaceName);\n-    }\n-\n-    public MethodDescriptor lookupMethod(String interfaceName, String methodName) {\n-        ServiceDescriptor serviceDescriptor = lookupService(interfaceName);\n-        if (serviceDescriptor == null) {\n-            return null;\n-        }\n-\n-        List<MethodDescriptor> methods = serviceDescriptor.getMethods(methodName);\n-        if (CollectionUtils.isEmpty(methods)) {\n-            return null;\n-        }\n-        return methods.iterator().next();\n-    }\n-\n-    public List<ProviderModel> getExportedServices() {\n-        return Collections.unmodifiableList(new ArrayList<>(providers.values()));\n-    }\n-\n-    public ProviderModel lookupExportedService(String serviceKey) {\n-        return providers.get(serviceKey);\n-    }\n-\n-    public ProviderModel lookupExportedServiceWithoutGroup(String key) {\n-        return providersWithoutGroup.get(key);\n-    }\n-\n-    public List<ConsumerModel> getReferredServices() {\n-        return Collections.unmodifiableList(new ArrayList<>(consumers.values()));\n-    }\n-\n-    public ConsumerModel lookupReferredService(String serviceKey) {\n-        return consumers.get(serviceKey);\n-    }\n-\n-    @Override\n-    public void destroy() throws IllegalStateException {\n-        // currently works for unit test\n-        services.clear();\n-        consumers.clear();\n-        providers.clear();\n-        providersWithoutGroup.clear();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.model;\r\n+\r\n+import org.apache.dubbo.common.context.FrameworkExt;\r\n+import org.apache.dubbo.common.context.LifecycleAdapter;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.config.ReferenceConfigBase;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.common.BaseServiceMetadata.interfaceFromServiceKey;\r\n+import static org.apache.dubbo.common.BaseServiceMetadata.versionFromServiceKey;\r\n+\r\n+public class ServiceRepository extends LifecycleAdapter implements FrameworkExt {\r\n+\r\n+    public static final String NAME = \"repository\";\r\n+\r\n+    // services\r\n+    private ConcurrentMap<String, ServiceDescriptor> services = new ConcurrentHashMap<>();\r\n+\r\n+    // consumers\r\n+    private ConcurrentMap<String, ConsumerModel> consumers = new ConcurrentHashMap<>();\r\n+\r\n+    // providers\r\n+    private ConcurrentMap<String, ProviderModel> providers = new ConcurrentHashMap<>();\r\n+\r\n+    // useful to find a provider model quickly with serviceInterfaceName:version\r\n+    private ConcurrentMap<String, ProviderModel> providersWithoutGroup = new ConcurrentHashMap<>();\r\n+\r\n+    public ServiceRepository() {\r\n+        Set<BuiltinServiceDetector> builtinServices\r\n+                = ExtensionLoader.getExtensionLoader(BuiltinServiceDetector.class).getSupportedExtensionInstances();\r\n+        if (CollectionUtils.isNotEmpty(builtinServices)) {\r\n+            for (BuiltinServiceDetector service : builtinServices) {\r\n+                registerService(service.getService());\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public ServiceDescriptor registerService(Class<?> interfaceClazz) {\r\n+        return services.computeIfAbsent(interfaceClazz.getName(),\r\n+                _k -> new ServiceDescriptor(interfaceClazz));\r\n+    }\r\n+\r\n+    /**\r\n+     * See {@link #registerService(Class)}\r\n+     * <p>\r\n+     * we assume:\r\n+     * 1. services with different interfaces are not allowed to have the same path.\r\n+     * 2. services share the same interface but has different group/version can share the same path.\r\n+     * 3. path's default value is the name of the interface.\r\n+     *\r\n+     * @param path\r\n+     * @param interfaceClass\r\n+     * @return\r\n+     */\r\n+    public ServiceDescriptor registerService(String path, Class<?> interfaceClass) {\r\n+        ServiceDescriptor serviceDescriptor = registerService(interfaceClass);\r\n+        // if path is different with interface name, add extra path mapping\r\n+        if (!interfaceClass.getName().equals(path)) {\r\n+            services.putIfAbsent(path, serviceDescriptor);\r\n+        }\r\n+        return serviceDescriptor;\r\n+    }\r\n+\r\n+    public void unregisterService(Class<?> interfaceClazz) {\r\n+        unregisterService(interfaceClazz.getName());\r\n+    }\r\n+\r\n+    public void unregisterService(String path) {\r\n+        services.remove(path);\r\n+    }\r\n+\r\n+    public void registerConsumer(String serviceKey,\r\n+                                 ServiceDescriptor serviceDescriptor,\r\n+                                 ReferenceConfigBase<?> rc,\r\n+                                 Object proxy,\r\n+                                 ServiceMetadata serviceMetadata) {\r\n+        ConsumerModel consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), proxy, serviceDescriptor, rc,\r\n+                serviceMetadata);\r\n+        consumers.putIfAbsent(serviceKey, consumerModel);\r\n+    }\r\n+\r\n+    public void reRegisterConsumer(String newServiceKey, String serviceKey) {\r\n+        ConsumerModel consumerModel = consumers.get(serviceKey);\r\n+        consumerModel.setServiceKey(newServiceKey);\r\n+        consumers.putIfAbsent(newServiceKey, consumerModel);\r\n+        consumers.remove(serviceKey);\r\n+\r\n+    }\r\n+\r\n+    public void registerProvider(String serviceKey,\r\n+                                 Object serviceInstance,\r\n+                                 ServiceDescriptor serviceModel,\r\n+                                 ServiceConfigBase<?> serviceConfig,\r\n+                                 ServiceMetadata serviceMetadata) {\r\n+        ProviderModel providerModel = new ProviderModel(serviceKey, serviceInstance, serviceModel, serviceConfig,\r\n+                serviceMetadata);\r\n+        providers.putIfAbsent(serviceKey, providerModel);\r\n+        providersWithoutGroup.putIfAbsent(keyWithoutGroup(serviceKey), providerModel);\r\n+    }\r\n+\r\n+    private static String keyWithoutGroup(String serviceKey) {\r\n+        return interfaceFromServiceKey(serviceKey) + \":\" + versionFromServiceKey(serviceKey);\r\n+    }\r\n+\r\n+    public void reRegisterProvider(String newServiceKey, String serviceKey) {\r\n+        ProviderModel providerModel = providers.get(serviceKey);\r\n+        providerModel.setServiceKey(newServiceKey);\r\n+        providers.putIfAbsent(newServiceKey, providerModel);\r\n+        providers.remove(serviceKey);\r\n+    }\r\n+\r\n+    public List<ServiceDescriptor> getAllServices() {\r\n+        return Collections.unmodifiableList(new ArrayList<>(services.values()));\r\n+    }\r\n+\r\n+    public ServiceDescriptor lookupService(String interfaceName) {\r\n+        return services.get(interfaceName);\r\n+    }\r\n+\r\n+    public MethodDescriptor lookupMethod(String interfaceName, String methodName) {\r\n+        ServiceDescriptor serviceDescriptor = lookupService(interfaceName);\r\n+        if (serviceDescriptor == null) {\r\n+            return null;\r\n+        }\r\n+\r\n+        List<MethodDescriptor> methods = serviceDescriptor.getMethods(methodName);\r\n+        if (CollectionUtils.isEmpty(methods)) {\r\n+            return null;\r\n+        }\r\n+        return methods.iterator().next();\r\n+    }\r\n+\r\n+    public List<ProviderModel> getExportedServices() {\r\n+        return Collections.unmodifiableList(new ArrayList<>(providers.values()));\r\n+    }\r\n+\r\n+    public ProviderModel lookupExportedService(String serviceKey) {\r\n+        return providers.get(serviceKey);\r\n+    }\r\n+\r\n+    public ProviderModel lookupExportedServiceWithoutGroup(String key) {\r\n+        return providersWithoutGroup.get(key);\r\n+    }\r\n+\r\n+    public List<ConsumerModel> getReferredServices() {\r\n+        return Collections.unmodifiableList(new ArrayList<>(consumers.values()));\r\n+    }\r\n+\r\n+    public ConsumerModel lookupReferredService(String serviceKey) {\r\n+        return consumers.get(serviceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws IllegalStateException {\r\n+        // currently works for unit test\r\n+        services.clear();\r\n+        consumers.clear();\r\n+        providers.clear();\r\n+        providersWithoutGroup.clear();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/service/Destroyable.java", "source2": "org/apache/dubbo/rpc/service/Destroyable.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,23 +1,23 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.service;\n-\n-public interface Destroyable {\n-\n-    void $destroy();\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.service;\r\n+\r\n+public interface Destroyable {\r\n+\r\n+    void $destroy();\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/service/EchoService.java", "source2": "org/apache/dubbo/rpc/service/EchoService.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.service;\n-\n-/**\n- * Echo service.\n- * @export\n- */\n-public interface EchoService {\n-\n-    /**\n-     * echo test.\n-     *\n-     * @param message message.\n-     * @return message.\n-     */\n-    Object $echo(Object message);\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.service;\r\n+\r\n+/**\r\n+ * Echo service.\r\n+ * @export\r\n+ */\r\n+public interface EchoService {\r\n+\r\n+    /**\r\n+     * echo test.\r\n+     *\r\n+     * @param message message.\r\n+     * @return message.\r\n+     */\r\n+    Object $echo(Object message);\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/rpc/service/EchoServiceDetector.java", "source2": "org/apache/dubbo/rpc/service/EchoServiceDetector.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,28 +1,28 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.service;\n-\n-import org.apache.dubbo.rpc.model.BuiltinServiceDetector;\n-\n-public class EchoServiceDetector implements BuiltinServiceDetector {\n-\n-    @Override\n-    public Class<?> getService() {\n-        return EchoService.class;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.service;\r\n+\r\n+import org.apache.dubbo.rpc.model.BuiltinServiceDetector;\r\n+\r\n+public class EchoServiceDetector implements BuiltinServiceDetector {\r\n+\r\n+    @Override\r\n+    public Class<?> getService() {\r\n+        return EchoService.class;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/service/GenericException.java", "source2": "org/apache/dubbo/rpc/service/GenericException.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,65 +1,65 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.service;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-/**\n- * GenericException\n- *\n- * @export\n- */\n-public class GenericException extends RuntimeException {\n-\n-    private static final long serialVersionUID = -1182299763306599962L;\n-\n-    private String exceptionClass;\n-\n-    private String exceptionMessage;\n-\n-    public GenericException() {\n-    }\n-\n-    public GenericException(String exceptionClass, String exceptionMessage) {\n-        super(exceptionMessage);\n-        this.exceptionClass = exceptionClass;\n-        this.exceptionMessage = exceptionMessage;\n-    }\n-\n-    public GenericException(Throwable cause) {\n-        super(StringUtils.toString(cause));\n-        this.exceptionClass = cause.getClass().getName();\n-        this.exceptionMessage = cause.getMessage();\n-    }\n-\n-    public String getExceptionClass() {\n-        return exceptionClass;\n-    }\n-\n-    public void setExceptionClass(String exceptionClass) {\n-        this.exceptionClass = exceptionClass;\n-    }\n-\n-    public String getExceptionMessage() {\n-        return exceptionMessage;\n-    }\n-\n-    public void setExceptionMessage(String exceptionMessage) {\n-        this.exceptionMessage = exceptionMessage;\n-    }\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.service;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+/**\r\n+ * GenericException\r\n+ *\r\n+ * @export\r\n+ */\r\n+public class GenericException extends RuntimeException {\r\n+\r\n+    private static final long serialVersionUID = -1182299763306599962L;\r\n+\r\n+    private String exceptionClass;\r\n+\r\n+    private String exceptionMessage;\r\n+\r\n+    public GenericException() {\r\n+    }\r\n+\r\n+    public GenericException(String exceptionClass, String exceptionMessage) {\r\n+        super(exceptionMessage);\r\n+        this.exceptionClass = exceptionClass;\r\n+        this.exceptionMessage = exceptionMessage;\r\n+    }\r\n+\r\n+    public GenericException(Throwable cause) {\r\n+        super(StringUtils.toString(cause));\r\n+        this.exceptionClass = cause.getClass().getName();\r\n+        this.exceptionMessage = cause.getMessage();\r\n+    }\r\n+\r\n+    public String getExceptionClass() {\r\n+        return exceptionClass;\r\n+    }\r\n+\r\n+    public void setExceptionClass(String exceptionClass) {\r\n+        this.exceptionClass = exceptionClass;\r\n+    }\r\n+\r\n+    public String getExceptionMessage() {\r\n+        return exceptionMessage;\r\n+    }\r\n+\r\n+    public void setExceptionMessage(String exceptionMessage) {\r\n+        this.exceptionMessage = exceptionMessage;\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/rpc/service/GenericService.java", "source2": "org/apache/dubbo/rpc/service/GenericService.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,48 +1,48 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.service;\n-\n-import java.util.concurrent.CompletableFuture;\n-\n-/**\n- * Generic service interface\n- *\n- * @export\n- */\n-public interface GenericService {\n-\n-    /**\n-     * Generic invocation\n-     *\n-     * @param method         Method name, e.g. findPerson. If there are overridden methods, parameter info is\n-     *                       required, e.g. findPerson(java.lang.String)\n-     * @param parameterTypes Parameter types\n-     * @param args           Arguments\n-     * @return invocation return value\n-     * @throws GenericException potential exception thrown from the invocation\n-     */\n-    Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException;\n-\n-    default CompletableFuture<Object> $invokeAsync(String method, String[] parameterTypes, Object[] args) throws GenericException {\n-        Object object = $invoke(method, parameterTypes, args);\n-        if (object instanceof CompletableFuture) {\n-            return (CompletableFuture<Object>) object;\n-        }\n-        return CompletableFuture.completedFuture(object);\n-    }\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.service;\r\n+\r\n+import java.util.concurrent.CompletableFuture;\r\n+\r\n+/**\r\n+ * Generic service interface\r\n+ *\r\n+ * @export\r\n+ */\r\n+public interface GenericService {\r\n+\r\n+    /**\r\n+     * Generic invocation\r\n+     *\r\n+     * @param method         Method name, e.g. findPerson. If there are overridden methods, parameter info is\r\n+     *                       required, e.g. findPerson(java.lang.String)\r\n+     * @param parameterTypes Parameter types\r\n+     * @param args           Arguments\r\n+     * @return invocation return value\r\n+     * @throws GenericException potential exception thrown from the invocation\r\n+     */\r\n+    Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException;\r\n+\r\n+    default CompletableFuture<Object> $invokeAsync(String method, String[] parameterTypes, Object[] args) throws GenericException {\r\n+        Object object = $invoke(method, parameterTypes, args);\r\n+        if (object instanceof CompletableFuture) {\r\n+            return (CompletableFuture<Object>) object;\r\n+        }\r\n+        return CompletableFuture.completedFuture(object);\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/rpc/service/GenericServiceDetector.java", "source2": "org/apache/dubbo/rpc/service/GenericServiceDetector.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,28 +1,28 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.service;\n-\n-import org.apache.dubbo.rpc.model.BuiltinServiceDetector;\n-\n-public class GenericServiceDetector implements BuiltinServiceDetector {\n-\n-    @Override\n-    public Class<?> getService() {\n-        return GenericService.class;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.service;\r\n+\r\n+import org.apache.dubbo.rpc.model.BuiltinServiceDetector;\r\n+\r\n+public class GenericServiceDetector implements BuiltinServiceDetector {\r\n+\r\n+    @Override\r\n+    public Class<?> getService() {\r\n+        return GenericService.class;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/support/GroupServiceKeyCache.java", "source2": "org/apache/dubbo/rpc/support/GroupServiceKeyCache.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.support;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-public class GroupServiceKeyCache {\n-\n-    private final String serviceGroup;\n-\n-    //ConcurrentMap<serviceName, ConcurrentMap<serviceVersion, ConcurrentMap<port, String>>>\n-    private final ConcurrentMap<String, ConcurrentMap<String, ConcurrentMap<Integer, String>>> serviceKeyMap;\n-\n-    public GroupServiceKeyCache(String serviceGroup) {\n-        this.serviceGroup = serviceGroup;\n-        this.serviceKeyMap = new ConcurrentHashMap<>(512);\n-    }\n-\n-    public String getServiceKey(String serviceName, String serviceVersion, int port) {\n-        ConcurrentMap<String, ConcurrentMap<Integer, String>> versionMap = serviceKeyMap.get(serviceName);\n-        if (versionMap == null) {\n-            serviceKeyMap.putIfAbsent(serviceName, new ConcurrentHashMap<>());\n-            versionMap = serviceKeyMap.get(serviceName);\n-        }\n-\n-        serviceVersion = serviceVersion == null ? \"\" : serviceVersion;\n-        ConcurrentMap<Integer, String> portMap = versionMap.get(serviceVersion);\n-        if (portMap == null) {\n-            versionMap.putIfAbsent(serviceVersion, new ConcurrentHashMap<>());\n-            portMap = versionMap.get(serviceVersion);\n-        }\n-\n-        String serviceKey = portMap.get(port);\n-        if (serviceKey == null) {\n-            serviceKey = createServiceKey(serviceName, serviceVersion, port);\n-            portMap.put(port, serviceKey);\n-        }\n-        return serviceKey;\n-    }\n-\n-    private String createServiceKey(String serviceName, String serviceVersion, int port) {\n-        StringBuilder buf = new StringBuilder();\n-        if (StringUtils.isNotEmpty(serviceGroup)) {\n-            buf.append(serviceGroup).append('/');\n-        }\n-\n-        buf.append(serviceName);\n-        if (StringUtils.isNotEmpty(serviceVersion) && !\"0.0.0\".equals(serviceVersion)) {\n-            buf.append(':').append(serviceVersion);\n-        }\n-        buf.append(':').append(port);\n-        return buf.toString();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.support;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+public class GroupServiceKeyCache {\r\n+\r\n+    private final String serviceGroup;\r\n+\r\n+    //ConcurrentMap<serviceName, ConcurrentMap<serviceVersion, ConcurrentMap<port, String>>>\r\n+    private final ConcurrentMap<String, ConcurrentMap<String, ConcurrentMap<Integer, String>>> serviceKeyMap;\r\n+\r\n+    public GroupServiceKeyCache(String serviceGroup) {\r\n+        this.serviceGroup = serviceGroup;\r\n+        this.serviceKeyMap = new ConcurrentHashMap<>(512);\r\n+    }\r\n+\r\n+    public String getServiceKey(String serviceName, String serviceVersion, int port) {\r\n+        ConcurrentMap<String, ConcurrentMap<Integer, String>> versionMap = serviceKeyMap.get(serviceName);\r\n+        if (versionMap == null) {\r\n+            serviceKeyMap.putIfAbsent(serviceName, new ConcurrentHashMap<>());\r\n+            versionMap = serviceKeyMap.get(serviceName);\r\n+        }\r\n+\r\n+        serviceVersion = serviceVersion == null ? \"\" : serviceVersion;\r\n+        ConcurrentMap<Integer, String> portMap = versionMap.get(serviceVersion);\r\n+        if (portMap == null) {\r\n+            versionMap.putIfAbsent(serviceVersion, new ConcurrentHashMap<>());\r\n+            portMap = versionMap.get(serviceVersion);\r\n+        }\r\n+\r\n+        String serviceKey = portMap.get(port);\r\n+        if (serviceKey == null) {\r\n+            serviceKey = createServiceKey(serviceName, serviceVersion, port);\r\n+            portMap.put(port, serviceKey);\r\n+        }\r\n+        return serviceKey;\r\n+    }\r\n+\r\n+    private String createServiceKey(String serviceName, String serviceVersion, int port) {\r\n+        StringBuilder buf = new StringBuilder();\r\n+        if (StringUtils.isNotEmpty(serviceGroup)) {\r\n+            buf.append(serviceGroup).append('/');\r\n+        }\r\n+\r\n+        buf.append(serviceName);\r\n+        if (StringUtils.isNotEmpty(serviceVersion) && !\"0.0.0\".equals(serviceVersion)) {\r\n+            buf.append(':').append(serviceVersion);\r\n+        }\r\n+        buf.append(':').append(port);\r\n+        return buf.toString();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/support/ProtocolUtils.java", "source2": "org/apache/dubbo/rpc/support/ProtocolUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,91 +1,91 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.support;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_RAW_RETURN;\n-import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_BEAN;\n-import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_DEFAULT;\n-import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_NATIVE_JAVA;\n-import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_PROTOBUF;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-\n-public class ProtocolUtils {\n-\n-    private static final ConcurrentMap<String, GroupServiceKeyCache> groupServiceKeyCacheMap = new ConcurrentHashMap<>();\n-\n-    private ProtocolUtils() {\n-    }\n-\n-    public static String serviceKey(URL url) {\n-        return serviceKey(url.getPort(), url.getPath(), url.getParameter(VERSION_KEY),\n-                url.getParameter(GROUP_KEY));\n-    }\n-\n-    public static String serviceKey(int port, String serviceName, String serviceVersion, String serviceGroup) {\n-        serviceGroup = serviceGroup == null ? \"\" : serviceGroup;\n-        GroupServiceKeyCache groupServiceKeyCache = groupServiceKeyCacheMap.get(serviceGroup);\n-        if (groupServiceKeyCache == null) {\n-            groupServiceKeyCacheMap.putIfAbsent(serviceGroup, new GroupServiceKeyCache(serviceGroup));\n-            groupServiceKeyCache = groupServiceKeyCacheMap.get(serviceGroup);\n-        }\n-        return groupServiceKeyCache.getServiceKey(serviceName, serviceVersion, port);\n-    }\n-\n-    public static boolean isGeneric(String generic) {\n-        return StringUtils.isNotEmpty(generic)\n-                && (GENERIC_SERIALIZATION_DEFAULT.equalsIgnoreCase(generic)  /* Normal generalization cal */\n-                || GENERIC_SERIALIZATION_NATIVE_JAVA.equalsIgnoreCase(generic) /* Streaming generalization call supporting jdk serialization */\n-                || GENERIC_SERIALIZATION_BEAN.equalsIgnoreCase(generic)\n-                || GENERIC_SERIALIZATION_PROTOBUF.equalsIgnoreCase(generic)\n-                || GENERIC_RAW_RETURN.equalsIgnoreCase(generic));\n-\n-    }\n-\n-    public static boolean isValidGenericValue(String generic) {\n-        return isGeneric(generic) || Boolean.FALSE.toString().equalsIgnoreCase(generic);\n-\n-    }\n-\n-    public static boolean isDefaultGenericSerialization(String generic) {\n-        return isGeneric(generic)\n-                && GENERIC_SERIALIZATION_DEFAULT.equalsIgnoreCase(generic);\n-    }\n-\n-    public static boolean isJavaGenericSerialization(String generic) {\n-        return isGeneric(generic)\n-                && GENERIC_SERIALIZATION_NATIVE_JAVA.equalsIgnoreCase(generic);\n-    }\n-\n-    public static boolean isBeanGenericSerialization(String generic) {\n-        return isGeneric(generic) && GENERIC_SERIALIZATION_BEAN.equals(generic);\n-    }\n-\n-    public static boolean isProtobufGenericSerialization(String generic) {\n-        return isGeneric(generic) && GENERIC_SERIALIZATION_PROTOBUF.equals(generic);\n-    }\n-\n-    public static boolean isGenericReturnRawResult(String generic) {\n-        return GENERIC_RAW_RETURN.equals(generic);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.support;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_RAW_RETURN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_BEAN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_DEFAULT;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_NATIVE_JAVA;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_PROTOBUF;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+\r\n+public class ProtocolUtils {\r\n+\r\n+    private static final ConcurrentMap<String, GroupServiceKeyCache> groupServiceKeyCacheMap = new ConcurrentHashMap<>();\r\n+\r\n+    private ProtocolUtils() {\r\n+    }\r\n+\r\n+    public static String serviceKey(URL url) {\r\n+        return serviceKey(url.getPort(), url.getPath(), url.getParameter(VERSION_KEY),\r\n+                url.getParameter(GROUP_KEY));\r\n+    }\r\n+\r\n+    public static String serviceKey(int port, String serviceName, String serviceVersion, String serviceGroup) {\r\n+        serviceGroup = serviceGroup == null ? \"\" : serviceGroup;\r\n+        GroupServiceKeyCache groupServiceKeyCache = groupServiceKeyCacheMap.get(serviceGroup);\r\n+        if (groupServiceKeyCache == null) {\r\n+            groupServiceKeyCacheMap.putIfAbsent(serviceGroup, new GroupServiceKeyCache(serviceGroup));\r\n+            groupServiceKeyCache = groupServiceKeyCacheMap.get(serviceGroup);\r\n+        }\r\n+        return groupServiceKeyCache.getServiceKey(serviceName, serviceVersion, port);\r\n+    }\r\n+\r\n+    public static boolean isGeneric(String generic) {\r\n+        return StringUtils.isNotEmpty(generic)\r\n+                && (GENERIC_SERIALIZATION_DEFAULT.equalsIgnoreCase(generic)  /* Normal generalization cal */\r\n+                || GENERIC_SERIALIZATION_NATIVE_JAVA.equalsIgnoreCase(generic) /* Streaming generalization call supporting jdk serialization */\r\n+                || GENERIC_SERIALIZATION_BEAN.equalsIgnoreCase(generic)\r\n+                || GENERIC_SERIALIZATION_PROTOBUF.equalsIgnoreCase(generic)\r\n+                || GENERIC_RAW_RETURN.equalsIgnoreCase(generic));\r\n+\r\n+    }\r\n+\r\n+    public static boolean isValidGenericValue(String generic) {\r\n+        return isGeneric(generic) || Boolean.FALSE.toString().equalsIgnoreCase(generic);\r\n+\r\n+    }\r\n+\r\n+    public static boolean isDefaultGenericSerialization(String generic) {\r\n+        return isGeneric(generic)\r\n+                && GENERIC_SERIALIZATION_DEFAULT.equalsIgnoreCase(generic);\r\n+    }\r\n+\r\n+    public static boolean isJavaGenericSerialization(String generic) {\r\n+        return isGeneric(generic)\r\n+                && GENERIC_SERIALIZATION_NATIVE_JAVA.equalsIgnoreCase(generic);\r\n+    }\r\n+\r\n+    public static boolean isBeanGenericSerialization(String generic) {\r\n+        return isGeneric(generic) && GENERIC_SERIALIZATION_BEAN.equals(generic);\r\n+    }\r\n+\r\n+    public static boolean isProtobufGenericSerialization(String generic) {\r\n+        return isGeneric(generic) && GENERIC_SERIALIZATION_PROTOBUF.equals(generic);\r\n+    }\r\n+\r\n+    public static boolean isGenericReturnRawResult(String generic) {\r\n+        return GENERIC_RAW_RETURN.equals(generic);\r\n+    }\r\n+}\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory", "source2": "META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-nop=org.apache.dubbo.common.config.configcenter.nop.NopDynamicConfigurationFactory\n+nop=org.apache.dubbo.common.config.configcenter.nop.NopDynamicConfigurationFactory\r\n file=org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfigurationFactory\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.common.context.FrameworkExt", "source2": "META-INF/dubbo/internal/org.apache.dubbo.common.context.FrameworkExt", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,3 +1,3 @@\n-config=org.apache.dubbo.config.context.ConfigManager\n-environment=org.apache.dubbo.common.config.Environment\n+config=org.apache.dubbo.config.context.ConfigManager\r\n+environment=org.apache.dubbo.common.config.Environment\r\n repository=org.apache.dubbo.rpc.model.ServiceRepository\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter", "source2": "META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,11 +1,11 @@\n-# org.apache.dubbo.common.convert.Converter\n-string-to-boolean=org.apache.dubbo.common.convert.StringToBooleanConverter\n-string-to-character=org.apache.dubbo.common.convert.StringToCharacterConverter\n-string-to-char-array=org.apache.dubbo.common.convert.StringToCharArrayConverter\n-string-to-double=org.apache.dubbo.common.convert.StringToDoubleConverter\n-string-to-float=org.apache.dubbo.common.convert.StringToFloatConverter\n-string-to-integer=org.apache.dubbo.common.convert.StringToIntegerConverter\n-string-to-long=org.apache.dubbo.common.convert.StringToLongConverter\n-string-to-optional=org.apache.dubbo.common.convert.StringToOptionalConverter\n-string-to-short=org.apache.dubbo.common.convert.StringToShortConverter\n+# org.apache.dubbo.common.convert.Converter\r\n+string-to-boolean=org.apache.dubbo.common.convert.StringToBooleanConverter\r\n+string-to-character=org.apache.dubbo.common.convert.StringToCharacterConverter\r\n+string-to-char-array=org.apache.dubbo.common.convert.StringToCharArrayConverter\r\n+string-to-double=org.apache.dubbo.common.convert.StringToDoubleConverter\r\n+string-to-float=org.apache.dubbo.common.convert.StringToFloatConverter\r\n+string-to-integer=org.apache.dubbo.common.convert.StringToIntegerConverter\r\n+string-to-long=org.apache.dubbo.common.convert.StringToLongConverter\r\n+string-to-optional=org.apache.dubbo.common.convert.StringToOptionalConverter\r\n+string-to-short=org.apache.dubbo.common.convert.StringToShortConverter\r\n string-to-string=org.apache.dubbo.common.convert.StringToStringConverter\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter", "source2": "META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,12 +1,12 @@\n-# org.apache.dubbo.common.convert.multiple.MultiValueConverter\n-string-to-array=org.apache.dubbo.common.convert.multiple.StringToArrayConverter\n-string-to-blocking-deque=org.apache.dubbo.common.convert.multiple.StringToBlockingDequeConverter\n-string-to-blocking-queue=org.apache.dubbo.common.convert.multiple.StringToBlockingQueueConverter\n-string-to-collection=org.apache.dubbo.common.convert.multiple.StringToCollectionConverter\n-string-to-deque=org.apache.dubbo.common.convert.multiple.StringToDequeConverter\n-string-to-list=org.apache.dubbo.common.convert.multiple.StringToListConverter\n-string-to-navigable-set=org.apache.dubbo.common.convert.multiple.StringToNavigableSetConverter\n-string-to-queue=org.apache.dubbo.common.convert.multiple.StringToQueueConverter\n-string-to-set=org.apache.dubbo.common.convert.multiple.StringToSetConverter\n-string-to-sorted-set=org.apache.dubbo.common.convert.multiple.StringToSortedSetConverter\n-string-to-transfer-queue=org.apache.dubbo.common.convert.multiple.StringToTransferQueueConverter\n+# org.apache.dubbo.common.convert.multiple.MultiValueConverter\r\n+string-to-array=org.apache.dubbo.common.convert.multiple.StringToArrayConverter\r\n+string-to-blocking-deque=org.apache.dubbo.common.convert.multiple.StringToBlockingDequeConverter\r\n+string-to-blocking-queue=org.apache.dubbo.common.convert.multiple.StringToBlockingQueueConverter\r\n+string-to-collection=org.apache.dubbo.common.convert.multiple.StringToCollectionConverter\r\n+string-to-deque=org.apache.dubbo.common.convert.multiple.StringToDequeConverter\r\n+string-to-list=org.apache.dubbo.common.convert.multiple.StringToListConverter\r\n+string-to-navigable-set=org.apache.dubbo.common.convert.multiple.StringToNavigableSetConverter\r\n+string-to-queue=org.apache.dubbo.common.convert.multiple.StringToQueueConverter\r\n+string-to-set=org.apache.dubbo.common.convert.multiple.StringToSetConverter\r\n+string-to-sorted-set=org.apache.dubbo.common.convert.multiple.StringToSortedSetConverter\r\n+string-to-transfer-queue=org.apache.dubbo.common.convert.multiple.StringToTransferQueueConverter\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher", "source2": "META-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-direct=org.apache.dubbo.event.DirectEventDispatcher\n-parallel=org.apache.dubbo.event.ParallelEventDispatcher\n+direct=org.apache.dubbo.event.DirectEventDispatcher\r\n+parallel=org.apache.dubbo.event.ParallelEventDispatcher\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector", "source2": "META-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-echo=org.apache.dubbo.rpc.service.EchoServiceDetector\n+echo=org.apache.dubbo.rpc.service.EchoServiceDetector\r\n generic=org.apache.dubbo.rpc.service.GenericServiceDetector\n"}, {"source1": "META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy", "source2": "META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,3 +1,3 @@\n-org.apache.dubbo.common.extension.DubboInternalLoadingStrategy\n-org.apache.dubbo.common.extension.DubboLoadingStrategy\n+org.apache.dubbo.common.extension.DubboInternalLoadingStrategy\r\n+org.apache.dubbo.common.extension.DubboLoadingStrategy\r\n org.apache.dubbo.common.extension.ServicesLoadingStrategy\n"}, {"source1": "security/serialize.blockedlist", "source2": "security/serialize.blockedlist", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,167 +1,167 @@\n-#\n-#\n-#   Licensed to the Apache Software Foundation (ASF) under one or more\n-#   contributor license agreements.  See the NOTICE file distributed with\n-#   this work for additional information regarding copyright ownership.\n-#   The ASF licenses this file to You under the Apache License, Version 2.0\n-#   (the \"License\"); you may not use this file except in compliance with\n-#   the License.  You may obtain a copy of the License at\n-#\n-#       http://www.apache.org/licenses/LICENSE-2.0\n-#\n-#   Unless required by applicable law or agreed to in writing, software\n-#   distributed under the License is distributed on an \"AS IS\" BASIS,\n-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-#   See the License for the specific language governing permissions and\n-#   limitations under the License.\n-#\n-#\n-aj.org.objectweb.asm.\n-br.com.anteros.\n-ch.qos.logback.\n-clojure.core$constantly\n-clojure.main$eval_opt\n-com.alibaba.citrus.springext.support.parser.abstractnamedproxybeandefinitionparser$proxytargetfactory\n-com.alibaba.citrus.springext.util.springextutil.abstractproxy\n-com.alibaba.druid.pool.druiddatasource\n-com.alibaba.druid.stat.jdbcdatasourcestat\n-com.alibaba.fastjson.annotation\n-com.alipay.custrelation.service.model.redress.pair\n-com.caucho.\n-com.ibatis.\n-com.mchange\n-com.mysql.cj.jdbc.admin.\n-com.mysql.cj.jdbc.mysqlconnectionpooldatasource\n-com.mysql.cj.jdbc.mysqldatasource\n-com.mysql.cj.jdbc.mysqlxadatasource\n-com.mysql.cj.log.\n-com.p6spy.engine.\n-com.rometools.rome.feed.impl.equalsbean\n-com.rometools.rome.feed.impl.tostringbean\n-com.sun.\n-com.taobao.eagleeye.wrapper\n-com.zaxxer.hikari.\n-flex.messaging.util.concurrent.\n-java.awt.i\n-java.awt.p\n-java.beans.expression\n-java.io.closeable\n-java.io.serializable\n-java.lang.autocloseable\n-java.lang.class\n-java.lang.cloneable\n-java.lang.iterable\n-java.lang.object\n-java.lang.readable\n-java.lang.runnable\n-java.lang.thread\n-java.lang.unixprocess\n-java.net.inetaddress\n-java.net.socket\n-java.net.url\n-java.rmi\n-java.security.signedobject\n-java.util.collection\n-java.util.eventlistener\n-java.util.jar.\n-java.util.logging.\n-java.util.prefs.\n-java.util.serviceloader$lazyiterator\n-javassist.\n-javax.activation.\n-javax.imageio.imageio$containsfilter\n-javax.imageio.spi.serviceregistry\n-javax.management.\n-javax.naming.\n-javax.net.\n-javax.print.\n-javax.script.\n-javax.sound.\n-javax.swing.j\n-javax.tools.\n-javax.xml\n-jdk.internal.\n-jodd.db.connection.\n-junit.\n-net.bytebuddy.dynamic.loading.bytearrayclassloader\n-net.sf.cglib.\n-net.sf.ehcache.hibernate.\n-net.sf.ehcache.transaction.manager.\n-oracle.jdbc.\n-oracle.jms.aq\n-oracle.net\n-org.aoju.bus.proxy.provider.\n-org.apache.activemq.activemqconnectionfactory\n-org.apache.activemq.activemqxaconnectionfactory\n-org.apache.activemq.jms.pool.\n-org.apache.activemq.pool.\n-org.apache.activemq.spring.\n-org.apache.aries.transaction.\n-org.apache.axis2.jaxws.spi.handler.\n-org.apache.axis2.transport.jms.\n-org.apache.bcel\n-org.apache.carbondata.core.scan.expression.expressionresult\n-org.apache.catalina.\n-org.apache.cocoon.\n-org.apache.commons.beanutils\n-org.apache.commons.collections.comparators.\n-org.apache.commons.collections.functors\n-org.apache.commons.collections.functors.\n-org.apache.commons.collections.transformer\n-org.apache.commons.collections4.comparators\n-org.apache.commons.collections4.functors\n-org.apache.commons.collections4.transformer\n-org.apache.commons.configuration\n-org.apache.commons.dbcp\n-org.apache.commons.fileupload\n-org.apache.commons.jelly.\n-org.apache.commons.logging.\n-org.apache.commons.proxy.\n-org.apache.cxf.jaxrs.provider.\n-org.apache.hadoop.shaded.com.zaxxer.hikari.\n-org.apache.http.auth.\n-org.apache.http.conn.\n-org.apache.http.cookie.\n-org.apache.http.impl.\n-org.apache.ibatis.datasource\n-org.apache.ibatis.executor.\n-org.apache.ibatis.javassist.\n-org.apache.ibatis.ognl.\n-org.apache.ibatis.parsing.\n-org.apache.ibatis.reflection.\n-org.apache.ibatis.scripting.\n-org.apache.ignite.cache.jta.\n-org.apache.log4j.\n-org.apache.logging.\n-org.apache.myfaces.context.servlet\n-org.apache.openjpa.ee.\n-org.apache.shiro.jndi.\n-org.apache.shiro.realm.\n-org.apache.tomcat\n-org.apache.wicket.util\n-org.apache.xalan\n-org.apache.xbean.\n-org.apache.xpath.xpathcontext\n-org.codehaus.groovy.runtime\n-org.codehaus.jackson.\n-org.eclipse.jetty.\n-org.geotools.filter.constantexpression\n-org.h2.jdbcx.\n-org.h2.server.\n-org.hibernate\n-org.javasimon.\n-org.jaxen.\n-org.jboss\n-org.jdom.\n-org.jdom2.transform.\n-org.logicalcobwebs.\n-org.mortbay.jetty.\n-org.mozilla.javascript\n-org.objectweb.asm.\n-org.osjava.sj.\n-org.python.core\n-org.quartz.\n-org.slf4j.\n-org.springframework.\n-org.yaml.snakeyaml.tokens.directivetoken\n+#\r\n+#\r\n+#   Licensed to the Apache Software Foundation (ASF) under one or more\r\n+#   contributor license agreements.  See the NOTICE file distributed with\r\n+#   this work for additional information regarding copyright ownership.\r\n+#   The ASF licenses this file to You under the Apache License, Version 2.0\r\n+#   (the \"License\"); you may not use this file except in compliance with\r\n+#   the License.  You may obtain a copy of the License at\r\n+#\r\n+#       http://www.apache.org/licenses/LICENSE-2.0\r\n+#\r\n+#   Unless required by applicable law or agreed to in writing, software\r\n+#   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+#   See the License for the specific language governing permissions and\r\n+#   limitations under the License.\r\n+#\r\n+#\r\n+aj.org.objectweb.asm.\r\n+br.com.anteros.\r\n+ch.qos.logback.\r\n+clojure.core$constantly\r\n+clojure.main$eval_opt\r\n+com.alibaba.citrus.springext.support.parser.abstractnamedproxybeandefinitionparser$proxytargetfactory\r\n+com.alibaba.citrus.springext.util.springextutil.abstractproxy\r\n+com.alibaba.druid.pool.druiddatasource\r\n+com.alibaba.druid.stat.jdbcdatasourcestat\r\n+com.alibaba.fastjson.annotation\r\n+com.alipay.custrelation.service.model.redress.pair\r\n+com.caucho.\r\n+com.ibatis.\r\n+com.mchange\r\n+com.mysql.cj.jdbc.admin.\r\n+com.mysql.cj.jdbc.mysqlconnectionpooldatasource\r\n+com.mysql.cj.jdbc.mysqldatasource\r\n+com.mysql.cj.jdbc.mysqlxadatasource\r\n+com.mysql.cj.log.\r\n+com.p6spy.engine.\r\n+com.rometools.rome.feed.impl.equalsbean\r\n+com.rometools.rome.feed.impl.tostringbean\r\n+com.sun.\r\n+com.taobao.eagleeye.wrapper\r\n+com.zaxxer.hikari.\r\n+flex.messaging.util.concurrent.\r\n+java.awt.i\r\n+java.awt.p\r\n+java.beans.expression\r\n+java.io.closeable\r\n+java.io.serializable\r\n+java.lang.autocloseable\r\n+java.lang.class\r\n+java.lang.cloneable\r\n+java.lang.iterable\r\n+java.lang.object\r\n+java.lang.readable\r\n+java.lang.runnable\r\n+java.lang.thread\r\n+java.lang.unixprocess\r\n+java.net.inetaddress\r\n+java.net.socket\r\n+java.net.url\r\n+java.rmi\r\n+java.security.signedobject\r\n+java.util.collection\r\n+java.util.eventlistener\r\n+java.util.jar.\r\n+java.util.logging.\r\n+java.util.prefs.\r\n+java.util.serviceloader$lazyiterator\r\n+javassist.\r\n+javax.activation.\r\n+javax.imageio.imageio$containsfilter\r\n+javax.imageio.spi.serviceregistry\r\n+javax.management.\r\n+javax.naming.\r\n+javax.net.\r\n+javax.print.\r\n+javax.script.\r\n+javax.sound.\r\n+javax.swing.j\r\n+javax.tools.\r\n+javax.xml\r\n+jdk.internal.\r\n+jodd.db.connection.\r\n+junit.\r\n+net.bytebuddy.dynamic.loading.bytearrayclassloader\r\n+net.sf.cglib.\r\n+net.sf.ehcache.hibernate.\r\n+net.sf.ehcache.transaction.manager.\r\n+oracle.jdbc.\r\n+oracle.jms.aq\r\n+oracle.net\r\n+org.aoju.bus.proxy.provider.\r\n+org.apache.activemq.activemqconnectionfactory\r\n+org.apache.activemq.activemqxaconnectionfactory\r\n+org.apache.activemq.jms.pool.\r\n+org.apache.activemq.pool.\r\n+org.apache.activemq.spring.\r\n+org.apache.aries.transaction.\r\n+org.apache.axis2.jaxws.spi.handler.\r\n+org.apache.axis2.transport.jms.\r\n+org.apache.bcel\r\n+org.apache.carbondata.core.scan.expression.expressionresult\r\n+org.apache.catalina.\r\n+org.apache.cocoon.\r\n+org.apache.commons.beanutils\r\n+org.apache.commons.collections.comparators.\r\n+org.apache.commons.collections.functors\r\n+org.apache.commons.collections.functors.\r\n+org.apache.commons.collections.transformer\r\n+org.apache.commons.collections4.comparators\r\n+org.apache.commons.collections4.functors\r\n+org.apache.commons.collections4.transformer\r\n+org.apache.commons.configuration\r\n+org.apache.commons.dbcp\r\n+org.apache.commons.fileupload\r\n+org.apache.commons.jelly.\r\n+org.apache.commons.logging.\r\n+org.apache.commons.proxy.\r\n+org.apache.cxf.jaxrs.provider.\r\n+org.apache.hadoop.shaded.com.zaxxer.hikari.\r\n+org.apache.http.auth.\r\n+org.apache.http.conn.\r\n+org.apache.http.cookie.\r\n+org.apache.http.impl.\r\n+org.apache.ibatis.datasource\r\n+org.apache.ibatis.executor.\r\n+org.apache.ibatis.javassist.\r\n+org.apache.ibatis.ognl.\r\n+org.apache.ibatis.parsing.\r\n+org.apache.ibatis.reflection.\r\n+org.apache.ibatis.scripting.\r\n+org.apache.ignite.cache.jta.\r\n+org.apache.log4j.\r\n+org.apache.logging.\r\n+org.apache.myfaces.context.servlet\r\n+org.apache.openjpa.ee.\r\n+org.apache.shiro.jndi.\r\n+org.apache.shiro.realm.\r\n+org.apache.tomcat\r\n+org.apache.wicket.util\r\n+org.apache.xalan\r\n+org.apache.xbean.\r\n+org.apache.xpath.xpathcontext\r\n+org.codehaus.groovy.runtime\r\n+org.codehaus.jackson.\r\n+org.eclipse.jetty.\r\n+org.geotools.filter.constantexpression\r\n+org.h2.jdbcx.\r\n+org.h2.server.\r\n+org.hibernate\r\n+org.javasimon.\r\n+org.jaxen.\r\n+org.jboss\r\n+org.jdom.\r\n+org.jdom2.transform.\r\n+org.logicalcobwebs.\r\n+org.mortbay.jetty.\r\n+org.mozilla.javascript\r\n+org.objectweb.asm.\r\n+org.osjava.sj.\r\n+org.python.core\r\n+org.quartz.\r\n+org.slf4j.\r\n+org.springframework.\r\n+org.yaml.snakeyaml.tokens.directivetoken\r\n sun.rmi.server.unicastref\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-common/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-common/pom.xml", "comments": ["Format-specific differences are supported for XML files but no file-specific differences were detected; falling back to a binary diff. file(1) reports: XML 1.0 document, ASCII text, with CRLF line terminators"], "has_internal_linenos": true, "unified_diff": "@@ -1,187 +1,181 @@\n 00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  <?xml version=\"1\n 00000010: 2e30 2220 656e 636f 6469 6e67 3d22 5554  .0\" encoding=\"UT\n-00000020: 462d 3822 3f3e 0d0a 3c21 2d2d 0d0a 2020  F-8\"?>..<!--..  \n-00000030: 4c69 6365 6e73 6564 2074 6f20 7468 6520  Licensed to the \n-00000040: 4170 6163 6865 2053 6f66 7477 6172 6520  Apache Software \n-00000050: 466f 756e 6461 7469 6f6e 2028 4153 4629  Foundation (ASF)\n-00000060: 2075 6e64 6572 206f 6e65 206f 7220 6d6f   under one or mo\n-00000070: 7265 0d0a 2020 636f 6e74 7269 6275 746f  re..  contributo\n-00000080: 7220 6c69 6365 6e73 6520 6167 7265 656d  r license agreem\n-00000090: 656e 7473 2e20 2053 6565 2074 6865 204e  ents.  See the N\n-000000a0: 4f54 4943 4520 6669 6c65 2064 6973 7472  OTICE file distr\n-000000b0: 6962 7574 6564 2077 6974 680d 0a20 2074  ibuted with..  t\n-000000c0: 6869 7320 776f 726b 2066 6f72 2061 6464  his work for add\n-000000d0: 6974 696f 6e61 6c20 696e 666f 726d 6174  itional informat\n-000000e0: 696f 6e20 7265 6761 7264 696e 6720 636f  ion regarding co\n-000000f0: 7079 7269 6768 7420 6f77 6e65 7273 6869  pyright ownershi\n-00000100: 702e 0d0a 2020 5468 6520 4153 4620 6c69  p...  The ASF li\n-00000110: 6365 6e73 6573 2074 6869 7320 6669 6c65  censes this file\n-00000120: 2074 6f20 596f 7520 756e 6465 7220 7468   to You under th\n-00000130: 6520 4170 6163 6865 204c 6963 656e 7365  e Apache License\n-00000140: 2c20 5665 7273 696f 6e20 322e 300d 0a20  , Version 2.0.. \n-00000150: 2028 7468 6520 224c 6963 656e 7365 2229   (the \"License\")\n-00000160: 3b20 796f 7520 6d61 7920 6e6f 7420 7573  ; you may not us\n-00000170: 6520 7468 6973 2066 696c 6520 6578 6365  e this file exce\n-00000180: 7074 2069 6e20 636f 6d70 6c69 616e 6365  pt in compliance\n-00000190: 2077 6974 680d 0a20 2074 6865 204c 6963   with..  the Lic\n-000001a0: 656e 7365 2e20 2059 6f75 206d 6179 206f  ense.  You may o\n-000001b0: 6274 6169 6e20 6120 636f 7079 206f 6620  btain a copy of \n-000001c0: 7468 6520 4c69 6365 6e73 6520 6174 0d0a  the License at..\n-000001d0: 0d0a 2020 2020 2020 6874 7470 3a2f 2f77  ..      http://w\n-000001e0: 7777 2e61 7061 6368 652e 6f72 672f 6c69  ww.apache.org/li\n-000001f0: 6365 6e73 6573 2f4c 4943 454e 5345 2d32  censes/LICENSE-2\n-00000200: 2e30 0d0a 0d0a 2020 556e 6c65 7373 2072  .0....  Unless r\n-00000210: 6571 7569 7265 6420 6279 2061 7070 6c69  equired by appli\n-00000220: 6361 626c 6520 6c61 7720 6f72 2061 6772  cable law or agr\n-00000230: 6565 6420 746f 2069 6e20 7772 6974 696e  eed to in writin\n-00000240: 672c 2073 6f66 7477 6172 650d 0a20 2064  g, software..  d\n-00000250: 6973 7472 6962 7574 6564 2075 6e64 6572  istributed under\n-00000260: 2074 6865 204c 6963 656e 7365 2069 7320   the License is \n-00000270: 6469 7374 7269 6275 7465 6420 6f6e 2061  distributed on a\n-00000280: 6e20 2241 5320 4953 2220 4241 5349 532c  n \"AS IS\" BASIS,\n-00000290: 0d0a 2020 5749 5448 4f55 5420 5741 5252  ..  WITHOUT WARR\n-000002a0: 414e 5449 4553 204f 5220 434f 4e44 4954  ANTIES OR CONDIT\n-000002b0: 494f 4e53 204f 4620 414e 5920 4b49 4e44  IONS OF ANY KIND\n-000002c0: 2c20 6569 7468 6572 2065 7870 7265 7373  , either express\n-000002d0: 206f 7220 696d 706c 6965 642e 0d0a 2020   or implied...  \n-000002e0: 5365 6520 7468 6520 4c69 6365 6e73 6520  See the License \n-000002f0: 666f 7220 7468 6520 7370 6563 6966 6963  for the specific\n-00000300: 206c 616e 6775 6167 6520 676f 7665 726e   language govern\n-00000310: 696e 6720 7065 726d 6973 7369 6f6e 7320  ing permissions \n-00000320: 616e 640d 0a20 206c 696d 6974 6174 696f  and..  limitatio\n-00000330: 6e73 2075 6e64 6572 2074 6865 204c 6963  ns under the Lic\n-00000340: 656e 7365 2e0d 0a20 202d 2d3e 0d0a 3c70  ense...  -->..<p\n-00000350: 726f 6a65 6374 2078 7369 3a73 6368 656d  roject xsi:schem\n-00000360: 614c 6f63 6174 696f 6e3d 2268 7474 703a  aLocation=\"http:\n-00000370: 2f2f 6d61 7665 6e2e 6170 6163 6865 2e6f  //maven.apache.o\n-00000380: 7267 2f50 4f4d 2f34 2e30 2e30 2068 7474  rg/POM/4.0.0 htt\n-00000390: 7073 3a2f 2f6d 6176 656e 2e61 7061 6368  ps://maven.apach\n-000003a0: 652e 6f72 672f 7873 642f 6d61 7665 6e2d  e.org/xsd/maven-\n-000003b0: 342e 302e 302e 7873 6422 2078 6d6c 6e73  4.0.0.xsd\" xmlns\n-000003c0: 3d22 6874 7470 3a2f 2f6d 6176 656e 2e61  =\"http://maven.a\n-000003d0: 7061 6368 652e 6f72 672f 504f 4d2f 342e  pache.org/POM/4.\n-000003e0: 302e 3022 0d0a 2020 2020 786d 6c6e 733a  0.0\"..    xmlns:\n-000003f0: 7873 693d 2268 7474 703a 2f2f 7777 772e  xsi=\"http://www.\n-00000400: 7733 2e6f 7267 2f32 3030 312f 584d 4c53  w3.org/2001/XMLS\n-00000410: 6368 656d 612d 696e 7374 616e 6365 223e  chema-instance\">\n-00000420: 0d0a 2020 3c6d 6f64 656c 5665 7273 696f  ..  <modelVersio\n-00000430: 6e3e 342e 302e 303c 2f6d 6f64 656c 5665  n>4.0.0</modelVe\n-00000440: 7273 696f 6e3e 0d0a 2020 3c70 6172 656e  rsion>..  <paren\n-00000450: 743e 0d0a 2020 2020 3c67 726f 7570 4964  t>..    <groupId\n-00000460: 3e6f 7267 2e61 7061 6368 652e 6475 6262  >org.apache.dubb\n-00000470: 6f3c 2f67 726f 7570 4964 3e0d 0a20 2020  o</groupId>..   \n-00000480: 203c 6172 7469 6661 6374 4964 3e64 7562   <artifactId>dub\n-00000490: 626f 2d70 6172 656e 743c 2f61 7274 6966  bo-parent</artif\n-000004a0: 6163 7449 643e 0d0a 2020 2020 3c76 6572  actId>..    <ver\n-000004b0: 7369 6f6e 3e32 2e37 2e31 303c 2f76 6572  sion>2.7.10</ver\n-000004c0: 7369 6f6e 3e0d 0a20 203c 2f70 6172 656e  sion>..  </paren\n-000004d0: 743e 0d0a 2020 3c67 726f 7570 4964 3e6f  t>..  <groupId>o\n-000004e0: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-000004f0: 2f67 726f 7570 4964 3e0d 0a20 203c 6172  /groupId>..  <ar\n-00000500: 7469 6661 6374 4964 3e64 7562 626f 2d63  tifactId>dubbo-c\n-00000510: 6f6d 6d6f 6e3c 2f61 7274 6966 6163 7449  ommon</artifactI\n-00000520: 643e 0d0a 2020 3c76 6572 7369 6f6e 3e32  d>..  <version>2\n-00000530: 2e37 2e31 303c 2f76 6572 7369 6f6e 3e0d  .7.10</version>.\n-00000540: 0a20 203c 6e61 6d65 3e24 7b70 726f 6a65  .  <name>${proje\n-00000550: 6374 2e61 7274 6966 6163 7449 647d 3c2f  ct.artifactId}</\n-00000560: 6e61 6d65 3e0d 0a20 203c 6465 7363 7269  name>..  <descri\n-00000570: 7074 696f 6e3e 5468 6520 636f 6d6d 6f6e  ption>The common\n-00000580: 206d 6f64 756c 6520 6f66 2064 7562 626f   module of dubbo\n-00000590: 2070 726f 6a65 6374 3c2f 6465 7363 7269   project</descri\n-000005a0: 7074 696f 6e3e 0d0a 2020 3c6c 6963 656e  ption>..  <licen\n-000005b0: 7365 733e 0d0a 2020 2020 3c6c 6963 656e  ses>..    <licen\n-000005c0: 7365 3e0d 0a20 2020 2020 203c 6e61 6d65  se>..      <name\n-000005d0: 3e41 7061 6368 6520 4c69 6365 6e73 652c  >Apache License,\n-000005e0: 2056 6572 7369 6f6e 2032 2e30 3c2f 6e61   Version 2.0</na\n-000005f0: 6d65 3e0d 0a20 2020 2020 203c 7572 6c3e  me>..      <url>\n-00000600: 6874 7470 3a2f 2f77 7777 2e61 7061 6368  http://www.apach\n-00000610: 652e 6f72 672f 6c69 6365 6e73 6573 2f4c  e.org/licenses/L\n-00000620: 4943 454e 5345 2d32 2e30 3c2f 7572 6c3e  ICENSE-2.0</url>\n-00000630: 0d0a 2020 2020 2020 3c64 6973 7472 6962  ..      <distrib\n-00000640: 7574 696f 6e3e 7265 706f 3c2f 6469 7374  ution>repo</dist\n-00000650: 7269 6275 7469 6f6e 3e0d 0a20 2020 203c  ribution>..    <\n-00000660: 2f6c 6963 656e 7365 3e0d 0a20 203c 2f6c  /license>..  </l\n-00000670: 6963 656e 7365 733e 0d0a 2020 3c70 726f  icenses>..  <pro\n-00000680: 7065 7274 6965 733e 0d0a 2020 2020 3c73  perties>..    <s\n-00000690: 6b69 705f 6d61 7665 6e5f 6465 706c 6f79  kip_maven_deploy\n-000006a0: 3e66 616c 7365 3c2f 736b 6970 5f6d 6176  >false</skip_mav\n-000006b0: 656e 5f64 6570 6c6f 793e 0d0a 2020 3c2f  en_deploy>..  </\n-000006c0: 7072 6f70 6572 7469 6573 3e0d 0a20 203c  properties>..  <\n-000006d0: 6465 7065 6e64 656e 6369 6573 3e0d 0a20  dependencies>.. \n-000006e0: 2020 203c 6465 7065 6e64 656e 6379 3e0d     <dependency>.\n-000006f0: 0a20 2020 2020 203c 6772 6f75 7049 643e  .      <groupId>\n-00000700: 6f72 672e 736c 6634 6a3c 2f67 726f 7570  org.slf4j</group\n-00000710: 4964 3e0d 0a20 2020 2020 203c 6172 7469  Id>..      <arti\n-00000720: 6661 6374 4964 3e73 6c66 346a 2d61 7069  factId>slf4j-api\n-00000730: 3c2f 6172 7469 6661 6374 4964 3e0d 0a20  </artifactId>.. \n-00000740: 2020 2020 203c 7363 6f70 653e 7072 6f76       <scope>prov\n-00000750: 6964 6564 3c2f 7363 6f70 653e 0d0a 2020  ided</scope>..  \n-00000760: 2020 3c2f 6465 7065 6e64 656e 6379 3e0d    </dependency>.\n-00000770: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n-00000780: 3e0d 0a20 2020 2020 203c 6772 6f75 7049  >..      <groupI\n-00000790: 643e 636f 6d6d 6f6e 732d 6c6f 6767 696e  d>commons-loggin\n-000007a0: 673c 2f67 726f 7570 4964 3e0d 0a20 2020  g</groupId>..   \n-000007b0: 2020 203c 6172 7469 6661 6374 4964 3e63     <artifactId>c\n-000007c0: 6f6d 6d6f 6e73 2d6c 6f67 6769 6e67 3c2f  ommons-logging</\n-000007d0: 6172 7469 6661 6374 4964 3e0d 0a20 2020  artifactId>..   \n-000007e0: 203c 2f64 6570 656e 6465 6e63 793e 0d0a   </dependency>..\n-000007f0: 2020 2020 3c64 6570 656e 6465 6e63 793e      <dependency>\n-00000800: 0d0a 2020 2020 2020 3c67 726f 7570 4964  ..      <groupId\n-00000810: 3e6c 6f67 346a 3c2f 6772 6f75 7049 643e  >log4j</groupId>\n-00000820: 0d0a 2020 2020 2020 3c61 7274 6966 6163  ..      <artifac\n-00000830: 7449 643e 6c6f 6734 6a3c 2f61 7274 6966  tId>log4j</artif\n-00000840: 6163 7449 643e 0d0a 2020 2020 3c2f 6465  actId>..    </de\n-00000850: 7065 6e64 656e 6379 3e0d 0a20 2020 203c  pendency>..    <\n-00000860: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-00000870: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n-00000880: 6170 6163 6865 2e6c 6f67 6769 6e67 2e6c  apache.logging.l\n-00000890: 6f67 346a 3c2f 6772 6f75 7049 643e 0d0a  og4j</groupId>..\n-000008a0: 2020 2020 2020 3c61 7274 6966 6163 7449        <artifactI\n-000008b0: 643e 6c6f 6734 6a2d 6170 693c 2f61 7274  d>log4j-api</art\n-000008c0: 6966 6163 7449 643e 0d0a 2020 2020 2020  ifactId>..      \n-000008d0: 3c73 636f 7065 3e70 726f 7669 6465 643c  <scope>provided<\n-000008e0: 2f73 636f 7065 3e0d 0a20 2020 203c 2f64  /scope>..    </d\n-000008f0: 6570 656e 6465 6e63 793e 0d0a 2020 2020  ependency>..    \n-00000900: 3c64 6570 656e 6465 6e63 793e 0d0a 2020  <dependency>..  \n-00000910: 2020 2020 3c67 726f 7570 4964 3e6f 7267      <groupId>org\n-00000920: 2e61 7061 6368 652e 6c6f 6767 696e 672e  .apache.logging.\n-00000930: 6c6f 6734 6a3c 2f67 726f 7570 4964 3e0d  log4j</groupId>.\n-00000940: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n-00000950: 4964 3e6c 6f67 346a 2d63 6f72 653c 2f61  Id>log4j-core</a\n-00000960: 7274 6966 6163 7449 643e 0d0a 2020 2020  rtifactId>..    \n-00000970: 2020 3c73 636f 7065 3e70 726f 7669 6465    <scope>provide\n-00000980: 643c 2f73 636f 7065 3e0d 0a20 2020 203c  d</scope>..    <\n-00000990: 2f64 6570 656e 6465 6e63 793e 0d0a 2020  /dependency>..  \n-000009a0: 2020 3c64 6570 656e 6465 6e63 793e 0d0a    <dependency>..\n-000009b0: 2020 2020 2020 3c67 726f 7570 4964 3e6f        <groupId>o\n-000009c0: 7267 2e6a 6176 6173 7369 7374 3c2f 6772  rg.javassist</gr\n-000009d0: 6f75 7049 643e 0d0a 2020 2020 2020 3c61  oupId>..      <a\n-000009e0: 7274 6966 6163 7449 643e 6a61 7661 7373  rtifactId>javass\n-000009f0: 6973 743c 2f61 7274 6966 6163 7449 643e  ist</artifactId>\n-00000a00: 0d0a 2020 2020 3c2f 6465 7065 6e64 656e  ..    </dependen\n-00000a10: 6379 3e0d 0a20 2020 203c 6465 7065 6e64  cy>..    <depend\n-00000a20: 656e 6379 3e0d 0a20 2020 2020 203c 6772  ency>..      <gr\n-00000a30: 6f75 7049 643e 636f 6d2e 616c 6962 6162  oupId>com.alibab\n-00000a40: 613c 2f67 726f 7570 4964 3e0d 0a20 2020  a</groupId>..   \n-00000a50: 2020 203c 6172 7469 6661 6374 4964 3e66     <artifactId>f\n-00000a60: 6173 746a 736f 6e3c 2f61 7274 6966 6163  astjson</artifac\n-00000a70: 7449 643e 0d0a 2020 2020 3c2f 6465 7065  tId>..    </depe\n-00000a80: 6e64 656e 6379 3e0d 0a20 2020 203c 6465  ndency>..    <de\n-00000a90: 7065 6e64 656e 6379 3e0d 0a20 2020 2020  pendency>..     \n-00000aa0: 203c 6772 6f75 7049 643e 636f 6d6d 6f6e   <groupId>common\n-00000ab0: 732d 696f 3c2f 6772 6f75 7049 643e 0d0a  s-io</groupId>..\n-00000ac0: 2020 2020 2020 3c61 7274 6966 6163 7449        <artifactI\n-00000ad0: 643e 636f 6d6d 6f6e 732d 696f 3c2f 6172  d>commons-io</ar\n-00000ae0: 7469 6661 6374 4964 3e0d 0a20 2020 203c  tifactId>..    <\n-00000af0: 2f64 6570 656e 6465 6e63 793e 0d0a 2020  /dependency>..  \n-00000b00: 2020 3c64 6570 656e 6465 6e63 793e 0d0a    <dependency>..\n-00000b10: 2020 2020 2020 3c67 726f 7570 4964 3e6a        <groupId>j\n-00000b20: 6176 6178 2e61 6e6e 6f74 6174 696f 6e3c  avax.annotation<\n-00000b30: 2f67 726f 7570 4964 3e0d 0a20 2020 2020  /groupId>..     \n-00000b40: 203c 6172 7469 6661 6374 4964 3e6a 6176   <artifactId>jav\n-00000b50: 6178 2e61 6e6e 6f74 6174 696f 6e2d 6170  ax.annotation-ap\n-00000b60: 693c 2f61 7274 6966 6163 7449 643e 0d0a  i</artifactId>..\n-00000b70: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n-00000b80: 3e0d 0a20 203c 2f64 6570 656e 6465 6e63  >..  </dependenc\n-00000b90: 6965 733e 0d0a 3c2f 7072 6f6a 6563 743e  ies>..</project>\n-00000ba0: 0d0a                                     ..\n+00000020: 462d 3822 3f3e 0a3c 212d 2d0a 2020 4c69  F-8\"?>.<!--.  Li\n+00000030: 6365 6e73 6564 2074 6f20 7468 6520 4170  censed to the Ap\n+00000040: 6163 6865 2053 6f66 7477 6172 6520 466f  ache Software Fo\n+00000050: 756e 6461 7469 6f6e 2028 4153 4629 2075  undation (ASF) u\n+00000060: 6e64 6572 206f 6e65 206f 7220 6d6f 7265  nder one or more\n+00000070: 0a20 2063 6f6e 7472 6962 7574 6f72 206c  .  contributor l\n+00000080: 6963 656e 7365 2061 6772 6565 6d65 6e74  icense agreement\n+00000090: 732e 2020 5365 6520 7468 6520 4e4f 5449  s.  See the NOTI\n+000000a0: 4345 2066 696c 6520 6469 7374 7269 6275  CE file distribu\n+000000b0: 7465 6420 7769 7468 0a20 2074 6869 7320  ted with.  this \n+000000c0: 776f 726b 2066 6f72 2061 6464 6974 696f  work for additio\n+000000d0: 6e61 6c20 696e 666f 726d 6174 696f 6e20  nal information \n+000000e0: 7265 6761 7264 696e 6720 636f 7079 7269  regarding copyri\n+000000f0: 6768 7420 6f77 6e65 7273 6869 702e 0a20  ght ownership.. \n+00000100: 2054 6865 2041 5346 206c 6963 656e 7365   The ASF license\n+00000110: 7320 7468 6973 2066 696c 6520 746f 2059  s this file to Y\n+00000120: 6f75 2075 6e64 6572 2074 6865 2041 7061  ou under the Apa\n+00000130: 6368 6520 4c69 6365 6e73 652c 2056 6572  che License, Ver\n+00000140: 7369 6f6e 2032 2e30 0a20 2028 7468 6520  sion 2.0.  (the \n+00000150: 224c 6963 656e 7365 2229 3b20 796f 7520  \"License\"); you \n+00000160: 6d61 7920 6e6f 7420 7573 6520 7468 6973  may not use this\n+00000170: 2066 696c 6520 6578 6365 7074 2069 6e20   file except in \n+00000180: 636f 6d70 6c69 616e 6365 2077 6974 680a  compliance with.\n+00000190: 2020 7468 6520 4c69 6365 6e73 652e 2020    the License.  \n+000001a0: 596f 7520 6d61 7920 6f62 7461 696e 2061  You may obtain a\n+000001b0: 2063 6f70 7920 6f66 2074 6865 204c 6963   copy of the Lic\n+000001c0: 656e 7365 2061 740a 0a20 2020 2020 2068  ense at..      h\n+000001d0: 7474 703a 2f2f 7777 772e 6170 6163 6865  ttp://www.apache\n+000001e0: 2e6f 7267 2f6c 6963 656e 7365 732f 4c49  .org/licenses/LI\n+000001f0: 4345 4e53 452d 322e 300a 0a20 2055 6e6c  CENSE-2.0..  Unl\n+00000200: 6573 7320 7265 7175 6972 6564 2062 7920  ess required by \n+00000210: 6170 706c 6963 6162 6c65 206c 6177 206f  applicable law o\n+00000220: 7220 6167 7265 6564 2074 6f20 696e 2077  r agreed to in w\n+00000230: 7269 7469 6e67 2c20 736f 6674 7761 7265  riting, software\n+00000240: 0a20 2064 6973 7472 6962 7574 6564 2075  .  distributed u\n+00000250: 6e64 6572 2074 6865 204c 6963 656e 7365  nder the License\n+00000260: 2069 7320 6469 7374 7269 6275 7465 6420   is distributed \n+00000270: 6f6e 2061 6e20 2241 5320 4953 2220 4241  on an \"AS IS\" BA\n+00000280: 5349 532c 0a20 2057 4954 484f 5554 2057  SIS,.  WITHOUT W\n+00000290: 4152 5241 4e54 4945 5320 4f52 2043 4f4e  ARRANTIES OR CON\n+000002a0: 4449 5449 4f4e 5320 4f46 2041 4e59 204b  DITIONS OF ANY K\n+000002b0: 494e 442c 2065 6974 6865 7220 6578 7072  IND, either expr\n+000002c0: 6573 7320 6f72 2069 6d70 6c69 6564 2e0a  ess or implied..\n+000002d0: 2020 5365 6520 7468 6520 4c69 6365 6e73    See the Licens\n+000002e0: 6520 666f 7220 7468 6520 7370 6563 6966  e for the specif\n+000002f0: 6963 206c 616e 6775 6167 6520 676f 7665  ic language gove\n+00000300: 726e 696e 6720 7065 726d 6973 7369 6f6e  rning permission\n+00000310: 7320 616e 640a 2020 6c69 6d69 7461 7469  s and.  limitati\n+00000320: 6f6e 7320 756e 6465 7220 7468 6520 4c69  ons under the Li\n+00000330: 6365 6e73 652e 0a20 202d 2d3e 0a3c 7072  cense..  -->.<pr\n+00000340: 6f6a 6563 7420 7873 693a 7363 6865 6d61  oject xsi:schema\n+00000350: 4c6f 6361 7469 6f6e 3d22 6874 7470 3a2f  Location=\"http:/\n+00000360: 2f6d 6176 656e 2e61 7061 6368 652e 6f72  /maven.apache.or\n+00000370: 672f 504f 4d2f 342e 302e 3020 6874 7470  g/POM/4.0.0 http\n+00000380: 733a 2f2f 6d61 7665 6e2e 6170 6163 6865  s://maven.apache\n+00000390: 2e6f 7267 2f78 7364 2f6d 6176 656e 2d34  .org/xsd/maven-4\n+000003a0: 2e30 2e30 2e78 7364 2220 786d 6c6e 733d  .0.0.xsd\" xmlns=\n+000003b0: 2268 7474 703a 2f2f 6d61 7665 6e2e 6170  \"http://maven.ap\n+000003c0: 6163 6865 2e6f 7267 2f50 4f4d 2f34 2e30  ache.org/POM/4.0\n+000003d0: 2e30 220a 2020 2020 786d 6c6e 733a 7873  .0\".    xmlns:xs\n+000003e0: 693d 2268 7474 703a 2f2f 7777 772e 7733  i=\"http://www.w3\n+000003f0: 2e6f 7267 2f32 3030 312f 584d 4c53 6368  .org/2001/XMLSch\n+00000400: 656d 612d 696e 7374 616e 6365 223e 0a20  ema-instance\">. \n+00000410: 203c 6d6f 6465 6c56 6572 7369 6f6e 3e34   <modelVersion>4\n+00000420: 2e30 2e30 3c2f 6d6f 6465 6c56 6572 7369  .0.0</modelVersi\n+00000430: 6f6e 3e0a 2020 3c70 6172 656e 743e 0a20  on>.  <parent>. \n+00000440: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n+00000450: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n+00000460: 6f75 7049 643e 0a20 2020 203c 6172 7469  oupId>.    <arti\n+00000470: 6661 6374 4964 3e64 7562 626f 2d70 6172  factId>dubbo-par\n+00000480: 656e 743c 2f61 7274 6966 6163 7449 643e  ent</artifactId>\n+00000490: 0a20 2020 203c 7665 7273 696f 6e3e 322e  .    <version>2.\n+000004a0: 372e 3130 3c2f 7665 7273 696f 6e3e 0a20  7.10</version>. \n+000004b0: 203c 2f70 6172 656e 743e 0a20 203c 6772   </parent>.  <gr\n+000004c0: 6f75 7049 643e 6f72 672e 6170 6163 6865  oupId>org.apache\n+000004d0: 2e64 7562 626f 3c2f 6772 6f75 7049 643e  .dubbo</groupId>\n+000004e0: 0a20 203c 6172 7469 6661 6374 4964 3e64  .  <artifactId>d\n+000004f0: 7562 626f 2d63 6f6d 6d6f 6e3c 2f61 7274  ubbo-common</art\n+00000500: 6966 6163 7449 643e 0a20 203c 7665 7273  ifactId>.  <vers\n+00000510: 696f 6e3e 322e 372e 3130 3c2f 7665 7273  ion>2.7.10</vers\n+00000520: 696f 6e3e 0a20 203c 6e61 6d65 3e24 7b70  ion>.  <name>${p\n+00000530: 726f 6a65 6374 2e61 7274 6966 6163 7449  roject.artifactI\n+00000540: 647d 3c2f 6e61 6d65 3e0a 2020 3c64 6573  d}</name>.  <des\n+00000550: 6372 6970 7469 6f6e 3e54 6865 2063 6f6d  cription>The com\n+00000560: 6d6f 6e20 6d6f 6475 6c65 206f 6620 6475  mon module of du\n+00000570: 6262 6f20 7072 6f6a 6563 743c 2f64 6573  bbo project</des\n+00000580: 6372 6970 7469 6f6e 3e0a 2020 3c6c 6963  cription>.  <lic\n+00000590: 656e 7365 733e 0a20 2020 203c 6c69 6365  enses>.    <lice\n+000005a0: 6e73 653e 0a20 2020 2020 203c 6e61 6d65  nse>.      <name\n+000005b0: 3e41 7061 6368 6520 4c69 6365 6e73 652c  >Apache License,\n+000005c0: 2056 6572 7369 6f6e 2032 2e30 3c2f 6e61   Version 2.0</na\n+000005d0: 6d65 3e0a 2020 2020 2020 3c75 726c 3e68  me>.      <url>h\n+000005e0: 7474 703a 2f2f 7777 772e 6170 6163 6865  ttp://www.apache\n+000005f0: 2e6f 7267 2f6c 6963 656e 7365 732f 4c49  .org/licenses/LI\n+00000600: 4345 4e53 452d 322e 303c 2f75 726c 3e0a  CENSE-2.0</url>.\n+00000610: 2020 2020 2020 3c64 6973 7472 6962 7574        <distribut\n+00000620: 696f 6e3e 7265 706f 3c2f 6469 7374 7269  ion>repo</distri\n+00000630: 6275 7469 6f6e 3e0a 2020 2020 3c2f 6c69  bution>.    </li\n+00000640: 6365 6e73 653e 0a20 203c 2f6c 6963 656e  cense>.  </licen\n+00000650: 7365 733e 0a20 203c 7072 6f70 6572 7469  ses>.  <properti\n+00000660: 6573 3e0a 2020 2020 3c73 6b69 705f 6d61  es>.    <skip_ma\n+00000670: 7665 6e5f 6465 706c 6f79 3e66 616c 7365  ven_deploy>false\n+00000680: 3c2f 736b 6970 5f6d 6176 656e 5f64 6570  </skip_maven_dep\n+00000690: 6c6f 793e 0a20 203c 2f70 726f 7065 7274  loy>.  </propert\n+000006a0: 6965 733e 0a20 203c 6465 7065 6e64 656e  ies>.  <dependen\n+000006b0: 6369 6573 3e0a 2020 2020 3c64 6570 656e  cies>.    <depen\n+000006c0: 6465 6e63 793e 0a20 2020 2020 203c 6772  dency>.      <gr\n+000006d0: 6f75 7049 643e 6f72 672e 736c 6634 6a3c  oupId>org.slf4j<\n+000006e0: 2f67 726f 7570 4964 3e0a 2020 2020 2020  /groupId>.      \n+000006f0: 3c61 7274 6966 6163 7449 643e 736c 6634  <artifactId>slf4\n+00000700: 6a2d 6170 693c 2f61 7274 6966 6163 7449  j-api</artifactI\n+00000710: 643e 0a20 2020 2020 203c 7363 6f70 653e  d>.      <scope>\n+00000720: 7072 6f76 6964 6564 3c2f 7363 6f70 653e  provided</scope>\n+00000730: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n+00000740: 793e 0a20 2020 203c 6465 7065 6e64 656e  y>.    <dependen\n+00000750: 6379 3e0a 2020 2020 2020 3c67 726f 7570  cy>.      <group\n+00000760: 4964 3e63 6f6d 6d6f 6e73 2d6c 6f67 6769  Id>commons-loggi\n+00000770: 6e67 3c2f 6772 6f75 7049 643e 0a20 2020  ng</groupId>.   \n+00000780: 2020 203c 6172 7469 6661 6374 4964 3e63     <artifactId>c\n+00000790: 6f6d 6d6f 6e73 2d6c 6f67 6769 6e67 3c2f  ommons-logging</\n+000007a0: 6172 7469 6661 6374 4964 3e0a 2020 2020  artifactId>.    \n+000007b0: 3c2f 6465 7065 6e64 656e 6379 3e0a 2020  </dependency>.  \n+000007c0: 2020 3c64 6570 656e 6465 6e63 793e 0a20    <dependency>. \n+000007d0: 2020 2020 203c 6772 6f75 7049 643e 6c6f       <groupId>lo\n+000007e0: 6734 6a3c 2f67 726f 7570 4964 3e0a 2020  g4j</groupId>.  \n+000007f0: 2020 2020 3c61 7274 6966 6163 7449 643e      <artifactId>\n+00000800: 6c6f 6734 6a3c 2f61 7274 6966 6163 7449  log4j</artifactI\n+00000810: 643e 0a20 2020 203c 2f64 6570 656e 6465  d>.    </depende\n+00000820: 6e63 793e 0a20 2020 203c 6465 7065 6e64  ncy>.    <depend\n+00000830: 656e 6379 3e0a 2020 2020 2020 3c67 726f  ency>.      <gro\n+00000840: 7570 4964 3e6f 7267 2e61 7061 6368 652e  upId>org.apache.\n+00000850: 6c6f 6767 696e 672e 6c6f 6734 6a3c 2f67  logging.log4j</g\n+00000860: 726f 7570 4964 3e0a 2020 2020 2020 3c61  roupId>.      <a\n+00000870: 7274 6966 6163 7449 643e 6c6f 6734 6a2d  rtifactId>log4j-\n+00000880: 6170 693c 2f61 7274 6966 6163 7449 643e  api</artifactId>\n+00000890: 0a20 2020 2020 203c 7363 6f70 653e 7072  .      <scope>pr\n+000008a0: 6f76 6964 6564 3c2f 7363 6f70 653e 0a20  ovided</scope>. \n+000008b0: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n+000008c0: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n+000008d0: 3e0a 2020 2020 2020 3c67 726f 7570 4964  >.      <groupId\n+000008e0: 3e6f 7267 2e61 7061 6368 652e 6c6f 6767  >org.apache.logg\n+000008f0: 696e 672e 6c6f 6734 6a3c 2f67 726f 7570  ing.log4j</group\n+00000900: 4964 3e0a 2020 2020 2020 3c61 7274 6966  Id>.      <artif\n+00000910: 6163 7449 643e 6c6f 6734 6a2d 636f 7265  actId>log4j-core\n+00000920: 3c2f 6172 7469 6661 6374 4964 3e0a 2020  </artifactId>.  \n+00000930: 2020 2020 3c73 636f 7065 3e70 726f 7669      <scope>provi\n+00000940: 6465 643c 2f73 636f 7065 3e0a 2020 2020  ded</scope>.    \n+00000950: 3c2f 6465 7065 6e64 656e 6379 3e0a 2020  </dependency>.  \n+00000960: 2020 3c64 6570 656e 6465 6e63 793e 0a20    <dependency>. \n+00000970: 2020 2020 203c 6772 6f75 7049 643e 6f72       <groupId>or\n+00000980: 672e 6a61 7661 7373 6973 743c 2f67 726f  g.javassist</gro\n+00000990: 7570 4964 3e0a 2020 2020 2020 3c61 7274  upId>.      <art\n+000009a0: 6966 6163 7449 643e 6a61 7661 7373 6973  ifactId>javassis\n+000009b0: 743c 2f61 7274 6966 6163 7449 643e 0a20  t</artifactId>. \n+000009c0: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n+000009d0: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n+000009e0: 3e0a 2020 2020 2020 3c67 726f 7570 4964  >.      <groupId\n+000009f0: 3e63 6f6d 2e61 6c69 6261 6261 3c2f 6772  >com.alibaba</gr\n+00000a00: 6f75 7049 643e 0a20 2020 2020 203c 6172  oupId>.      <ar\n+00000a10: 7469 6661 6374 4964 3e66 6173 746a 736f  tifactId>fastjso\n+00000a20: 6e3c 2f61 7274 6966 6163 7449 643e 0a20  n</artifactId>. \n+00000a30: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n+00000a40: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n+00000a50: 3e0a 2020 2020 2020 3c67 726f 7570 4964  >.      <groupId\n+00000a60: 3e63 6f6d 6d6f 6e73 2d69 6f3c 2f67 726f  >commons-io</gro\n+00000a70: 7570 4964 3e0a 2020 2020 2020 3c61 7274  upId>.      <art\n+00000a80: 6966 6163 7449 643e 636f 6d6d 6f6e 732d  ifactId>commons-\n+00000a90: 696f 3c2f 6172 7469 6661 6374 4964 3e0a  io</artifactId>.\n+00000aa0: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n+00000ab0: 3e0a 2020 2020 3c64 6570 656e 6465 6e63  >.    <dependenc\n+00000ac0: 793e 0a20 2020 2020 203c 6772 6f75 7049  y>.      <groupI\n+00000ad0: 643e 6a61 7661 782e 616e 6e6f 7461 7469  d>javax.annotati\n+00000ae0: 6f6e 3c2f 6772 6f75 7049 643e 0a20 2020  on</groupId>.   \n+00000af0: 2020 203c 6172 7469 6661 6374 4964 3e6a     <artifactId>j\n+00000b00: 6176 6178 2e61 6e6e 6f74 6174 696f 6e2d  avax.annotation-\n+00000b10: 6170 693c 2f61 7274 6966 6163 7449 643e  api</artifactId>\n+00000b20: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n+00000b30: 793e 0a20 203c 2f64 6570 656e 6465 6e63  y>.  </dependenc\n+00000b40: 6965 733e 0a3c 2f70 726f 6a65 6374 3e0a  ies>.</project>.\n"}]}
