{"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: 88084 bytes, number of entries: 65\n+Zip file size: 88613 bytes, number of entries: 65\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 org/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/config/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/\n@@ -16,52 +16,52 @@\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/dubbo/internal/\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-config-api/\n -rw-r--r--  2.0 unx     5324 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      173 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx     1137 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConfigInitializer.java\n--rw-r--r--  2.0 unx     1116 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConfigPostProcessor.java\n--rw-r--r--  2.0 unx     4895 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/DubboShutdownHook.java\n--rw-r--r--  2.0 unx    24129 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ReferenceConfig.java\n--rw-r--r--  2.0 unx    32215 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ServiceConfig.java\n--rw-r--r--  2.0 unx    52396 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/DubboBootstrap.java\n--rw-r--r--  2.0 unx     1132 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java\n--rw-r--r--  2.0 unx     2533 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java\n--rw-r--r--  2.0 unx     9212 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java\n--rw-r--r--  2.0 unx     5506 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java\n--rw-r--r--  2.0 unx     4105 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java\n--rw-r--r--  2.0 unx     6787 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java\n--rw-r--r--  2.0 unx     6767 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java\n--rw-r--r--  2.0 unx     1865 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java\n--rw-r--r--  2.0 unx     4350 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java\n--rw-r--r--  2.0 unx     3389 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java\n--rw-r--r--  2.0 unx     4303 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java\n--rw-r--r--  2.0 unx     6115 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java\n--rw-r--r--  2.0 unx     3460 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java\n--rw-r--r--  2.0 unx     3748 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java\n--rw-r--r--  2.0 unx    10054 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java\n--rw-r--r--  2.0 unx     6786 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java\n--rw-r--r--  2.0 unx     4644 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java\n--rw-r--r--  2.0 unx     9666 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java\n--rw-r--r--  2.0 unx     4440 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java\n--rw-r--r--  2.0 unx     1034 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/package-info.java\n--rw-r--r--  2.0 unx     1145 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java\n--rw-r--r--  2.0 unx     1680 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java\n--rw-r--r--  2.0 unx     1688 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java\n--rw-r--r--  2.0 unx     1444 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java\n--rw-r--r--  2.0 unx     1642 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java\n--rw-r--r--  2.0 unx     1274 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ServiceConfigExportedEvent.java\n--rw-r--r--  2.0 unx     1282 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java\n--rw-r--r--  2.0 unx     1857 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/listener/LoggingEventListener.java\n--rw-r--r--  2.0 unx     2045 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java\n--rw-r--r--  2.0 unx     4697 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java\n--rw-r--r--  2.0 unx     2579 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java\n--rw-r--r--  2.0 unx    29526 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/utils/ConfigValidationUtils.java\n--rw-r--r--  2.0 unx     8829 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/utils/ReferenceConfigCache.java\n--rw-r--r--  2.0 unx       75 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.event.EventListener\n--rw-r--r--  2.0 unx       91 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter\n+-rw-r--r--  2.0 unx     1173 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConfigInitializer.java\n+-rw-r--r--  2.0 unx     1151 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ConfigPostProcessor.java\n+-rw-r--r--  2.0 unx     5044 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/DubboShutdownHook.java\n+-rw-r--r--  2.0 unx    24683 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ReferenceConfig.java\n+-rw-r--r--  2.0 unx    32942 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/ServiceConfig.java\n+-rw-r--r--  2.0 unx    53805 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/DubboBootstrap.java\n+-rw-r--r--  2.0 unx     1166 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java\n+-rw-r--r--  2.0 unx     2615 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java\n+-rw-r--r--  2.0 unx     9557 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java\n+-rw-r--r--  2.0 unx     5719 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java\n+-rw-r--r--  2.0 unx     4266 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java\n+-rw-r--r--  2.0 unx     7059 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java\n+-rw-r--r--  2.0 unx     6981 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java\n+-rw-r--r--  2.0 unx     1928 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java\n+-rw-r--r--  2.0 unx     4491 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java\n+-rw-r--r--  2.0 unx     3507 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java\n+-rw-r--r--  2.0 unx     4447 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java\n+-rw-r--r--  2.0 unx     6352 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java\n+-rw-r--r--  2.0 unx     3592 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java\n+-rw-r--r--  2.0 unx     3885 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java\n+-rw-r--r--  2.0 unx    10481 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java\n+-rw-r--r--  2.0 unx     7079 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java\n+-rw-r--r--  2.0 unx     4809 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java\n+-rw-r--r--  2.0 unx    10049 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java\n+-rw-r--r--  2.0 unx     4601 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java\n+-rw-r--r--  2.0 unx     1054 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/bootstrap/builders/package-info.java\n+-rw-r--r--  2.0 unx     1177 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java\n+-rw-r--r--  2.0 unx     1726 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java\n+-rw-r--r--  2.0 unx     1733 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java\n+-rw-r--r--  2.0 unx     1484 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java\n+-rw-r--r--  2.0 unx     1690 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java\n+-rw-r--r--  2.0 unx     1310 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ServiceConfigExportedEvent.java\n+-rw-r--r--  2.0 unx     1318 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java\n+-rw-r--r--  2.0 unx     1908 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/event/listener/LoggingEventListener.java\n+-rw-r--r--  2.0 unx     2112 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java\n+-rw-r--r--  2.0 unx     4826 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java\n+-rw-r--r--  2.0 unx     2643 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java\n+-rw-r--r--  2.0 unx    30184 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/utils/ConfigValidationUtils.java\n+-rw-r--r--  2.0 unx     9081 b- defN 20-Apr-01 08:04 org/apache/dubbo/config/utils/ReferenceConfigCache.java\n+-rw-r--r--  2.0 unx       76 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.event.EventListener\n+-rw-r--r--  2.0 unx       93 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter\n -rw-r--r--  2.0 unx       67 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer\n--rw-r--r--  2.0 unx     8066 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml\n+-rw-r--r--  2.0 unx     7844 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml\n -rw-r--r--  2.0 unx       71 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.properties\n-65 files, 300761 bytes uncompressed, 76596 bytes compressed:  74.5%\n+65 files, 308698 bytes uncompressed, 77125 bytes compressed:  75.0%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -389,2862 +389,2862 @@\n 018DA Extract Zip Spec      14 (20) '2.0'\n 018DB Extract OS            00 (0) 'MS-DOS'\n 018DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n 018DE Compression Method    0008 (8) 'Deflated'\n 018E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-018E4 CRC                   44C14167 (1153515879)\n-018E8 Compressed Size       00000262 (610)\n-018EC Uncompressed Size     00000471 (1137)\n+018E4 CRC                   6C5A36DD (1817851613)\n+018E8 Compressed Size       0000026C (620)\n+018EC Uncompressed Size     00000495 (1173)\n 018F0 Filename Length       002E (46)\n 018F2 Extra Length          0000 (0)\n 018F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x18F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 01922 PAYLOAD\n \n-01B84 LOCAL HEADER #23      04034B50 (67324752)\n-01B88 Extract Zip Spec      14 (20) '2.0'\n-01B89 Extract OS            00 (0) 'MS-DOS'\n-01B8A General Purpose Flag  0800 (2048)\n+01B8E LOCAL HEADER #23      04034B50 (67324752)\n+01B92 Extract Zip Spec      14 (20) '2.0'\n+01B93 Extract OS            00 (0) 'MS-DOS'\n+01B94 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-01B8C Compression Method    0008 (8) 'Deflated'\n-01B8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-01B92 CRC                   F5917ED9 (4119953113)\n-01B96 Compressed Size       00000254 (596)\n-01B9A Uncompressed Size     0000045C (1116)\n-01B9E Filename Length       0030 (48)\n-01BA0 Extra Length          0000 (0)\n-01BA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+01B96 Compression Method    0008 (8) 'Deflated'\n+01B98 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+01B9C CRC                   566E5E12 (1450073618)\n+01BA0 Compressed Size       0000025E (606)\n+01BA4 Uncompressed Size     0000047F (1151)\n+01BA8 Filename Length       0030 (48)\n+01BAA Extra Length          0000 (0)\n+01BAC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BAC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-01BD2 PAYLOAD\n+01BDC PAYLOAD\n \n-01E26 LOCAL HEADER #24      04034B50 (67324752)\n-01E2A Extract Zip Spec      14 (20) '2.0'\n-01E2B Extract OS            00 (0) 'MS-DOS'\n-01E2C General Purpose Flag  0800 (2048)\n+01E3A LOCAL HEADER #24      04034B50 (67324752)\n+01E3E Extract Zip Spec      14 (20) '2.0'\n+01E3F Extract OS            00 (0) 'MS-DOS'\n+01E40 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-01E2E Compression Method    0008 (8) 'Deflated'\n-01E30 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-01E34 CRC                   7CE2D61E (2095240734)\n-01E38 Compressed Size       00000605 (1541)\n-01E3C Uncompressed Size     0000131F (4895)\n-01E40 Filename Length       002E (46)\n-01E42 Extra Length          0000 (0)\n-01E44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+01E42 Compression Method    0008 (8) 'Deflated'\n+01E44 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+01E48 CRC                   8233D78E (2184435598)\n+01E4C Compressed Size       0000060F (1551)\n+01E50 Uncompressed Size     000013B4 (5044)\n+01E54 Filename Length       002E (46)\n+01E56 Extra Length          0000 (0)\n+01E58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1E44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-01E72 PAYLOAD\n+01E86 PAYLOAD\n \n-02477 LOCAL HEADER #25      04034B50 (67324752)\n-0247B Extract Zip Spec      14 (20) '2.0'\n-0247C Extract OS            00 (0) 'MS-DOS'\n-0247D General Purpose Flag  0800 (2048)\n+02495 LOCAL HEADER #25      04034B50 (67324752)\n+02499 Extract Zip Spec      14 (20) '2.0'\n+0249A Extract OS            00 (0) 'MS-DOS'\n+0249B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0247F Compression Method    0008 (8) 'Deflated'\n-02481 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-02485 CRC                   5F946D70 (1603562864)\n-02489 Compressed Size       0000178E (6030)\n-0248D Uncompressed Size     00005E41 (24129)\n-02491 Filename Length       002C (44)\n-02493 Extra Length          0000 (0)\n-02495 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0249D Compression Method    0008 (8) 'Deflated'\n+0249F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+024A3 CRC                   23EF92DF (602903263)\n+024A7 Compressed Size       000017AA (6058)\n+024AB Uncompressed Size     0000606B (24683)\n+024AF Filename Length       002C (44)\n+024B1 Extra Length          0000 (0)\n+024B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2495: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x24B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-024C1 PAYLOAD\n+024DF PAYLOAD\n \n-03C4F LOCAL HEADER #26      04034B50 (67324752)\n-03C53 Extract Zip Spec      14 (20) '2.0'\n-03C54 Extract OS            00 (0) 'MS-DOS'\n-03C55 General Purpose Flag  0800 (2048)\n+03C89 LOCAL HEADER #26      04034B50 (67324752)\n+03C8D Extract Zip Spec      14 (20) '2.0'\n+03C8E Extract OS            00 (0) 'MS-DOS'\n+03C8F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03C57 Compression Method    0008 (8) 'Deflated'\n-03C59 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03C5D CRC                   CBF03B71 (3421518705)\n-03C61 Compressed Size       00001B79 (7033)\n-03C65 Uncompressed Size     00007DD7 (32215)\n-03C69 Filename Length       002A (42)\n-03C6B Extra Length          0000 (0)\n-03C6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03C91 Compression Method    0008 (8) 'Deflated'\n+03C93 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03C97 CRC                   8A9B11DB (2325418459)\n+03C9B Compressed Size       00001BA0 (7072)\n+03C9F Uncompressed Size     000080AE (32942)\n+03CA3 Filename Length       002A (42)\n+03CA5 Extra Length          0000 (0)\n+03CA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3CA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-03C97 PAYLOAD\n+03CD1 PAYLOAD\n \n-05810 LOCAL HEADER #27      04034B50 (67324752)\n-05814 Extract Zip Spec      14 (20) '2.0'\n-05815 Extract OS            00 (0) 'MS-DOS'\n-05816 General Purpose Flag  0800 (2048)\n+05871 LOCAL HEADER #27      04034B50 (67324752)\n+05875 Extract Zip Spec      14 (20) '2.0'\n+05876 Extract OS            00 (0) 'MS-DOS'\n+05877 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-05818 Compression Method    0008 (8) 'Deflated'\n-0581A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0581E CRC                   57D2914C (1473417548)\n-05822 Compressed Size       000024D7 (9431)\n-05826 Uncompressed Size     0000CCAC (52396)\n-0582A Filename Length       0035 (53)\n-0582C Extra Length          0000 (0)\n-0582E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+05879 Compression Method    0008 (8) 'Deflated'\n+0587B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0587F CRC                   D413AF69 (3558059881)\n+05883 Compressed Size       00002503 (9475)\n+05887 Uncompressed Size     0000D22D (53805)\n+0588B Filename Length       0035 (53)\n+0588D Extra Length          0000 (0)\n+0588F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x582E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x588F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-05863 PAYLOAD\n+058C4 PAYLOAD\n \n-07D3A LOCAL HEADER #28      04034B50 (67324752)\n-07D3E Extract Zip Spec      14 (20) '2.0'\n-07D3F Extract OS            00 (0) 'MS-DOS'\n-07D40 General Purpose Flag  0800 (2048)\n+07DC7 LOCAL HEADER #28      04034B50 (67324752)\n+07DCB Extract Zip Spec      14 (20) '2.0'\n+07DCC Extract OS            00 (0) 'MS-DOS'\n+07DCD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-07D42 Compression Method    0008 (8) 'Deflated'\n-07D44 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-07D48 CRC                   BB643DBD (3143908797)\n-07D4C Compressed Size       00000257 (599)\n-07D50 Uncompressed Size     0000046C (1132)\n-07D54 Filename Length       0046 (70)\n-07D56 Extra Length          0000 (0)\n-07D58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+07DCF Compression Method    0008 (8) 'Deflated'\n+07DD1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+07DD5 CRC                   E174331E (3782488862)\n+07DD9 Compressed Size       0000025F (607)\n+07DDD Uncompressed Size     0000048E (1166)\n+07DE1 Filename Length       0046 (70)\n+07DE3 Extra Length          0000 (0)\n+07DE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7D58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7DE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-07D9E PAYLOAD\n+07E2B PAYLOAD\n \n-07FF5 LOCAL HEADER #29      04034B50 (67324752)\n-07FF9 Extract Zip Spec      14 (20) '2.0'\n-07FFA Extract OS            00 (0) 'MS-DOS'\n-07FFB General Purpose Flag  0800 (2048)\n+0808A LOCAL HEADER #29      04034B50 (67324752)\n+0808E Extract Zip Spec      14 (20) '2.0'\n+0808F Extract OS            00 (0) 'MS-DOS'\n+08090 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-07FFD Compression Method    0008 (8) 'Deflated'\n-07FFF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-08003 CRC                   272CCF3E (657248062)\n-08007 Compressed Size       000003AC (940)\n-0800B Uncompressed Size     000009E5 (2533)\n-0800F Filename Length       003F (63)\n-08011 Extra Length          0000 (0)\n-08013 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+08092 Compression Method    0008 (8) 'Deflated'\n+08094 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+08098 CRC                   FC3CBC13 (4231838739)\n+0809C Compressed Size       000003B6 (950)\n+080A0 Uncompressed Size     00000A37 (2615)\n+080A4 Filename Length       003F (63)\n+080A6 Extra Length          0000 (0)\n+080A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x8013: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x80A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-08052 PAYLOAD\n+080E7 PAYLOAD\n \n-083FE LOCAL HEADER #30      04034B50 (67324752)\n-08402 Extract Zip Spec      14 (20) '2.0'\n-08403 Extract OS            00 (0) 'MS-DOS'\n-08404 General Purpose Flag  0800 (2048)\n+0849D LOCAL HEADER #30      04034B50 (67324752)\n+084A1 Extract Zip Spec      14 (20) '2.0'\n+084A2 Extract OS            00 (0) 'MS-DOS'\n+084A3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-08406 Compression Method    0008 (8) 'Deflated'\n-08408 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0840C CRC                   A2DFDA9A (2732579482)\n-08410 Compressed Size       00000855 (2133)\n-08414 Uncompressed Size     000023FC (9212)\n-08418 Filename Length       0048 (72)\n-0841A Extra Length          0000 (0)\n-0841C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+084A5 Compression Method    0008 (8) 'Deflated'\n+084A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+084AB CRC                   A83ED6AA (2822690474)\n+084AF Compressed Size       00000868 (2152)\n+084B3 Uncompressed Size     00002555 (9557)\n+084B7 Filename Length       0048 (72)\n+084B9 Extra Length          0000 (0)\n+084BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x841C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x84BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-08464 PAYLOAD\n+08503 PAYLOAD\n \n-08CB9 LOCAL HEADER #31      04034B50 (67324752)\n-08CBD Extract Zip Spec      14 (20) '2.0'\n-08CBE Extract OS            00 (0) 'MS-DOS'\n-08CBF General Purpose Flag  0800 (2048)\n+08D6B LOCAL HEADER #31      04034B50 (67324752)\n+08D6F Extract Zip Spec      14 (20) '2.0'\n+08D70 Extract OS            00 (0) 'MS-DOS'\n+08D71 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-08CC1 Compression Method    0008 (8) 'Deflated'\n-08CC3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-08CC7 CRC                   99D438F5 (2580822261)\n-08CCB Compressed Size       00000677 (1655)\n-08CCF Uncompressed Size     00001582 (5506)\n-08CD3 Filename Length       0045 (69)\n-08CD5 Extra Length          0000 (0)\n-08CD7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+08D73 Compression Method    0008 (8) 'Deflated'\n+08D75 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+08D79 CRC                   E160ED1C (3781225756)\n+08D7D Compressed Size       00000686 (1670)\n+08D81 Uncompressed Size     00001657 (5719)\n+08D85 Filename Length       0045 (69)\n+08D87 Extra Length          0000 (0)\n+08D89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x8CD7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x8D89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-08D1C PAYLOAD\n+08DCE PAYLOAD\n \n-09393 LOCAL HEADER #32      04034B50 (67324752)\n-09397 Extract Zip Spec      14 (20) '2.0'\n-09398 Extract OS            00 (0) 'MS-DOS'\n-09399 General Purpose Flag  0800 (2048)\n+09454 LOCAL HEADER #32      04034B50 (67324752)\n+09458 Extract Zip Spec      14 (20) '2.0'\n+09459 Extract OS            00 (0) 'MS-DOS'\n+0945A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0939B Compression Method    0008 (8) 'Deflated'\n-0939D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-093A1 CRC                   348CD6A3 (881645219)\n-093A5 Compressed Size       0000050A (1290)\n-093A9 Uncompressed Size     00001009 (4105)\n-093AD Filename Length       0048 (72)\n-093AF Extra Length          0000 (0)\n-093B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0945C Compression Method    0008 (8) 'Deflated'\n+0945E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+09462 CRC                   156605D7 (359007703)\n+09466 Compressed Size       00000516 (1302)\n+0946A Uncompressed Size     000010AA (4266)\n+0946E Filename Length       0048 (72)\n+09470 Extra Length          0000 (0)\n+09472 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x93B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x9472: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-093F9 PAYLOAD\n+094BA PAYLOAD\n \n-09903 LOCAL HEADER #33      04034B50 (67324752)\n-09907 Extract Zip Spec      14 (20) '2.0'\n-09908 Extract OS            00 (0) 'MS-DOS'\n-09909 General Purpose Flag  0800 (2048)\n+099D0 LOCAL HEADER #33      04034B50 (67324752)\n+099D4 Extract Zip Spec      14 (20) '2.0'\n+099D5 Extract OS            00 (0) 'MS-DOS'\n+099D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0990B Compression Method    0008 (8) 'Deflated'\n-0990D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-09911 CRC                   C2D529E3 (3268749795)\n-09915 Compressed Size       000006A6 (1702)\n-09919 Uncompressed Size     00001A83 (6787)\n-0991D Filename Length       0046 (70)\n-0991F Extra Length          0000 (0)\n-09921 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+099D8 Compression Method    0008 (8) 'Deflated'\n+099DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+099DE CRC                   67C26956 (1740794198)\n+099E2 Compressed Size       000006B3 (1715)\n+099E6 Uncompressed Size     00001B93 (7059)\n+099EA Filename Length       0046 (70)\n+099EC Extra Length          0000 (0)\n+099EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9921: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x99EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09967 PAYLOAD\n+09A34 PAYLOAD\n \n-0A00D LOCAL HEADER #34      04034B50 (67324752)\n-0A011 Extract Zip Spec      14 (20) '2.0'\n-0A012 Extract OS            00 (0) 'MS-DOS'\n-0A013 General Purpose Flag  0800 (2048)\n+0A0E7 LOCAL HEADER #34      04034B50 (67324752)\n+0A0EB Extract Zip Spec      14 (20) '2.0'\n+0A0EC Extract OS            00 (0) 'MS-DOS'\n+0A0ED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A015 Compression Method    0008 (8) 'Deflated'\n-0A017 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0A01B CRC                   E72A3EBF (3878305471)\n-0A01F Compressed Size       00000654 (1620)\n-0A023 Uncompressed Size     00001A6F (6767)\n-0A027 Filename Length       0042 (66)\n-0A029 Extra Length          0000 (0)\n-0A02B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0A0EF Compression Method    0008 (8) 'Deflated'\n+0A0F1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0A0F5 CRC                   46796056 (1182359638)\n+0A0F9 Compressed Size       00000661 (1633)\n+0A0FD Uncompressed Size     00001B45 (6981)\n+0A101 Filename Length       0042 (66)\n+0A103 Extra Length          0000 (0)\n+0A105 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA02B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xA105: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0A06D PAYLOAD\n+0A147 PAYLOAD\n \n-0A6C1 LOCAL HEADER #35      04034B50 (67324752)\n-0A6C5 Extract Zip Spec      14 (20) '2.0'\n-0A6C6 Extract OS            00 (0) 'MS-DOS'\n-0A6C7 General Purpose Flag  0800 (2048)\n+0A7A8 LOCAL HEADER #35      04034B50 (67324752)\n+0A7AC Extract Zip Spec      14 (20) '2.0'\n+0A7AD Extract OS            00 (0) 'MS-DOS'\n+0A7AE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A6C9 Compression Method    0008 (8) 'Deflated'\n-0A6CB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0A6CF CRC                   1CF76EFC (485977852)\n-0A6D3 Compressed Size       0000030B (779)\n-0A6D7 Uncompressed Size     00000749 (1865)\n-0A6DB Filename Length       003F (63)\n-0A6DD Extra Length          0000 (0)\n-0A6DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0A7B0 Compression Method    0008 (8) 'Deflated'\n+0A7B2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0A7B6 CRC                   C694724C (3331617356)\n+0A7BA Compressed Size       00000316 (790)\n+0A7BE Uncompressed Size     00000788 (1928)\n+0A7C2 Filename Length       003F (63)\n+0A7C4 Extra Length          0000 (0)\n+0A7C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA6DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xA7C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0A71E PAYLOAD\n+0A805 PAYLOAD\n \n-0AA29 LOCAL HEADER #36      04034B50 (67324752)\n-0AA2D Extract Zip Spec      14 (20) '2.0'\n-0AA2E Extract OS            00 (0) 'MS-DOS'\n-0AA2F General Purpose Flag  0800 (2048)\n+0AB1B LOCAL HEADER #36      04034B50 (67324752)\n+0AB1F Extract Zip Spec      14 (20) '2.0'\n+0AB20 Extract OS            00 (0) 'MS-DOS'\n+0AB21 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0AA31 Compression Method    0008 (8) 'Deflated'\n-0AA33 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0AA37 CRC                   187BA855 (410757205)\n-0AA3B Compressed Size       000004B9 (1209)\n-0AA3F Uncompressed Size     000010FE (4350)\n-0AA43 Filename Length       0043 (67)\n-0AA45 Extra Length          0000 (0)\n-0AA47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0AB23 Compression Method    0008 (8) 'Deflated'\n+0AB25 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0AB29 CRC                   E2414032 (3795927090)\n+0AB2D Compressed Size       000004C3 (1219)\n+0AB31 Uncompressed Size     0000118B (4491)\n+0AB35 Filename Length       0043 (67)\n+0AB37 Extra Length          0000 (0)\n+0AB39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xAA47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xAB39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AA8A PAYLOAD\n+0AB7C PAYLOAD\n \n-0AF43 LOCAL HEADER #37      04034B50 (67324752)\n-0AF47 Extract Zip Spec      14 (20) '2.0'\n-0AF48 Extract OS            00 (0) 'MS-DOS'\n-0AF49 General Purpose Flag  0800 (2048)\n+0B03F LOCAL HEADER #37      04034B50 (67324752)\n+0B043 Extract Zip Spec      14 (20) '2.0'\n+0B044 Extract OS            00 (0) 'MS-DOS'\n+0B045 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0AF4B Compression Method    0008 (8) 'Deflated'\n-0AF4D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0AF51 CRC                   D7A41DAE (3617856942)\n-0AF55 Compressed Size       00000488 (1160)\n-0AF59 Uncompressed Size     00000D3D (3389)\n-0AF5D Filename Length       003F (63)\n-0AF5F Extra Length          0000 (0)\n-0AF61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B047 Compression Method    0008 (8) 'Deflated'\n+0B049 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0B04D CRC                   85CF6764 (2244962148)\n+0B051 Compressed Size       00000494 (1172)\n+0B055 Uncompressed Size     00000DB3 (3507)\n+0B059 Filename Length       003F (63)\n+0B05B Extra Length          0000 (0)\n+0B05D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xAF61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB05D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AFA0 PAYLOAD\n+0B09C PAYLOAD\n \n-0B428 LOCAL HEADER #38      04034B50 (67324752)\n-0B42C Extract Zip Spec      14 (20) '2.0'\n-0B42D Extract OS            00 (0) 'MS-DOS'\n-0B42E General Purpose Flag  0800 (2048)\n+0B530 LOCAL HEADER #38      04034B50 (67324752)\n+0B534 Extract Zip Spec      14 (20) '2.0'\n+0B535 Extract OS            00 (0) 'MS-DOS'\n+0B536 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B430 Compression Method    0008 (8) 'Deflated'\n-0B432 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0B436 CRC                   F1C1369F (4055971487)\n-0B43A Compressed Size       000004F0 (1264)\n-0B43E Uncompressed Size     000010CF (4303)\n-0B442 Filename Length       0045 (69)\n-0B444 Extra Length          0000 (0)\n-0B446 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B538 Compression Method    0008 (8) 'Deflated'\n+0B53A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0B53E CRC                   D26D2315 (3530367765)\n+0B542 Compressed Size       000004FD (1277)\n+0B546 Uncompressed Size     0000115F (4447)\n+0B54A Filename Length       0045 (69)\n+0B54C Extra Length          0000 (0)\n+0B54E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB446: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB54E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B48B PAYLOAD\n+0B593 PAYLOAD\n \n-0B97B LOCAL HEADER #39      04034B50 (67324752)\n-0B97F Extract Zip Spec      14 (20) '2.0'\n-0B980 Extract OS            00 (0) 'MS-DOS'\n-0B981 General Purpose Flag  0800 (2048)\n+0BA90 LOCAL HEADER #39      04034B50 (67324752)\n+0BA94 Extract Zip Spec      14 (20) '2.0'\n+0BA95 Extract OS            00 (0) 'MS-DOS'\n+0BA96 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B983 Compression Method    0008 (8) 'Deflated'\n-0B985 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0B989 CRC                   B12B8896 (2972420246)\n-0B98D Compressed Size       000005FF (1535)\n-0B991 Uncompressed Size     000017E3 (6115)\n-0B995 Filename Length       003D (61)\n-0B997 Extra Length          0000 (0)\n-0B999 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0BA98 Compression Method    0008 (8) 'Deflated'\n+0BA9A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0BA9E CRC                   F796C627 (4153853479)\n+0BAA2 Compressed Size       0000060E (1550)\n+0BAA6 Uncompressed Size     000018D0 (6352)\n+0BAAA Filename Length       003D (61)\n+0BAAC Extra Length          0000 (0)\n+0BAAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB999: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xBAAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B9D6 PAYLOAD\n+0BAEB PAYLOAD\n \n-0BFD5 LOCAL HEADER #40      04034B50 (67324752)\n-0BFD9 Extract Zip Spec      14 (20) '2.0'\n-0BFDA Extract OS            00 (0) 'MS-DOS'\n-0BFDB General Purpose Flag  0800 (2048)\n+0C0F9 LOCAL HEADER #40      04034B50 (67324752)\n+0C0FD Extract Zip Spec      14 (20) '2.0'\n+0C0FE Extract OS            00 (0) 'MS-DOS'\n+0C0FF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0BFDD Compression Method    0008 (8) 'Deflated'\n-0BFDF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0BFE3 CRC                   04D43ED1 (81018577)\n-0BFE7 Compressed Size       00000432 (1074)\n-0BFEB Uncompressed Size     00000D84 (3460)\n-0BFEF Filename Length       003D (61)\n-0BFF1 Extra Length          0000 (0)\n-0BFF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C101 Compression Method    0008 (8) 'Deflated'\n+0C103 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C107 CRC                   EB12A7F1 (3943868401)\n+0C10B Compressed Size       0000043E (1086)\n+0C10F Uncompressed Size     00000E08 (3592)\n+0C113 Filename Length       003D (61)\n+0C115 Extra Length          0000 (0)\n+0C117 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xBFF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC117: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C030 PAYLOAD\n+0C154 PAYLOAD\n \n-0C462 LOCAL HEADER #41      04034B50 (67324752)\n-0C466 Extract Zip Spec      14 (20) '2.0'\n-0C467 Extract OS            00 (0) 'MS-DOS'\n-0C468 General Purpose Flag  0800 (2048)\n+0C592 LOCAL HEADER #41      04034B50 (67324752)\n+0C596 Extract Zip Spec      14 (20) '2.0'\n+0C597 Extract OS            00 (0) 'MS-DOS'\n+0C598 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C46A Compression Method    0008 (8) 'Deflated'\n-0C46C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C470 CRC                   05580F75 (89657205)\n-0C474 Compressed Size       0000048A (1162)\n-0C478 Uncompressed Size     00000EA4 (3748)\n-0C47C Filename Length       003E (62)\n-0C47E Extra Length          0000 (0)\n-0C480 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C59A Compression Method    0008 (8) 'Deflated'\n+0C59C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C5A0 CRC                   F5A79DAF (4121402799)\n+0C5A4 Compressed Size       00000495 (1173)\n+0C5A8 Uncompressed Size     00000F2D (3885)\n+0C5AC Filename Length       003E (62)\n+0C5AE Extra Length          0000 (0)\n+0C5B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC480: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C4BE PAYLOAD\n+0C5EE PAYLOAD\n \n-0C948 LOCAL HEADER #42      04034B50 (67324752)\n-0C94C Extract Zip Spec      14 (20) '2.0'\n-0C94D Extract OS            00 (0) 'MS-DOS'\n-0C94E General Purpose Flag  0800 (2048)\n+0CA83 LOCAL HEADER #42      04034B50 (67324752)\n+0CA87 Extract Zip Spec      14 (20) '2.0'\n+0CA88 Extract OS            00 (0) 'MS-DOS'\n+0CA89 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C950 Compression Method    0008 (8) 'Deflated'\n-0C952 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C956 CRC                   D6497204 (3595137540)\n-0C95A Compressed Size       000008AA (2218)\n-0C95E Uncompressed Size     00002746 (10054)\n-0C962 Filename Length       003F (63)\n-0C964 Extra Length          0000 (0)\n-0C966 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0CA8B Compression Method    0008 (8) 'Deflated'\n+0CA8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0CA91 CRC                   24F4C726 (620021542)\n+0CA95 Compressed Size       000008BD (2237)\n+0CA99 Uncompressed Size     000028F1 (10481)\n+0CA9D Filename Length       003F (63)\n+0CA9F Extra Length          0000 (0)\n+0CAA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC966: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C9A5 PAYLOAD\n+0CAE0 PAYLOAD\n \n-0D24F LOCAL HEADER #43      04034B50 (67324752)\n-0D253 Extract Zip Spec      14 (20) '2.0'\n-0D254 Extract OS            00 (0) 'MS-DOS'\n-0D255 General Purpose Flag  0800 (2048)\n+0D39D LOCAL HEADER #43      04034B50 (67324752)\n+0D3A1 Extract Zip Spec      14 (20) '2.0'\n+0D3A2 Extract OS            00 (0) 'MS-DOS'\n+0D3A3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D257 Compression Method    0008 (8) 'Deflated'\n-0D259 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0D25D CRC                   1ADB9373 (450597747)\n-0D261 Compressed Size       000006B0 (1712)\n-0D265 Uncompressed Size     00001A82 (6786)\n-0D269 Filename Length       003F (63)\n-0D26B Extra Length          0000 (0)\n-0D26D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D3A5 Compression Method    0008 (8) 'Deflated'\n+0D3A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0D3AB CRC                   35C5DEAF (902160047)\n+0D3AF Compressed Size       000006C1 (1729)\n+0D3B3 Uncompressed Size     00001BA7 (7079)\n+0D3B7 Filename Length       003F (63)\n+0D3B9 Extra Length          0000 (0)\n+0D3BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD26D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D2AC PAYLOAD\n+0D3FA PAYLOAD\n \n-0D95C LOCAL HEADER #44      04034B50 (67324752)\n-0D960 Extract Zip Spec      14 (20) '2.0'\n-0D961 Extract OS            00 (0) 'MS-DOS'\n-0D962 General Purpose Flag  0800 (2048)\n+0DABB LOCAL HEADER #44      04034B50 (67324752)\n+0DABF Extract Zip Spec      14 (20) '2.0'\n+0DAC0 Extract OS            00 (0) 'MS-DOS'\n+0DAC1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D964 Compression Method    0008 (8) 'Deflated'\n-0D966 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0D96A CRC                   41505507 (1095783687)\n-0D96E Compressed Size       00000551 (1361)\n-0D972 Uncompressed Size     00001224 (4644)\n-0D976 Filename Length       0040 (64)\n-0D978 Extra Length          0000 (0)\n-0D97A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0DAC3 Compression Method    0008 (8) 'Deflated'\n+0DAC5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0DAC9 CRC                   4C4BC15C (1280033116)\n+0DACD Compressed Size       00000560 (1376)\n+0DAD1 Uncompressed Size     000012C9 (4809)\n+0DAD5 Filename Length       0040 (64)\n+0DAD7 Extra Length          0000 (0)\n+0DAD9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD97A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xDAD9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D9BA PAYLOAD\n+0DB19 PAYLOAD\n \n-0DF0B LOCAL HEADER #45      04034B50 (67324752)\n-0DF0F Extract Zip Spec      14 (20) '2.0'\n-0DF10 Extract OS            00 (0) 'MS-DOS'\n-0DF11 General Purpose Flag  0800 (2048)\n+0E079 LOCAL HEADER #45      04034B50 (67324752)\n+0E07D Extract Zip Spec      14 (20) '2.0'\n+0E07E Extract OS            00 (0) 'MS-DOS'\n+0E07F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0DF13 Compression Method    0008 (8) 'Deflated'\n-0DF15 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0DF19 CRC                   C452CFCB (3293761483)\n-0DF1D Compressed Size       00000902 (2306)\n-0DF21 Uncompressed Size     000025C2 (9666)\n-0DF25 Filename Length       003F (63)\n-0DF27 Extra Length          0000 (0)\n-0DF29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E081 Compression Method    0008 (8) 'Deflated'\n+0E083 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E087 CRC                   3875CC22 (947244066)\n+0E08B Compressed Size       00000914 (2324)\n+0E08F Uncompressed Size     00002741 (10049)\n+0E093 Filename Length       003F (63)\n+0E095 Extra Length          0000 (0)\n+0E097 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xDF29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE097: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0DF68 PAYLOAD\n+0E0D6 PAYLOAD\n \n-0E86A LOCAL HEADER #46      04034B50 (67324752)\n-0E86E Extract Zip Spec      14 (20) '2.0'\n-0E86F Extract OS            00 (0) 'MS-DOS'\n-0E870 General Purpose Flag  0800 (2048)\n+0E9EA LOCAL HEADER #46      04034B50 (67324752)\n+0E9EE Extract Zip Spec      14 (20) '2.0'\n+0E9EF Extract OS            00 (0) 'MS-DOS'\n+0E9F0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E872 Compression Method    0008 (8) 'Deflated'\n-0E874 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0E878 CRC                   FCF57B8C (4243946380)\n-0E87C Compressed Size       000004F1 (1265)\n-0E880 Uncompressed Size     00001158 (4440)\n-0E884 Filename Length       003E (62)\n-0E886 Extra Length          0000 (0)\n-0E888 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E9F2 Compression Method    0008 (8) 'Deflated'\n+0E9F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E9F8 CRC                   5053B7A1 (1347663777)\n+0E9FC Compressed Size       000004FE (1278)\n+0EA00 Uncompressed Size     000011F9 (4601)\n+0EA04 Filename Length       003E (62)\n+0EA06 Extra Length          0000 (0)\n+0EA08 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE888: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEA08: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E8C6 PAYLOAD\n+0EA46 PAYLOAD\n \n-0EDB7 LOCAL HEADER #47      04034B50 (67324752)\n-0EDBB Extract Zip Spec      14 (20) '2.0'\n-0EDBC Extract OS            00 (0) 'MS-DOS'\n-0EDBD General Purpose Flag  0800 (2048)\n+0EF44 LOCAL HEADER #47      04034B50 (67324752)\n+0EF48 Extract Zip Spec      14 (20) '2.0'\n+0EF49 Extract OS            00 (0) 'MS-DOS'\n+0EF4A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0EDBF Compression Method    0008 (8) 'Deflated'\n-0EDC1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0EDC5 CRC                   93AEE0AC (2477711532)\n-0EDC9 Compressed Size       00000247 (583)\n-0EDCD Uncompressed Size     0000040A (1034)\n-0EDD1 Filename Length       003C (60)\n-0EDD3 Extra Length          0000 (0)\n-0EDD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0EF4C Compression Method    0008 (8) 'Deflated'\n+0EF4E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0EF52 CRC                   AA9A314A (2862231882)\n+0EF56 Compressed Size       0000024C (588)\n+0EF5A Uncompressed Size     0000041E (1054)\n+0EF5E Filename Length       003C (60)\n+0EF60 Extra Length          0000 (0)\n+0EF62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0EE11 PAYLOAD\n+0EF9E PAYLOAD\n \n-0F058 LOCAL HEADER #48      04034B50 (67324752)\n-0F05C Extract Zip Spec      14 (20) '2.0'\n-0F05D Extract OS            00 (0) 'MS-DOS'\n-0F05E General Purpose Flag  0800 (2048)\n+0F1EA LOCAL HEADER #48      04034B50 (67324752)\n+0F1EE Extract Zip Spec      14 (20) '2.0'\n+0F1EF Extract OS            00 (0) 'MS-DOS'\n+0F1F0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F060 Compression Method    0008 (8) 'Deflated'\n-0F062 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0F066 CRC                   7A3B23D9 (2050696153)\n-0F06A Compressed Size       0000026C (620)\n-0F06E Uncompressed Size     00000479 (1145)\n-0F072 Filename Length       003D (61)\n-0F074 Extra Length          0000 (0)\n-0F076 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F1F2 Compression Method    0008 (8) 'Deflated'\n+0F1F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0F1F8 CRC                   7C75425F (2088059487)\n+0F1FC Compressed Size       00000274 (628)\n+0F200 Uncompressed Size     00000499 (1177)\n+0F204 Filename Length       003D (61)\n+0F206 Extra Length          0000 (0)\n+0F208 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF076: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF208: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F0B3 PAYLOAD\n+0F245 PAYLOAD\n \n-0F31F LOCAL HEADER #49      04034B50 (67324752)\n-0F323 Extract Zip Spec      14 (20) '2.0'\n-0F324 Extract OS            00 (0) 'MS-DOS'\n-0F325 General Purpose Flag  0800 (2048)\n+0F4B9 LOCAL HEADER #49      04034B50 (67324752)\n+0F4BD Extract Zip Spec      14 (20) '2.0'\n+0F4BE Extract OS            00 (0) 'MS-DOS'\n+0F4BF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F327 Compression Method    0008 (8) 'Deflated'\n-0F329 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0F32D CRC                   3E8906CC (1049167564)\n-0F331 Compressed Size       0000031B (795)\n-0F335 Uncompressed Size     00000690 (1680)\n-0F339 Filename Length       0043 (67)\n-0F33B Extra Length          0000 (0)\n-0F33D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F4C1 Compression Method    0008 (8) 'Deflated'\n+0F4C3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0F4C7 CRC                   A67D03FF (2793210879)\n+0F4CB Compressed Size       00000322 (802)\n+0F4CF Uncompressed Size     000006BE (1726)\n+0F4D3 Filename Length       0043 (67)\n+0F4D5 Extra Length          0000 (0)\n+0F4D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF33D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F380 PAYLOAD\n+0F51A PAYLOAD\n \n-0F69B LOCAL HEADER #50      04034B50 (67324752)\n-0F69F Extract Zip Spec      14 (20) '2.0'\n-0F6A0 Extract OS            00 (0) 'MS-DOS'\n-0F6A1 General Purpose Flag  0800 (2048)\n+0F83C LOCAL HEADER #50      04034B50 (67324752)\n+0F840 Extract Zip Spec      14 (20) '2.0'\n+0F841 Extract OS            00 (0) 'MS-DOS'\n+0F842 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F6A3 Compression Method    0008 (8) 'Deflated'\n-0F6A5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0F6A9 CRC                   AE1F051B (2921268507)\n-0F6AD Compressed Size       0000031D (797)\n-0F6B1 Uncompressed Size     00000698 (1688)\n-0F6B5 Filename Length       0045 (69)\n-0F6B7 Extra Length          0000 (0)\n-0F6B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F844 Compression Method    0008 (8) 'Deflated'\n+0F846 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0F84A CRC                   F6F65296 (4143338134)\n+0F84E Compressed Size       00000324 (804)\n+0F852 Uncompressed Size     000006C5 (1733)\n+0F856 Filename Length       0045 (69)\n+0F858 Extra Length          0000 (0)\n+0F85A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF85A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F6FE PAYLOAD\n+0F89F PAYLOAD\n \n-0FA1B LOCAL HEADER #51      04034B50 (67324752)\n-0FA1F Extract Zip Spec      14 (20) '2.0'\n-0FA20 Extract OS            00 (0) 'MS-DOS'\n-0FA21 General Purpose Flag  0800 (2048)\n+0FBC3 LOCAL HEADER #51      04034B50 (67324752)\n+0FBC7 Extract Zip Spec      14 (20) '2.0'\n+0FBC8 Extract OS            00 (0) 'MS-DOS'\n+0FBC9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0FA23 Compression Method    0008 (8) 'Deflated'\n-0FA25 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0FA29 CRC                   542D0143 (1412235587)\n-0FA2D Compressed Size       0000029B (667)\n-0FA31 Uncompressed Size     000005A4 (1444)\n-0FA35 Filename Length       0040 (64)\n-0FA37 Extra Length          0000 (0)\n-0FA39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FBCB Compression Method    0008 (8) 'Deflated'\n+0FBCD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0FBD1 CRC                   D200547F (3523236991)\n+0FBD5 Compressed Size       000002A3 (675)\n+0FBD9 Uncompressed Size     000005CC (1484)\n+0FBDD Filename Length       0040 (64)\n+0FBDF Extra Length          0000 (0)\n+0FBE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FA79 PAYLOAD\n+0FC21 PAYLOAD\n \n-0FD14 LOCAL HEADER #52      04034B50 (67324752)\n-0FD18 Extract Zip Spec      14 (20) '2.0'\n-0FD19 Extract OS            00 (0) 'MS-DOS'\n-0FD1A General Purpose Flag  0800 (2048)\n+0FEC4 LOCAL HEADER #52      04034B50 (67324752)\n+0FEC8 Extract Zip Spec      14 (20) '2.0'\n+0FEC9 Extract OS            00 (0) 'MS-DOS'\n+0FECA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0FD1C Compression Method    0008 (8) 'Deflated'\n-0FD1E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0FD22 CRC                   FC50C2FA (4233151226)\n-0FD26 Compressed Size       000002DA (730)\n-0FD2A Uncompressed Size     0000066A (1642)\n-0FD2E Filename Length       0042 (66)\n-0FD30 Extra Length          0000 (0)\n-0FD32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FECC Compression Method    0008 (8) 'Deflated'\n+0FECE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0FED2 CRC                   ADCF7988 (2916055432)\n+0FED6 Compressed Size       000002E1 (737)\n+0FEDA Uncompressed Size     0000069A (1690)\n+0FEDE Filename Length       0042 (66)\n+0FEE0 Extra Length          0000 (0)\n+0FEE2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFD32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFEE2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FD74 PAYLOAD\n+0FF24 PAYLOAD\n \n-1004E LOCAL HEADER #53      04034B50 (67324752)\n-10052 Extract Zip Spec      14 (20) '2.0'\n-10053 Extract OS            00 (0) 'MS-DOS'\n-10054 General Purpose Flag  0800 (2048)\n+10205 LOCAL HEADER #53      04034B50 (67324752)\n+10209 Extract Zip Spec      14 (20) '2.0'\n+1020A Extract OS            00 (0) 'MS-DOS'\n+1020B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10056 Compression Method    0008 (8) 'Deflated'\n-10058 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1005C CRC                   E1CD8446 (3788342342)\n-10060 Compressed Size       00000279 (633)\n-10064 Uncompressed Size     000004FA (1274)\n-10068 Filename Length       003D (61)\n-1006A Extra Length          0000 (0)\n-1006C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1020D Compression Method    0008 (8) 'Deflated'\n+1020F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+10213 CRC                   A8CE0A81 (2832075393)\n+10217 Compressed Size       00000280 (640)\n+1021B Uncompressed Size     0000051E (1310)\n+1021F Filename Length       003D (61)\n+10221 Extra Length          0000 (0)\n+10223 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1006C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10223: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-100A9 PAYLOAD\n+10260 PAYLOAD\n \n-10322 LOCAL HEADER #54      04034B50 (67324752)\n-10326 Extract Zip Spec      14 (20) '2.0'\n-10327 Extract OS            00 (0) 'MS-DOS'\n-10328 General Purpose Flag  0800 (2048)\n+104E0 LOCAL HEADER #54      04034B50 (67324752)\n+104E4 Extract Zip Spec      14 (20) '2.0'\n+104E5 Extract OS            00 (0) 'MS-DOS'\n+104E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1032A Compression Method    0008 (8) 'Deflated'\n-1032C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-10330 CRC                   FE2922A2 (4264108706)\n-10334 Compressed Size       0000027D (637)\n-10338 Uncompressed Size     00000502 (1282)\n-1033C Filename Length       003F (63)\n-1033E Extra Length          0000 (0)\n-10340 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+104E8 Compression Method    0008 (8) 'Deflated'\n+104EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+104EE CRC                   5D6056E9 (1566594793)\n+104F2 Compressed Size       00000284 (644)\n+104F6 Uncompressed Size     00000526 (1318)\n+104FA Filename Length       003F (63)\n+104FC Extra Length          0000 (0)\n+104FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x10340: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x104FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1037F PAYLOAD\n+1053D PAYLOAD\n \n-105FC LOCAL HEADER #55      04034B50 (67324752)\n-10600 Extract Zip Spec      14 (20) '2.0'\n-10601 Extract OS            00 (0) 'MS-DOS'\n-10602 General Purpose Flag  0800 (2048)\n+107C1 LOCAL HEADER #55      04034B50 (67324752)\n+107C5 Extract Zip Spec      14 (20) '2.0'\n+107C6 Extract OS            00 (0) 'MS-DOS'\n+107C7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10604 Compression Method    0008 (8) 'Deflated'\n-10606 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1060A CRC                   704BFEFA (1884028666)\n-1060E Compressed Size       0000033B (827)\n-10612 Uncompressed Size     00000741 (1857)\n-10616 Filename Length       0040 (64)\n-10618 Extra Length          0000 (0)\n-1061A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+107C9 Compression Method    0008 (8) 'Deflated'\n+107CB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+107CF CRC                   FFDB09C9 (4292544969)\n+107D3 Compressed Size       00000340 (832)\n+107D7 Uncompressed Size     00000774 (1908)\n+107DB Filename Length       0040 (64)\n+107DD Extra Length          0000 (0)\n+107DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1061A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x107DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1065A PAYLOAD\n+1081F PAYLOAD\n \n-10995 LOCAL HEADER #56      04034B50 (67324752)\n-10999 Extract Zip Spec      14 (20) '2.0'\n-1099A Extract OS            00 (0) 'MS-DOS'\n-1099B General Purpose Flag  0800 (2048)\n+10B5F LOCAL HEADER #56      04034B50 (67324752)\n+10B63 Extract Zip Spec      14 (20) '2.0'\n+10B64 Extract OS            00 (0) 'MS-DOS'\n+10B65 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1099D Compression Method    0008 (8) 'Deflated'\n-1099F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-109A3 CRC                   7E779F80 (2121768832)\n-109A7 Compressed Size       0000032F (815)\n-109AB Uncompressed Size     000007FD (2045)\n-109AF Filename Length       0044 (68)\n-109B1 Extra Length          0000 (0)\n-109B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+10B67 Compression Method    0008 (8) 'Deflated'\n+10B69 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+10B6D CRC                   A8777CA7 (2826402983)\n+10B71 Compressed Size       00000339 (825)\n+10B75 Uncompressed Size     00000840 (2112)\n+10B79 Filename Length       0044 (68)\n+10B7B Extra Length          0000 (0)\n+10B7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x109B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10B7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-109F7 PAYLOAD\n+10BC1 PAYLOAD\n \n-10D26 LOCAL HEADER #57      04034B50 (67324752)\n-10D2A Extract Zip Spec      14 (20) '2.0'\n-10D2B Extract OS            00 (0) 'MS-DOS'\n-10D2C General Purpose Flag  0800 (2048)\n+10EFA LOCAL HEADER #57      04034B50 (67324752)\n+10EFE Extract Zip Spec      14 (20) '2.0'\n+10EFF Extract OS            00 (0) 'MS-DOS'\n+10F00 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10D2E Compression Method    0008 (8) 'Deflated'\n-10D30 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-10D34 CRC                   33B32090 (867377296)\n-10D38 Compressed Size       000005BE (1470)\n-10D3C Uncompressed Size     00001259 (4697)\n-10D40 Filename Length       0049 (73)\n-10D42 Extra Length          0000 (0)\n-10D44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+10F02 Compression Method    0008 (8) 'Deflated'\n+10F04 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+10F08 CRC                   E294E314 (3801408276)\n+10F0C Compressed Size       000005C9 (1481)\n+10F10 Uncompressed Size     000012DA (4826)\n+10F14 Filename Length       0049 (73)\n+10F16 Extra Length          0000 (0)\n+10F18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x10D44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10F18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-10D8D PAYLOAD\n+10F61 PAYLOAD\n \n-1134B LOCAL HEADER #58      04034B50 (67324752)\n-1134F Extract Zip Spec      14 (20) '2.0'\n-11350 Extract OS            00 (0) 'MS-DOS'\n-11351 General Purpose Flag  0800 (2048)\n+1152A LOCAL HEADER #58      04034B50 (67324752)\n+1152E Extract Zip Spec      14 (20) '2.0'\n+1152F Extract OS            00 (0) 'MS-DOS'\n+11530 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11353 Compression Method    0008 (8) 'Deflated'\n-11355 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-11359 CRC                   DEA0C858 (3735079000)\n-1135D Compressed Size       000003F9 (1017)\n-11361 Uncompressed Size     00000A13 (2579)\n-11365 Filename Length       0043 (67)\n-11367 Extra Length          0000 (0)\n-11369 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11532 Compression Method    0008 (8) 'Deflated'\n+11534 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+11538 CRC                   484F34E6 (1213150438)\n+1153C Compressed Size       00000402 (1026)\n+11540 Uncompressed Size     00000A53 (2643)\n+11544 Filename Length       0043 (67)\n+11546 Extra Length          0000 (0)\n+11548 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11369: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x11548: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-113AC PAYLOAD\n+1158B PAYLOAD\n \n-117A5 LOCAL HEADER #59      04034B50 (67324752)\n-117A9 Extract Zip Spec      14 (20) '2.0'\n-117AA Extract OS            00 (0) 'MS-DOS'\n-117AB General Purpose Flag  0800 (2048)\n+1198D LOCAL HEADER #59      04034B50 (67324752)\n+11991 Extract Zip Spec      14 (20) '2.0'\n+11992 Extract OS            00 (0) 'MS-DOS'\n+11993 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-117AD Compression Method    0008 (8) 'Deflated'\n-117AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-117B3 CRC                   CE83BFB8 (3464740792)\n-117B7 Compressed Size       000016FA (5882)\n-117BB Uncompressed Size     00007356 (29526)\n-117BF Filename Length       0038 (56)\n-117C1 Extra Length          0000 (0)\n-117C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11995 Compression Method    0008 (8) 'Deflated'\n+11997 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1199B CRC                   25A2615A (631398746)\n+1199F Compressed Size       0000171A (5914)\n+119A3 Uncompressed Size     000075E8 (30184)\n+119A7 Filename Length       0038 (56)\n+119A9 Extra Length          0000 (0)\n+119AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x117C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x119AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-117FB PAYLOAD\n+119E3 PAYLOAD\n \n-12EF5 LOCAL HEADER #60      04034B50 (67324752)\n-12EF9 Extract Zip Spec      14 (20) '2.0'\n-12EFA Extract OS            00 (0) 'MS-DOS'\n-12EFB General Purpose Flag  0800 (2048)\n+130FD LOCAL HEADER #60      04034B50 (67324752)\n+13101 Extract Zip Spec      14 (20) '2.0'\n+13102 Extract OS            00 (0) 'MS-DOS'\n+13103 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12EFD Compression Method    0008 (8) 'Deflated'\n-12EFF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-12F03 CRC                   B659AACE (3059329742)\n-12F07 Compressed Size       000008C7 (2247)\n-12F0B Uncompressed Size     0000227D (8829)\n-12F0F Filename Length       0037 (55)\n-12F11 Extra Length          0000 (0)\n-12F13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13105 Compression Method    0008 (8) 'Deflated'\n+13107 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1310B CRC                   3773BB53 (930331475)\n+1310F Compressed Size       000008D6 (2262)\n+13113 Uncompressed Size     00002379 (9081)\n+13117 Filename Length       0037 (55)\n+13119 Extra Length          0000 (0)\n+1311B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x12F13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1311B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12F4A PAYLOAD\n+13152 PAYLOAD\n \n-13811 LOCAL HEADER #61      04034B50 (67324752)\n-13815 Extract Zip Spec      14 (20) '2.0'\n-13816 Extract OS            00 (0) 'MS-DOS'\n-13817 General Purpose Flag  0800 (2048)\n+13A28 LOCAL HEADER #61      04034B50 (67324752)\n+13A2C Extract Zip Spec      14 (20) '2.0'\n+13A2D Extract OS            00 (0) 'MS-DOS'\n+13A2E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13819 Compression Method    0008 (8) 'Deflated'\n-1381B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1381F CRC                   2E6A10BD (778703037)\n-13823 Compressed Size       0000003E (62)\n-13827 Uncompressed Size     0000004B (75)\n-1382B Filename Length       003C (60)\n-1382D Extra Length          0000 (0)\n-1382F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13A30 Compression Method    0008 (8) 'Deflated'\n+13A32 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13A36 CRC                   C8683575 (3362272629)\n+13A3A Compressed Size       0000003F (63)\n+13A3E Uncompressed Size     0000004C (76)\n+13A42 Filename Length       003C (60)\n+13A44 Extra Length          0000 (0)\n+13A46 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1382F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13A46: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1386B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+13A82 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-138A9 LOCAL HEADER #62      04034B50 (67324752)\n-138AD Extract Zip Spec      14 (20) '2.0'\n-138AE Extract OS            00 (0) 'MS-DOS'\n-138AF General Purpose Flag  0800 (2048)\n+13AC1 LOCAL HEADER #62      04034B50 (67324752)\n+13AC5 Extract Zip Spec      14 (20) '2.0'\n+13AC6 Extract OS            00 (0) 'MS-DOS'\n+13AC7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-138B1 Compression Method    0008 (8) 'Deflated'\n-138B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-138B7 CRC                   175EE5B1 (392095153)\n-138BB Compressed Size       00000054 (84)\n-138BF Uncompressed Size     0000005B (91)\n-138C3 Filename Length       0049 (73)\n-138C5 Extra Length          0000 (0)\n-138C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13AC9 Compression Method    0008 (8) 'Deflated'\n+13ACB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13ACF CRC                   950165AD (2499896749)\n+13AD3 Compressed Size       00000056 (86)\n+13AD7 Uncompressed Size     0000005D (93)\n+13ADB Filename Length       0049 (73)\n+13ADD Extra Length          0000 (0)\n+13ADF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x138C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13ADF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13910 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+13B28 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-13964 LOCAL HEADER #63      04034B50 (67324752)\n-13968 Extract Zip Spec      14 (20) '2.0'\n-13969 Extract OS            00 (0) 'MS-DOS'\n-1396A General Purpose Flag  0800 (2048)\n+13B7E LOCAL HEADER #63      04034B50 (67324752)\n+13B82 Extract Zip Spec      14 (20) '2.0'\n+13B83 Extract OS            00 (0) 'MS-DOS'\n+13B84 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1396C Compression Method    0008 (8) 'Deflated'\n-1396E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13972 CRC                   02CBA695 (46900885)\n-13976 Compressed Size       00000043 (67)\n-1397A Uncompressed Size     00000043 (67)\n-1397E Filename Length       0052 (82)\n-13980 Extra Length          0000 (0)\n-13982 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13B86 Compression Method    0008 (8) 'Deflated'\n+13B88 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13B8C CRC                   02CBA695 (46900885)\n+13B90 Compressed Size       00000043 (67)\n+13B94 Uncompressed Size     00000043 (67)\n+13B98 Filename Length       0052 (82)\n+13B9A Extra Length          0000 (0)\n+13B9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13982: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13B9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-139D4 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+13BEE PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-13A17 LOCAL HEADER #64      04034B50 (67324752)\n-13A1B Extract Zip Spec      14 (20) '2.0'\n-13A1C Extract OS            00 (0) 'MS-DOS'\n-13A1D General Purpose Flag  0800 (2048)\n+13C31 LOCAL HEADER #64      04034B50 (67324752)\n+13C35 Extract Zip Spec      14 (20) '2.0'\n+13C36 Extract OS            00 (0) 'MS-DOS'\n+13C37 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13A1F Compression Method    0008 (8) 'Deflated'\n-13A21 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13A25 CRC                   48945B27 (1217682215)\n-13A29 Compressed Size       00000482 (1154)\n-13A2D Uncompressed Size     00001F82 (8066)\n-13A31 Filename Length       0038 (56)\n-13A33 Extra Length          0000 (0)\n-13A35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13C39 Compression Method    0008 (8) 'Deflated'\n+13C3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13C3F CRC                   50B6758C (1354134924)\n+13C43 Compressed Size       00000479 (1145)\n+13C47 Uncompressed Size     00001EA4 (7844)\n+13C4B Filename Length       0038 (56)\n+13C4D Extra Length          0000 (0)\n+13C4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13A35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13C4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13A6D PAYLOAD\n+13C87 PAYLOAD\n \n-13EEF LOCAL HEADER #65      04034B50 (67324752)\n-13EF3 Extract Zip Spec      14 (20) '2.0'\n-13EF4 Extract OS            00 (0) 'MS-DOS'\n-13EF5 General Purpose Flag  0800 (2048)\n+14100 LOCAL HEADER #65      04034B50 (67324752)\n+14104 Extract Zip Spec      14 (20) '2.0'\n+14105 Extract OS            00 (0) 'MS-DOS'\n+14106 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13EF7 Compression Method    0008 (8) 'Deflated'\n-13EF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13EFD CRC                   494D98C1 (1229822145)\n-13F01 Compressed Size       00000045 (69)\n-13F05 Uncompressed Size     00000047 (71)\n-13F09 Filename Length       003F (63)\n-13F0B Extra Length          0000 (0)\n-13F0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14108 Compression Method    0008 (8) 'Deflated'\n+1410A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1410E CRC                   494D98C1 (1229822145)\n+14112 Compressed Size       00000045 (69)\n+14116 Uncompressed Size     00000047 (71)\n+1411A Filename Length       003F (63)\n+1411C Extra Length          0000 (0)\n+1411E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13F0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1411E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13F4C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1415D PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-13F91 CENTRAL HEADER #1     02014B50 (33639248)\n-13F95 Created Zip Spec      14 (20) '2.0'\n-13F96 Created OS            03 (3) 'Unix'\n-13F97 Extract Zip Spec      14 (20) '2.0'\n-13F98 Extract OS            00 (0) 'MS-DOS'\n-13F99 General Purpose Flag  0800 (2048)\n+141A2 CENTRAL HEADER #1     02014B50 (33639248)\n+141A6 Created Zip Spec      14 (20) '2.0'\n+141A7 Created OS            03 (3) 'Unix'\n+141A8 Extract Zip Spec      14 (20) '2.0'\n+141A9 Extract OS            00 (0) 'MS-DOS'\n+141AA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13F9B Compression Method    0008 (8) 'Deflated'\n-13F9D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13FA1 CRC                   A689EB18 (2794056472)\n-13FA5 Compressed Size       00000042 (66)\n-13FA9 Uncompressed Size     00000040 (64)\n-13FAD Filename Length       0014 (20)\n-13FAF Extra Length          0000 (0)\n-13FB1 Comment Length        0000 (0)\n-13FB3 Disk Start            0000 (0)\n-13FB5 Int File Attributes   0000 (0)\n+141AC Compression Method    0008 (8) 'Deflated'\n+141AE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+141B2 CRC                   A689EB18 (2794056472)\n+141B6 Compressed Size       00000042 (66)\n+141BA Uncompressed Size     00000040 (64)\n+141BE Filename Length       0014 (20)\n+141C0 Extra Length          0000 (0)\n+141C2 Comment Length        0000 (0)\n+141C4 Disk Start            0000 (0)\n+141C6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-13FB7 Ext File Attributes   81A40000 (2175008768)\n+141C8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-13FBB Local Header Offset   00000000 (0)\n-13FBF Filename              'XXXXXXXXXXXXXXXXXXXX'\n+141CC Local Header Offset   00000000 (0)\n+141D0 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13FBF: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x141D0: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-13FD3 CENTRAL HEADER #2     02014B50 (33639248)\n-13FD7 Created Zip Spec      14 (20) '2.0'\n-13FD8 Created OS            03 (3) 'Unix'\n-13FD9 Extract Zip Spec      0A (10) '1.0'\n-13FDA Extract OS            00 (0) 'MS-DOS'\n-13FDB General Purpose Flag  0800 (2048)\n+141E4 CENTRAL HEADER #2     02014B50 (33639248)\n+141E8 Created Zip Spec      14 (20) '2.0'\n+141E9 Created OS            03 (3) 'Unix'\n+141EA Extract Zip Spec      0A (10) '1.0'\n+141EB Extract OS            00 (0) 'MS-DOS'\n+141EC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-13FDD Compression Method    0000 (0) 'Stored'\n-13FDF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13FE3 CRC                   00000000 (0)\n-13FE7 Compressed Size       00000000 (0)\n-13FEB Uncompressed Size     00000000 (0)\n-13FEF Filename Length       0009 (9)\n-13FF1 Extra Length          0000 (0)\n-13FF3 Comment Length        0000 (0)\n-13FF5 Disk Start            0000 (0)\n-13FF7 Int File Attributes   0000 (0)\n+141EE Compression Method    0000 (0) 'Stored'\n+141F0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+141F4 CRC                   00000000 (0)\n+141F8 Compressed Size       00000000 (0)\n+141FC Uncompressed Size     00000000 (0)\n+14200 Filename Length       0009 (9)\n+14202 Extra Length          0000 (0)\n+14204 Comment Length        0000 (0)\n+14206 Disk Start            0000 (0)\n+14208 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-13FF9 Ext File Attributes   41ED0010 (1106051088)\n+1420A 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-13FFD Local Header Offset   00000074 (116)\n-14001 Filename              'XXXXXXXXX'\n+1420E Local Header Offset   00000074 (116)\n+14212 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x14001: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x14212: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14001: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x14212: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x13FD9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x141EA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-1400A CENTRAL HEADER #3     02014B50 (33639248)\n-1400E Created Zip Spec      14 (20) '2.0'\n-1400F Created OS            03 (3) 'Unix'\n-14010 Extract Zip Spec      0A (10) '1.0'\n-14011 Extract OS            00 (0) 'MS-DOS'\n-14012 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14014 Compression Method    0000 (0) 'Stored'\n-14016 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1401A CRC                   00000000 (0)\n-1401E Compressed Size       00000000 (0)\n-14022 Uncompressed Size     00000000 (0)\n-14026 Filename Length       0004 (4)\n-14028 Extra Length          0000 (0)\n-1402A Comment Length        0000 (0)\n-1402C Disk Start            0000 (0)\n-1402E Int File Attributes   0000 (0)\n+1421B CENTRAL HEADER #3     02014B50 (33639248)\n+1421F Created Zip Spec      14 (20) '2.0'\n+14220 Created OS            03 (3) 'Unix'\n+14221 Extract Zip Spec      0A (10) '1.0'\n+14222 Extract OS            00 (0) 'MS-DOS'\n+14223 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14225 Compression Method    0000 (0) 'Stored'\n+14227 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1422B CRC                   00000000 (0)\n+1422F Compressed Size       00000000 (0)\n+14233 Uncompressed Size     00000000 (0)\n+14237 Filename Length       0004 (4)\n+14239 Extra Length          0000 (0)\n+1423B Comment Length        0000 (0)\n+1423D Disk Start            0000 (0)\n+1423F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14030 Ext File Attributes   41ED0010 (1106051088)\n+14241 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-14034 Local Header Offset   0000009B (155)\n-14038 Filename              'XXXX'\n+14245 Local Header Offset   0000009B (155)\n+14249 Filename              'XXXX'\n #\n-# WARNING: Offset 0x14038: Filename 'XXXX'\n+# WARNING: Offset 0x14249: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14038: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x14249: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14010: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x14221: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-1403C CENTRAL HEADER #4     02014B50 (33639248)\n-14040 Created Zip Spec      14 (20) '2.0'\n-14041 Created OS            03 (3) 'Unix'\n-14042 Extract Zip Spec      0A (10) '1.0'\n-14043 Extract OS            00 (0) 'MS-DOS'\n-14044 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14046 Compression Method    0000 (0) 'Stored'\n-14048 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1404C CRC                   00000000 (0)\n-14050 Compressed Size       00000000 (0)\n-14054 Uncompressed Size     00000000 (0)\n-14058 Filename Length       000B (11)\n-1405A Extra Length          0000 (0)\n-1405C Comment Length        0000 (0)\n-1405E Disk Start            0000 (0)\n-14060 Int File Attributes   0000 (0)\n+1424D CENTRAL HEADER #4     02014B50 (33639248)\n+14251 Created Zip Spec      14 (20) '2.0'\n+14252 Created OS            03 (3) 'Unix'\n+14253 Extract Zip Spec      0A (10) '1.0'\n+14254 Extract OS            00 (0) 'MS-DOS'\n+14255 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14257 Compression Method    0000 (0) 'Stored'\n+14259 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1425D CRC                   00000000 (0)\n+14261 Compressed Size       00000000 (0)\n+14265 Uncompressed Size     00000000 (0)\n+14269 Filename Length       000B (11)\n+1426B Extra Length          0000 (0)\n+1426D Comment Length        0000 (0)\n+1426F Disk Start            0000 (0)\n+14271 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14062 Ext File Attributes   41ED0010 (1106051088)\n+14273 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-14066 Local Header Offset   000000BD (189)\n-1406A Filename              'XXXXXXXXXXX'\n+14277 Local Header Offset   000000BD (189)\n+1427B Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1406A: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x1427B: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x1406A: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x1427B: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14042: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x14253: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-14075 CENTRAL HEADER #5     02014B50 (33639248)\n-14079 Created Zip Spec      14 (20) '2.0'\n-1407A Created OS            03 (3) 'Unix'\n-1407B Extract Zip Spec      0A (10) '1.0'\n-1407C Extract OS            00 (0) 'MS-DOS'\n-1407D General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-1407F Compression Method    0000 (0) 'Stored'\n-14081 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14085 CRC                   00000000 (0)\n-14089 Compressed Size       00000000 (0)\n-1408D Uncompressed Size     00000000 (0)\n-14091 Filename Length       0011 (17)\n-14093 Extra Length          0000 (0)\n-14095 Comment Length        0000 (0)\n-14097 Disk Start            0000 (0)\n-14099 Int File Attributes   0000 (0)\n+14286 CENTRAL HEADER #5     02014B50 (33639248)\n+1428A Created Zip Spec      14 (20) '2.0'\n+1428B Created OS            03 (3) 'Unix'\n+1428C Extract Zip Spec      0A (10) '1.0'\n+1428D Extract OS            00 (0) 'MS-DOS'\n+1428E General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14290 Compression Method    0000 (0) 'Stored'\n+14292 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14296 CRC                   00000000 (0)\n+1429A Compressed Size       00000000 (0)\n+1429E Uncompressed Size     00000000 (0)\n+142A2 Filename Length       0011 (17)\n+142A4 Extra Length          0000 (0)\n+142A6 Comment Length        0000 (0)\n+142A8 Disk Start            0000 (0)\n+142AA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1409B Ext File Attributes   41ED0010 (1106051088)\n+142AC 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-1409F Local Header Offset   000000E6 (230)\n-140A3 Filename              'XXXXXXXXXXXXXXXXX'\n+142B0 Local Header Offset   000000E6 (230)\n+142B4 Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x140A3: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x142B4: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x140A3: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x142B4: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x1407B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1428C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-140B4 CENTRAL HEADER #6     02014B50 (33639248)\n-140B8 Created Zip Spec      14 (20) '2.0'\n-140B9 Created OS            03 (3) 'Unix'\n-140BA Extract Zip Spec      0A (10) '1.0'\n-140BB Extract OS            00 (0) 'MS-DOS'\n-140BC General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-140BE Compression Method    0000 (0) 'Stored'\n-140C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-140C4 CRC                   00000000 (0)\n-140C8 Compressed Size       00000000 (0)\n-140CC Uncompressed Size     00000000 (0)\n-140D0 Filename Length       0018 (24)\n-140D2 Extra Length          0000 (0)\n-140D4 Comment Length        0000 (0)\n-140D6 Disk Start            0000 (0)\n-140D8 Int File Attributes   0000 (0)\n+142C5 CENTRAL HEADER #6     02014B50 (33639248)\n+142C9 Created Zip Spec      14 (20) '2.0'\n+142CA Created OS            03 (3) 'Unix'\n+142CB Extract Zip Spec      0A (10) '1.0'\n+142CC Extract OS            00 (0) 'MS-DOS'\n+142CD General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+142CF Compression Method    0000 (0) 'Stored'\n+142D1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+142D5 CRC                   00000000 (0)\n+142D9 Compressed Size       00000000 (0)\n+142DD Uncompressed Size     00000000 (0)\n+142E1 Filename Length       0018 (24)\n+142E3 Extra Length          0000 (0)\n+142E5 Comment Length        0000 (0)\n+142E7 Disk Start            0000 (0)\n+142E9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-140DA Ext File Attributes   41ED0010 (1106051088)\n+142EB 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-140DE Local Header Offset   00000115 (277)\n-140E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+142EF Local Header Offset   00000115 (277)\n+142F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x140E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x142F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x140E2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x142F3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x140BA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x142CB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-140FA CENTRAL HEADER #7     02014B50 (33639248)\n-140FE Created Zip Spec      14 (20) '2.0'\n-140FF Created OS            03 (3) 'Unix'\n-14100 Extract Zip Spec      0A (10) '1.0'\n-14101 Extract OS            00 (0) 'MS-DOS'\n-14102 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14104 Compression Method    0000 (0) 'Stored'\n-14106 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1410A CRC                   00000000 (0)\n-1410E Compressed Size       00000000 (0)\n-14112 Uncompressed Size     00000000 (0)\n-14116 Filename Length       0022 (34)\n-14118 Extra Length          0000 (0)\n-1411A Comment Length        0000 (0)\n-1411C Disk Start            0000 (0)\n-1411E Int File Attributes   0000 (0)\n+1430B CENTRAL HEADER #7     02014B50 (33639248)\n+1430F Created Zip Spec      14 (20) '2.0'\n+14310 Created OS            03 (3) 'Unix'\n+14311 Extract Zip Spec      0A (10) '1.0'\n+14312 Extract OS            00 (0) 'MS-DOS'\n+14313 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14315 Compression Method    0000 (0) 'Stored'\n+14317 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1431B CRC                   00000000 (0)\n+1431F Compressed Size       00000000 (0)\n+14323 Uncompressed Size     00000000 (0)\n+14327 Filename Length       0022 (34)\n+14329 Extra Length          0000 (0)\n+1432B Comment Length        0000 (0)\n+1432D Disk Start            0000 (0)\n+1432F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14120 Ext File Attributes   41ED0010 (1106051088)\n+14331 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-14124 Local Header Offset   0000014B (331)\n-14128 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14335 Local Header Offset   0000014B (331)\n+14339 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14128: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14339: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14128: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x14339: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14100: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14311: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-1414A CENTRAL HEADER #8     02014B50 (33639248)\n-1414E Created Zip Spec      14 (20) '2.0'\n-1414F Created OS            03 (3) 'Unix'\n-14150 Extract Zip Spec      0A (10) '1.0'\n-14151 Extract OS            00 (0) 'MS-DOS'\n-14152 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14154 Compression Method    0000 (0) 'Stored'\n-14156 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1415A CRC                   00000000 (0)\n-1415E Compressed Size       00000000 (0)\n-14162 Uncompressed Size     00000000 (0)\n-14166 Filename Length       002B (43)\n-14168 Extra Length          0000 (0)\n-1416A Comment Length        0000 (0)\n-1416C Disk Start            0000 (0)\n-1416E Int File Attributes   0000 (0)\n+1435B CENTRAL HEADER #8     02014B50 (33639248)\n+1435F Created Zip Spec      14 (20) '2.0'\n+14360 Created OS            03 (3) 'Unix'\n+14361 Extract Zip Spec      0A (10) '1.0'\n+14362 Extract OS            00 (0) 'MS-DOS'\n+14363 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14365 Compression Method    0000 (0) 'Stored'\n+14367 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1436B CRC                   00000000 (0)\n+1436F Compressed Size       00000000 (0)\n+14373 Uncompressed Size     00000000 (0)\n+14377 Filename Length       002B (43)\n+14379 Extra Length          0000 (0)\n+1437B Comment Length        0000 (0)\n+1437D Disk Start            0000 (0)\n+1437F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14170 Ext File Attributes   41ED0010 (1106051088)\n+14381 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-14174 Local Header Offset   0000018B (395)\n-14178 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14385 Local Header Offset   0000018B (395)\n+14389 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14178: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14389: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14178: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x14389: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14150: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14361: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-141A3 CENTRAL HEADER #9     02014B50 (33639248)\n-141A7 Created Zip Spec      14 (20) '2.0'\n-141A8 Created OS            03 (3) 'Unix'\n-141A9 Extract Zip Spec      0A (10) '1.0'\n-141AA Extract OS            00 (0) 'MS-DOS'\n-141AB General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-141AD Compression Method    0000 (0) 'Stored'\n-141AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-141B3 CRC                   00000000 (0)\n-141B7 Compressed Size       00000000 (0)\n-141BB Uncompressed Size     00000000 (0)\n-141BF Filename Length       001E (30)\n-141C1 Extra Length          0000 (0)\n-141C3 Comment Length        0000 (0)\n-141C5 Disk Start            0000 (0)\n-141C7 Int File Attributes   0000 (0)\n+143B4 CENTRAL HEADER #9     02014B50 (33639248)\n+143B8 Created Zip Spec      14 (20) '2.0'\n+143B9 Created OS            03 (3) 'Unix'\n+143BA Extract Zip Spec      0A (10) '1.0'\n+143BB Extract OS            00 (0) 'MS-DOS'\n+143BC General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+143BE Compression Method    0000 (0) 'Stored'\n+143C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+143C4 CRC                   00000000 (0)\n+143C8 Compressed Size       00000000 (0)\n+143CC Uncompressed Size     00000000 (0)\n+143D0 Filename Length       001E (30)\n+143D2 Extra Length          0000 (0)\n+143D4 Comment Length        0000 (0)\n+143D6 Disk Start            0000 (0)\n+143D8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-141C9 Ext File Attributes   41ED0010 (1106051088)\n+143DA 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-141CD Local Header Offset   000001D4 (468)\n-141D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+143DE Local Header Offset   000001D4 (468)\n+143E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x141D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x143E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x141D1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x143E2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x141A9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x143BA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-141EF CENTRAL HEADER #10    02014B50 (33639248)\n-141F3 Created Zip Spec      14 (20) '2.0'\n-141F4 Created OS            03 (3) 'Unix'\n-141F5 Extract Zip Spec      0A (10) '1.0'\n-141F6 Extract OS            00 (0) 'MS-DOS'\n-141F7 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-141F9 Compression Method    0000 (0) 'Stored'\n-141FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-141FF CRC                   00000000 (0)\n-14203 Compressed Size       00000000 (0)\n-14207 Uncompressed Size     00000000 (0)\n-1420B Filename Length       0027 (39)\n-1420D Extra Length          0000 (0)\n-1420F Comment Length        0000 (0)\n-14211 Disk Start            0000 (0)\n-14213 Int File Attributes   0000 (0)\n+14400 CENTRAL HEADER #10    02014B50 (33639248)\n+14404 Created Zip Spec      14 (20) '2.0'\n+14405 Created OS            03 (3) 'Unix'\n+14406 Extract Zip Spec      0A (10) '1.0'\n+14407 Extract OS            00 (0) 'MS-DOS'\n+14408 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+1440A Compression Method    0000 (0) 'Stored'\n+1440C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14410 CRC                   00000000 (0)\n+14414 Compressed Size       00000000 (0)\n+14418 Uncompressed Size     00000000 (0)\n+1441C Filename Length       0027 (39)\n+1441E Extra Length          0000 (0)\n+14420 Comment Length        0000 (0)\n+14422 Disk Start            0000 (0)\n+14424 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14215 Ext File Attributes   41ED0010 (1106051088)\n+14426 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-14219 Local Header Offset   00000210 (528)\n-1421D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1442A Local Header Offset   00000210 (528)\n+1442E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1421D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1442E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x1421D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x1442E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x141F5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14406: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-14244 CENTRAL HEADER #11    02014B50 (33639248)\n-14248 Created Zip Spec      14 (20) '2.0'\n-14249 Created OS            03 (3) 'Unix'\n-1424A Extract Zip Spec      0A (10) '1.0'\n-1424B Extract OS            00 (0) 'MS-DOS'\n-1424C General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-1424E Compression Method    0000 (0) 'Stored'\n-14250 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14254 CRC                   00000000 (0)\n-14258 Compressed Size       00000000 (0)\n-1425C Uncompressed Size     00000000 (0)\n-14260 Filename Length       0020 (32)\n-14262 Extra Length          0000 (0)\n-14264 Comment Length        0000 (0)\n-14266 Disk Start            0000 (0)\n-14268 Int File Attributes   0000 (0)\n+14455 CENTRAL HEADER #11    02014B50 (33639248)\n+14459 Created Zip Spec      14 (20) '2.0'\n+1445A Created OS            03 (3) 'Unix'\n+1445B Extract Zip Spec      0A (10) '1.0'\n+1445C Extract OS            00 (0) 'MS-DOS'\n+1445D General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+1445F Compression Method    0000 (0) 'Stored'\n+14461 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14465 CRC                   00000000 (0)\n+14469 Compressed Size       00000000 (0)\n+1446D Uncompressed Size     00000000 (0)\n+14471 Filename Length       0020 (32)\n+14473 Extra Length          0000 (0)\n+14475 Comment Length        0000 (0)\n+14477 Disk Start            0000 (0)\n+14479 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1426A Ext File Attributes   41ED0010 (1106051088)\n+1447B 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-1426E Local Header Offset   00000255 (597)\n-14272 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1447F Local Header Offset   00000255 (597)\n+14483 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14272: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14483: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14272: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x14483: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x1424A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1445B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-14292 CENTRAL HEADER #12    02014B50 (33639248)\n-14296 Created Zip Spec      14 (20) '2.0'\n-14297 Created OS            03 (3) 'Unix'\n-14298 Extract Zip Spec      0A (10) '1.0'\n-14299 Extract OS            00 (0) 'MS-DOS'\n-1429A General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-1429C Compression Method    0000 (0) 'Stored'\n-1429E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-142A2 CRC                   00000000 (0)\n-142A6 Compressed Size       00000000 (0)\n-142AA Uncompressed Size     00000000 (0)\n-142AE Filename Length       0021 (33)\n-142B0 Extra Length          0000 (0)\n-142B2 Comment Length        0000 (0)\n-142B4 Disk Start            0000 (0)\n-142B6 Int File Attributes   0000 (0)\n+144A3 CENTRAL HEADER #12    02014B50 (33639248)\n+144A7 Created Zip Spec      14 (20) '2.0'\n+144A8 Created OS            03 (3) 'Unix'\n+144A9 Extract Zip Spec      0A (10) '1.0'\n+144AA Extract OS            00 (0) 'MS-DOS'\n+144AB General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+144AD Compression Method    0000 (0) 'Stored'\n+144AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+144B3 CRC                   00000000 (0)\n+144B7 Compressed Size       00000000 (0)\n+144BB Uncompressed Size     00000000 (0)\n+144BF Filename Length       0021 (33)\n+144C1 Extra Length          0000 (0)\n+144C3 Comment Length        0000 (0)\n+144C5 Disk Start            0000 (0)\n+144C7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-142B8 Ext File Attributes   41ED0010 (1106051088)\n+144C9 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-142BC Local Header Offset   00000293 (659)\n-142C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+144CD Local Header Offset   00000293 (659)\n+144D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x142C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x144D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x142C0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x144D1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14298: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x144A9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-142E1 CENTRAL HEADER #13    02014B50 (33639248)\n-142E5 Created Zip Spec      14 (20) '2.0'\n-142E6 Created OS            03 (3) 'Unix'\n-142E7 Extract Zip Spec      0A (10) '1.0'\n-142E8 Extract OS            00 (0) 'MS-DOS'\n-142E9 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-142EB Compression Method    0000 (0) 'Stored'\n-142ED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-142F1 CRC                   00000000 (0)\n-142F5 Compressed Size       00000000 (0)\n-142F9 Uncompressed Size     00000000 (0)\n-142FD Filename Length       001E (30)\n-142FF Extra Length          0000 (0)\n-14301 Comment Length        0000 (0)\n-14303 Disk Start            0000 (0)\n-14305 Int File Attributes   0000 (0)\n+144F2 CENTRAL HEADER #13    02014B50 (33639248)\n+144F6 Created Zip Spec      14 (20) '2.0'\n+144F7 Created OS            03 (3) 'Unix'\n+144F8 Extract Zip Spec      0A (10) '1.0'\n+144F9 Extract OS            00 (0) 'MS-DOS'\n+144FA General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+144FC Compression Method    0000 (0) 'Stored'\n+144FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14502 CRC                   00000000 (0)\n+14506 Compressed Size       00000000 (0)\n+1450A Uncompressed Size     00000000 (0)\n+1450E Filename Length       001E (30)\n+14510 Extra Length          0000 (0)\n+14512 Comment Length        0000 (0)\n+14514 Disk Start            0000 (0)\n+14516 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14307 Ext File Attributes   41ED0010 (1106051088)\n+14518 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-1430B Local Header Offset   000002D2 (722)\n-1430F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1451C Local Header Offset   000002D2 (722)\n+14520 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1430F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14520: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x1430F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x14520: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x142E7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x144F8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-1432D CENTRAL HEADER #14    02014B50 (33639248)\n-14331 Created Zip Spec      14 (20) '2.0'\n-14332 Created OS            03 (3) 'Unix'\n-14333 Extract Zip Spec      0A (10) '1.0'\n-14334 Extract OS            00 (0) 'MS-DOS'\n-14335 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14337 Compression Method    0000 (0) 'Stored'\n-14339 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1433D CRC                   00000000 (0)\n-14341 Compressed Size       00000000 (0)\n-14345 Uncompressed Size     00000000 (0)\n-14349 Filename Length       000F (15)\n-1434B Extra Length          0000 (0)\n-1434D Comment Length        0000 (0)\n-1434F Disk Start            0000 (0)\n-14351 Int File Attributes   0000 (0)\n+1453E CENTRAL HEADER #14    02014B50 (33639248)\n+14542 Created Zip Spec      14 (20) '2.0'\n+14543 Created OS            03 (3) 'Unix'\n+14544 Extract Zip Spec      0A (10) '1.0'\n+14545 Extract OS            00 (0) 'MS-DOS'\n+14546 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14548 Compression Method    0000 (0) 'Stored'\n+1454A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1454E CRC                   00000000 (0)\n+14552 Compressed Size       00000000 (0)\n+14556 Uncompressed Size     00000000 (0)\n+1455A Filename Length       000F (15)\n+1455C Extra Length          0000 (0)\n+1455E Comment Length        0000 (0)\n+14560 Disk Start            0000 (0)\n+14562 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14353 Ext File Attributes   41ED0010 (1106051088)\n+14564 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-14357 Local Header Offset   0000030E (782)\n-1435B Filename              'XXXXXXXXXXXXXXX'\n+14568 Local Header Offset   0000030E (782)\n+1456C Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1435B: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1456C: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x1435B: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x1456C: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14333: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14544: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-1436A CENTRAL HEADER #15    02014B50 (33639248)\n-1436E Created Zip Spec      14 (20) '2.0'\n-1436F Created OS            03 (3) 'Unix'\n-14370 Extract Zip Spec      0A (10) '1.0'\n-14371 Extract OS            00 (0) 'MS-DOS'\n-14372 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14374 Compression Method    0000 (0) 'Stored'\n-14376 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1437A CRC                   00000000 (0)\n-1437E Compressed Size       00000000 (0)\n-14382 Uncompressed Size     00000000 (0)\n-14386 Filename Length       0018 (24)\n-14388 Extra Length          0000 (0)\n-1438A Comment Length        0000 (0)\n-1438C Disk Start            0000 (0)\n-1438E Int File Attributes   0000 (0)\n+1457B CENTRAL HEADER #15    02014B50 (33639248)\n+1457F Created Zip Spec      14 (20) '2.0'\n+14580 Created OS            03 (3) 'Unix'\n+14581 Extract Zip Spec      0A (10) '1.0'\n+14582 Extract OS            00 (0) 'MS-DOS'\n+14583 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14585 Compression Method    0000 (0) 'Stored'\n+14587 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1458B CRC                   00000000 (0)\n+1458F Compressed Size       00000000 (0)\n+14593 Uncompressed Size     00000000 (0)\n+14597 Filename Length       0018 (24)\n+14599 Extra Length          0000 (0)\n+1459B Comment Length        0000 (0)\n+1459D Disk Start            0000 (0)\n+1459F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14390 Ext File Attributes   41ED0010 (1106051088)\n+145A1 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-14394 Local Header Offset   0000033B (827)\n-14398 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+145A5 Local Header Offset   0000033B (827)\n+145A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14398: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x145A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14398: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x145A9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14370: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14581: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-143B0 CENTRAL HEADER #16    02014B50 (33639248)\n-143B4 Created Zip Spec      14 (20) '2.0'\n-143B5 Created OS            03 (3) 'Unix'\n-143B6 Extract Zip Spec      0A (10) '1.0'\n-143B7 Extract OS            00 (0) 'MS-DOS'\n-143B8 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-143BA Compression Method    0000 (0) 'Stored'\n-143BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-143C0 CRC                   00000000 (0)\n-143C4 Compressed Size       00000000 (0)\n-143C8 Uncompressed Size     00000000 (0)\n-143CC Filename Length       000F (15)\n-143CE Extra Length          0000 (0)\n-143D0 Comment Length        0000 (0)\n-143D2 Disk Start            0000 (0)\n-143D4 Int File Attributes   0000 (0)\n+145C1 CENTRAL HEADER #16    02014B50 (33639248)\n+145C5 Created Zip Spec      14 (20) '2.0'\n+145C6 Created OS            03 (3) 'Unix'\n+145C7 Extract Zip Spec      0A (10) '1.0'\n+145C8 Extract OS            00 (0) 'MS-DOS'\n+145C9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+145CB Compression Method    0000 (0) 'Stored'\n+145CD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+145D1 CRC                   00000000 (0)\n+145D5 Compressed Size       00000000 (0)\n+145D9 Uncompressed Size     00000000 (0)\n+145DD Filename Length       000F (15)\n+145DF Extra Length          0000 (0)\n+145E1 Comment Length        0000 (0)\n+145E3 Disk Start            0000 (0)\n+145E5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-143D6 Ext File Attributes   41ED0010 (1106051088)\n+145E7 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-143DA Local Header Offset   00000371 (881)\n-143DE Filename              'XXXXXXXXXXXXXXX'\n+145EB Local Header Offset   00000371 (881)\n+145EF Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x143DE: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x145EF: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x143DE: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x145EF: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x143B6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x145C7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-143ED CENTRAL HEADER #17    02014B50 (33639248)\n-143F1 Created Zip Spec      14 (20) '2.0'\n-143F2 Created OS            03 (3) 'Unix'\n-143F3 Extract Zip Spec      0A (10) '1.0'\n-143F4 Extract OS            00 (0) 'MS-DOS'\n-143F5 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-143F7 Compression Method    0000 (0) 'Stored'\n-143F9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-143FD CRC                   00000000 (0)\n-14401 Compressed Size       00000000 (0)\n-14405 Uncompressed Size     00000000 (0)\n-14409 Filename Length       0020 (32)\n-1440B Extra Length          0000 (0)\n-1440D Comment Length        0000 (0)\n-1440F Disk Start            0000 (0)\n-14411 Int File Attributes   0000 (0)\n+145FE CENTRAL HEADER #17    02014B50 (33639248)\n+14602 Created Zip Spec      14 (20) '2.0'\n+14603 Created OS            03 (3) 'Unix'\n+14604 Extract Zip Spec      0A (10) '1.0'\n+14605 Extract OS            00 (0) 'MS-DOS'\n+14606 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14608 Compression Method    0000 (0) 'Stored'\n+1460A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1460E CRC                   00000000 (0)\n+14612 Compressed Size       00000000 (0)\n+14616 Uncompressed Size     00000000 (0)\n+1461A Filename Length       0020 (32)\n+1461C Extra Length          0000 (0)\n+1461E Comment Length        0000 (0)\n+14620 Disk Start            0000 (0)\n+14622 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14413 Ext File Attributes   41ED0010 (1106051088)\n+14624 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-14417 Local Header Offset   0000039E (926)\n-1441B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14628 Local Header Offset   0000039E (926)\n+1462C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1441B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1462C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x1441B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x1462C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x143F3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14604: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-1443B CENTRAL HEADER #18    02014B50 (33639248)\n-1443F Created Zip Spec      14 (20) '2.0'\n-14440 Created OS            03 (3) 'Unix'\n-14441 Extract Zip Spec      0A (10) '1.0'\n-14442 Extract OS            00 (0) 'MS-DOS'\n-14443 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-14445 Compression Method    0000 (0) 'Stored'\n-14447 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1444B CRC                   00000000 (0)\n-1444F Compressed Size       00000000 (0)\n-14453 Uncompressed Size     00000000 (0)\n-14457 Filename Length       0031 (49)\n-14459 Extra Length          0000 (0)\n-1445B Comment Length        0000 (0)\n-1445D Disk Start            0000 (0)\n-1445F Int File Attributes   0000 (0)\n+1464C CENTRAL HEADER #18    02014B50 (33639248)\n+14650 Created Zip Spec      14 (20) '2.0'\n+14651 Created OS            03 (3) 'Unix'\n+14652 Extract Zip Spec      0A (10) '1.0'\n+14653 Extract OS            00 (0) 'MS-DOS'\n+14654 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+14656 Compression Method    0000 (0) 'Stored'\n+14658 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1465C CRC                   00000000 (0)\n+14660 Compressed Size       00000000 (0)\n+14664 Uncompressed Size     00000000 (0)\n+14668 Filename Length       0031 (49)\n+1466A Extra Length          0000 (0)\n+1466C Comment Length        0000 (0)\n+1466E Disk Start            0000 (0)\n+14670 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14461 Ext File Attributes   41ED0010 (1106051088)\n+14672 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-14465 Local Header Offset   000003DC (988)\n-14469 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14676 Local Header Offset   000003DC (988)\n+1467A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14469: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1467A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x14469: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x1467A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x14441: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14652: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-1449A CENTRAL HEADER #19    02014B50 (33639248)\n-1449E Created Zip Spec      14 (20) '2.0'\n-1449F Created OS            03 (3) 'Unix'\n-144A0 Extract Zip Spec      14 (20) '2.0'\n-144A1 Extract OS            00 (0) 'MS-DOS'\n-144A2 General Purpose Flag  0800 (2048)\n+146AB CENTRAL HEADER #19    02014B50 (33639248)\n+146AF Created Zip Spec      14 (20) '2.0'\n+146B0 Created OS            03 (3) 'Unix'\n+146B1 Extract Zip Spec      14 (20) '2.0'\n+146B2 Extract OS            00 (0) 'MS-DOS'\n+146B3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-144A4 Compression Method    0008 (8) 'Deflated'\n-144A6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-144AA CRC                   D1996C93 (3516492947)\n-144AE Compressed Size       00000432 (1074)\n-144B2 Uncompressed Size     000014CC (5324)\n-144B6 Filename Length       0015 (21)\n-144B8 Extra Length          0000 (0)\n-144BA Comment Length        0000 (0)\n-144BC Disk Start            0000 (0)\n-144BE Int File Attributes   0000 (0)\n+146B5 Compression Method    0008 (8) 'Deflated'\n+146B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+146BB CRC                   D1996C93 (3516492947)\n+146BF Compressed Size       00000432 (1074)\n+146C3 Uncompressed Size     000014CC (5324)\n+146C7 Filename Length       0015 (21)\n+146C9 Extra Length          0000 (0)\n+146CB Comment Length        0000 (0)\n+146CD Disk Start            0000 (0)\n+146CF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-144C0 Ext File Attributes   81A40000 (2175008768)\n+146D1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-144C4 Local Header Offset   0000042B (1067)\n-144C8 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+146D5 Local Header Offset   0000042B (1067)\n+146D9 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x144C8: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x146D9: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-144DD CENTRAL HEADER #20    02014B50 (33639248)\n-144E1 Created Zip Spec      14 (20) '2.0'\n-144E2 Created OS            03 (3) 'Unix'\n-144E3 Extract Zip Spec      14 (20) '2.0'\n-144E4 Extract OS            00 (0) 'MS-DOS'\n-144E5 General Purpose Flag  0800 (2048)\n+146EE CENTRAL HEADER #20    02014B50 (33639248)\n+146F2 Created Zip Spec      14 (20) '2.0'\n+146F3 Created OS            03 (3) 'Unix'\n+146F4 Extract Zip Spec      14 (20) '2.0'\n+146F5 Extract OS            00 (0) 'MS-DOS'\n+146F6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-144E7 Compression Method    0008 (8) 'Deflated'\n-144E9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-144ED CRC                   86E2B4B4 (2263004340)\n-144F1 Compressed Size       00000F6D (3949)\n-144F5 Uncompressed Size     00002C5E (11358)\n-144F9 Filename Length       0010 (16)\n-144FB Extra Length          0000 (0)\n-144FD Comment Length        0000 (0)\n-144FF Disk Start            0000 (0)\n-14501 Int File Attributes   0000 (0)\n+146F8 Compression Method    0008 (8) 'Deflated'\n+146FA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+146FE CRC                   86E2B4B4 (2263004340)\n+14702 Compressed Size       00000F6D (3949)\n+14706 Uncompressed Size     00002C5E (11358)\n+1470A Filename Length       0010 (16)\n+1470C Extra Length          0000 (0)\n+1470E Comment Length        0000 (0)\n+14710 Disk Start            0000 (0)\n+14712 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14503 Ext File Attributes   81A40000 (2175008768)\n+14714 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14507 Local Header Offset   00000890 (2192)\n-1450B Filename              'XXXXXXXXXXXXXXXX'\n+14718 Local Header Offset   00000890 (2192)\n+1471C Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1450B: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1471C: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1451B CENTRAL HEADER #21    02014B50 (33639248)\n-1451F Created Zip Spec      14 (20) '2.0'\n-14520 Created OS            03 (3) 'Unix'\n-14521 Extract Zip Spec      14 (20) '2.0'\n-14522 Extract OS            00 (0) 'MS-DOS'\n-14523 General Purpose Flag  0800 (2048)\n+1472C CENTRAL HEADER #21    02014B50 (33639248)\n+14730 Created Zip Spec      14 (20) '2.0'\n+14731 Created OS            03 (3) 'Unix'\n+14732 Extract Zip Spec      14 (20) '2.0'\n+14733 Extract OS            00 (0) 'MS-DOS'\n+14734 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14525 Compression Method    0008 (8) 'Deflated'\n-14527 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1452B CRC                   5C793A50 (1551448656)\n-1452F Compressed Size       0000007E (126)\n-14533 Uncompressed Size     000000AD (173)\n-14537 Filename Length       000F (15)\n-14539 Extra Length          0000 (0)\n-1453B Comment Length        0000 (0)\n-1453D Disk Start            0000 (0)\n-1453F Int File Attributes   0000 (0)\n+14736 Compression Method    0008 (8) 'Deflated'\n+14738 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1473C CRC                   5C793A50 (1551448656)\n+14740 Compressed Size       0000007E (126)\n+14744 Uncompressed Size     000000AD (173)\n+14748 Filename Length       000F (15)\n+1474A Extra Length          0000 (0)\n+1474C Comment Length        0000 (0)\n+1474E Disk Start            0000 (0)\n+14750 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14541 Ext File Attributes   81A40000 (2175008768)\n+14752 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14545 Local Header Offset   0000182B (6187)\n-14549 Filename              'XXXXXXXXXXXXXXX'\n+14756 Local Header Offset   0000182B (6187)\n+1475A Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14549: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1475A: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14558 CENTRAL HEADER #22    02014B50 (33639248)\n-1455C Created Zip Spec      14 (20) '2.0'\n-1455D Created OS            03 (3) 'Unix'\n-1455E Extract Zip Spec      14 (20) '2.0'\n-1455F Extract OS            00 (0) 'MS-DOS'\n-14560 General Purpose Flag  0800 (2048)\n+14769 CENTRAL HEADER #22    02014B50 (33639248)\n+1476D Created Zip Spec      14 (20) '2.0'\n+1476E Created OS            03 (3) 'Unix'\n+1476F Extract Zip Spec      14 (20) '2.0'\n+14770 Extract OS            00 (0) 'MS-DOS'\n+14771 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14562 Compression Method    0008 (8) 'Deflated'\n-14564 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14568 CRC                   44C14167 (1153515879)\n-1456C Compressed Size       00000262 (610)\n-14570 Uncompressed Size     00000471 (1137)\n-14574 Filename Length       002E (46)\n-14576 Extra Length          0000 (0)\n-14578 Comment Length        0000 (0)\n-1457A Disk Start            0000 (0)\n-1457C Int File Attributes   0000 (0)\n+14773 Compression Method    0008 (8) 'Deflated'\n+14775 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14779 CRC                   6C5A36DD (1817851613)\n+1477D Compressed Size       0000026C (620)\n+14781 Uncompressed Size     00000495 (1173)\n+14785 Filename Length       002E (46)\n+14787 Extra Length          0000 (0)\n+14789 Comment Length        0000 (0)\n+1478B Disk Start            0000 (0)\n+1478D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1457E Ext File Attributes   81A40000 (2175008768)\n+1478F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14582 Local Header Offset   000018D6 (6358)\n-14586 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14793 Local Header Offset   000018D6 (6358)\n+14797 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14586: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14797: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-145B4 CENTRAL HEADER #23    02014B50 (33639248)\n-145B8 Created Zip Spec      14 (20) '2.0'\n-145B9 Created OS            03 (3) 'Unix'\n-145BA Extract Zip Spec      14 (20) '2.0'\n-145BB Extract OS            00 (0) 'MS-DOS'\n-145BC General Purpose Flag  0800 (2048)\n+147C5 CENTRAL HEADER #23    02014B50 (33639248)\n+147C9 Created Zip Spec      14 (20) '2.0'\n+147CA Created OS            03 (3) 'Unix'\n+147CB Extract Zip Spec      14 (20) '2.0'\n+147CC Extract OS            00 (0) 'MS-DOS'\n+147CD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-145BE Compression Method    0008 (8) 'Deflated'\n-145C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-145C4 CRC                   F5917ED9 (4119953113)\n-145C8 Compressed Size       00000254 (596)\n-145CC Uncompressed Size     0000045C (1116)\n-145D0 Filename Length       0030 (48)\n-145D2 Extra Length          0000 (0)\n-145D4 Comment Length        0000 (0)\n-145D6 Disk Start            0000 (0)\n-145D8 Int File Attributes   0000 (0)\n+147CF Compression Method    0008 (8) 'Deflated'\n+147D1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+147D5 CRC                   566E5E12 (1450073618)\n+147D9 Compressed Size       0000025E (606)\n+147DD Uncompressed Size     0000047F (1151)\n+147E1 Filename Length       0030 (48)\n+147E3 Extra Length          0000 (0)\n+147E5 Comment Length        0000 (0)\n+147E7 Disk Start            0000 (0)\n+147E9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-145DA Ext File Attributes   81A40000 (2175008768)\n+147EB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-145DE Local Header Offset   00001B84 (7044)\n-145E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+147EF Local Header Offset   00001B8E (7054)\n+147F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x145E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x147F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14612 CENTRAL HEADER #24    02014B50 (33639248)\n-14616 Created Zip Spec      14 (20) '2.0'\n-14617 Created OS            03 (3) 'Unix'\n-14618 Extract Zip Spec      14 (20) '2.0'\n-14619 Extract OS            00 (0) 'MS-DOS'\n-1461A General Purpose Flag  0800 (2048)\n+14823 CENTRAL HEADER #24    02014B50 (33639248)\n+14827 Created Zip Spec      14 (20) '2.0'\n+14828 Created OS            03 (3) 'Unix'\n+14829 Extract Zip Spec      14 (20) '2.0'\n+1482A Extract OS            00 (0) 'MS-DOS'\n+1482B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1461C Compression Method    0008 (8) 'Deflated'\n-1461E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14622 CRC                   7CE2D61E (2095240734)\n-14626 Compressed Size       00000605 (1541)\n-1462A Uncompressed Size     0000131F (4895)\n-1462E Filename Length       002E (46)\n-14630 Extra Length          0000 (0)\n-14632 Comment Length        0000 (0)\n-14634 Disk Start            0000 (0)\n-14636 Int File Attributes   0000 (0)\n+1482D Compression Method    0008 (8) 'Deflated'\n+1482F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14833 CRC                   8233D78E (2184435598)\n+14837 Compressed Size       0000060F (1551)\n+1483B Uncompressed Size     000013B4 (5044)\n+1483F Filename Length       002E (46)\n+14841 Extra Length          0000 (0)\n+14843 Comment Length        0000 (0)\n+14845 Disk Start            0000 (0)\n+14847 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14638 Ext File Attributes   81A40000 (2175008768)\n+14849 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-1463C Local Header Offset   00001E26 (7718)\n-14640 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1484D Local Header Offset   00001E3A (7738)\n+14851 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14640: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14851: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1466E CENTRAL HEADER #25    02014B50 (33639248)\n-14672 Created Zip Spec      14 (20) '2.0'\n-14673 Created OS            03 (3) 'Unix'\n-14674 Extract Zip Spec      14 (20) '2.0'\n-14675 Extract OS            00 (0) 'MS-DOS'\n-14676 General Purpose Flag  0800 (2048)\n+1487F CENTRAL HEADER #25    02014B50 (33639248)\n+14883 Created Zip Spec      14 (20) '2.0'\n+14884 Created OS            03 (3) 'Unix'\n+14885 Extract Zip Spec      14 (20) '2.0'\n+14886 Extract OS            00 (0) 'MS-DOS'\n+14887 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14678 Compression Method    0008 (8) 'Deflated'\n-1467A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1467E CRC                   5F946D70 (1603562864)\n-14682 Compressed Size       0000178E (6030)\n-14686 Uncompressed Size     00005E41 (24129)\n-1468A Filename Length       002C (44)\n-1468C Extra Length          0000 (0)\n-1468E Comment Length        0000 (0)\n-14690 Disk Start            0000 (0)\n-14692 Int File Attributes   0000 (0)\n+14889 Compression Method    0008 (8) 'Deflated'\n+1488B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1488F CRC                   23EF92DF (602903263)\n+14893 Compressed Size       000017AA (6058)\n+14897 Uncompressed Size     0000606B (24683)\n+1489B Filename Length       002C (44)\n+1489D Extra Length          0000 (0)\n+1489F Comment Length        0000 (0)\n+148A1 Disk Start            0000 (0)\n+148A3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14694 Ext File Attributes   81A40000 (2175008768)\n+148A5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14698 Local Header Offset   00002477 (9335)\n-1469C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+148A9 Local Header Offset   00002495 (9365)\n+148AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1469C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x148AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-146C8 CENTRAL HEADER #26    02014B50 (33639248)\n-146CC Created Zip Spec      14 (20) '2.0'\n-146CD Created OS            03 (3) 'Unix'\n-146CE Extract Zip Spec      14 (20) '2.0'\n-146CF Extract OS            00 (0) 'MS-DOS'\n-146D0 General Purpose Flag  0800 (2048)\n+148D9 CENTRAL HEADER #26    02014B50 (33639248)\n+148DD Created Zip Spec      14 (20) '2.0'\n+148DE Created OS            03 (3) 'Unix'\n+148DF Extract Zip Spec      14 (20) '2.0'\n+148E0 Extract OS            00 (0) 'MS-DOS'\n+148E1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-146D2 Compression Method    0008 (8) 'Deflated'\n-146D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-146D8 CRC                   CBF03B71 (3421518705)\n-146DC Compressed Size       00001B79 (7033)\n-146E0 Uncompressed Size     00007DD7 (32215)\n-146E4 Filename Length       002A (42)\n-146E6 Extra Length          0000 (0)\n-146E8 Comment Length        0000 (0)\n-146EA Disk Start            0000 (0)\n-146EC Int File Attributes   0000 (0)\n+148E3 Compression Method    0008 (8) 'Deflated'\n+148E5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+148E9 CRC                   8A9B11DB (2325418459)\n+148ED Compressed Size       00001BA0 (7072)\n+148F1 Uncompressed Size     000080AE (32942)\n+148F5 Filename Length       002A (42)\n+148F7 Extra Length          0000 (0)\n+148F9 Comment Length        0000 (0)\n+148FB Disk Start            0000 (0)\n+148FD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-146EE Ext File Attributes   81A40000 (2175008768)\n+148FF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-146F2 Local Header Offset   00003C4F (15439)\n-146F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14903 Local Header Offset   00003C89 (15497)\n+14907 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x146F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14907: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14720 CENTRAL HEADER #27    02014B50 (33639248)\n-14724 Created Zip Spec      14 (20) '2.0'\n-14725 Created OS            03 (3) 'Unix'\n-14726 Extract Zip Spec      14 (20) '2.0'\n-14727 Extract OS            00 (0) 'MS-DOS'\n-14728 General Purpose Flag  0800 (2048)\n+14931 CENTRAL HEADER #27    02014B50 (33639248)\n+14935 Created Zip Spec      14 (20) '2.0'\n+14936 Created OS            03 (3) 'Unix'\n+14937 Extract Zip Spec      14 (20) '2.0'\n+14938 Extract OS            00 (0) 'MS-DOS'\n+14939 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1472A Compression Method    0008 (8) 'Deflated'\n-1472C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14730 CRC                   57D2914C (1473417548)\n-14734 Compressed Size       000024D7 (9431)\n-14738 Uncompressed Size     0000CCAC (52396)\n-1473C Filename Length       0035 (53)\n-1473E Extra Length          0000 (0)\n-14740 Comment Length        0000 (0)\n-14742 Disk Start            0000 (0)\n-14744 Int File Attributes   0000 (0)\n+1493B Compression Method    0008 (8) 'Deflated'\n+1493D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14941 CRC                   D413AF69 (3558059881)\n+14945 Compressed Size       00002503 (9475)\n+14949 Uncompressed Size     0000D22D (53805)\n+1494D Filename Length       0035 (53)\n+1494F Extra Length          0000 (0)\n+14951 Comment Length        0000 (0)\n+14953 Disk Start            0000 (0)\n+14955 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14746 Ext File Attributes   81A40000 (2175008768)\n+14957 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-1474A Local Header Offset   00005810 (22544)\n-1474E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1495B Local Header Offset   00005871 (22641)\n+1495F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1474E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1495F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14783 CENTRAL HEADER #28    02014B50 (33639248)\n-14787 Created Zip Spec      14 (20) '2.0'\n-14788 Created OS            03 (3) 'Unix'\n-14789 Extract Zip Spec      14 (20) '2.0'\n-1478A Extract OS            00 (0) 'MS-DOS'\n-1478B General Purpose Flag  0800 (2048)\n+14994 CENTRAL HEADER #28    02014B50 (33639248)\n+14998 Created Zip Spec      14 (20) '2.0'\n+14999 Created OS            03 (3) 'Unix'\n+1499A Extract Zip Spec      14 (20) '2.0'\n+1499B Extract OS            00 (0) 'MS-DOS'\n+1499C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1478D Compression Method    0008 (8) 'Deflated'\n-1478F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14793 CRC                   BB643DBD (3143908797)\n-14797 Compressed Size       00000257 (599)\n-1479B Uncompressed Size     0000046C (1132)\n-1479F Filename Length       0046 (70)\n-147A1 Extra Length          0000 (0)\n-147A3 Comment Length        0000 (0)\n-147A5 Disk Start            0000 (0)\n-147A7 Int File Attributes   0000 (0)\n+1499E Compression Method    0008 (8) 'Deflated'\n+149A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+149A4 CRC                   E174331E (3782488862)\n+149A8 Compressed Size       0000025F (607)\n+149AC Uncompressed Size     0000048E (1166)\n+149B0 Filename Length       0046 (70)\n+149B2 Extra Length          0000 (0)\n+149B4 Comment Length        0000 (0)\n+149B6 Disk Start            0000 (0)\n+149B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-147A9 Ext File Attributes   81A40000 (2175008768)\n+149BA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-147AD Local Header Offset   00007D3A (32058)\n-147B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+149BE Local Header Offset   00007DC7 (32199)\n+149C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x147B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x149C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-147F7 CENTRAL HEADER #29    02014B50 (33639248)\n-147FB Created Zip Spec      14 (20) '2.0'\n-147FC Created OS            03 (3) 'Unix'\n-147FD Extract Zip Spec      14 (20) '2.0'\n-147FE Extract OS            00 (0) 'MS-DOS'\n-147FF General Purpose Flag  0800 (2048)\n+14A08 CENTRAL HEADER #29    02014B50 (33639248)\n+14A0C Created Zip Spec      14 (20) '2.0'\n+14A0D Created OS            03 (3) 'Unix'\n+14A0E Extract Zip Spec      14 (20) '2.0'\n+14A0F Extract OS            00 (0) 'MS-DOS'\n+14A10 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14801 Compression Method    0008 (8) 'Deflated'\n-14803 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14807 CRC                   272CCF3E (657248062)\n-1480B Compressed Size       000003AC (940)\n-1480F Uncompressed Size     000009E5 (2533)\n-14813 Filename Length       003F (63)\n-14815 Extra Length          0000 (0)\n-14817 Comment Length        0000 (0)\n-14819 Disk Start            0000 (0)\n-1481B Int File Attributes   0000 (0)\n+14A12 Compression Method    0008 (8) 'Deflated'\n+14A14 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14A18 CRC                   FC3CBC13 (4231838739)\n+14A1C Compressed Size       000003B6 (950)\n+14A20 Uncompressed Size     00000A37 (2615)\n+14A24 Filename Length       003F (63)\n+14A26 Extra Length          0000 (0)\n+14A28 Comment Length        0000 (0)\n+14A2A Disk Start            0000 (0)\n+14A2C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1481D Ext File Attributes   81A40000 (2175008768)\n+14A2E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14821 Local Header Offset   00007FF5 (32757)\n-14825 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14A32 Local Header Offset   0000808A (32906)\n+14A36 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14825: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14A36: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14864 CENTRAL HEADER #30    02014B50 (33639248)\n-14868 Created Zip Spec      14 (20) '2.0'\n-14869 Created OS            03 (3) 'Unix'\n-1486A Extract Zip Spec      14 (20) '2.0'\n-1486B Extract OS            00 (0) 'MS-DOS'\n-1486C General Purpose Flag  0800 (2048)\n+14A75 CENTRAL HEADER #30    02014B50 (33639248)\n+14A79 Created Zip Spec      14 (20) '2.0'\n+14A7A Created OS            03 (3) 'Unix'\n+14A7B Extract Zip Spec      14 (20) '2.0'\n+14A7C Extract OS            00 (0) 'MS-DOS'\n+14A7D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1486E Compression Method    0008 (8) 'Deflated'\n-14870 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14874 CRC                   A2DFDA9A (2732579482)\n-14878 Compressed Size       00000855 (2133)\n-1487C Uncompressed Size     000023FC (9212)\n-14880 Filename Length       0048 (72)\n-14882 Extra Length          0000 (0)\n-14884 Comment Length        0000 (0)\n-14886 Disk Start            0000 (0)\n-14888 Int File Attributes   0000 (0)\n+14A7F Compression Method    0008 (8) 'Deflated'\n+14A81 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14A85 CRC                   A83ED6AA (2822690474)\n+14A89 Compressed Size       00000868 (2152)\n+14A8D Uncompressed Size     00002555 (9557)\n+14A91 Filename Length       0048 (72)\n+14A93 Extra Length          0000 (0)\n+14A95 Comment Length        0000 (0)\n+14A97 Disk Start            0000 (0)\n+14A99 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1488A Ext File Attributes   81A40000 (2175008768)\n+14A9B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-1488E Local Header Offset   000083FE (33790)\n-14892 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14A9F Local Header Offset   0000849D (33949)\n+14AA3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14892: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14AA3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-148DA CENTRAL HEADER #31    02014B50 (33639248)\n-148DE Created Zip Spec      14 (20) '2.0'\n-148DF Created OS            03 (3) 'Unix'\n-148E0 Extract Zip Spec      14 (20) '2.0'\n-148E1 Extract OS            00 (0) 'MS-DOS'\n-148E2 General Purpose Flag  0800 (2048)\n+14AEB CENTRAL HEADER #31    02014B50 (33639248)\n+14AEF Created Zip Spec      14 (20) '2.0'\n+14AF0 Created OS            03 (3) 'Unix'\n+14AF1 Extract Zip Spec      14 (20) '2.0'\n+14AF2 Extract OS            00 (0) 'MS-DOS'\n+14AF3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-148E4 Compression Method    0008 (8) 'Deflated'\n-148E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-148EA CRC                   99D438F5 (2580822261)\n-148EE Compressed Size       00000677 (1655)\n-148F2 Uncompressed Size     00001582 (5506)\n-148F6 Filename Length       0045 (69)\n-148F8 Extra Length          0000 (0)\n-148FA Comment Length        0000 (0)\n-148FC Disk Start            0000 (0)\n-148FE Int File Attributes   0000 (0)\n+14AF5 Compression Method    0008 (8) 'Deflated'\n+14AF7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14AFB CRC                   E160ED1C (3781225756)\n+14AFF Compressed Size       00000686 (1670)\n+14B03 Uncompressed Size     00001657 (5719)\n+14B07 Filename Length       0045 (69)\n+14B09 Extra Length          0000 (0)\n+14B0B Comment Length        0000 (0)\n+14B0D Disk Start            0000 (0)\n+14B0F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14900 Ext File Attributes   81A40000 (2175008768)\n+14B11 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14904 Local Header Offset   00008CB9 (36025)\n-14908 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14B15 Local Header Offset   00008D6B (36203)\n+14B19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14908: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14B19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1494D CENTRAL HEADER #32    02014B50 (33639248)\n-14951 Created Zip Spec      14 (20) '2.0'\n-14952 Created OS            03 (3) 'Unix'\n-14953 Extract Zip Spec      14 (20) '2.0'\n-14954 Extract OS            00 (0) 'MS-DOS'\n-14955 General Purpose Flag  0800 (2048)\n+14B5E CENTRAL HEADER #32    02014B50 (33639248)\n+14B62 Created Zip Spec      14 (20) '2.0'\n+14B63 Created OS            03 (3) 'Unix'\n+14B64 Extract Zip Spec      14 (20) '2.0'\n+14B65 Extract OS            00 (0) 'MS-DOS'\n+14B66 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14957 Compression Method    0008 (8) 'Deflated'\n-14959 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1495D CRC                   348CD6A3 (881645219)\n-14961 Compressed Size       0000050A (1290)\n-14965 Uncompressed Size     00001009 (4105)\n-14969 Filename Length       0048 (72)\n-1496B Extra Length          0000 (0)\n-1496D Comment Length        0000 (0)\n-1496F Disk Start            0000 (0)\n-14971 Int File Attributes   0000 (0)\n+14B68 Compression Method    0008 (8) 'Deflated'\n+14B6A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14B6E CRC                   156605D7 (359007703)\n+14B72 Compressed Size       00000516 (1302)\n+14B76 Uncompressed Size     000010AA (4266)\n+14B7A Filename Length       0048 (72)\n+14B7C Extra Length          0000 (0)\n+14B7E Comment Length        0000 (0)\n+14B80 Disk Start            0000 (0)\n+14B82 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14973 Ext File Attributes   81A40000 (2175008768)\n+14B84 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14977 Local Header Offset   00009393 (37779)\n-1497B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14B88 Local Header Offset   00009454 (37972)\n+14B8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1497B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14B8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-149C3 CENTRAL HEADER #33    02014B50 (33639248)\n-149C7 Created Zip Spec      14 (20) '2.0'\n-149C8 Created OS            03 (3) 'Unix'\n-149C9 Extract Zip Spec      14 (20) '2.0'\n-149CA Extract OS            00 (0) 'MS-DOS'\n-149CB General Purpose Flag  0800 (2048)\n+14BD4 CENTRAL HEADER #33    02014B50 (33639248)\n+14BD8 Created Zip Spec      14 (20) '2.0'\n+14BD9 Created OS            03 (3) 'Unix'\n+14BDA Extract Zip Spec      14 (20) '2.0'\n+14BDB Extract OS            00 (0) 'MS-DOS'\n+14BDC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-149CD Compression Method    0008 (8) 'Deflated'\n-149CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-149D3 CRC                   C2D529E3 (3268749795)\n-149D7 Compressed Size       000006A6 (1702)\n-149DB Uncompressed Size     00001A83 (6787)\n-149DF Filename Length       0046 (70)\n-149E1 Extra Length          0000 (0)\n-149E3 Comment Length        0000 (0)\n-149E5 Disk Start            0000 (0)\n-149E7 Int File Attributes   0000 (0)\n+14BDE Compression Method    0008 (8) 'Deflated'\n+14BE0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14BE4 CRC                   67C26956 (1740794198)\n+14BE8 Compressed Size       000006B3 (1715)\n+14BEC Uncompressed Size     00001B93 (7059)\n+14BF0 Filename Length       0046 (70)\n+14BF2 Extra Length          0000 (0)\n+14BF4 Comment Length        0000 (0)\n+14BF6 Disk Start            0000 (0)\n+14BF8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-149E9 Ext File Attributes   81A40000 (2175008768)\n+14BFA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-149ED Local Header Offset   00009903 (39171)\n-149F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14BFE Local Header Offset   000099D0 (39376)\n+14C02 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x149F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14C02: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14A37 CENTRAL HEADER #34    02014B50 (33639248)\n-14A3B Created Zip Spec      14 (20) '2.0'\n-14A3C Created OS            03 (3) 'Unix'\n-14A3D Extract Zip Spec      14 (20) '2.0'\n-14A3E Extract OS            00 (0) 'MS-DOS'\n-14A3F General Purpose Flag  0800 (2048)\n+14C48 CENTRAL HEADER #34    02014B50 (33639248)\n+14C4C Created Zip Spec      14 (20) '2.0'\n+14C4D Created OS            03 (3) 'Unix'\n+14C4E Extract Zip Spec      14 (20) '2.0'\n+14C4F Extract OS            00 (0) 'MS-DOS'\n+14C50 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14A41 Compression Method    0008 (8) 'Deflated'\n-14A43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14A47 CRC                   E72A3EBF (3878305471)\n-14A4B Compressed Size       00000654 (1620)\n-14A4F Uncompressed Size     00001A6F (6767)\n-14A53 Filename Length       0042 (66)\n-14A55 Extra Length          0000 (0)\n-14A57 Comment Length        0000 (0)\n-14A59 Disk Start            0000 (0)\n-14A5B Int File Attributes   0000 (0)\n+14C52 Compression Method    0008 (8) 'Deflated'\n+14C54 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14C58 CRC                   46796056 (1182359638)\n+14C5C Compressed Size       00000661 (1633)\n+14C60 Uncompressed Size     00001B45 (6981)\n+14C64 Filename Length       0042 (66)\n+14C66 Extra Length          0000 (0)\n+14C68 Comment Length        0000 (0)\n+14C6A Disk Start            0000 (0)\n+14C6C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14A5D Ext File Attributes   81A40000 (2175008768)\n+14C6E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14A61 Local Header Offset   0000A00D (40973)\n-14A65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14C72 Local Header Offset   0000A0E7 (41191)\n+14C76 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14A65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14C76: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14AA7 CENTRAL HEADER #35    02014B50 (33639248)\n-14AAB Created Zip Spec      14 (20) '2.0'\n-14AAC Created OS            03 (3) 'Unix'\n-14AAD Extract Zip Spec      14 (20) '2.0'\n-14AAE Extract OS            00 (0) 'MS-DOS'\n-14AAF General Purpose Flag  0800 (2048)\n+14CB8 CENTRAL HEADER #35    02014B50 (33639248)\n+14CBC Created Zip Spec      14 (20) '2.0'\n+14CBD Created OS            03 (3) 'Unix'\n+14CBE Extract Zip Spec      14 (20) '2.0'\n+14CBF Extract OS            00 (0) 'MS-DOS'\n+14CC0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14AB1 Compression Method    0008 (8) 'Deflated'\n-14AB3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14AB7 CRC                   1CF76EFC (485977852)\n-14ABB Compressed Size       0000030B (779)\n-14ABF Uncompressed Size     00000749 (1865)\n-14AC3 Filename Length       003F (63)\n-14AC5 Extra Length          0000 (0)\n-14AC7 Comment Length        0000 (0)\n-14AC9 Disk Start            0000 (0)\n-14ACB Int File Attributes   0000 (0)\n+14CC2 Compression Method    0008 (8) 'Deflated'\n+14CC4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14CC8 CRC                   C694724C (3331617356)\n+14CCC Compressed Size       00000316 (790)\n+14CD0 Uncompressed Size     00000788 (1928)\n+14CD4 Filename Length       003F (63)\n+14CD6 Extra Length          0000 (0)\n+14CD8 Comment Length        0000 (0)\n+14CDA Disk Start            0000 (0)\n+14CDC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14ACD Ext File Attributes   81A40000 (2175008768)\n+14CDE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14AD1 Local Header Offset   0000A6C1 (42689)\n-14AD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14CE2 Local Header Offset   0000A7A8 (42920)\n+14CE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14AD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14CE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14B14 CENTRAL HEADER #36    02014B50 (33639248)\n-14B18 Created Zip Spec      14 (20) '2.0'\n-14B19 Created OS            03 (3) 'Unix'\n-14B1A Extract Zip Spec      14 (20) '2.0'\n-14B1B Extract OS            00 (0) 'MS-DOS'\n-14B1C General Purpose Flag  0800 (2048)\n+14D25 CENTRAL HEADER #36    02014B50 (33639248)\n+14D29 Created Zip Spec      14 (20) '2.0'\n+14D2A Created OS            03 (3) 'Unix'\n+14D2B Extract Zip Spec      14 (20) '2.0'\n+14D2C Extract OS            00 (0) 'MS-DOS'\n+14D2D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14B1E Compression Method    0008 (8) 'Deflated'\n-14B20 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14B24 CRC                   187BA855 (410757205)\n-14B28 Compressed Size       000004B9 (1209)\n-14B2C Uncompressed Size     000010FE (4350)\n-14B30 Filename Length       0043 (67)\n-14B32 Extra Length          0000 (0)\n-14B34 Comment Length        0000 (0)\n-14B36 Disk Start            0000 (0)\n-14B38 Int File Attributes   0000 (0)\n+14D2F Compression Method    0008 (8) 'Deflated'\n+14D31 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14D35 CRC                   E2414032 (3795927090)\n+14D39 Compressed Size       000004C3 (1219)\n+14D3D Uncompressed Size     0000118B (4491)\n+14D41 Filename Length       0043 (67)\n+14D43 Extra Length          0000 (0)\n+14D45 Comment Length        0000 (0)\n+14D47 Disk Start            0000 (0)\n+14D49 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14B3A Ext File Attributes   81A40000 (2175008768)\n+14D4B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14B3E Local Header Offset   0000AA29 (43561)\n-14B42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14D4F Local Header Offset   0000AB1B (43803)\n+14D53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14B42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14D53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14B85 CENTRAL HEADER #37    02014B50 (33639248)\n-14B89 Created Zip Spec      14 (20) '2.0'\n-14B8A Created OS            03 (3) 'Unix'\n-14B8B Extract Zip Spec      14 (20) '2.0'\n-14B8C Extract OS            00 (0) 'MS-DOS'\n-14B8D General Purpose Flag  0800 (2048)\n+14D96 CENTRAL HEADER #37    02014B50 (33639248)\n+14D9A Created Zip Spec      14 (20) '2.0'\n+14D9B Created OS            03 (3) 'Unix'\n+14D9C Extract Zip Spec      14 (20) '2.0'\n+14D9D Extract OS            00 (0) 'MS-DOS'\n+14D9E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14B8F Compression Method    0008 (8) 'Deflated'\n-14B91 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14B95 CRC                   D7A41DAE (3617856942)\n-14B99 Compressed Size       00000488 (1160)\n-14B9D Uncompressed Size     00000D3D (3389)\n-14BA1 Filename Length       003F (63)\n-14BA3 Extra Length          0000 (0)\n-14BA5 Comment Length        0000 (0)\n-14BA7 Disk Start            0000 (0)\n-14BA9 Int File Attributes   0000 (0)\n+14DA0 Compression Method    0008 (8) 'Deflated'\n+14DA2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14DA6 CRC                   85CF6764 (2244962148)\n+14DAA Compressed Size       00000494 (1172)\n+14DAE Uncompressed Size     00000DB3 (3507)\n+14DB2 Filename Length       003F (63)\n+14DB4 Extra Length          0000 (0)\n+14DB6 Comment Length        0000 (0)\n+14DB8 Disk Start            0000 (0)\n+14DBA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14BAB Ext File Attributes   81A40000 (2175008768)\n+14DBC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14BAF Local Header Offset   0000AF43 (44867)\n-14BB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14DC0 Local Header Offset   0000B03F (45119)\n+14DC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14BB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14DC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14BF2 CENTRAL HEADER #38    02014B50 (33639248)\n-14BF6 Created Zip Spec      14 (20) '2.0'\n-14BF7 Created OS            03 (3) 'Unix'\n-14BF8 Extract Zip Spec      14 (20) '2.0'\n-14BF9 Extract OS            00 (0) 'MS-DOS'\n-14BFA General Purpose Flag  0800 (2048)\n+14E03 CENTRAL HEADER #38    02014B50 (33639248)\n+14E07 Created Zip Spec      14 (20) '2.0'\n+14E08 Created OS            03 (3) 'Unix'\n+14E09 Extract Zip Spec      14 (20) '2.0'\n+14E0A Extract OS            00 (0) 'MS-DOS'\n+14E0B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14BFC Compression Method    0008 (8) 'Deflated'\n-14BFE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14C02 CRC                   F1C1369F (4055971487)\n-14C06 Compressed Size       000004F0 (1264)\n-14C0A Uncompressed Size     000010CF (4303)\n-14C0E Filename Length       0045 (69)\n-14C10 Extra Length          0000 (0)\n-14C12 Comment Length        0000 (0)\n-14C14 Disk Start            0000 (0)\n-14C16 Int File Attributes   0000 (0)\n+14E0D Compression Method    0008 (8) 'Deflated'\n+14E0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14E13 CRC                   D26D2315 (3530367765)\n+14E17 Compressed Size       000004FD (1277)\n+14E1B Uncompressed Size     0000115F (4447)\n+14E1F Filename Length       0045 (69)\n+14E21 Extra Length          0000 (0)\n+14E23 Comment Length        0000 (0)\n+14E25 Disk Start            0000 (0)\n+14E27 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14C18 Ext File Attributes   81A40000 (2175008768)\n+14E29 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14C1C Local Header Offset   0000B428 (46120)\n-14C20 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14E2D Local Header Offset   0000B530 (46384)\n+14E31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14C20: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14E31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14C65 CENTRAL HEADER #39    02014B50 (33639248)\n-14C69 Created Zip Spec      14 (20) '2.0'\n-14C6A Created OS            03 (3) 'Unix'\n-14C6B Extract Zip Spec      14 (20) '2.0'\n-14C6C Extract OS            00 (0) 'MS-DOS'\n-14C6D General Purpose Flag  0800 (2048)\n+14E76 CENTRAL HEADER #39    02014B50 (33639248)\n+14E7A Created Zip Spec      14 (20) '2.0'\n+14E7B Created OS            03 (3) 'Unix'\n+14E7C Extract Zip Spec      14 (20) '2.0'\n+14E7D Extract OS            00 (0) 'MS-DOS'\n+14E7E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14C6F Compression Method    0008 (8) 'Deflated'\n-14C71 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14C75 CRC                   B12B8896 (2972420246)\n-14C79 Compressed Size       000005FF (1535)\n-14C7D Uncompressed Size     000017E3 (6115)\n-14C81 Filename Length       003D (61)\n-14C83 Extra Length          0000 (0)\n-14C85 Comment Length        0000 (0)\n-14C87 Disk Start            0000 (0)\n-14C89 Int File Attributes   0000 (0)\n+14E80 Compression Method    0008 (8) 'Deflated'\n+14E82 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14E86 CRC                   F796C627 (4153853479)\n+14E8A Compressed Size       0000060E (1550)\n+14E8E Uncompressed Size     000018D0 (6352)\n+14E92 Filename Length       003D (61)\n+14E94 Extra Length          0000 (0)\n+14E96 Comment Length        0000 (0)\n+14E98 Disk Start            0000 (0)\n+14E9A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14C8B Ext File Attributes   81A40000 (2175008768)\n+14E9C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14C8F Local Header Offset   0000B97B (47483)\n-14C93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14EA0 Local Header Offset   0000BA90 (47760)\n+14EA4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14C93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14EA4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14CD0 CENTRAL HEADER #40    02014B50 (33639248)\n-14CD4 Created Zip Spec      14 (20) '2.0'\n-14CD5 Created OS            03 (3) 'Unix'\n-14CD6 Extract Zip Spec      14 (20) '2.0'\n-14CD7 Extract OS            00 (0) 'MS-DOS'\n-14CD8 General Purpose Flag  0800 (2048)\n+14EE1 CENTRAL HEADER #40    02014B50 (33639248)\n+14EE5 Created Zip Spec      14 (20) '2.0'\n+14EE6 Created OS            03 (3) 'Unix'\n+14EE7 Extract Zip Spec      14 (20) '2.0'\n+14EE8 Extract OS            00 (0) 'MS-DOS'\n+14EE9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14CDA Compression Method    0008 (8) 'Deflated'\n-14CDC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14CE0 CRC                   04D43ED1 (81018577)\n-14CE4 Compressed Size       00000432 (1074)\n-14CE8 Uncompressed Size     00000D84 (3460)\n-14CEC Filename Length       003D (61)\n-14CEE Extra Length          0000 (0)\n-14CF0 Comment Length        0000 (0)\n-14CF2 Disk Start            0000 (0)\n-14CF4 Int File Attributes   0000 (0)\n+14EEB Compression Method    0008 (8) 'Deflated'\n+14EED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14EF1 CRC                   EB12A7F1 (3943868401)\n+14EF5 Compressed Size       0000043E (1086)\n+14EF9 Uncompressed Size     00000E08 (3592)\n+14EFD Filename Length       003D (61)\n+14EFF Extra Length          0000 (0)\n+14F01 Comment Length        0000 (0)\n+14F03 Disk Start            0000 (0)\n+14F05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14CF6 Ext File Attributes   81A40000 (2175008768)\n+14F07 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14CFA Local Header Offset   0000BFD5 (49109)\n-14CFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14F0B Local Header Offset   0000C0F9 (49401)\n+14F0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14CFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14F0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14D3B CENTRAL HEADER #41    02014B50 (33639248)\n-14D3F Created Zip Spec      14 (20) '2.0'\n-14D40 Created OS            03 (3) 'Unix'\n-14D41 Extract Zip Spec      14 (20) '2.0'\n-14D42 Extract OS            00 (0) 'MS-DOS'\n-14D43 General Purpose Flag  0800 (2048)\n+14F4C CENTRAL HEADER #41    02014B50 (33639248)\n+14F50 Created Zip Spec      14 (20) '2.0'\n+14F51 Created OS            03 (3) 'Unix'\n+14F52 Extract Zip Spec      14 (20) '2.0'\n+14F53 Extract OS            00 (0) 'MS-DOS'\n+14F54 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14D45 Compression Method    0008 (8) 'Deflated'\n-14D47 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14D4B CRC                   05580F75 (89657205)\n-14D4F Compressed Size       0000048A (1162)\n-14D53 Uncompressed Size     00000EA4 (3748)\n-14D57 Filename Length       003E (62)\n-14D59 Extra Length          0000 (0)\n-14D5B Comment Length        0000 (0)\n-14D5D Disk Start            0000 (0)\n-14D5F Int File Attributes   0000 (0)\n+14F56 Compression Method    0008 (8) 'Deflated'\n+14F58 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14F5C CRC                   F5A79DAF (4121402799)\n+14F60 Compressed Size       00000495 (1173)\n+14F64 Uncompressed Size     00000F2D (3885)\n+14F68 Filename Length       003E (62)\n+14F6A Extra Length          0000 (0)\n+14F6C Comment Length        0000 (0)\n+14F6E Disk Start            0000 (0)\n+14F70 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14D61 Ext File Attributes   81A40000 (2175008768)\n+14F72 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14D65 Local Header Offset   0000C462 (50274)\n-14D69 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14F76 Local Header Offset   0000C592 (50578)\n+14F7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14D69: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14F7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14DA7 CENTRAL HEADER #42    02014B50 (33639248)\n-14DAB Created Zip Spec      14 (20) '2.0'\n-14DAC Created OS            03 (3) 'Unix'\n-14DAD Extract Zip Spec      14 (20) '2.0'\n-14DAE Extract OS            00 (0) 'MS-DOS'\n-14DAF General Purpose Flag  0800 (2048)\n+14FB8 CENTRAL HEADER #42    02014B50 (33639248)\n+14FBC Created Zip Spec      14 (20) '2.0'\n+14FBD Created OS            03 (3) 'Unix'\n+14FBE Extract Zip Spec      14 (20) '2.0'\n+14FBF Extract OS            00 (0) 'MS-DOS'\n+14FC0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14DB1 Compression Method    0008 (8) 'Deflated'\n-14DB3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14DB7 CRC                   D6497204 (3595137540)\n-14DBB Compressed Size       000008AA (2218)\n-14DBF Uncompressed Size     00002746 (10054)\n-14DC3 Filename Length       003F (63)\n-14DC5 Extra Length          0000 (0)\n-14DC7 Comment Length        0000 (0)\n-14DC9 Disk Start            0000 (0)\n-14DCB Int File Attributes   0000 (0)\n+14FC2 Compression Method    0008 (8) 'Deflated'\n+14FC4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14FC8 CRC                   24F4C726 (620021542)\n+14FCC Compressed Size       000008BD (2237)\n+14FD0 Uncompressed Size     000028F1 (10481)\n+14FD4 Filename Length       003F (63)\n+14FD6 Extra Length          0000 (0)\n+14FD8 Comment Length        0000 (0)\n+14FDA Disk Start            0000 (0)\n+14FDC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14DCD Ext File Attributes   81A40000 (2175008768)\n+14FDE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14DD1 Local Header Offset   0000C948 (51528)\n-14DD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14FE2 Local Header Offset   0000CA83 (51843)\n+14FE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14DD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14FE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14E14 CENTRAL HEADER #43    02014B50 (33639248)\n-14E18 Created Zip Spec      14 (20) '2.0'\n-14E19 Created OS            03 (3) 'Unix'\n-14E1A Extract Zip Spec      14 (20) '2.0'\n-14E1B Extract OS            00 (0) 'MS-DOS'\n-14E1C General Purpose Flag  0800 (2048)\n+15025 CENTRAL HEADER #43    02014B50 (33639248)\n+15029 Created Zip Spec      14 (20) '2.0'\n+1502A Created OS            03 (3) 'Unix'\n+1502B Extract Zip Spec      14 (20) '2.0'\n+1502C Extract OS            00 (0) 'MS-DOS'\n+1502D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14E1E Compression Method    0008 (8) 'Deflated'\n-14E20 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14E24 CRC                   1ADB9373 (450597747)\n-14E28 Compressed Size       000006B0 (1712)\n-14E2C Uncompressed Size     00001A82 (6786)\n-14E30 Filename Length       003F (63)\n-14E32 Extra Length          0000 (0)\n-14E34 Comment Length        0000 (0)\n-14E36 Disk Start            0000 (0)\n-14E38 Int File Attributes   0000 (0)\n+1502F Compression Method    0008 (8) 'Deflated'\n+15031 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15035 CRC                   35C5DEAF (902160047)\n+15039 Compressed Size       000006C1 (1729)\n+1503D Uncompressed Size     00001BA7 (7079)\n+15041 Filename Length       003F (63)\n+15043 Extra Length          0000 (0)\n+15045 Comment Length        0000 (0)\n+15047 Disk Start            0000 (0)\n+15049 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14E3A Ext File Attributes   81A40000 (2175008768)\n+1504B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14E3E Local Header Offset   0000D24F (53839)\n-14E42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1504F Local Header Offset   0000D39D (54173)\n+15053 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14E42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15053: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14E81 CENTRAL HEADER #44    02014B50 (33639248)\n-14E85 Created Zip Spec      14 (20) '2.0'\n-14E86 Created OS            03 (3) 'Unix'\n-14E87 Extract Zip Spec      14 (20) '2.0'\n-14E88 Extract OS            00 (0) 'MS-DOS'\n-14E89 General Purpose Flag  0800 (2048)\n+15092 CENTRAL HEADER #44    02014B50 (33639248)\n+15096 Created Zip Spec      14 (20) '2.0'\n+15097 Created OS            03 (3) 'Unix'\n+15098 Extract Zip Spec      14 (20) '2.0'\n+15099 Extract OS            00 (0) 'MS-DOS'\n+1509A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14E8B Compression Method    0008 (8) 'Deflated'\n-14E8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14E91 CRC                   41505507 (1095783687)\n-14E95 Compressed Size       00000551 (1361)\n-14E99 Uncompressed Size     00001224 (4644)\n-14E9D Filename Length       0040 (64)\n-14E9F Extra Length          0000 (0)\n-14EA1 Comment Length        0000 (0)\n-14EA3 Disk Start            0000 (0)\n-14EA5 Int File Attributes   0000 (0)\n+1509C Compression Method    0008 (8) 'Deflated'\n+1509E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+150A2 CRC                   4C4BC15C (1280033116)\n+150A6 Compressed Size       00000560 (1376)\n+150AA Uncompressed Size     000012C9 (4809)\n+150AE Filename Length       0040 (64)\n+150B0 Extra Length          0000 (0)\n+150B2 Comment Length        0000 (0)\n+150B4 Disk Start            0000 (0)\n+150B6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14EA7 Ext File Attributes   81A40000 (2175008768)\n+150B8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14EAB Local Header Offset   0000D95C (55644)\n-14EAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+150BC Local Header Offset   0000DABB (55995)\n+150C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14EAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x150C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14EEF CENTRAL HEADER #45    02014B50 (33639248)\n-14EF3 Created Zip Spec      14 (20) '2.0'\n-14EF4 Created OS            03 (3) 'Unix'\n-14EF5 Extract Zip Spec      14 (20) '2.0'\n-14EF6 Extract OS            00 (0) 'MS-DOS'\n-14EF7 General Purpose Flag  0800 (2048)\n+15100 CENTRAL HEADER #45    02014B50 (33639248)\n+15104 Created Zip Spec      14 (20) '2.0'\n+15105 Created OS            03 (3) 'Unix'\n+15106 Extract Zip Spec      14 (20) '2.0'\n+15107 Extract OS            00 (0) 'MS-DOS'\n+15108 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14EF9 Compression Method    0008 (8) 'Deflated'\n-14EFB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14EFF CRC                   C452CFCB (3293761483)\n-14F03 Compressed Size       00000902 (2306)\n-14F07 Uncompressed Size     000025C2 (9666)\n-14F0B Filename Length       003F (63)\n-14F0D Extra Length          0000 (0)\n-14F0F Comment Length        0000 (0)\n-14F11 Disk Start            0000 (0)\n-14F13 Int File Attributes   0000 (0)\n+1510A Compression Method    0008 (8) 'Deflated'\n+1510C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15110 CRC                   3875CC22 (947244066)\n+15114 Compressed Size       00000914 (2324)\n+15118 Uncompressed Size     00002741 (10049)\n+1511C Filename Length       003F (63)\n+1511E Extra Length          0000 (0)\n+15120 Comment Length        0000 (0)\n+15122 Disk Start            0000 (0)\n+15124 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14F15 Ext File Attributes   81A40000 (2175008768)\n+15126 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14F19 Local Header Offset   0000DF0B (57099)\n-14F1D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1512A Local Header Offset   0000E079 (57465)\n+1512E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14F1D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1512E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14F5C CENTRAL HEADER #46    02014B50 (33639248)\n-14F60 Created Zip Spec      14 (20) '2.0'\n-14F61 Created OS            03 (3) 'Unix'\n-14F62 Extract Zip Spec      14 (20) '2.0'\n-14F63 Extract OS            00 (0) 'MS-DOS'\n-14F64 General Purpose Flag  0800 (2048)\n+1516D CENTRAL HEADER #46    02014B50 (33639248)\n+15171 Created Zip Spec      14 (20) '2.0'\n+15172 Created OS            03 (3) 'Unix'\n+15173 Extract Zip Spec      14 (20) '2.0'\n+15174 Extract OS            00 (0) 'MS-DOS'\n+15175 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14F66 Compression Method    0008 (8) 'Deflated'\n-14F68 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14F6C CRC                   FCF57B8C (4243946380)\n-14F70 Compressed Size       000004F1 (1265)\n-14F74 Uncompressed Size     00001158 (4440)\n-14F78 Filename Length       003E (62)\n-14F7A Extra Length          0000 (0)\n-14F7C Comment Length        0000 (0)\n-14F7E Disk Start            0000 (0)\n-14F80 Int File Attributes   0000 (0)\n+15177 Compression Method    0008 (8) 'Deflated'\n+15179 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1517D CRC                   5053B7A1 (1347663777)\n+15181 Compressed Size       000004FE (1278)\n+15185 Uncompressed Size     000011F9 (4601)\n+15189 Filename Length       003E (62)\n+1518B Extra Length          0000 (0)\n+1518D Comment Length        0000 (0)\n+1518F Disk Start            0000 (0)\n+15191 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14F82 Ext File Attributes   81A40000 (2175008768)\n+15193 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14F86 Local Header Offset   0000E86A (59498)\n-14F8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15197 Local Header Offset   0000E9EA (59882)\n+1519B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14F8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1519B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-14FC8 CENTRAL HEADER #47    02014B50 (33639248)\n-14FCC Created Zip Spec      14 (20) '2.0'\n-14FCD Created OS            03 (3) 'Unix'\n-14FCE Extract Zip Spec      14 (20) '2.0'\n-14FCF Extract OS            00 (0) 'MS-DOS'\n-14FD0 General Purpose Flag  0800 (2048)\n+151D9 CENTRAL HEADER #47    02014B50 (33639248)\n+151DD Created Zip Spec      14 (20) '2.0'\n+151DE Created OS            03 (3) 'Unix'\n+151DF Extract Zip Spec      14 (20) '2.0'\n+151E0 Extract OS            00 (0) 'MS-DOS'\n+151E1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14FD2 Compression Method    0008 (8) 'Deflated'\n-14FD4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14FD8 CRC                   93AEE0AC (2477711532)\n-14FDC Compressed Size       00000247 (583)\n-14FE0 Uncompressed Size     0000040A (1034)\n-14FE4 Filename Length       003C (60)\n-14FE6 Extra Length          0000 (0)\n-14FE8 Comment Length        0000 (0)\n-14FEA Disk Start            0000 (0)\n-14FEC Int File Attributes   0000 (0)\n+151E3 Compression Method    0008 (8) 'Deflated'\n+151E5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+151E9 CRC                   AA9A314A (2862231882)\n+151ED Compressed Size       0000024C (588)\n+151F1 Uncompressed Size     0000041E (1054)\n+151F5 Filename Length       003C (60)\n+151F7 Extra Length          0000 (0)\n+151F9 Comment Length        0000 (0)\n+151FB Disk Start            0000 (0)\n+151FD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-14FEE Ext File Attributes   81A40000 (2175008768)\n+151FF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-14FF2 Local Header Offset   0000EDB7 (60855)\n-14FF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15203 Local Header Offset   0000EF44 (61252)\n+15207 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14FF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15207: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15032 CENTRAL HEADER #48    02014B50 (33639248)\n-15036 Created Zip Spec      14 (20) '2.0'\n-15037 Created OS            03 (3) 'Unix'\n-15038 Extract Zip Spec      14 (20) '2.0'\n-15039 Extract OS            00 (0) 'MS-DOS'\n-1503A General Purpose Flag  0800 (2048)\n+15243 CENTRAL HEADER #48    02014B50 (33639248)\n+15247 Created Zip Spec      14 (20) '2.0'\n+15248 Created OS            03 (3) 'Unix'\n+15249 Extract Zip Spec      14 (20) '2.0'\n+1524A Extract OS            00 (0) 'MS-DOS'\n+1524B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1503C Compression Method    0008 (8) 'Deflated'\n-1503E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15042 CRC                   7A3B23D9 (2050696153)\n-15046 Compressed Size       0000026C (620)\n-1504A Uncompressed Size     00000479 (1145)\n-1504E Filename Length       003D (61)\n-15050 Extra Length          0000 (0)\n-15052 Comment Length        0000 (0)\n-15054 Disk Start            0000 (0)\n-15056 Int File Attributes   0000 (0)\n+1524D Compression Method    0008 (8) 'Deflated'\n+1524F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15253 CRC                   7C75425F (2088059487)\n+15257 Compressed Size       00000274 (628)\n+1525B Uncompressed Size     00000499 (1177)\n+1525F Filename Length       003D (61)\n+15261 Extra Length          0000 (0)\n+15263 Comment Length        0000 (0)\n+15265 Disk Start            0000 (0)\n+15267 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-15058 Ext File Attributes   81A40000 (2175008768)\n+15269 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-1505C Local Header Offset   0000F058 (61528)\n-15060 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1526D Local Header Offset   0000F1EA (61930)\n+15271 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15060: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15271: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1509D CENTRAL HEADER #49    02014B50 (33639248)\n-150A1 Created Zip Spec      14 (20) '2.0'\n-150A2 Created OS            03 (3) 'Unix'\n-150A3 Extract Zip Spec      14 (20) '2.0'\n-150A4 Extract OS            00 (0) 'MS-DOS'\n-150A5 General Purpose Flag  0800 (2048)\n+152AE CENTRAL HEADER #49    02014B50 (33639248)\n+152B2 Created Zip Spec      14 (20) '2.0'\n+152B3 Created OS            03 (3) 'Unix'\n+152B4 Extract Zip Spec      14 (20) '2.0'\n+152B5 Extract OS            00 (0) 'MS-DOS'\n+152B6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-150A7 Compression Method    0008 (8) 'Deflated'\n-150A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-150AD CRC                   3E8906CC (1049167564)\n-150B1 Compressed Size       0000031B (795)\n-150B5 Uncompressed Size     00000690 (1680)\n-150B9 Filename Length       0043 (67)\n-150BB Extra Length          0000 (0)\n-150BD Comment Length        0000 (0)\n-150BF Disk Start            0000 (0)\n-150C1 Int File Attributes   0000 (0)\n+152B8 Compression Method    0008 (8) 'Deflated'\n+152BA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+152BE CRC                   A67D03FF (2793210879)\n+152C2 Compressed Size       00000322 (802)\n+152C6 Uncompressed Size     000006BE (1726)\n+152CA Filename Length       0043 (67)\n+152CC Extra Length          0000 (0)\n+152CE Comment Length        0000 (0)\n+152D0 Disk Start            0000 (0)\n+152D2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-150C3 Ext File Attributes   81A40000 (2175008768)\n+152D4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-150C7 Local Header Offset   0000F31F (62239)\n-150CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+152D8 Local Header Offset   0000F4B9 (62649)\n+152DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x150CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x152DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1510E CENTRAL HEADER #50    02014B50 (33639248)\n-15112 Created Zip Spec      14 (20) '2.0'\n-15113 Created OS            03 (3) 'Unix'\n-15114 Extract Zip Spec      14 (20) '2.0'\n-15115 Extract OS            00 (0) 'MS-DOS'\n-15116 General Purpose Flag  0800 (2048)\n+1531F CENTRAL HEADER #50    02014B50 (33639248)\n+15323 Created Zip Spec      14 (20) '2.0'\n+15324 Created OS            03 (3) 'Unix'\n+15325 Extract Zip Spec      14 (20) '2.0'\n+15326 Extract OS            00 (0) 'MS-DOS'\n+15327 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15118 Compression Method    0008 (8) 'Deflated'\n-1511A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1511E CRC                   AE1F051B (2921268507)\n-15122 Compressed Size       0000031D (797)\n-15126 Uncompressed Size     00000698 (1688)\n-1512A Filename Length       0045 (69)\n-1512C Extra Length          0000 (0)\n-1512E Comment Length        0000 (0)\n-15130 Disk Start            0000 (0)\n-15132 Int File Attributes   0000 (0)\n+15329 Compression Method    0008 (8) 'Deflated'\n+1532B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1532F CRC                   F6F65296 (4143338134)\n+15333 Compressed Size       00000324 (804)\n+15337 Uncompressed Size     000006C5 (1733)\n+1533B Filename Length       0045 (69)\n+1533D Extra Length          0000 (0)\n+1533F Comment Length        0000 (0)\n+15341 Disk Start            0000 (0)\n+15343 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-15134 Ext File Attributes   81A40000 (2175008768)\n+15345 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15138 Local Header Offset   0000F69B (63131)\n-1513C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15349 Local Header Offset   0000F83C (63548)\n+1534D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1513C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1534D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15181 CENTRAL HEADER #51    02014B50 (33639248)\n-15185 Created Zip Spec      14 (20) '2.0'\n-15186 Created OS            03 (3) 'Unix'\n-15187 Extract Zip Spec      14 (20) '2.0'\n-15188 Extract OS            00 (0) 'MS-DOS'\n-15189 General Purpose Flag  0800 (2048)\n+15392 CENTRAL HEADER #51    02014B50 (33639248)\n+15396 Created Zip Spec      14 (20) '2.0'\n+15397 Created OS            03 (3) 'Unix'\n+15398 Extract Zip Spec      14 (20) '2.0'\n+15399 Extract OS            00 (0) 'MS-DOS'\n+1539A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1518B Compression Method    0008 (8) 'Deflated'\n-1518D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15191 CRC                   542D0143 (1412235587)\n-15195 Compressed Size       0000029B (667)\n-15199 Uncompressed Size     000005A4 (1444)\n-1519D Filename Length       0040 (64)\n-1519F Extra Length          0000 (0)\n-151A1 Comment Length        0000 (0)\n-151A3 Disk Start            0000 (0)\n-151A5 Int File Attributes   0000 (0)\n+1539C Compression Method    0008 (8) 'Deflated'\n+1539E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+153A2 CRC                   D200547F (3523236991)\n+153A6 Compressed Size       000002A3 (675)\n+153AA Uncompressed Size     000005CC (1484)\n+153AE Filename Length       0040 (64)\n+153B0 Extra Length          0000 (0)\n+153B2 Comment Length        0000 (0)\n+153B4 Disk Start            0000 (0)\n+153B6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-151A7 Ext File Attributes   81A40000 (2175008768)\n+153B8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-151AB Local Header Offset   0000FA1B (64027)\n-151AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+153BC Local Header Offset   0000FBC3 (64451)\n+153C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x151AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x153C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-151EF CENTRAL HEADER #52    02014B50 (33639248)\n-151F3 Created Zip Spec      14 (20) '2.0'\n-151F4 Created OS            03 (3) 'Unix'\n-151F5 Extract Zip Spec      14 (20) '2.0'\n-151F6 Extract OS            00 (0) 'MS-DOS'\n-151F7 General Purpose Flag  0800 (2048)\n+15400 CENTRAL HEADER #52    02014B50 (33639248)\n+15404 Created Zip Spec      14 (20) '2.0'\n+15405 Created OS            03 (3) 'Unix'\n+15406 Extract Zip Spec      14 (20) '2.0'\n+15407 Extract OS            00 (0) 'MS-DOS'\n+15408 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-151F9 Compression Method    0008 (8) 'Deflated'\n-151FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-151FF CRC                   FC50C2FA (4233151226)\n-15203 Compressed Size       000002DA (730)\n-15207 Uncompressed Size     0000066A (1642)\n-1520B Filename Length       0042 (66)\n-1520D Extra Length          0000 (0)\n-1520F Comment Length        0000 (0)\n-15211 Disk Start            0000 (0)\n-15213 Int File Attributes   0000 (0)\n+1540A Compression Method    0008 (8) 'Deflated'\n+1540C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15410 CRC                   ADCF7988 (2916055432)\n+15414 Compressed Size       000002E1 (737)\n+15418 Uncompressed Size     0000069A (1690)\n+1541C Filename Length       0042 (66)\n+1541E Extra Length          0000 (0)\n+15420 Comment Length        0000 (0)\n+15422 Disk Start            0000 (0)\n+15424 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-15215 Ext File Attributes   81A40000 (2175008768)\n+15426 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15219 Local Header Offset   0000FD14 (64788)\n-1521D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1542A Local Header Offset   0000FEC4 (65220)\n+1542E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1521D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1542E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1525F CENTRAL HEADER #53    02014B50 (33639248)\n-15263 Created Zip Spec      14 (20) '2.0'\n-15264 Created OS            03 (3) 'Unix'\n-15265 Extract Zip Spec      14 (20) '2.0'\n-15266 Extract OS            00 (0) 'MS-DOS'\n-15267 General Purpose Flag  0800 (2048)\n+15470 CENTRAL HEADER #53    02014B50 (33639248)\n+15474 Created Zip Spec      14 (20) '2.0'\n+15475 Created OS            03 (3) 'Unix'\n+15476 Extract Zip Spec      14 (20) '2.0'\n+15477 Extract OS            00 (0) 'MS-DOS'\n+15478 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15269 Compression Method    0008 (8) 'Deflated'\n-1526B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1526F CRC                   E1CD8446 (3788342342)\n-15273 Compressed Size       00000279 (633)\n-15277 Uncompressed Size     000004FA (1274)\n-1527B Filename Length       003D (61)\n-1527D Extra Length          0000 (0)\n-1527F Comment Length        0000 (0)\n-15281 Disk Start            0000 (0)\n-15283 Int File Attributes   0000 (0)\n+1547A Compression Method    0008 (8) 'Deflated'\n+1547C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15480 CRC                   A8CE0A81 (2832075393)\n+15484 Compressed Size       00000280 (640)\n+15488 Uncompressed Size     0000051E (1310)\n+1548C Filename Length       003D (61)\n+1548E Extra Length          0000 (0)\n+15490 Comment Length        0000 (0)\n+15492 Disk Start            0000 (0)\n+15494 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-15285 Ext File Attributes   81A40000 (2175008768)\n+15496 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15289 Local Header Offset   0001004E (65614)\n-1528D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1549A Local Header Offset   00010205 (66053)\n+1549E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1528D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1549E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-152CA CENTRAL HEADER #54    02014B50 (33639248)\n-152CE Created Zip Spec      14 (20) '2.0'\n-152CF Created OS            03 (3) 'Unix'\n-152D0 Extract Zip Spec      14 (20) '2.0'\n-152D1 Extract OS            00 (0) 'MS-DOS'\n-152D2 General Purpose Flag  0800 (2048)\n+154DB CENTRAL HEADER #54    02014B50 (33639248)\n+154DF Created Zip Spec      14 (20) '2.0'\n+154E0 Created OS            03 (3) 'Unix'\n+154E1 Extract Zip Spec      14 (20) '2.0'\n+154E2 Extract OS            00 (0) 'MS-DOS'\n+154E3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-152D4 Compression Method    0008 (8) 'Deflated'\n-152D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-152DA CRC                   FE2922A2 (4264108706)\n-152DE Compressed Size       0000027D (637)\n-152E2 Uncompressed Size     00000502 (1282)\n-152E6 Filename Length       003F (63)\n-152E8 Extra Length          0000 (0)\n-152EA Comment Length        0000 (0)\n-152EC Disk Start            0000 (0)\n-152EE Int File Attributes   0000 (0)\n+154E5 Compression Method    0008 (8) 'Deflated'\n+154E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+154EB CRC                   5D6056E9 (1566594793)\n+154EF Compressed Size       00000284 (644)\n+154F3 Uncompressed Size     00000526 (1318)\n+154F7 Filename Length       003F (63)\n+154F9 Extra Length          0000 (0)\n+154FB Comment Length        0000 (0)\n+154FD Disk Start            0000 (0)\n+154FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-152F0 Ext File Attributes   81A40000 (2175008768)\n+15501 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-152F4 Local Header Offset   00010322 (66338)\n-152F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15505 Local Header Offset   000104E0 (66784)\n+15509 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x152F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15509: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15337 CENTRAL HEADER #55    02014B50 (33639248)\n-1533B Created Zip Spec      14 (20) '2.0'\n-1533C Created OS            03 (3) 'Unix'\n-1533D Extract Zip Spec      14 (20) '2.0'\n-1533E Extract OS            00 (0) 'MS-DOS'\n-1533F General Purpose Flag  0800 (2048)\n+15548 CENTRAL HEADER #55    02014B50 (33639248)\n+1554C Created Zip Spec      14 (20) '2.0'\n+1554D Created OS            03 (3) 'Unix'\n+1554E Extract Zip Spec      14 (20) '2.0'\n+1554F Extract OS            00 (0) 'MS-DOS'\n+15550 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15341 Compression Method    0008 (8) 'Deflated'\n-15343 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15347 CRC                   704BFEFA (1884028666)\n-1534B Compressed Size       0000033B (827)\n-1534F Uncompressed Size     00000741 (1857)\n-15353 Filename Length       0040 (64)\n-15355 Extra Length          0000 (0)\n-15357 Comment Length        0000 (0)\n-15359 Disk Start            0000 (0)\n-1535B Int File Attributes   0000 (0)\n+15552 Compression Method    0008 (8) 'Deflated'\n+15554 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15558 CRC                   FFDB09C9 (4292544969)\n+1555C Compressed Size       00000340 (832)\n+15560 Uncompressed Size     00000774 (1908)\n+15564 Filename Length       0040 (64)\n+15566 Extra Length          0000 (0)\n+15568 Comment Length        0000 (0)\n+1556A Disk Start            0000 (0)\n+1556C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1535D Ext File Attributes   81A40000 (2175008768)\n+1556E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15361 Local Header Offset   000105FC (67068)\n-15365 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15572 Local Header Offset   000107C1 (67521)\n+15576 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15365: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15576: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-153A5 CENTRAL HEADER #56    02014B50 (33639248)\n-153A9 Created Zip Spec      14 (20) '2.0'\n-153AA Created OS            03 (3) 'Unix'\n-153AB Extract Zip Spec      14 (20) '2.0'\n-153AC Extract OS            00 (0) 'MS-DOS'\n-153AD General Purpose Flag  0800 (2048)\n+155B6 CENTRAL HEADER #56    02014B50 (33639248)\n+155BA Created Zip Spec      14 (20) '2.0'\n+155BB Created OS            03 (3) 'Unix'\n+155BC Extract Zip Spec      14 (20) '2.0'\n+155BD Extract OS            00 (0) 'MS-DOS'\n+155BE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-153AF Compression Method    0008 (8) 'Deflated'\n-153B1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-153B5 CRC                   7E779F80 (2121768832)\n-153B9 Compressed Size       0000032F (815)\n-153BD Uncompressed Size     000007FD (2045)\n-153C1 Filename Length       0044 (68)\n-153C3 Extra Length          0000 (0)\n-153C5 Comment Length        0000 (0)\n-153C7 Disk Start            0000 (0)\n-153C9 Int File Attributes   0000 (0)\n+155C0 Compression Method    0008 (8) 'Deflated'\n+155C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+155C6 CRC                   A8777CA7 (2826402983)\n+155CA Compressed Size       00000339 (825)\n+155CE Uncompressed Size     00000840 (2112)\n+155D2 Filename Length       0044 (68)\n+155D4 Extra Length          0000 (0)\n+155D6 Comment Length        0000 (0)\n+155D8 Disk Start            0000 (0)\n+155DA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-153CB Ext File Attributes   81A40000 (2175008768)\n+155DC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-153CF Local Header Offset   00010995 (67989)\n-153D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+155E0 Local Header Offset   00010B5F (68447)\n+155E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x153D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x155E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15417 CENTRAL HEADER #57    02014B50 (33639248)\n-1541B Created Zip Spec      14 (20) '2.0'\n-1541C Created OS            03 (3) 'Unix'\n-1541D Extract Zip Spec      14 (20) '2.0'\n-1541E Extract OS            00 (0) 'MS-DOS'\n-1541F General Purpose Flag  0800 (2048)\n+15628 CENTRAL HEADER #57    02014B50 (33639248)\n+1562C Created Zip Spec      14 (20) '2.0'\n+1562D Created OS            03 (3) 'Unix'\n+1562E Extract Zip Spec      14 (20) '2.0'\n+1562F Extract OS            00 (0) 'MS-DOS'\n+15630 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15421 Compression Method    0008 (8) 'Deflated'\n-15423 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15427 CRC                   33B32090 (867377296)\n-1542B Compressed Size       000005BE (1470)\n-1542F Uncompressed Size     00001259 (4697)\n-15433 Filename Length       0049 (73)\n-15435 Extra Length          0000 (0)\n-15437 Comment Length        0000 (0)\n-15439 Disk Start            0000 (0)\n-1543B Int File Attributes   0000 (0)\n+15632 Compression Method    0008 (8) 'Deflated'\n+15634 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15638 CRC                   E294E314 (3801408276)\n+1563C Compressed Size       000005C9 (1481)\n+15640 Uncompressed Size     000012DA (4826)\n+15644 Filename Length       0049 (73)\n+15646 Extra Length          0000 (0)\n+15648 Comment Length        0000 (0)\n+1564A Disk Start            0000 (0)\n+1564C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1543D Ext File Attributes   81A40000 (2175008768)\n+1564E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15441 Local Header Offset   00010D26 (68902)\n-15445 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15652 Local Header Offset   00010EFA (69370)\n+15656 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15445: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15656: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1548E CENTRAL HEADER #58    02014B50 (33639248)\n-15492 Created Zip Spec      14 (20) '2.0'\n-15493 Created OS            03 (3) 'Unix'\n-15494 Extract Zip Spec      14 (20) '2.0'\n-15495 Extract OS            00 (0) 'MS-DOS'\n-15496 General Purpose Flag  0800 (2048)\n+1569F CENTRAL HEADER #58    02014B50 (33639248)\n+156A3 Created Zip Spec      14 (20) '2.0'\n+156A4 Created OS            03 (3) 'Unix'\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       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15498 Compression Method    0008 (8) 'Deflated'\n-1549A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1549E CRC                   DEA0C858 (3735079000)\n-154A2 Compressed Size       000003F9 (1017)\n-154A6 Uncompressed Size     00000A13 (2579)\n-154AA Filename Length       0043 (67)\n-154AC Extra Length          0000 (0)\n-154AE Comment Length        0000 (0)\n-154B0 Disk Start            0000 (0)\n-154B2 Int File Attributes   0000 (0)\n+156A9 Compression Method    0008 (8) 'Deflated'\n+156AB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+156AF CRC                   484F34E6 (1213150438)\n+156B3 Compressed Size       00000402 (1026)\n+156B7 Uncompressed Size     00000A53 (2643)\n+156BB Filename Length       0043 (67)\n+156BD Extra Length          0000 (0)\n+156BF Comment Length        0000 (0)\n+156C1 Disk Start            0000 (0)\n+156C3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-154B4 Ext File Attributes   81A40000 (2175008768)\n+156C5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-154B8 Local Header Offset   0001134B (70475)\n-154BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+156C9 Local Header Offset   0001152A (70954)\n+156CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x154BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x156CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-154FF CENTRAL HEADER #59    02014B50 (33639248)\n-15503 Created Zip Spec      14 (20) '2.0'\n-15504 Created OS            03 (3) 'Unix'\n-15505 Extract Zip Spec      14 (20) '2.0'\n-15506 Extract OS            00 (0) 'MS-DOS'\n-15507 General Purpose Flag  0800 (2048)\n+15710 CENTRAL HEADER #59    02014B50 (33639248)\n+15714 Created Zip Spec      14 (20) '2.0'\n+15715 Created OS            03 (3) 'Unix'\n+15716 Extract Zip Spec      14 (20) '2.0'\n+15717 Extract OS            00 (0) 'MS-DOS'\n+15718 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15509 Compression Method    0008 (8) 'Deflated'\n-1550B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1550F CRC                   CE83BFB8 (3464740792)\n-15513 Compressed Size       000016FA (5882)\n-15517 Uncompressed Size     00007356 (29526)\n-1551B Filename Length       0038 (56)\n-1551D Extra Length          0000 (0)\n-1551F Comment Length        0000 (0)\n-15521 Disk Start            0000 (0)\n-15523 Int File Attributes   0000 (0)\n+1571A Compression Method    0008 (8) 'Deflated'\n+1571C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15720 CRC                   25A2615A (631398746)\n+15724 Compressed Size       0000171A (5914)\n+15728 Uncompressed Size     000075E8 (30184)\n+1572C Filename Length       0038 (56)\n+1572E Extra Length          0000 (0)\n+15730 Comment Length        0000 (0)\n+15732 Disk Start            0000 (0)\n+15734 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-15525 Ext File Attributes   81A40000 (2175008768)\n+15736 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15529 Local Header Offset   000117A5 (71589)\n-1552D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1573A Local Header Offset   0001198D (72077)\n+1573E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1552D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1573E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15565 CENTRAL HEADER #60    02014B50 (33639248)\n-15569 Created Zip Spec      14 (20) '2.0'\n-1556A Created OS            03 (3) 'Unix'\n-1556B Extract Zip Spec      14 (20) '2.0'\n-1556C Extract OS            00 (0) 'MS-DOS'\n-1556D General Purpose Flag  0800 (2048)\n+15776 CENTRAL HEADER #60    02014B50 (33639248)\n+1577A Created Zip Spec      14 (20) '2.0'\n+1577B Created OS            03 (3) 'Unix'\n+1577C Extract Zip Spec      14 (20) '2.0'\n+1577D Extract OS            00 (0) 'MS-DOS'\n+1577E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1556F Compression Method    0008 (8) 'Deflated'\n-15571 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15575 CRC                   B659AACE (3059329742)\n-15579 Compressed Size       000008C7 (2247)\n-1557D Uncompressed Size     0000227D (8829)\n-15581 Filename Length       0037 (55)\n-15583 Extra Length          0000 (0)\n-15585 Comment Length        0000 (0)\n-15587 Disk Start            0000 (0)\n-15589 Int File Attributes   0000 (0)\n+15780 Compression Method    0008 (8) 'Deflated'\n+15782 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15786 CRC                   3773BB53 (930331475)\n+1578A Compressed Size       000008D6 (2262)\n+1578E Uncompressed Size     00002379 (9081)\n+15792 Filename Length       0037 (55)\n+15794 Extra Length          0000 (0)\n+15796 Comment Length        0000 (0)\n+15798 Disk Start            0000 (0)\n+1579A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1558B Ext File Attributes   81A40000 (2175008768)\n+1579C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-1558F Local Header Offset   00012EF5 (77557)\n-15593 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+157A0 Local Header Offset   000130FD (78077)\n+157A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15593: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x157A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-155CA CENTRAL HEADER #61    02014B50 (33639248)\n-155CE Created Zip Spec      14 (20) '2.0'\n-155CF Created OS            03 (3) 'Unix'\n-155D0 Extract Zip Spec      14 (20) '2.0'\n-155D1 Extract OS            00 (0) 'MS-DOS'\n-155D2 General Purpose Flag  0800 (2048)\n+157DB CENTRAL HEADER #61    02014B50 (33639248)\n+157DF Created Zip Spec      14 (20) '2.0'\n+157E0 Created OS            03 (3) 'Unix'\n+157E1 Extract Zip Spec      14 (20) '2.0'\n+157E2 Extract OS            00 (0) 'MS-DOS'\n+157E3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-155D4 Compression Method    0008 (8) 'Deflated'\n-155D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-155DA CRC                   2E6A10BD (778703037)\n-155DE Compressed Size       0000003E (62)\n-155E2 Uncompressed Size     0000004B (75)\n-155E6 Filename Length       003C (60)\n-155E8 Extra Length          0000 (0)\n-155EA Comment Length        0000 (0)\n-155EC Disk Start            0000 (0)\n-155EE Int File Attributes   0000 (0)\n+157E5 Compression Method    0008 (8) 'Deflated'\n+157E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+157EB CRC                   C8683575 (3362272629)\n+157EF Compressed Size       0000003F (63)\n+157F3 Uncompressed Size     0000004C (76)\n+157F7 Filename Length       003C (60)\n+157F9 Extra Length          0000 (0)\n+157FB Comment Length        0000 (0)\n+157FD Disk Start            0000 (0)\n+157FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-155F0 Ext File Attributes   81A40000 (2175008768)\n+15801 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-155F4 Local Header Offset   00013811 (79889)\n-155F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15805 Local Header Offset   00013A28 (80424)\n+15809 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x155F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15809: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15634 CENTRAL HEADER #62    02014B50 (33639248)\n-15638 Created Zip Spec      14 (20) '2.0'\n-15639 Created OS            03 (3) 'Unix'\n-1563A Extract Zip Spec      14 (20) '2.0'\n-1563B Extract OS            00 (0) 'MS-DOS'\n-1563C General Purpose Flag  0800 (2048)\n+15845 CENTRAL HEADER #62    02014B50 (33639248)\n+15849 Created Zip Spec      14 (20) '2.0'\n+1584A Created OS            03 (3) 'Unix'\n+1584B Extract Zip Spec      14 (20) '2.0'\n+1584C Extract OS            00 (0) 'MS-DOS'\n+1584D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1563E Compression Method    0008 (8) 'Deflated'\n-15640 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15644 CRC                   175EE5B1 (392095153)\n-15648 Compressed Size       00000054 (84)\n-1564C Uncompressed Size     0000005B (91)\n-15650 Filename Length       0049 (73)\n-15652 Extra Length          0000 (0)\n-15654 Comment Length        0000 (0)\n-15656 Disk Start            0000 (0)\n-15658 Int File Attributes   0000 (0)\n+1584F Compression Method    0008 (8) 'Deflated'\n+15851 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15855 CRC                   950165AD (2499896749)\n+15859 Compressed Size       00000056 (86)\n+1585D Uncompressed Size     0000005D (93)\n+15861 Filename Length       0049 (73)\n+15863 Extra Length          0000 (0)\n+15865 Comment Length        0000 (0)\n+15867 Disk Start            0000 (0)\n+15869 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-1565A Ext File Attributes   81A40000 (2175008768)\n+1586B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-1565E Local Header Offset   000138A9 (80041)\n-15662 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1586F Local Header Offset   00013AC1 (80577)\n+15873 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15662: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15873: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-156AB CENTRAL HEADER #63    02014B50 (33639248)\n-156AF Created Zip Spec      14 (20) '2.0'\n-156B0 Created OS            03 (3) 'Unix'\n-156B1 Extract Zip Spec      14 (20) '2.0'\n-156B2 Extract OS            00 (0) 'MS-DOS'\n-156B3 General Purpose Flag  0800 (2048)\n+158BC CENTRAL HEADER #63    02014B50 (33639248)\n+158C0 Created Zip Spec      14 (20) '2.0'\n+158C1 Created OS            03 (3) 'Unix'\n+158C2 Extract Zip Spec      14 (20) '2.0'\n+158C3 Extract OS            00 (0) 'MS-DOS'\n+158C4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-156B5 Compression Method    0008 (8) 'Deflated'\n-156B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-156BB CRC                   02CBA695 (46900885)\n-156BF Compressed Size       00000043 (67)\n-156C3 Uncompressed Size     00000043 (67)\n-156C7 Filename Length       0052 (82)\n-156C9 Extra Length          0000 (0)\n-156CB Comment Length        0000 (0)\n-156CD Disk Start            0000 (0)\n-156CF Int File Attributes   0000 (0)\n+158C6 Compression Method    0008 (8) 'Deflated'\n+158C8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+158CC CRC                   02CBA695 (46900885)\n+158D0 Compressed Size       00000043 (67)\n+158D4 Uncompressed Size     00000043 (67)\n+158D8 Filename Length       0052 (82)\n+158DA Extra Length          0000 (0)\n+158DC Comment Length        0000 (0)\n+158DE Disk Start            0000 (0)\n+158E0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-156D1 Ext File Attributes   81A40000 (2175008768)\n+158E2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-156D5 Local Header Offset   00013964 (80228)\n-156D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+158E6 Local Header Offset   00013B7E (80766)\n+158EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x156D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x158EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-1572B CENTRAL HEADER #64    02014B50 (33639248)\n-1572F Created Zip Spec      14 (20) '2.0'\n-15730 Created OS            03 (3) 'Unix'\n-15731 Extract Zip Spec      14 (20) '2.0'\n-15732 Extract OS            00 (0) 'MS-DOS'\n-15733 General Purpose Flag  0800 (2048)\n+1593C CENTRAL HEADER #64    02014B50 (33639248)\n+15940 Created Zip Spec      14 (20) '2.0'\n+15941 Created OS            03 (3) 'Unix'\n+15942 Extract Zip Spec      14 (20) '2.0'\n+15943 Extract OS            00 (0) 'MS-DOS'\n+15944 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15735 Compression Method    0008 (8) 'Deflated'\n-15737 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1573B CRC                   48945B27 (1217682215)\n-1573F Compressed Size       00000482 (1154)\n-15743 Uncompressed Size     00001F82 (8066)\n-15747 Filename Length       0038 (56)\n-15749 Extra Length          0000 (0)\n-1574B Comment Length        0000 (0)\n-1574D Disk Start            0000 (0)\n-1574F Int File Attributes   0000 (0)\n+15946 Compression Method    0008 (8) 'Deflated'\n+15948 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1594C CRC                   50B6758C (1354134924)\n+15950 Compressed Size       00000479 (1145)\n+15954 Uncompressed Size     00001EA4 (7844)\n+15958 Filename Length       0038 (56)\n+1595A Extra Length          0000 (0)\n+1595C Comment Length        0000 (0)\n+1595E Disk Start            0000 (0)\n+15960 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-15751 Ext File Attributes   81A40000 (2175008768)\n+15962 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-15755 Local Header Offset   00013A17 (80407)\n-15759 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15966 Local Header Offset   00013C31 (80945)\n+1596A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15759: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1596A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-15791 CENTRAL HEADER #65    02014B50 (33639248)\n-15795 Created Zip Spec      14 (20) '2.0'\n-15796 Created OS            03 (3) 'Unix'\n-15797 Extract Zip Spec      14 (20) '2.0'\n-15798 Extract OS            00 (0) 'MS-DOS'\n-15799 General Purpose Flag  0800 (2048)\n+159A2 CENTRAL HEADER #65    02014B50 (33639248)\n+159A6 Created Zip Spec      14 (20) '2.0'\n+159A7 Created OS            03 (3) 'Unix'\n+159A8 Extract Zip Spec      14 (20) '2.0'\n+159A9 Extract OS            00 (0) 'MS-DOS'\n+159AA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1579B Compression Method    0008 (8) 'Deflated'\n-1579D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-157A1 CRC                   494D98C1 (1229822145)\n-157A5 Compressed Size       00000045 (69)\n-157A9 Uncompressed Size     00000047 (71)\n-157AD Filename Length       003F (63)\n-157AF Extra Length          0000 (0)\n-157B1 Comment Length        0000 (0)\n-157B3 Disk Start            0000 (0)\n-157B5 Int File Attributes   0000 (0)\n+159AC Compression Method    0008 (8) 'Deflated'\n+159AE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+159B2 CRC                   494D98C1 (1229822145)\n+159B6 Compressed Size       00000045 (69)\n+159BA Uncompressed Size     00000047 (71)\n+159BE Filename Length       003F (63)\n+159C0 Extra Length          0000 (0)\n+159C2 Comment Length        0000 (0)\n+159C4 Disk Start            0000 (0)\n+159C6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-157B7 Ext File Attributes   81A40000 (2175008768)\n+159C8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-157BB Local Header Offset   00013EEF (81647)\n-157BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+159CC Local Header Offset   00014100 (82176)\n+159D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x157BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x159D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-157FE END CENTRAL HEADER    06054B50 (101010256)\n-15802 Number of this disk   0000 (0)\n-15804 Central Dir Disk no   0000 (0)\n-15806 Entries in this disk  0041 (65)\n-15808 Total Entries         0041 (65)\n-1580A Size of Central Dir   0000186D (6253)\n-1580E Offset to Central Dir 00013F91 (81809)\n-15812 Comment Length        0000 (0)\n+15A0F END CENTRAL HEADER    06054B50 (101010256)\n+15A13 Number of this disk   0000 (0)\n+15A15 Central Dir Disk no   0000 (0)\n+15A17 Entries in this disk  0041 (65)\n+15A19 Total Entries         0041 (65)\n+15A1B Size of Central Dir   0000186D (6253)\n+15A1F Offset to Central Dir 000141A2 (82338)\n+15A23 Comment Length        0000 (0)\n #\n # Error Count: 17\n # Warning Count: 147\n #\n # Done\n"}, {"source1": "org/apache/dubbo/config/ConfigInitializer.java", "source2": "org/apache/dubbo/config/ConfigInitializer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,36 +1,36 @@\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.extension.SPI;\n-\n-/**\n- * Dynamically add some parameters / check config\n- */\n-\n-@SPI\n-public interface ConfigInitializer {\n-\n-    default void initReferConfig(ReferenceConfig referenceConfig) {\n-\n-    }\n-\n-    default void initServiceConfig(ServiceConfig serviceConfig) {\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.extension.SPI;\r\n+\r\n+/**\r\n+ * Dynamically add some parameters / check config\r\n+ */\r\n+\r\n+@SPI\r\n+public interface ConfigInitializer {\r\n+\r\n+    default void initReferConfig(ReferenceConfig referenceConfig) {\r\n+\r\n+    }\r\n+\r\n+    default void initServiceConfig(ServiceConfig serviceConfig) {\r\n+\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ConfigPostProcessor.java", "source2": "org/apache/dubbo/config/ConfigPostProcessor.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.config;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-/**\n- * 2019/12/30\n- */\n-\n-@SPI\n-public interface ConfigPostProcessor {\n-\n-    default void postProcessReferConfig(ReferenceConfig referenceConfig) {\n-\n-    }\n-\n-    default void postProcessServiceConfig(ServiceConfig serviceConfig) {\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.extension.SPI;\r\n+\r\n+/**\r\n+ * 2019/12/30\r\n+ */\r\n+\r\n+@SPI\r\n+public interface ConfigPostProcessor {\r\n+\r\n+    default void postProcessReferConfig(ReferenceConfig referenceConfig) {\r\n+\r\n+    }\r\n+\r\n+    default void postProcessServiceConfig(ServiceConfig serviceConfig) {\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/DubboShutdownHook.java", "source2": "org/apache/dubbo/config/DubboShutdownHook.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,149 +1,149 @@\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.extension.ExtensionLoader;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.event.DubboServiceDestroyedEvent;\n-import org.apache.dubbo.config.event.DubboShutdownHookRegisteredEvent;\n-import org.apache.dubbo.config.event.DubboShutdownHookUnregisteredEvent;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.rpc.Protocol;\n-\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-/**\n- * The shutdown hook thread to do the clean up stuff.\n- * This is a singleton in order to ensure there is only one shutdown hook registered.\n- * Because {@link ApplicationShutdownHooks} use {@link java.util.IdentityHashMap}\n- * to store the shutdown hooks.\n- */\n-public class DubboShutdownHook extends Thread {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(DubboShutdownHook.class);\n-\n-    private static final DubboShutdownHook DUBBO_SHUTDOWN_HOOK = new DubboShutdownHook(\"DubboShutdownHook\");\n-\n-    private final ShutdownHookCallbacks callbacks = ShutdownHookCallbacks.INSTANCE;\n-\n-    /**\n-     * Has it already been registered or not?\n-     */\n-    private final AtomicBoolean registered = new AtomicBoolean(false);\n-\n-    /**\n-     * Has it already been destroyed or not?\n-     */\n-    private static final AtomicBoolean destroyed = new AtomicBoolean(false);\n-\n-    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\n-\n-    private DubboShutdownHook(String name) {\n-        super(name);\n-    }\n-\n-    public static DubboShutdownHook getDubboShutdownHook() {\n-        return DUBBO_SHUTDOWN_HOOK;\n-    }\n-\n-    @Override\n-    public void run() {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Run shutdown hook now.\");\n-        }\n-\n-        callback();\n-        doDestroy();\n-    }\n-\n-    /**\n-     * For testing purpose\n-     */\n-    void clear() {\n-        callbacks.clear();\n-    }\n-\n-    private void callback() {\n-        callbacks.callback();\n-    }\n-\n-    /**\n-     * Register the ShutdownHook\n-     */\n-    public void register() {\n-        if (registered.compareAndSet(false, true)) {\n-            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\n-            Runtime.getRuntime().addShutdownHook(dubboShutdownHook);\n-            dispatch(new DubboShutdownHookRegisteredEvent(dubboShutdownHook));\n-        }\n-    }\n-\n-    /**\n-     * Unregister the ShutdownHook\n-     */\n-    public void unregister() {\n-        if (registered.compareAndSet(true, false)) {\n-            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\n-            Runtime.getRuntime().removeShutdownHook(dubboShutdownHook);\n-            dispatch(new DubboShutdownHookUnregisteredEvent(dubboShutdownHook));\n-        }\n-    }\n-\n-    /**\n-     * Destroy all the resources, including registries and protocols.\n-     */\n-    public void doDestroy() {\n-        // dispatch the DubboDestroyedEvent @since 2.7.5\n-        dispatch(new DubboServiceDestroyedEvent(this));\n-    }\n-\n-    private void dispatch(Event event) {\n-        eventDispatcher.dispatch(event);\n-    }\n-\n-    public boolean getRegistered() {\n-        return registered.get();\n-    }\n-\n-    public static void destroyAll() {\n-        if (destroyed.compareAndSet(false, true)) {\n-            AbstractRegistryFactory.destroyAll();\n-            destroyProtocols();\n-        }\n-    }\n-\n-    /**\n-     * Destroy all the protocols.\n-     */\n-    public static void destroyProtocols() {\n-        ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class);\n-        for (String protocolName : loader.getLoadedExtensions()) {\n-            try {\n-                Protocol protocol = loader.getLoadedExtension(protocolName);\n-                if (protocol != null) {\n-                    protocol.destroy();\n-                }\n-            } catch (Throwable t) {\n-                logger.warn(t.getMessage(), 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.config;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\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.event.DubboServiceDestroyedEvent;\r\n+import org.apache.dubbo.config.event.DubboShutdownHookRegisteredEvent;\r\n+import org.apache.dubbo.config.event.DubboShutdownHookUnregisteredEvent;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+/**\r\n+ * The shutdown hook thread to do the clean up stuff.\r\n+ * This is a singleton in order to ensure there is only one shutdown hook registered.\r\n+ * Because {@link ApplicationShutdownHooks} use {@link java.util.IdentityHashMap}\r\n+ * to store the shutdown hooks.\r\n+ */\r\n+public class DubboShutdownHook extends Thread {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(DubboShutdownHook.class);\r\n+\r\n+    private static final DubboShutdownHook DUBBO_SHUTDOWN_HOOK = new DubboShutdownHook(\"DubboShutdownHook\");\r\n+\r\n+    private final ShutdownHookCallbacks callbacks = ShutdownHookCallbacks.INSTANCE;\r\n+\r\n+    /**\r\n+     * Has it already been registered or not?\r\n+     */\r\n+    private final AtomicBoolean registered = new AtomicBoolean(false);\r\n+\r\n+    /**\r\n+     * Has it already been destroyed or not?\r\n+     */\r\n+    private static final AtomicBoolean destroyed = new AtomicBoolean(false);\r\n+\r\n+    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\r\n+\r\n+    private DubboShutdownHook(String name) {\r\n+        super(name);\r\n+    }\r\n+\r\n+    public static DubboShutdownHook getDubboShutdownHook() {\r\n+        return DUBBO_SHUTDOWN_HOOK;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void run() {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Run shutdown hook now.\");\r\n+        }\r\n+\r\n+        callback();\r\n+        doDestroy();\r\n+    }\r\n+\r\n+    /**\r\n+     * For testing purpose\r\n+     */\r\n+    void clear() {\r\n+        callbacks.clear();\r\n+    }\r\n+\r\n+    private void callback() {\r\n+        callbacks.callback();\r\n+    }\r\n+\r\n+    /**\r\n+     * Register the ShutdownHook\r\n+     */\r\n+    public void register() {\r\n+        if (registered.compareAndSet(false, true)) {\r\n+            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\r\n+            Runtime.getRuntime().addShutdownHook(dubboShutdownHook);\r\n+            dispatch(new DubboShutdownHookRegisteredEvent(dubboShutdownHook));\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Unregister the ShutdownHook\r\n+     */\r\n+    public void unregister() {\r\n+        if (registered.compareAndSet(true, false)) {\r\n+            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\r\n+            Runtime.getRuntime().removeShutdownHook(dubboShutdownHook);\r\n+            dispatch(new DubboShutdownHookUnregisteredEvent(dubboShutdownHook));\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Destroy all the resources, including registries and protocols.\r\n+     */\r\n+    public void doDestroy() {\r\n+        // dispatch the DubboDestroyedEvent @since 2.7.5\r\n+        dispatch(new DubboServiceDestroyedEvent(this));\r\n+    }\r\n+\r\n+    private void dispatch(Event event) {\r\n+        eventDispatcher.dispatch(event);\r\n+    }\r\n+\r\n+    public boolean getRegistered() {\r\n+        return registered.get();\r\n+    }\r\n+\r\n+    public static void destroyAll() {\r\n+        if (destroyed.compareAndSet(false, true)) {\r\n+            AbstractRegistryFactory.destroyAll();\r\n+            destroyProtocols();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Destroy all the protocols.\r\n+     */\r\n+    public static void destroyProtocols() {\r\n+        ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class);\r\n+        for (String protocolName : loader.getLoadedExtensions()) {\r\n+            try {\r\n+                Protocol protocol = loader.getLoadedExtension(protocolName);\r\n+                if (protocol != null) {\r\n+                    protocol.destroy();\r\n+                }\r\n+            } catch (Throwable t) {\r\n+                logger.warn(t.getMessage(), t);\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ReferenceConfig.java", "source2": "org/apache/dubbo/config/ReferenceConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,554 +1,554 @@\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.bytecode.Wrapper;\n-import org.apache.dubbo.common.constants.RegistryConstants;\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.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.config.bootstrap.DubboBootstrap;\n-import org.apache.dubbo.config.event.ReferenceConfigDestroyedEvent;\n-import org.apache.dubbo.config.event.ReferenceConfigInitializedEvent;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.config.utils.ConfigValidationUtils;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;\n-import org.apache.dubbo.rpc.cluster.support.ClusterUtils;\n-import org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.AsyncMethodInfo;\n-import org.apache.dubbo.rpc.model.ConsumerModel;\n-import org.apache.dubbo.rpc.model.ServiceDescriptor;\n-import org.apache.dubbo.rpc.model.ServiceRepository;\n-import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;\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.HashMap;\n-import java.util.HashSet;\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.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROXY_CLASS_REF;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\n-import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\n-import static org.apache.dubbo.common.utils.StringUtils.splitToSet;\n-import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\n-import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-\n-/**\n- * Please avoid using this class for any new application,\n- * use {@link ReferenceConfigBase} instead.\n- */\n-public class ReferenceConfig<T> extends ReferenceConfigBase<T> {\n-\n-    public static final Logger logger = LoggerFactory.getLogger(ReferenceConfig.class);\n-\n-    /**\n-     * The {@link Protocol} implementation with adaptive functionality,it will be different in different scenarios.\n-     * A particular {@link Protocol} implementation is determined by the protocol attribute in the {@link URL}.\n-     * For example:\n-     *\n-     * <li>when the url is registry://224.5.6.7:1234/org.apache.dubbo.registry.RegistryService?application=dubbo-sample,\n-     * then the protocol is <b>RegistryProtocol</b></li>\n-     *\n-     * <li>when the url is dubbo://224.5.6.7:1234/org.apache.dubbo.config.api.DemoService?application=dubbo-sample, then\n-     * the protocol is <b>DubboProtocol</b></li>\n-     * <p>\n-     * Actually\uff0cwhen the {@link ExtensionLoader} init the {@link Protocol} instants,it will automatically wraps two\n-     * layers, and eventually will get a <b>ProtocolFilterWrapper</b> or <b>ProtocolListenerWrapper</b>\n-     */\n-    private static final Protocol REF_PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\n-\n-    /**\n-     * The {@link Cluster}'s implementation with adaptive functionality, and actually it will get a {@link Cluster}'s\n-     * specific implementation who is wrapped with <b>MockClusterInvoker</b>\n-     */\n-    private static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\n-\n-    /**\n-     * A {@link ProxyFactory} implementation that will generate a reference service's proxy,the JavassistProxyFactory is\n-     * its default implementation\n-     */\n-    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\n-\n-    /**\n-     * The interface proxy reference\n-     */\n-    private transient volatile T ref;\n-\n-    /**\n-     * The invoker of the reference service\n-     */\n-    private transient volatile Invoker<?> invoker;\n-\n-    /**\n-     * The flag whether the ReferenceConfig has been initialized\n-     */\n-    private transient volatile boolean initialized;\n-\n-    /**\n-     * whether this ReferenceConfig has been destroyed\n-     */\n-    private transient volatile boolean destroyed;\n-\n-    private final ServiceRepository repository;\n-\n-    private DubboBootstrap bootstrap;\n-\n-    /**\n-     * The service names that the Dubbo interface subscribed.\n-     *\n-     * @since 2.7.8\n-     */\n-    private String services;\n-\n-    public ReferenceConfig() {\n-        super();\n-        this.repository = ApplicationModel.getServiceRepository();\n-    }\n-\n-    public ReferenceConfig(Reference reference) {\n-        super(reference);\n-        this.repository = ApplicationModel.getServiceRepository();\n-    }\n-\n-    /**\n-     * Get a string presenting the service names that the Dubbo interface subscribed.\n-     * If it is a multiple-values, the content will be a comma-delimited String.\n-     *\n-     * @return non-null\n-     * @see RegistryConstants#SUBSCRIBED_SERVICE_NAMES_KEY\n-     * @since 2.7.8\n-     */\n-    @Deprecated\n-    @Parameter(key = SUBSCRIBED_SERVICE_NAMES_KEY)\n-    public String getServices() {\n-        return services;\n-    }\n-\n-    /**\n-     * It's an alias method for {@link #getServices()}, but the more convenient.\n-     *\n-     * @return the String {@link List} presenting the Dubbo interface subscribed\n-     * @since 2.7.8\n-     */\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public Set<String> getSubscribedServices() {\n-        return splitToSet(getServices(), COMMA_SEPARATOR_CHAR);\n-    }\n-\n-    /**\n-     * Set the service names that the Dubbo interface subscribed.\n-     *\n-     * @param services If it is a multiple-values, the content will be a comma-delimited String.\n-     * @since 2.7.8\n-     */\n-    public void setServices(String services) {\n-        this.services = services;\n-    }\n-\n-    public synchronized T get() {\n-        if (destroyed) {\n-            throw new IllegalStateException(\"The invoker of ReferenceConfig(\" + url + \") has already destroyed!\");\n-        }\n-        if (ref == null) {\n-            init();\n-        }\n-        return ref;\n-    }\n-\n-    public synchronized void destroy() {\n-        if (ref == null) {\n-            return;\n-        }\n-        if (destroyed) {\n-            return;\n-        }\n-        destroyed = true;\n-        try {\n-            invoker.destroy();\n-        } catch (Throwable t) {\n-            logger.warn(\"Unexpected error occurred when destroy invoker of ReferenceConfig(\" + url + \").\", t);\n-        }\n-        invoker = null;\n-        ref = null;\n-\n-        // dispatch a ReferenceConfigDestroyedEvent since 2.7.4\n-        dispatch(new ReferenceConfigDestroyedEvent(this));\n-    }\n-\n-    public synchronized void init() {\n-        if (initialized) {\n-            return;\n-        }\n-\n-\n-        if (bootstrap == null) {\n-            bootstrap = DubboBootstrap.getInstance();\n-            bootstrap.initialize();\n-        }\n-\n-        checkAndUpdateSubConfigs();\n-\n-        checkStubAndLocal(interfaceClass);\n-        ConfigValidationUtils.checkMock(interfaceClass, this);\n-\n-        Map<String, String> map = new HashMap<String, String>();\n-        map.put(SIDE_KEY, CONSUMER_SIDE);\n-\n-        ReferenceConfigBase.appendRuntimeParameters(map);\n-        if (!ProtocolUtils.isGeneric(generic)) {\n-            String revision = Version.getVersion(interfaceClass, version);\n-            if (revision != null && revision.length() > 0) {\n-                map.put(REVISION_KEY, revision);\n-            }\n-\n-            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\n-            if (methods.length == 0) {\n-                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\n-                map.put(METHODS_KEY, ANY_VALUE);\n-            } else {\n-                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), COMMA_SEPARATOR));\n-            }\n-        }\n-        map.put(INTERFACE_KEY, interfaceName);\n-        AbstractConfig.appendParameters(map, getMetrics());\n-        AbstractConfig.appendParameters(map, getApplication());\n-        AbstractConfig.appendParameters(map, getModule());\n-        // remove 'default.' prefix for configs from ConsumerConfig\n-        // appendParameters(map, consumer, Constants.DEFAULT_KEY);\n-        AbstractConfig.appendParameters(map, consumer);\n-        AbstractConfig.appendParameters(map, this);\n-        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\n-        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\n-            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\n-        }\n-        Map<String, AsyncMethodInfo> attributes = null;\n-        if (CollectionUtils.isNotEmpty(getMethods())) {\n-            attributes = new HashMap<>();\n-            for (MethodConfig methodConfig : getMethods()) {\n-                AbstractConfig.appendParameters(map, methodConfig, methodConfig.getName());\n-                String retryKey = methodConfig.getName() + \".retry\";\n-                if (map.containsKey(retryKey)) {\n-                    String retryValue = map.remove(retryKey);\n-                    if (\"false\".equals(retryValue)) {\n-                        map.put(methodConfig.getName() + \".retries\", \"0\");\n-                    }\n-                }\n-                AsyncMethodInfo asyncMethodInfo = AbstractConfig.convertMethodConfig2AsyncInfo(methodConfig);\n-                if (asyncMethodInfo != null) {\n-//                    consumerModel.getMethodModel(methodConfig.getName()).addAttribute(ASYNC_KEY, asyncMethodInfo);\n-                    attributes.put(methodConfig.getName(), asyncMethodInfo);\n-                }\n-            }\n-        }\n-\n-        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\n-        if (StringUtils.isEmpty(hostToRegistry)) {\n-            hostToRegistry = NetUtils.getLocalHost();\n-        } else if (isInvalidLocalHost(hostToRegistry)) {\n-            throw new IllegalArgumentException(\n-                    \"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\n-        }\n-        map.put(REGISTER_IP_KEY, hostToRegistry);\n-\n-        serviceMetadata.getAttachments().putAll(map);\n-\n-        ref = createProxy(map);\n-\n-        serviceMetadata.setTarget(ref);\n-        serviceMetadata.addAttribute(PROXY_CLASS_REF, ref);\n-        ConsumerModel consumerModel = repository.lookupReferredService(serviceMetadata.getServiceKey());\n-        consumerModel.setProxyObject(ref);\n-        consumerModel.init(attributes);\n-\n-        initialized = true;\n-\n-        checkInvokerAvailable();\n-\n-        // dispatch a ReferenceConfigInitializedEvent since 2.7.4\n-        dispatch(new ReferenceConfigInitializedEvent(this, invoker));\n-    }\n-\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\", \"deprecation\"})\n-    private T createProxy(Map<String, String> map) {\n-        if (shouldJvmRefer(map)) {\n-            URL url = new URL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0, interfaceClass.getName()).addParameters(map);\n-            invoker = REF_PROTOCOL.refer(interfaceClass, url);\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"Using injvm service \" + interfaceClass.getName());\n-            }\n-        } else {\n-            urls.clear();\n-            if (url != null && url.length() > 0) { // user specified URL, could be peer-to-peer address, or register center's address.\n-                String[] us = SEMICOLON_SPLIT_PATTERN.split(url);\n-                if (us != null && us.length > 0) {\n-                    for (String u : us) {\n-                        URL url = URL.valueOf(u);\n-                        if (StringUtils.isEmpty(url.getPath())) {\n-                            url = url.setPath(interfaceName);\n-                        }\n-                        if (UrlUtils.isRegistry(url)) {\n-                            urls.add(url.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\n-                        } else {\n-                            urls.add(ClusterUtils.mergeUrl(url, map));\n-                        }\n-                    }\n-                }\n-            } else { // assemble URL from register center's configuration\n-                // if protocols not injvm checkRegistry\n-                if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {\n-                    checkRegistry();\n-                    List<URL> us = ConfigValidationUtils.loadRegistries(this, false);\n-                    if (CollectionUtils.isNotEmpty(us)) {\n-                        for (URL u : us) {\n-                            URL monitorUrl = ConfigValidationUtils.loadMonitor(this, u);\n-                            if (monitorUrl != null) {\n-                                map.put(MONITOR_KEY, URL.encode(monitorUrl.toFullString()));\n-                            }\n-                            urls.add(u.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\n-                        }\n-                    }\n-                    if (urls.isEmpty()) {\n-                        throw new IllegalStateException(\n-                                \"No such any registry to reference \" + interfaceName + \" on the consumer \" + NetUtils.getLocalHost() +\n-                                        \" use dubbo version \" + Version.getVersion() +\n-                                        \", please config <dubbo:registry address=\\\"...\\\" /> to your spring config.\");\n-                    }\n-                }\n-            }\n-\n-            if (urls.size() == 1) {\n-                invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));\n-            } else {\n-                List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();\n-                URL registryURL = null;\n-                for (URL url : urls) {\n-                    Invoker<?> referInvoker = REF_PROTOCOL.refer(interfaceClass, url);\n-                    if (shouldCheck()) {\n-                        if (referInvoker.isAvailable()) {\n-                            invokers.add(referInvoker);\n-                        } else {\n-                            referInvoker.destroy();\n-                        }\n-                    } else {\n-                        invokers.add(referInvoker);\n-                    }\n-\n-                    if (UrlUtils.isRegistry(url)) {\n-                        registryURL = url; // use last registry url\n-                    }\n-                }\n-\n-                if (shouldCheck() && invokers.size() == 0) {\n-                    throw new IllegalStateException(\"Failed to check the status of the service \"\n-                            + interfaceName\n-                            + \". No provider available for the service \"\n-                            + (group == null ? \"\" : group + \"/\")\n-                            + interfaceName +\n-                            (version == null ? \"\" : \":\" + version)\n-                            + \" from the multi registry cluster\"\n-                            + \" use dubbo version \" + Version.getVersion());\n-                }\n-\n-                if (registryURL != null) { // registry url is available\n-                    // for multi-subscription scenario, use 'zone-aware' policy by default\n-                    String cluster = registryURL.getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME);\n-                    // The invoker wrap sequence would be: ZoneAwareClusterInvoker(StaticDirectory) -> FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker\n-                    invoker = Cluster.getCluster(cluster, false).join(new StaticDirectory(registryURL, invokers));\n-                } else { // not a registry url, must be direct invoke.\n-                    String cluster = CollectionUtils.isNotEmpty(invokers)\n-                            ?\n-                            (invokers.get(0).getUrl() != null ? invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) :\n-                                    Cluster.DEFAULT)\n-                            : Cluster.DEFAULT;\n-                    invoker = Cluster.getCluster(cluster).join(new StaticDirectory(invokers));\n-                }\n-            }\n-        }\n-\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Refer dubbo service \" + interfaceClass.getName() + \" from url \" + invoker.getUrl());\n-        }\n-\n-        URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);\n-        MetadataUtils.publishServiceDefinition(consumerURL);\n-\n-        // create service proxy\n-        return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));\n-    }\n-\n-    private void checkInvokerAvailable() throws IllegalStateException {\n-        if (shouldCheck() && !invoker.isAvailable()) {\n-            invoker.destroy();\n-            throw new IllegalStateException(\"Failed to check the status of the service \"\n-                    + interfaceName\n-                    + \". No provider available for the service \"\n-                    + (group == null ? \"\" : group + \"/\")\n-                    + interfaceName +\n-                    (version == null ? \"\" : \":\" + version)\n-                    + \" from the url \"\n-                    + invoker.getUrl()\n-                    + \" to the consumer \"\n-                    + NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion());\n-        }\n-    }\n-\n-    /**\n-     * This method should be called right after the creation of this class's instance, before any property in other config modules is used.\n-     * Check each config modules are created properly and override their properties if necessary.\n-     */\n-    public void checkAndUpdateSubConfigs() {\n-        if (StringUtils.isEmpty(interfaceName)) {\n-            throw new IllegalStateException(\"<dubbo:reference interface=\\\"\\\" /> interface not allow null!\");\n-        }\n-        completeCompoundConfigs(consumer);\n-        // get consumer's global configuration\n-        checkDefault();\n-\n-        // init some null configuration.\n-        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\n-                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\n-        configInitializers.forEach(e -> e.initReferConfig(this));\n-\n-        this.refresh();\n-        if (getGeneric() == null && getConsumer() != null) {\n-            setGeneric(getConsumer().getGeneric());\n-        }\n-        if (ProtocolUtils.isGeneric(generic)) {\n-            interfaceClass = GenericService.class;\n-        } else {\n-            try {\n-                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\n-                        .getContextClassLoader());\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            checkInterfaceAndMethods(interfaceClass, getMethods());\n-        }\n-\n-        initServiceMetadata(consumer);\n-        serviceMetadata.setServiceType(getActualInterface());\n-        // TODO, uncomment this line once service key is unified\n-        serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, version));\n-\n-        ServiceRepository repository = ApplicationModel.getServiceRepository();\n-        ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass);\n-        repository.registerConsumer(\n-                serviceMetadata.getServiceKey(),\n-                serviceDescriptor,\n-                this,\n-                null,\n-                serviceMetadata);\n-\n-        resolveFile();\n-        ConfigValidationUtils.validateReferenceConfig(this);\n-        postProcessConfig();\n-    }\n-\n-\n-    /**\n-     * Figure out should refer the service in the same JVM from configurations. The default behavior is true\n-     * 1. if injvm is specified, then use it\n-     * 2. then if a url is specified, then assume it's a remote call\n-     * 3. otherwise, check scope parameter\n-     * 4. if scope is not specified but the target service is provided in the same JVM, then prefer to make the local\n-     * call, which is the default behavior\n-     */\n-    protected boolean shouldJvmRefer(Map<String, String> map) {\n-        URL tmpUrl = new URL(\"temp\", \"localhost\", 0, map);\n-        boolean isJvmRefer;\n-        if (isInjvm() == null) {\n-            // if a url is specified, don't do local reference\n-            if (url != null && url.length() > 0) {\n-                isJvmRefer = false;\n-            } else {\n-                // by default, reference local service if there is\n-                isJvmRefer = InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl);\n-            }\n-        } else {\n-            isJvmRefer = isInjvm();\n-        }\n-        return isJvmRefer;\n-    }\n-\n-    /**\n-     * Dispatch an {@link Event event}\n-     *\n-     * @param event an {@link Event event}\n-     * @since 2.7.5\n-     */\n-    protected void dispatch(Event event) {\n-        EventDispatcher.getDefaultExtension().dispatch(event);\n-    }\n-\n-    public DubboBootstrap getBootstrap() {\n-        return bootstrap;\n-    }\n-\n-    public void setBootstrap(DubboBootstrap bootstrap) {\n-        this.bootstrap = bootstrap;\n-    }\n-\n-    private void postProcessConfig() {\n-        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\n-                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\n-        configPostProcessors.forEach(component -> component.postProcessReferConfig(this));\n-    }\n-\n-    // just for test\n-    Invoker<?> getInvoker() {\n-        return invoker;\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.bytecode.Wrapper;\r\n+import org.apache.dubbo.common.constants.RegistryConstants;\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.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.NetUtils;\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.annotation.Reference;\r\n+import org.apache.dubbo.config.bootstrap.DubboBootstrap;\r\n+import org.apache.dubbo.config.event.ReferenceConfigDestroyedEvent;\r\n+import org.apache.dubbo.config.event.ReferenceConfigInitializedEvent;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.config.utils.ConfigValidationUtils;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;\r\n+import org.apache.dubbo.rpc.cluster.support.ClusterUtils;\r\n+import org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.AsyncMethodInfo;\r\n+import org.apache.dubbo.rpc.model.ConsumerModel;\r\n+import org.apache.dubbo.rpc.model.ServiceDescriptor;\r\n+import org.apache.dubbo.rpc.model.ServiceRepository;\r\n+import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;\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.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+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROXY_CLASS_REF;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\r\n+import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\r\n+import static org.apache.dubbo.common.utils.StringUtils.splitToSet;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\r\n+import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+\r\n+/**\r\n+ * Please avoid using this class for any new application,\r\n+ * use {@link ReferenceConfigBase} instead.\r\n+ */\r\n+public class ReferenceConfig<T> extends ReferenceConfigBase<T> {\r\n+\r\n+    public static final Logger logger = LoggerFactory.getLogger(ReferenceConfig.class);\r\n+\r\n+    /**\r\n+     * The {@link Protocol} implementation with adaptive functionality,it will be different in different scenarios.\r\n+     * A particular {@link Protocol} implementation is determined by the protocol attribute in the {@link URL}.\r\n+     * For example:\r\n+     *\r\n+     * <li>when the url is registry://224.5.6.7:1234/org.apache.dubbo.registry.RegistryService?application=dubbo-sample,\r\n+     * then the protocol is <b>RegistryProtocol</b></li>\r\n+     *\r\n+     * <li>when the url is dubbo://224.5.6.7:1234/org.apache.dubbo.config.api.DemoService?application=dubbo-sample, then\r\n+     * the protocol is <b>DubboProtocol</b></li>\r\n+     * <p>\r\n+     * Actually\uff0cwhen the {@link ExtensionLoader} init the {@link Protocol} instants,it will automatically wraps two\r\n+     * layers, and eventually will get a <b>ProtocolFilterWrapper</b> or <b>ProtocolListenerWrapper</b>\r\n+     */\r\n+    private static final Protocol REF_PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * The {@link Cluster}'s implementation with adaptive functionality, and actually it will get a {@link Cluster}'s\r\n+     * specific implementation who is wrapped with <b>MockClusterInvoker</b>\r\n+     */\r\n+    private static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * A {@link ProxyFactory} implementation that will generate a reference service's proxy,the JavassistProxyFactory is\r\n+     * its default implementation\r\n+     */\r\n+    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * The interface proxy reference\r\n+     */\r\n+    private transient volatile T ref;\r\n+\r\n+    /**\r\n+     * The invoker of the reference service\r\n+     */\r\n+    private transient volatile Invoker<?> invoker;\r\n+\r\n+    /**\r\n+     * The flag whether the ReferenceConfig has been initialized\r\n+     */\r\n+    private transient volatile boolean initialized;\r\n+\r\n+    /**\r\n+     * whether this ReferenceConfig has been destroyed\r\n+     */\r\n+    private transient volatile boolean destroyed;\r\n+\r\n+    private final ServiceRepository repository;\r\n+\r\n+    private DubboBootstrap bootstrap;\r\n+\r\n+    /**\r\n+     * The service names that the Dubbo interface subscribed.\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    private String services;\r\n+\r\n+    public ReferenceConfig() {\r\n+        super();\r\n+        this.repository = ApplicationModel.getServiceRepository();\r\n+    }\r\n+\r\n+    public ReferenceConfig(Reference reference) {\r\n+        super(reference);\r\n+        this.repository = ApplicationModel.getServiceRepository();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get a string presenting the service names that the Dubbo interface subscribed.\r\n+     * If it is a multiple-values, the content will be a comma-delimited String.\r\n+     *\r\n+     * @return non-null\r\n+     * @see RegistryConstants#SUBSCRIBED_SERVICE_NAMES_KEY\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(key = SUBSCRIBED_SERVICE_NAMES_KEY)\r\n+    public String getServices() {\r\n+        return services;\r\n+    }\r\n+\r\n+    /**\r\n+     * It's an alias method for {@link #getServices()}, but the more convenient.\r\n+     *\r\n+     * @return the String {@link List} presenting the Dubbo interface subscribed\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public Set<String> getSubscribedServices() {\r\n+        return splitToSet(getServices(), COMMA_SEPARATOR_CHAR);\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the service names that the Dubbo interface subscribed.\r\n+     *\r\n+     * @param services If it is a multiple-values, the content will be a comma-delimited String.\r\n+     * @since 2.7.8\r\n+     */\r\n+    public void setServices(String services) {\r\n+        this.services = services;\r\n+    }\r\n+\r\n+    public synchronized T get() {\r\n+        if (destroyed) {\r\n+            throw new IllegalStateException(\"The invoker of ReferenceConfig(\" + url + \") has already destroyed!\");\r\n+        }\r\n+        if (ref == null) {\r\n+            init();\r\n+        }\r\n+        return ref;\r\n+    }\r\n+\r\n+    public synchronized void destroy() {\r\n+        if (ref == null) {\r\n+            return;\r\n+        }\r\n+        if (destroyed) {\r\n+            return;\r\n+        }\r\n+        destroyed = true;\r\n+        try {\r\n+            invoker.destroy();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Unexpected error occurred when destroy invoker of ReferenceConfig(\" + url + \").\", t);\r\n+        }\r\n+        invoker = null;\r\n+        ref = null;\r\n+\r\n+        // dispatch a ReferenceConfigDestroyedEvent since 2.7.4\r\n+        dispatch(new ReferenceConfigDestroyedEvent(this));\r\n+    }\r\n+\r\n+    public synchronized void init() {\r\n+        if (initialized) {\r\n+            return;\r\n+        }\r\n+\r\n+\r\n+        if (bootstrap == null) {\r\n+            bootstrap = DubboBootstrap.getInstance();\r\n+            bootstrap.initialize();\r\n+        }\r\n+\r\n+        checkAndUpdateSubConfigs();\r\n+\r\n+        checkStubAndLocal(interfaceClass);\r\n+        ConfigValidationUtils.checkMock(interfaceClass, this);\r\n+\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        map.put(SIDE_KEY, CONSUMER_SIDE);\r\n+\r\n+        ReferenceConfigBase.appendRuntimeParameters(map);\r\n+        if (!ProtocolUtils.isGeneric(generic)) {\r\n+            String revision = Version.getVersion(interfaceClass, version);\r\n+            if (revision != null && revision.length() > 0) {\r\n+                map.put(REVISION_KEY, revision);\r\n+            }\r\n+\r\n+            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\r\n+            if (methods.length == 0) {\r\n+                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\r\n+                map.put(METHODS_KEY, ANY_VALUE);\r\n+            } else {\r\n+                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), COMMA_SEPARATOR));\r\n+            }\r\n+        }\r\n+        map.put(INTERFACE_KEY, interfaceName);\r\n+        AbstractConfig.appendParameters(map, getMetrics());\r\n+        AbstractConfig.appendParameters(map, getApplication());\r\n+        AbstractConfig.appendParameters(map, getModule());\r\n+        // remove 'default.' prefix for configs from ConsumerConfig\r\n+        // appendParameters(map, consumer, Constants.DEFAULT_KEY);\r\n+        AbstractConfig.appendParameters(map, consumer);\r\n+        AbstractConfig.appendParameters(map, this);\r\n+        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\r\n+        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\r\n+            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\r\n+        }\r\n+        Map<String, AsyncMethodInfo> attributes = null;\r\n+        if (CollectionUtils.isNotEmpty(getMethods())) {\r\n+            attributes = new HashMap<>();\r\n+            for (MethodConfig methodConfig : getMethods()) {\r\n+                AbstractConfig.appendParameters(map, methodConfig, methodConfig.getName());\r\n+                String retryKey = methodConfig.getName() + \".retry\";\r\n+                if (map.containsKey(retryKey)) {\r\n+                    String retryValue = map.remove(retryKey);\r\n+                    if (\"false\".equals(retryValue)) {\r\n+                        map.put(methodConfig.getName() + \".retries\", \"0\");\r\n+                    }\r\n+                }\r\n+                AsyncMethodInfo asyncMethodInfo = AbstractConfig.convertMethodConfig2AsyncInfo(methodConfig);\r\n+                if (asyncMethodInfo != null) {\r\n+//                    consumerModel.getMethodModel(methodConfig.getName()).addAttribute(ASYNC_KEY, asyncMethodInfo);\r\n+                    attributes.put(methodConfig.getName(), asyncMethodInfo);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\r\n+        if (StringUtils.isEmpty(hostToRegistry)) {\r\n+            hostToRegistry = NetUtils.getLocalHost();\r\n+        } else if (isInvalidLocalHost(hostToRegistry)) {\r\n+            throw new IllegalArgumentException(\r\n+                    \"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\r\n+        }\r\n+        map.put(REGISTER_IP_KEY, hostToRegistry);\r\n+\r\n+        serviceMetadata.getAttachments().putAll(map);\r\n+\r\n+        ref = createProxy(map);\r\n+\r\n+        serviceMetadata.setTarget(ref);\r\n+        serviceMetadata.addAttribute(PROXY_CLASS_REF, ref);\r\n+        ConsumerModel consumerModel = repository.lookupReferredService(serviceMetadata.getServiceKey());\r\n+        consumerModel.setProxyObject(ref);\r\n+        consumerModel.init(attributes);\r\n+\r\n+        initialized = true;\r\n+\r\n+        checkInvokerAvailable();\r\n+\r\n+        // dispatch a ReferenceConfigInitializedEvent since 2.7.4\r\n+        dispatch(new ReferenceConfigInitializedEvent(this, invoker));\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\", \"deprecation\"})\r\n+    private T createProxy(Map<String, String> map) {\r\n+        if (shouldJvmRefer(map)) {\r\n+            URL url = new URL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0, interfaceClass.getName()).addParameters(map);\r\n+            invoker = REF_PROTOCOL.refer(interfaceClass, url);\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"Using injvm service \" + interfaceClass.getName());\r\n+            }\r\n+        } else {\r\n+            urls.clear();\r\n+            if (url != null && url.length() > 0) { // user specified URL, could be peer-to-peer address, or register center's address.\r\n+                String[] us = SEMICOLON_SPLIT_PATTERN.split(url);\r\n+                if (us != null && us.length > 0) {\r\n+                    for (String u : us) {\r\n+                        URL url = URL.valueOf(u);\r\n+                        if (StringUtils.isEmpty(url.getPath())) {\r\n+                            url = url.setPath(interfaceName);\r\n+                        }\r\n+                        if (UrlUtils.isRegistry(url)) {\r\n+                            urls.add(url.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\r\n+                        } else {\r\n+                            urls.add(ClusterUtils.mergeUrl(url, map));\r\n+                        }\r\n+                    }\r\n+                }\r\n+            } else { // assemble URL from register center's configuration\r\n+                // if protocols not injvm checkRegistry\r\n+                if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {\r\n+                    checkRegistry();\r\n+                    List<URL> us = ConfigValidationUtils.loadRegistries(this, false);\r\n+                    if (CollectionUtils.isNotEmpty(us)) {\r\n+                        for (URL u : us) {\r\n+                            URL monitorUrl = ConfigValidationUtils.loadMonitor(this, u);\r\n+                            if (monitorUrl != null) {\r\n+                                map.put(MONITOR_KEY, URL.encode(monitorUrl.toFullString()));\r\n+                            }\r\n+                            urls.add(u.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\r\n+                        }\r\n+                    }\r\n+                    if (urls.isEmpty()) {\r\n+                        throw new IllegalStateException(\r\n+                                \"No such any registry to reference \" + interfaceName + \" on the consumer \" + NetUtils.getLocalHost() +\r\n+                                        \" use dubbo version \" + Version.getVersion() +\r\n+                                        \", please config <dubbo:registry address=\\\"...\\\" /> to your spring config.\");\r\n+                    }\r\n+                }\r\n+            }\r\n+\r\n+            if (urls.size() == 1) {\r\n+                invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));\r\n+            } else {\r\n+                List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();\r\n+                URL registryURL = null;\r\n+                for (URL url : urls) {\r\n+                    Invoker<?> referInvoker = REF_PROTOCOL.refer(interfaceClass, url);\r\n+                    if (shouldCheck()) {\r\n+                        if (referInvoker.isAvailable()) {\r\n+                            invokers.add(referInvoker);\r\n+                        } else {\r\n+                            referInvoker.destroy();\r\n+                        }\r\n+                    } else {\r\n+                        invokers.add(referInvoker);\r\n+                    }\r\n+\r\n+                    if (UrlUtils.isRegistry(url)) {\r\n+                        registryURL = url; // use last registry url\r\n+                    }\r\n+                }\r\n+\r\n+                if (shouldCheck() && invokers.size() == 0) {\r\n+                    throw new IllegalStateException(\"Failed to check the status of the service \"\r\n+                            + interfaceName\r\n+                            + \". No provider available for the service \"\r\n+                            + (group == null ? \"\" : group + \"/\")\r\n+                            + interfaceName +\r\n+                            (version == null ? \"\" : \":\" + version)\r\n+                            + \" from the multi registry cluster\"\r\n+                            + \" use dubbo version \" + Version.getVersion());\r\n+                }\r\n+\r\n+                if (registryURL != null) { // registry url is available\r\n+                    // for multi-subscription scenario, use 'zone-aware' policy by default\r\n+                    String cluster = registryURL.getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME);\r\n+                    // The invoker wrap sequence would be: ZoneAwareClusterInvoker(StaticDirectory) -> FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker\r\n+                    invoker = Cluster.getCluster(cluster, false).join(new StaticDirectory(registryURL, invokers));\r\n+                } else { // not a registry url, must be direct invoke.\r\n+                    String cluster = CollectionUtils.isNotEmpty(invokers)\r\n+                            ?\r\n+                            (invokers.get(0).getUrl() != null ? invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) :\r\n+                                    Cluster.DEFAULT)\r\n+                            : Cluster.DEFAULT;\r\n+                    invoker = Cluster.getCluster(cluster).join(new StaticDirectory(invokers));\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Refer dubbo service \" + interfaceClass.getName() + \" from url \" + invoker.getUrl());\r\n+        }\r\n+\r\n+        URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);\r\n+        MetadataUtils.publishServiceDefinition(consumerURL);\r\n+\r\n+        // create service proxy\r\n+        return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));\r\n+    }\r\n+\r\n+    private void checkInvokerAvailable() throws IllegalStateException {\r\n+        if (shouldCheck() && !invoker.isAvailable()) {\r\n+            invoker.destroy();\r\n+            throw new IllegalStateException(\"Failed to check the status of the service \"\r\n+                    + interfaceName\r\n+                    + \". No provider available for the service \"\r\n+                    + (group == null ? \"\" : group + \"/\")\r\n+                    + interfaceName +\r\n+                    (version == null ? \"\" : \":\" + version)\r\n+                    + \" from the url \"\r\n+                    + invoker.getUrl()\r\n+                    + \" to the consumer \"\r\n+                    + NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * This method should be called right after the creation of this class's instance, before any property in other config modules is used.\r\n+     * Check each config modules are created properly and override their properties if necessary.\r\n+     */\r\n+    public void checkAndUpdateSubConfigs() {\r\n+        if (StringUtils.isEmpty(interfaceName)) {\r\n+            throw new IllegalStateException(\"<dubbo:reference interface=\\\"\\\" /> interface not allow null!\");\r\n+        }\r\n+        completeCompoundConfigs(consumer);\r\n+        // get consumer's global configuration\r\n+        checkDefault();\r\n+\r\n+        // init some null configuration.\r\n+        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\r\n+                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\r\n+        configInitializers.forEach(e -> e.initReferConfig(this));\r\n+\r\n+        this.refresh();\r\n+        if (getGeneric() == null && getConsumer() != null) {\r\n+            setGeneric(getConsumer().getGeneric());\r\n+        }\r\n+        if (ProtocolUtils.isGeneric(generic)) {\r\n+            interfaceClass = GenericService.class;\r\n+        } else {\r\n+            try {\r\n+                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\r\n+                        .getContextClassLoader());\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            checkInterfaceAndMethods(interfaceClass, getMethods());\r\n+        }\r\n+\r\n+        initServiceMetadata(consumer);\r\n+        serviceMetadata.setServiceType(getActualInterface());\r\n+        // TODO, uncomment this line once service key is unified\r\n+        serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, version));\r\n+\r\n+        ServiceRepository repository = ApplicationModel.getServiceRepository();\r\n+        ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass);\r\n+        repository.registerConsumer(\r\n+                serviceMetadata.getServiceKey(),\r\n+                serviceDescriptor,\r\n+                this,\r\n+                null,\r\n+                serviceMetadata);\r\n+\r\n+        resolveFile();\r\n+        ConfigValidationUtils.validateReferenceConfig(this);\r\n+        postProcessConfig();\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Figure out should refer the service in the same JVM from configurations. The default behavior is true\r\n+     * 1. if injvm is specified, then use it\r\n+     * 2. then if a url is specified, then assume it's a remote call\r\n+     * 3. otherwise, check scope parameter\r\n+     * 4. if scope is not specified but the target service is provided in the same JVM, then prefer to make the local\r\n+     * call, which is the default behavior\r\n+     */\r\n+    protected boolean shouldJvmRefer(Map<String, String> map) {\r\n+        URL tmpUrl = new URL(\"temp\", \"localhost\", 0, map);\r\n+        boolean isJvmRefer;\r\n+        if (isInjvm() == null) {\r\n+            // if a url is specified, don't do local reference\r\n+            if (url != null && url.length() > 0) {\r\n+                isJvmRefer = false;\r\n+            } else {\r\n+                // by default, reference local service if there is\r\n+                isJvmRefer = InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl);\r\n+            }\r\n+        } else {\r\n+            isJvmRefer = isInjvm();\r\n+        }\r\n+        return isJvmRefer;\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch an {@link Event event}\r\n+     *\r\n+     * @param event an {@link Event event}\r\n+     * @since 2.7.5\r\n+     */\r\n+    protected void dispatch(Event event) {\r\n+        EventDispatcher.getDefaultExtension().dispatch(event);\r\n+    }\r\n+\r\n+    public DubboBootstrap getBootstrap() {\r\n+        return bootstrap;\r\n+    }\r\n+\r\n+    public void setBootstrap(DubboBootstrap bootstrap) {\r\n+        this.bootstrap = bootstrap;\r\n+    }\r\n+\r\n+    private void postProcessConfig() {\r\n+        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\r\n+                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\r\n+        configPostProcessors.forEach(component -> component.postProcessReferConfig(this));\r\n+    }\r\n+\r\n+    // just for test\r\n+    Invoker<?> getInvoker() {\r\n+        return invoker;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ServiceConfig.java", "source2": "org/apache/dubbo/config/ServiceConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,727 +1,727 @@\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.URLBuilder;\n-import org.apache.dubbo.common.Version;\n-import org.apache.dubbo.common.bytecode.Wrapper;\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.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.annotation.Service;\n-import org.apache.dubbo.config.bootstrap.DubboBootstrap;\n-import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\n-import org.apache.dubbo.config.event.ServiceConfigUnexportedEvent;\n-import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.config.utils.ConfigValidationUtils;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.metadata.ServiceNameMapping;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.cluster.ConfiguratorFactory;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ServiceDescriptor;\n-import org.apache.dubbo.rpc.model.ServiceRepository;\n-import org.apache.dubbo.rpc.service.GenericService;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import java.lang.reflect.Method;\n-import java.net.InetAddress;\n-import java.net.InetSocketAddress;\n-import java.net.Socket;\n-import java.net.SocketAddress;\n-import java.net.UnknownHostException;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.UUID;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REGISTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;\n-import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort;\n-import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;\n-import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\n-import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort;\n-import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\n-import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_BIND;\n-import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_REGISTRY;\n-import static org.apache.dubbo.config.Constants.MULTICAST;\n-import static org.apache.dubbo.config.Constants.SCOPE_NONE;\n-import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\n-import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\n-import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\n-import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\n-import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\n-import static org.apache.dubbo.rpc.Constants.SCOPE_KEY;\n-import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;\n-import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\n-\n-public class ServiceConfig<T> extends ServiceConfigBase<T> {\n-\n-    public static final Logger logger = LoggerFactory.getLogger(ServiceConfig.class);\n-\n-    /**\n-     * A random port cache, the different protocols who has no port specified have different random port\n-     */\n-    private static final Map<String, Integer> RANDOM_PORT_MAP = new HashMap<String, Integer>();\n-\n-    /**\n-     * A delayed exposure service timer\n-     */\n-    private static final ScheduledExecutorService DELAY_EXPORT_EXECUTOR = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"DubboServiceDelayExporter\", true));\n-\n-    private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\n-\n-    /**\n-     * A {@link ProxyFactory} implementation that will generate a exported service proxy,the JavassistProxyFactory is its\n-     * default implementation\n-     */\n-    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\n-\n-    /**\n-     * Whether the provider has been exported\n-     */\n-    private transient volatile boolean exported;\n-\n-    /**\n-     * The flag whether a service has unexported ,if the method unexported is invoked, the value is true\n-     */\n-    private transient volatile boolean unexported;\n-\n-    private DubboBootstrap bootstrap;\n-\n-    /**\n-     * The exported services\n-     */\n-    private final List<Exporter<?>> exporters = new ArrayList<Exporter<?>>();\n-\n-    public ServiceConfig() {\n-    }\n-\n-    public ServiceConfig(Service service) {\n-        super(service);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public boolean isExported() {\n-        return exported;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public boolean isUnexported() {\n-        return unexported;\n-    }\n-\n-    public void unexport() {\n-        if (!exported) {\n-            return;\n-        }\n-        if (unexported) {\n-            return;\n-        }\n-        if (!exporters.isEmpty()) {\n-            for (Exporter<?> exporter : exporters) {\n-                try {\n-                    exporter.unexport();\n-                } catch (Throwable t) {\n-                    logger.warn(\"Unexpected error occurred when unexport \" + exporter, t);\n-                }\n-            }\n-            exporters.clear();\n-        }\n-        unexported = true;\n-\n-        // dispatch a ServiceConfigUnExportedEvent since 2.7.4\n-        dispatch(new ServiceConfigUnexportedEvent(this));\n-    }\n-\n-    public synchronized void export() {\n-        if (bootstrap == null) {\n-            bootstrap = DubboBootstrap.getInstance();\n-            bootstrap.initialize();\n-        }\n-\n-        checkAndUpdateSubConfigs();\n-\n-        initServiceMetadata(provider);\n-        serviceMetadata.setServiceType(getInterfaceClass());\n-        serviceMetadata.setTarget(getRef());\n-        serviceMetadata.generateServiceKey();\n-\n-        if (!shouldExport()) {\n-            return;\n-        }\n-\n-        if (shouldDelay()) {\n-            DELAY_EXPORT_EXECUTOR.schedule(this::doExport, getDelay(), TimeUnit.MILLISECONDS);\n-        } else {\n-            doExport();\n-        }\n-\n-        exported();\n-    }\n-\n-    public void exported() {\n-        List<URL> exportedURLs = this.getExportedUrls();\n-        exportedURLs.forEach(url -> {\n-            Map<String, String> parameters = getApplication().getParameters();\n-            ServiceNameMapping.getExtension(parameters != null ? parameters.get(MAPPING_KEY) : null).map(url);\n-        });\n-        // dispatch a ServiceConfigExportedEvent since 2.7.4\n-        dispatch(new ServiceConfigExportedEvent(this));\n-    }\n-\n-    private void checkAndUpdateSubConfigs() {\n-        // Use default configs defined explicitly with global scope\n-        completeCompoundConfigs();\n-        checkDefault();\n-        checkProtocol();\n-        // init some null configuration.\n-        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\n-                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\n-        configInitializers.forEach(e -> e.initServiceConfig(this));\n-\n-        // if protocol is not injvm checkRegistry\n-        if (!isOnlyInJvm()) {\n-            checkRegistry();\n-        }\n-        this.refresh();\n-\n-        if (StringUtils.isEmpty(interfaceName)) {\n-            throw new IllegalStateException(\"<dubbo:service interface=\\\"\\\" /> interface not allow null!\");\n-        }\n-\n-        if (ref instanceof GenericService) {\n-            interfaceClass = GenericService.class;\n-            if (StringUtils.isEmpty(generic)) {\n-                generic = Boolean.TRUE.toString();\n-            }\n-        } else {\n-            try {\n-                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\n-                        .getContextClassLoader());\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            checkInterfaceAndMethods(interfaceClass, getMethods());\n-            checkRef();\n-            generic = Boolean.FALSE.toString();\n-        }\n-        if (local != null) {\n-            if (\"true\".equals(local)) {\n-                local = interfaceName + \"Local\";\n-            }\n-            Class<?> localClass;\n-            try {\n-                localClass = ClassUtils.forNameWithThreadContextClassLoader(local);\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            if (!interfaceClass.isAssignableFrom(localClass)) {\n-                throw new IllegalStateException(\"The local implementation class \" + localClass.getName() + \" not implement interface \" + interfaceName);\n-            }\n-        }\n-        if (stub != null) {\n-            if (\"true\".equals(stub)) {\n-                stub = interfaceName + \"Stub\";\n-            }\n-            Class<?> stubClass;\n-            try {\n-                stubClass = ClassUtils.forNameWithThreadContextClassLoader(stub);\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            if (!interfaceClass.isAssignableFrom(stubClass)) {\n-                throw new IllegalStateException(\"The stub implementation class \" + stubClass.getName() + \" not implement interface \" + interfaceName);\n-            }\n-        }\n-        checkStubAndLocal(interfaceClass);\n-        ConfigValidationUtils.checkMock(interfaceClass, this);\n-        ConfigValidationUtils.validateServiceConfig(this);\n-        postProcessConfig();\n-    }\n-\n-\n-    protected synchronized void doExport() {\n-        if (unexported) {\n-            throw new IllegalStateException(\"The service \" + interfaceClass.getName() + \" has already unexported!\");\n-        }\n-        if (exported) {\n-            return;\n-        }\n-        exported = true;\n-\n-        if (StringUtils.isEmpty(path)) {\n-            path = interfaceName;\n-        }\n-        doExportUrls();\n-        bootstrap.setReady(true);\n-    }\n-\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n-    private void doExportUrls() {\n-        ServiceRepository repository = ApplicationModel.getServiceRepository();\n-        ServiceDescriptor serviceDescriptor = repository.registerService(getInterfaceClass());\n-        repository.registerProvider(\n-                getUniqueServiceName(),\n-                ref,\n-                serviceDescriptor,\n-                this,\n-                serviceMetadata\n-        );\n-\n-        List<URL> registryURLs = ConfigValidationUtils.loadRegistries(this, true);\n-\n-        for (ProtocolConfig protocolConfig : protocols) {\n-            String pathKey = URL.buildKey(getContextPath(protocolConfig)\n-                    .map(p -> p + \"/\" + path)\n-                    .orElse(path), group, version);\n-            // In case user specified path, register service one more time to map it to path.\n-            repository.registerService(pathKey, interfaceClass);\n-            doExportUrlsFor1Protocol(protocolConfig, registryURLs);\n-        }\n-    }\n-\n-    private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {\n-        String name = protocolConfig.getName();\n-        if (StringUtils.isEmpty(name)) {\n-            name = DUBBO;\n-        }\n-\n-        Map<String, String> map = new HashMap<String, String>();\n-        map.put(SIDE_KEY, PROVIDER_SIDE);\n-\n-        ServiceConfig.appendRuntimeParameters(map);\n-        AbstractConfig.appendParameters(map, getMetrics());\n-        AbstractConfig.appendParameters(map, getApplication());\n-        AbstractConfig.appendParameters(map, getModule());\n-        // remove 'default.' prefix for configs from ProviderConfig\n-        // appendParameters(map, provider, Constants.DEFAULT_KEY);\n-        AbstractConfig.appendParameters(map, provider);\n-        AbstractConfig.appendParameters(map, protocolConfig);\n-        AbstractConfig.appendParameters(map, this);\n-        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\n-        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\n-            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\n-        }\n-        if (CollectionUtils.isNotEmpty(getMethods())) {\n-            for (MethodConfig method : getMethods()) {\n-                AbstractConfig.appendParameters(map, method, method.getName());\n-                String retryKey = method.getName() + \".retry\";\n-                if (map.containsKey(retryKey)) {\n-                    String retryValue = map.remove(retryKey);\n-                    if (\"false\".equals(retryValue)) {\n-                        map.put(method.getName() + \".retries\", \"0\");\n-                    }\n-                }\n-                List<ArgumentConfig> arguments = method.getArguments();\n-                if (CollectionUtils.isNotEmpty(arguments)) {\n-                    for (ArgumentConfig argument : arguments) {\n-                        // convert argument type\n-                        if (argument.getType() != null && argument.getType().length() > 0) {\n-                            Method[] methods = interfaceClass.getMethods();\n-                            // visit all methods\n-                            if (methods.length > 0) {\n-                                for (int i = 0; i < methods.length; i++) {\n-                                    String methodName = methods[i].getName();\n-                                    // target the method, and get its signature\n-                                    if (methodName.equals(method.getName())) {\n-                                        Class<?>[] argtypes = methods[i].getParameterTypes();\n-                                        // one callback in the method\n-                                        if (argument.getIndex() != -1) {\n-                                            if (argtypes[argument.getIndex()].getName().equals(argument.getType())) {\n-                                                AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\n-                                            } else {\n-                                                throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\n-                                            }\n-                                        } else {\n-                                            // multiple callbacks in the method\n-                                            for (int j = 0; j < argtypes.length; j++) {\n-                                                Class<?> argclazz = argtypes[j];\n-                                                if (argclazz.getName().equals(argument.getType())) {\n-                                                    AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + j);\n-                                                    if (argument.getIndex() != -1 && argument.getIndex() != j) {\n-                                                        throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\n-                                                    }\n-                                                }\n-                                            }\n-                                        }\n-                                    }\n-                                }\n-                            }\n-                        } else if (argument.getIndex() != -1) {\n-                            AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\n-                        } else {\n-                            throw new IllegalArgumentException(\"Argument config must set index or type attribute.eg: <dubbo:argument index='0' .../> or <dubbo:argument type=xxx .../>\");\n-                        }\n-\n-                    }\n-                }\n-            } // end of methods for\n-        }\n-\n-        if (ProtocolUtils.isGeneric(generic)) {\n-            map.put(GENERIC_KEY, generic);\n-            map.put(METHODS_KEY, ANY_VALUE);\n-        } else {\n-            String revision = Version.getVersion(interfaceClass, version);\n-            if (revision != null && revision.length() > 0) {\n-                map.put(REVISION_KEY, revision);\n-            }\n-\n-            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\n-            if (methods.length == 0) {\n-                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\n-                map.put(METHODS_KEY, ANY_VALUE);\n-            } else {\n-                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), \",\"));\n-            }\n-        }\n-\n-        /**\n-         * Here the token value configured by the provider is used to assign the value to ServiceConfig#token\n-         */\n-        if (ConfigUtils.isEmpty(token) && provider != null) {\n-            token = provider.getToken();\n-        }\n-\n-        if (!ConfigUtils.isEmpty(token)) {\n-            if (ConfigUtils.isDefault(token)) {\n-                map.put(TOKEN_KEY, UUID.randomUUID().toString());\n-            } else {\n-                map.put(TOKEN_KEY, token);\n-            }\n-        }\n-        //init serviceMetadata attachments\n-        serviceMetadata.getAttachments().putAll(map);\n-\n-        // export service\n-        String host = findConfigedHosts(protocolConfig, registryURLs, map);\n-        Integer port = findConfigedPorts(protocolConfig, name, map);\n-        URL url = new URL(name, host, port, getContextPath(protocolConfig).map(p -> p + \"/\" + path).orElse(path), map);\n-\n-        // You can customize Configurator to append extra parameters\n-        if (ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\n-                .hasExtension(url.getProtocol())) {\n-            url = ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\n-                    .getExtension(url.getProtocol()).getConfigurator(url).configure(url);\n-        }\n-\n-        String scope = url.getParameter(SCOPE_KEY);\n-        // don't export when none is configured\n-        if (!SCOPE_NONE.equalsIgnoreCase(scope)) {\n-\n-            // export to local if the config is not remote (export to remote only when config is remote)\n-            if (!SCOPE_REMOTE.equalsIgnoreCase(scope)) {\n-                exportLocal(url);\n-            }\n-            // export to remote if the config is not local (export to local only when config is local)\n-            if (!SCOPE_LOCAL.equalsIgnoreCase(scope)) {\n-                if (CollectionUtils.isNotEmpty(registryURLs)) {\n-                    for (URL registryURL : registryURLs) {\n-                        //if protocol is only injvm ,not register\n-                        if (LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\n-                            continue;\n-                        }\n-                        url = url.addParameterIfAbsent(DYNAMIC_KEY, registryURL.getParameter(DYNAMIC_KEY));\n-                        URL monitorUrl = ConfigValidationUtils.loadMonitor(this, registryURL);\n-                        if (monitorUrl != null) {\n-                            url = url.addParameterAndEncoded(MONITOR_KEY, monitorUrl.toFullString());\n-                        }\n-                        if (logger.isInfoEnabled()) {\n-                            if (url.getParameter(REGISTER_KEY, true)) {\n-                                logger.info(\"Register dubbo service \" + interfaceClass.getName() + \" url \" + url + \" to registry \" + registryURL);\n-                            } else {\n-                                logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\n-                            }\n-                        }\n-\n-                        // For providers, this is used to enable custom proxy to generate invoker\n-                        String proxy = url.getParameter(PROXY_KEY);\n-                        if (StringUtils.isNotEmpty(proxy)) {\n-                            registryURL = registryURL.addParameter(PROXY_KEY, proxy);\n-                        }\n-\n-                        Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));\n-                        DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\n-\n-                        Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\n-                        exporters.add(exporter);\n-                    }\n-                } else {\n-                    if (logger.isInfoEnabled()) {\n-                        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\n-                    }\n-                    Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, url);\n-                    DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\n-\n-                    Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\n-                    exporters.add(exporter);\n-                }\n-\n-                MetadataUtils.publishServiceDefinition(url);\n-            }\n-        }\n-        this.urls.add(url);\n-    }\n-\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n-    /**\n-     * always export injvm\n-     */\n-    private void exportLocal(URL url) {\n-        URL local = URLBuilder.from(url)\n-                .setProtocol(LOCAL_PROTOCOL)\n-                .setHost(LOCALHOST_VALUE)\n-                .setPort(0)\n-                .build();\n-        Exporter<?> exporter = PROTOCOL.export(\n-                PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, local));\n-        exporters.add(exporter);\n-        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to local registry url : \" + local);\n-    }\n-\n-    /**\n-     * Determine if it is injvm\n-     *\n-     * @return\n-     */\n-    private boolean isOnlyInJvm() {\n-        return getProtocols().size() == 1\n-                && LOCAL_PROTOCOL.equalsIgnoreCase(getProtocols().get(0).getName());\n-    }\n-\n-\n-    /**\n-     * Register & bind IP address for service provider, can be configured separately.\n-     * Configuration priority: environment variables -> java system properties -> host property in config file ->\n-     * /etc/hosts -> default network address -> first available network address\n-     *\n-     * @param protocolConfig\n-     * @param registryURLs\n-     * @param map\n-     * @return\n-     */\n-    private String findConfigedHosts(ProtocolConfig protocolConfig,\n-                                     List<URL> registryURLs,\n-                                     Map<String, String> map) {\n-        boolean anyhost = false;\n-\n-        String hostToBind = getValueFromConfig(protocolConfig, DUBBO_IP_TO_BIND);\n-        if (hostToBind != null && hostToBind.length() > 0 && isInvalidLocalHost(hostToBind)) {\n-            throw new IllegalArgumentException(\"Specified invalid bind ip from property:\" + DUBBO_IP_TO_BIND + \", value:\" + hostToBind);\n-        }\n-\n-        // if bind ip is not found in environment, keep looking up\n-        if (StringUtils.isEmpty(hostToBind)) {\n-            hostToBind = protocolConfig.getHost();\n-            if (provider != null && StringUtils.isEmpty(hostToBind)) {\n-                hostToBind = provider.getHost();\n-            }\n-            if (isInvalidLocalHost(hostToBind)) {\n-                anyhost = true;\n-                try {\n-                    logger.info(\"No valid ip found from environment, try to find valid host from DNS.\");\n-                    hostToBind = InetAddress.getLocalHost().getHostAddress();\n-                } catch (UnknownHostException e) {\n-                    logger.warn(e.getMessage(), e);\n-                }\n-                if (isInvalidLocalHost(hostToBind)) {\n-                    if (CollectionUtils.isNotEmpty(registryURLs)) {\n-                        for (URL registryURL : registryURLs) {\n-                            if (MULTICAST.equalsIgnoreCase(registryURL.getParameter(\"registry\"))) {\n-                                // skip multicast registry since we cannot connect to it via Socket\n-                                continue;\n-                            }\n-                            try (Socket socket = new Socket()) {\n-                                SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());\n-                                socket.connect(addr, 1000);\n-                                hostToBind = socket.getLocalAddress().getHostAddress();\n-                                break;\n-                            } catch (Exception e) {\n-                                logger.warn(e.getMessage(), e);\n-                            }\n-                        }\n-                    }\n-                    if (isInvalidLocalHost(hostToBind)) {\n-                        hostToBind = getLocalHost();\n-                    }\n-                }\n-            }\n-        }\n-\n-        map.put(BIND_IP_KEY, hostToBind);\n-\n-        // registry ip is not used for bind ip by default\n-        String hostToRegistry = getValueFromConfig(protocolConfig, DUBBO_IP_TO_REGISTRY);\n-        if (hostToRegistry != null && hostToRegistry.length() > 0 && isInvalidLocalHost(hostToRegistry)) {\n-            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\n-        } else if (StringUtils.isEmpty(hostToRegistry)) {\n-            // bind ip is used as registry ip by default\n-            hostToRegistry = hostToBind;\n-        }\n-\n-        map.put(ANYHOST_KEY, String.valueOf(anyhost));\n-\n-        return hostToRegistry;\n-    }\n-\n-\n-    /**\n-     * Register port and bind port for the provider, can be configured separately\n-     * Configuration priority: environment variable -> java system properties -> port property in protocol config file\n-     * -> protocol default port\n-     *\n-     * @param protocolConfig\n-     * @param name\n-     * @return\n-     */\n-    private Integer findConfigedPorts(ProtocolConfig protocolConfig,\n-                                      String name,\n-                                      Map<String, String> map) {\n-        Integer portToBind = null;\n-\n-        // parse bind port from environment\n-        String port = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_BIND);\n-        portToBind = parsePort(port);\n-\n-        // if there's no bind port found from environment, keep looking up.\n-        if (portToBind == null) {\n-            portToBind = protocolConfig.getPort();\n-            if (provider != null && (portToBind == null || portToBind == 0)) {\n-                portToBind = provider.getPort();\n-            }\n-            final int defaultPort = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort();\n-            if (portToBind == null || portToBind == 0) {\n-                portToBind = defaultPort;\n-            }\n-            if (portToBind <= 0) {\n-                portToBind = getRandomPort(name);\n-                if (portToBind == null || portToBind < 0) {\n-                    portToBind = getAvailablePort(defaultPort);\n-                    putRandomPort(name, portToBind);\n-                }\n-            }\n-        }\n-\n-        // save bind port, used as url's key later\n-        map.put(BIND_PORT_KEY, String.valueOf(portToBind));\n-\n-        // registry port, not used as bind port by default\n-        String portToRegistryStr = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_REGISTRY);\n-        Integer portToRegistry = parsePort(portToRegistryStr);\n-        if (portToRegistry == null) {\n-            portToRegistry = portToBind;\n-        }\n-\n-        return portToRegistry;\n-    }\n-\n-    private Integer parsePort(String configPort) {\n-        Integer port = null;\n-        if (configPort != null && configPort.length() > 0) {\n-            try {\n-                Integer intPort = Integer.parseInt(configPort);\n-                if (isInvalidPort(intPort)) {\n-                    throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\n-                }\n-                port = intPort;\n-            } catch (Exception e) {\n-                throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\n-            }\n-        }\n-        return port;\n-    }\n-\n-    private String getValueFromConfig(ProtocolConfig protocolConfig, String key) {\n-        String protocolPrefix = protocolConfig.getName().toUpperCase() + \"_\";\n-        String value = ConfigUtils.getSystemProperty(protocolPrefix + key);\n-        if (StringUtils.isEmpty(value)) {\n-            value = ConfigUtils.getSystemProperty(key);\n-        }\n-        return value;\n-    }\n-\n-    private Integer getRandomPort(String protocol) {\n-        protocol = protocol.toLowerCase();\n-        return RANDOM_PORT_MAP.getOrDefault(protocol, Integer.MIN_VALUE);\n-    }\n-\n-    private void putRandomPort(String protocol, Integer port) {\n-        protocol = protocol.toLowerCase();\n-        if (!RANDOM_PORT_MAP.containsKey(protocol)) {\n-            RANDOM_PORT_MAP.put(protocol, port);\n-            logger.warn(\"Use random available port(\" + port + \") for protocol \" + protocol);\n-        }\n-    }\n-\n-    private void postProcessConfig() {\n-        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\n-                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\n-        configPostProcessors.forEach(component -> component.postProcessServiceConfig(this));\n-    }\n-\n-    /**\n-     * Dispatch an {@link Event event}\n-     *\n-     * @param event an {@link Event event}\n-     * @since 2.7.5\n-     */\n-    private void dispatch(Event event) {\n-        EventDispatcher.getDefaultExtension().dispatch(event);\n-    }\n-\n-    public DubboBootstrap getBootstrap() {\n-        return bootstrap;\n-    }\n-\n-    public void setBootstrap(DubboBootstrap bootstrap) {\n-        this.bootstrap = bootstrap;\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.URLBuilder;\r\n+import org.apache.dubbo.common.Version;\r\n+import org.apache.dubbo.common.bytecode.Wrapper;\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.utils.ClassUtils;\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.NamedThreadFactory;\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.bootstrap.DubboBootstrap;\r\n+import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\r\n+import org.apache.dubbo.config.event.ServiceConfigUnexportedEvent;\r\n+import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.config.utils.ConfigValidationUtils;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.metadata.ServiceNameMapping;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.cluster.ConfiguratorFactory;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ServiceDescriptor;\r\n+import org.apache.dubbo.rpc.model.ServiceRepository;\r\n+import org.apache.dubbo.rpc.service.GenericService;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.net.InetAddress;\r\n+import java.net.InetSocketAddress;\r\n+import java.net.Socket;\r\n+import java.net.SocketAddress;\r\n+import java.net.UnknownHostException;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\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.UUID;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REGISTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;\r\n+import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort;\r\n+import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;\r\n+import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\r\n+import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_BIND;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_REGISTRY;\r\n+import static org.apache.dubbo.config.Constants.MULTICAST;\r\n+import static org.apache.dubbo.config.Constants.SCOPE_NONE;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\r\n+import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.SCOPE_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;\r\n+import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\r\n+\r\n+public class ServiceConfig<T> extends ServiceConfigBase<T> {\r\n+\r\n+    public static final Logger logger = LoggerFactory.getLogger(ServiceConfig.class);\r\n+\r\n+    /**\r\n+     * A random port cache, the different protocols who has no port specified have different random port\r\n+     */\r\n+    private static final Map<String, Integer> RANDOM_PORT_MAP = new HashMap<String, Integer>();\r\n+\r\n+    /**\r\n+     * A delayed exposure service timer\r\n+     */\r\n+    private static final ScheduledExecutorService DELAY_EXPORT_EXECUTOR = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"DubboServiceDelayExporter\", true));\r\n+\r\n+    private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * A {@link ProxyFactory} implementation that will generate a exported service proxy,the JavassistProxyFactory is its\r\n+     * default implementation\r\n+     */\r\n+    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * Whether the provider has been exported\r\n+     */\r\n+    private transient volatile boolean exported;\r\n+\r\n+    /**\r\n+     * The flag whether a service has unexported ,if the method unexported is invoked, the value is true\r\n+     */\r\n+    private transient volatile boolean unexported;\r\n+\r\n+    private DubboBootstrap bootstrap;\r\n+\r\n+    /**\r\n+     * The exported services\r\n+     */\r\n+    private final List<Exporter<?>> exporters = new ArrayList<Exporter<?>>();\r\n+\r\n+    public ServiceConfig() {\r\n+    }\r\n+\r\n+    public ServiceConfig(Service service) {\r\n+        super(service);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public boolean isExported() {\r\n+        return exported;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public boolean isUnexported() {\r\n+        return unexported;\r\n+    }\r\n+\r\n+    public void unexport() {\r\n+        if (!exported) {\r\n+            return;\r\n+        }\r\n+        if (unexported) {\r\n+            return;\r\n+        }\r\n+        if (!exporters.isEmpty()) {\r\n+            for (Exporter<?> exporter : exporters) {\r\n+                try {\r\n+                    exporter.unexport();\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(\"Unexpected error occurred when unexport \" + exporter, t);\r\n+                }\r\n+            }\r\n+            exporters.clear();\r\n+        }\r\n+        unexported = true;\r\n+\r\n+        // dispatch a ServiceConfigUnExportedEvent since 2.7.4\r\n+        dispatch(new ServiceConfigUnexportedEvent(this));\r\n+    }\r\n+\r\n+    public synchronized void export() {\r\n+        if (bootstrap == null) {\r\n+            bootstrap = DubboBootstrap.getInstance();\r\n+            bootstrap.initialize();\r\n+        }\r\n+\r\n+        checkAndUpdateSubConfigs();\r\n+\r\n+        initServiceMetadata(provider);\r\n+        serviceMetadata.setServiceType(getInterfaceClass());\r\n+        serviceMetadata.setTarget(getRef());\r\n+        serviceMetadata.generateServiceKey();\r\n+\r\n+        if (!shouldExport()) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (shouldDelay()) {\r\n+            DELAY_EXPORT_EXECUTOR.schedule(this::doExport, getDelay(), TimeUnit.MILLISECONDS);\r\n+        } else {\r\n+            doExport();\r\n+        }\r\n+\r\n+        exported();\r\n+    }\r\n+\r\n+    public void exported() {\r\n+        List<URL> exportedURLs = this.getExportedUrls();\r\n+        exportedURLs.forEach(url -> {\r\n+            Map<String, String> parameters = getApplication().getParameters();\r\n+            ServiceNameMapping.getExtension(parameters != null ? parameters.get(MAPPING_KEY) : null).map(url);\r\n+        });\r\n+        // dispatch a ServiceConfigExportedEvent since 2.7.4\r\n+        dispatch(new ServiceConfigExportedEvent(this));\r\n+    }\r\n+\r\n+    private void checkAndUpdateSubConfigs() {\r\n+        // Use default configs defined explicitly with global scope\r\n+        completeCompoundConfigs();\r\n+        checkDefault();\r\n+        checkProtocol();\r\n+        // init some null configuration.\r\n+        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\r\n+                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\r\n+        configInitializers.forEach(e -> e.initServiceConfig(this));\r\n+\r\n+        // if protocol is not injvm checkRegistry\r\n+        if (!isOnlyInJvm()) {\r\n+            checkRegistry();\r\n+        }\r\n+        this.refresh();\r\n+\r\n+        if (StringUtils.isEmpty(interfaceName)) {\r\n+            throw new IllegalStateException(\"<dubbo:service interface=\\\"\\\" /> interface not allow null!\");\r\n+        }\r\n+\r\n+        if (ref instanceof GenericService) {\r\n+            interfaceClass = GenericService.class;\r\n+            if (StringUtils.isEmpty(generic)) {\r\n+                generic = Boolean.TRUE.toString();\r\n+            }\r\n+        } else {\r\n+            try {\r\n+                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\r\n+                        .getContextClassLoader());\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            checkInterfaceAndMethods(interfaceClass, getMethods());\r\n+            checkRef();\r\n+            generic = Boolean.FALSE.toString();\r\n+        }\r\n+        if (local != null) {\r\n+            if (\"true\".equals(local)) {\r\n+                local = interfaceName + \"Local\";\r\n+            }\r\n+            Class<?> localClass;\r\n+            try {\r\n+                localClass = ClassUtils.forNameWithThreadContextClassLoader(local);\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            if (!interfaceClass.isAssignableFrom(localClass)) {\r\n+                throw new IllegalStateException(\"The local implementation class \" + localClass.getName() + \" not implement interface \" + interfaceName);\r\n+            }\r\n+        }\r\n+        if (stub != null) {\r\n+            if (\"true\".equals(stub)) {\r\n+                stub = interfaceName + \"Stub\";\r\n+            }\r\n+            Class<?> stubClass;\r\n+            try {\r\n+                stubClass = ClassUtils.forNameWithThreadContextClassLoader(stub);\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            if (!interfaceClass.isAssignableFrom(stubClass)) {\r\n+                throw new IllegalStateException(\"The stub implementation class \" + stubClass.getName() + \" not implement interface \" + interfaceName);\r\n+            }\r\n+        }\r\n+        checkStubAndLocal(interfaceClass);\r\n+        ConfigValidationUtils.checkMock(interfaceClass, this);\r\n+        ConfigValidationUtils.validateServiceConfig(this);\r\n+        postProcessConfig();\r\n+    }\r\n+\r\n+\r\n+    protected synchronized void doExport() {\r\n+        if (unexported) {\r\n+            throw new IllegalStateException(\"The service \" + interfaceClass.getName() + \" has already unexported!\");\r\n+        }\r\n+        if (exported) {\r\n+            return;\r\n+        }\r\n+        exported = true;\r\n+\r\n+        if (StringUtils.isEmpty(path)) {\r\n+            path = interfaceName;\r\n+        }\r\n+        doExportUrls();\r\n+        bootstrap.setReady(true);\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\r\n+    private void doExportUrls() {\r\n+        ServiceRepository repository = ApplicationModel.getServiceRepository();\r\n+        ServiceDescriptor serviceDescriptor = repository.registerService(getInterfaceClass());\r\n+        repository.registerProvider(\r\n+                getUniqueServiceName(),\r\n+                ref,\r\n+                serviceDescriptor,\r\n+                this,\r\n+                serviceMetadata\r\n+        );\r\n+\r\n+        List<URL> registryURLs = ConfigValidationUtils.loadRegistries(this, true);\r\n+\r\n+        for (ProtocolConfig protocolConfig : protocols) {\r\n+            String pathKey = URL.buildKey(getContextPath(protocolConfig)\r\n+                    .map(p -> p + \"/\" + path)\r\n+                    .orElse(path), group, version);\r\n+            // In case user specified path, register service one more time to map it to path.\r\n+            repository.registerService(pathKey, interfaceClass);\r\n+            doExportUrlsFor1Protocol(protocolConfig, registryURLs);\r\n+        }\r\n+    }\r\n+\r\n+    private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {\r\n+        String name = protocolConfig.getName();\r\n+        if (StringUtils.isEmpty(name)) {\r\n+            name = DUBBO;\r\n+        }\r\n+\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        map.put(SIDE_KEY, PROVIDER_SIDE);\r\n+\r\n+        ServiceConfig.appendRuntimeParameters(map);\r\n+        AbstractConfig.appendParameters(map, getMetrics());\r\n+        AbstractConfig.appendParameters(map, getApplication());\r\n+        AbstractConfig.appendParameters(map, getModule());\r\n+        // remove 'default.' prefix for configs from ProviderConfig\r\n+        // appendParameters(map, provider, Constants.DEFAULT_KEY);\r\n+        AbstractConfig.appendParameters(map, provider);\r\n+        AbstractConfig.appendParameters(map, protocolConfig);\r\n+        AbstractConfig.appendParameters(map, this);\r\n+        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\r\n+        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\r\n+            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\r\n+        }\r\n+        if (CollectionUtils.isNotEmpty(getMethods())) {\r\n+            for (MethodConfig method : getMethods()) {\r\n+                AbstractConfig.appendParameters(map, method, method.getName());\r\n+                String retryKey = method.getName() + \".retry\";\r\n+                if (map.containsKey(retryKey)) {\r\n+                    String retryValue = map.remove(retryKey);\r\n+                    if (\"false\".equals(retryValue)) {\r\n+                        map.put(method.getName() + \".retries\", \"0\");\r\n+                    }\r\n+                }\r\n+                List<ArgumentConfig> arguments = method.getArguments();\r\n+                if (CollectionUtils.isNotEmpty(arguments)) {\r\n+                    for (ArgumentConfig argument : arguments) {\r\n+                        // convert argument type\r\n+                        if (argument.getType() != null && argument.getType().length() > 0) {\r\n+                            Method[] methods = interfaceClass.getMethods();\r\n+                            // visit all methods\r\n+                            if (methods.length > 0) {\r\n+                                for (int i = 0; i < methods.length; i++) {\r\n+                                    String methodName = methods[i].getName();\r\n+                                    // target the method, and get its signature\r\n+                                    if (methodName.equals(method.getName())) {\r\n+                                        Class<?>[] argtypes = methods[i].getParameterTypes();\r\n+                                        // one callback in the method\r\n+                                        if (argument.getIndex() != -1) {\r\n+                                            if (argtypes[argument.getIndex()].getName().equals(argument.getType())) {\r\n+                                                AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\r\n+                                            } else {\r\n+                                                throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\r\n+                                            }\r\n+                                        } else {\r\n+                                            // multiple callbacks in the method\r\n+                                            for (int j = 0; j < argtypes.length; j++) {\r\n+                                                Class<?> argclazz = argtypes[j];\r\n+                                                if (argclazz.getName().equals(argument.getType())) {\r\n+                                                    AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + j);\r\n+                                                    if (argument.getIndex() != -1 && argument.getIndex() != j) {\r\n+                                                        throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\r\n+                                                    }\r\n+                                                }\r\n+                                            }\r\n+                                        }\r\n+                                    }\r\n+                                }\r\n+                            }\r\n+                        } else if (argument.getIndex() != -1) {\r\n+                            AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\r\n+                        } else {\r\n+                            throw new IllegalArgumentException(\"Argument config must set index or type attribute.eg: <dubbo:argument index='0' .../> or <dubbo:argument type=xxx .../>\");\r\n+                        }\r\n+\r\n+                    }\r\n+                }\r\n+            } // end of methods for\r\n+        }\r\n+\r\n+        if (ProtocolUtils.isGeneric(generic)) {\r\n+            map.put(GENERIC_KEY, generic);\r\n+            map.put(METHODS_KEY, ANY_VALUE);\r\n+        } else {\r\n+            String revision = Version.getVersion(interfaceClass, version);\r\n+            if (revision != null && revision.length() > 0) {\r\n+                map.put(REVISION_KEY, revision);\r\n+            }\r\n+\r\n+            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\r\n+            if (methods.length == 0) {\r\n+                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\r\n+                map.put(METHODS_KEY, ANY_VALUE);\r\n+            } else {\r\n+                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), \",\"));\r\n+            }\r\n+        }\r\n+\r\n+        /**\r\n+         * Here the token value configured by the provider is used to assign the value to ServiceConfig#token\r\n+         */\r\n+        if (ConfigUtils.isEmpty(token) && provider != null) {\r\n+            token = provider.getToken();\r\n+        }\r\n+\r\n+        if (!ConfigUtils.isEmpty(token)) {\r\n+            if (ConfigUtils.isDefault(token)) {\r\n+                map.put(TOKEN_KEY, UUID.randomUUID().toString());\r\n+            } else {\r\n+                map.put(TOKEN_KEY, token);\r\n+            }\r\n+        }\r\n+        //init serviceMetadata attachments\r\n+        serviceMetadata.getAttachments().putAll(map);\r\n+\r\n+        // export service\r\n+        String host = findConfigedHosts(protocolConfig, registryURLs, map);\r\n+        Integer port = findConfigedPorts(protocolConfig, name, map);\r\n+        URL url = new URL(name, host, port, getContextPath(protocolConfig).map(p -> p + \"/\" + path).orElse(path), map);\r\n+\r\n+        // You can customize Configurator to append extra parameters\r\n+        if (ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\r\n+                .hasExtension(url.getProtocol())) {\r\n+            url = ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\r\n+                    .getExtension(url.getProtocol()).getConfigurator(url).configure(url);\r\n+        }\r\n+\r\n+        String scope = url.getParameter(SCOPE_KEY);\r\n+        // don't export when none is configured\r\n+        if (!SCOPE_NONE.equalsIgnoreCase(scope)) {\r\n+\r\n+            // export to local if the config is not remote (export to remote only when config is remote)\r\n+            if (!SCOPE_REMOTE.equalsIgnoreCase(scope)) {\r\n+                exportLocal(url);\r\n+            }\r\n+            // export to remote if the config is not local (export to local only when config is local)\r\n+            if (!SCOPE_LOCAL.equalsIgnoreCase(scope)) {\r\n+                if (CollectionUtils.isNotEmpty(registryURLs)) {\r\n+                    for (URL registryURL : registryURLs) {\r\n+                        //if protocol is only injvm ,not register\r\n+                        if (LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\r\n+                            continue;\r\n+                        }\r\n+                        url = url.addParameterIfAbsent(DYNAMIC_KEY, registryURL.getParameter(DYNAMIC_KEY));\r\n+                        URL monitorUrl = ConfigValidationUtils.loadMonitor(this, registryURL);\r\n+                        if (monitorUrl != null) {\r\n+                            url = url.addParameterAndEncoded(MONITOR_KEY, monitorUrl.toFullString());\r\n+                        }\r\n+                        if (logger.isInfoEnabled()) {\r\n+                            if (url.getParameter(REGISTER_KEY, true)) {\r\n+                                logger.info(\"Register dubbo service \" + interfaceClass.getName() + \" url \" + url + \" to registry \" + registryURL);\r\n+                            } else {\r\n+                                logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\r\n+                            }\r\n+                        }\r\n+\r\n+                        // For providers, this is used to enable custom proxy to generate invoker\r\n+                        String proxy = url.getParameter(PROXY_KEY);\r\n+                        if (StringUtils.isNotEmpty(proxy)) {\r\n+                            registryURL = registryURL.addParameter(PROXY_KEY, proxy);\r\n+                        }\r\n+\r\n+                        Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));\r\n+                        DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\r\n+\r\n+                        Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\r\n+                        exporters.add(exporter);\r\n+                    }\r\n+                } else {\r\n+                    if (logger.isInfoEnabled()) {\r\n+                        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\r\n+                    }\r\n+                    Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, url);\r\n+                    DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\r\n+\r\n+                    Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\r\n+                    exporters.add(exporter);\r\n+                }\r\n+\r\n+                MetadataUtils.publishServiceDefinition(url);\r\n+            }\r\n+        }\r\n+        this.urls.add(url);\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\r\n+    /**\r\n+     * always export injvm\r\n+     */\r\n+    private void exportLocal(URL url) {\r\n+        URL local = URLBuilder.from(url)\r\n+                .setProtocol(LOCAL_PROTOCOL)\r\n+                .setHost(LOCALHOST_VALUE)\r\n+                .setPort(0)\r\n+                .build();\r\n+        Exporter<?> exporter = PROTOCOL.export(\r\n+                PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, local));\r\n+        exporters.add(exporter);\r\n+        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to local registry url : \" + local);\r\n+    }\r\n+\r\n+    /**\r\n+     * Determine if it is injvm\r\n+     *\r\n+     * @return\r\n+     */\r\n+    private boolean isOnlyInJvm() {\r\n+        return getProtocols().size() == 1\r\n+                && LOCAL_PROTOCOL.equalsIgnoreCase(getProtocols().get(0).getName());\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Register & bind IP address for service provider, can be configured separately.\r\n+     * Configuration priority: environment variables -> java system properties -> host property in config file ->\r\n+     * /etc/hosts -> default network address -> first available network address\r\n+     *\r\n+     * @param protocolConfig\r\n+     * @param registryURLs\r\n+     * @param map\r\n+     * @return\r\n+     */\r\n+    private String findConfigedHosts(ProtocolConfig protocolConfig,\r\n+                                     List<URL> registryURLs,\r\n+                                     Map<String, String> map) {\r\n+        boolean anyhost = false;\r\n+\r\n+        String hostToBind = getValueFromConfig(protocolConfig, DUBBO_IP_TO_BIND);\r\n+        if (hostToBind != null && hostToBind.length() > 0 && isInvalidLocalHost(hostToBind)) {\r\n+            throw new IllegalArgumentException(\"Specified invalid bind ip from property:\" + DUBBO_IP_TO_BIND + \", value:\" + hostToBind);\r\n+        }\r\n+\r\n+        // if bind ip is not found in environment, keep looking up\r\n+        if (StringUtils.isEmpty(hostToBind)) {\r\n+            hostToBind = protocolConfig.getHost();\r\n+            if (provider != null && StringUtils.isEmpty(hostToBind)) {\r\n+                hostToBind = provider.getHost();\r\n+            }\r\n+            if (isInvalidLocalHost(hostToBind)) {\r\n+                anyhost = true;\r\n+                try {\r\n+                    logger.info(\"No valid ip found from environment, try to find valid host from DNS.\");\r\n+                    hostToBind = InetAddress.getLocalHost().getHostAddress();\r\n+                } catch (UnknownHostException e) {\r\n+                    logger.warn(e.getMessage(), e);\r\n+                }\r\n+                if (isInvalidLocalHost(hostToBind)) {\r\n+                    if (CollectionUtils.isNotEmpty(registryURLs)) {\r\n+                        for (URL registryURL : registryURLs) {\r\n+                            if (MULTICAST.equalsIgnoreCase(registryURL.getParameter(\"registry\"))) {\r\n+                                // skip multicast registry since we cannot connect to it via Socket\r\n+                                continue;\r\n+                            }\r\n+                            try (Socket socket = new Socket()) {\r\n+                                SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());\r\n+                                socket.connect(addr, 1000);\r\n+                                hostToBind = socket.getLocalAddress().getHostAddress();\r\n+                                break;\r\n+                            } catch (Exception e) {\r\n+                                logger.warn(e.getMessage(), e);\r\n+                            }\r\n+                        }\r\n+                    }\r\n+                    if (isInvalidLocalHost(hostToBind)) {\r\n+                        hostToBind = getLocalHost();\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        map.put(BIND_IP_KEY, hostToBind);\r\n+\r\n+        // registry ip is not used for bind ip by default\r\n+        String hostToRegistry = getValueFromConfig(protocolConfig, DUBBO_IP_TO_REGISTRY);\r\n+        if (hostToRegistry != null && hostToRegistry.length() > 0 && isInvalidLocalHost(hostToRegistry)) {\r\n+            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\r\n+        } else if (StringUtils.isEmpty(hostToRegistry)) {\r\n+            // bind ip is used as registry ip by default\r\n+            hostToRegistry = hostToBind;\r\n+        }\r\n+\r\n+        map.put(ANYHOST_KEY, String.valueOf(anyhost));\r\n+\r\n+        return hostToRegistry;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Register port and bind port for the provider, can be configured separately\r\n+     * Configuration priority: environment variable -> java system properties -> port property in protocol config file\r\n+     * -> protocol default port\r\n+     *\r\n+     * @param protocolConfig\r\n+     * @param name\r\n+     * @return\r\n+     */\r\n+    private Integer findConfigedPorts(ProtocolConfig protocolConfig,\r\n+                                      String name,\r\n+                                      Map<String, String> map) {\r\n+        Integer portToBind = null;\r\n+\r\n+        // parse bind port from environment\r\n+        String port = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_BIND);\r\n+        portToBind = parsePort(port);\r\n+\r\n+        // if there's no bind port found from environment, keep looking up.\r\n+        if (portToBind == null) {\r\n+            portToBind = protocolConfig.getPort();\r\n+            if (provider != null && (portToBind == null || portToBind == 0)) {\r\n+                portToBind = provider.getPort();\r\n+            }\r\n+            final int defaultPort = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort();\r\n+            if (portToBind == null || portToBind == 0) {\r\n+                portToBind = defaultPort;\r\n+            }\r\n+            if (portToBind <= 0) {\r\n+                portToBind = getRandomPort(name);\r\n+                if (portToBind == null || portToBind < 0) {\r\n+                    portToBind = getAvailablePort(defaultPort);\r\n+                    putRandomPort(name, portToBind);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        // save bind port, used as url's key later\r\n+        map.put(BIND_PORT_KEY, String.valueOf(portToBind));\r\n+\r\n+        // registry port, not used as bind port by default\r\n+        String portToRegistryStr = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_REGISTRY);\r\n+        Integer portToRegistry = parsePort(portToRegistryStr);\r\n+        if (portToRegistry == null) {\r\n+            portToRegistry = portToBind;\r\n+        }\r\n+\r\n+        return portToRegistry;\r\n+    }\r\n+\r\n+    private Integer parsePort(String configPort) {\r\n+        Integer port = null;\r\n+        if (configPort != null && configPort.length() > 0) {\r\n+            try {\r\n+                Integer intPort = Integer.parseInt(configPort);\r\n+                if (isInvalidPort(intPort)) {\r\n+                    throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\r\n+                }\r\n+                port = intPort;\r\n+            } catch (Exception e) {\r\n+                throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\r\n+            }\r\n+        }\r\n+        return port;\r\n+    }\r\n+\r\n+    private String getValueFromConfig(ProtocolConfig protocolConfig, String key) {\r\n+        String protocolPrefix = protocolConfig.getName().toUpperCase() + \"_\";\r\n+        String value = ConfigUtils.getSystemProperty(protocolPrefix + key);\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            value = ConfigUtils.getSystemProperty(key);\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    private Integer getRandomPort(String protocol) {\r\n+        protocol = protocol.toLowerCase();\r\n+        return RANDOM_PORT_MAP.getOrDefault(protocol, Integer.MIN_VALUE);\r\n+    }\r\n+\r\n+    private void putRandomPort(String protocol, Integer port) {\r\n+        protocol = protocol.toLowerCase();\r\n+        if (!RANDOM_PORT_MAP.containsKey(protocol)) {\r\n+            RANDOM_PORT_MAP.put(protocol, port);\r\n+            logger.warn(\"Use random available port(\" + port + \") for protocol \" + protocol);\r\n+        }\r\n+    }\r\n+\r\n+    private void postProcessConfig() {\r\n+        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\r\n+                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\r\n+        configPostProcessors.forEach(component -> component.postProcessServiceConfig(this));\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch an {@link Event event}\r\n+     *\r\n+     * @param event an {@link Event event}\r\n+     * @since 2.7.5\r\n+     */\r\n+    private void dispatch(Event event) {\r\n+        EventDispatcher.getDefaultExtension().dispatch(event);\r\n+    }\r\n+\r\n+    public DubboBootstrap getBootstrap() {\r\n+        return bootstrap;\r\n+    }\r\n+\r\n+    public void setBootstrap(DubboBootstrap bootstrap) {\r\n+        this.bootstrap = bootstrap;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/DubboBootstrap.java", "source2": "org/apache/dubbo/config/bootstrap/DubboBootstrap.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,1409 +1,1409 @@\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.bootstrap;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.config.Environment;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;\n-import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.threadpool.concurrent.ScheduledCompletableFuture;\n-import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;\n-import org.apache.dubbo.common.utils.ArrayUtils;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\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.DubboShutdownHook;\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.ReferenceConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-import org.apache.dubbo.config.SslConfig;\n-import org.apache.dubbo.config.bootstrap.builders.ApplicationBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ConsumerBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ProtocolBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ProviderBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ReferenceBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.RegistryBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ServiceBuilder;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;\n-import org.apache.dubbo.config.utils.ConfigValidationUtils;\n-import org.apache.dubbo.config.utils.ReferenceConfigCache;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.event.GenericEventListener;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.MetadataServiceExporter;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.metadata.report.MetadataReportFactory;\n-import org.apache.dubbo.metadata.report.MetadataReportInstance;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.io.IOException;\n-import java.util.ArrayList;\n-import java.util.Collection;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Set;\n-import java.util.SortedSet;\n-import java.util.concurrent.CompletableFuture;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.Future;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-import java.util.concurrent.locks.Condition;\n-import java.util.concurrent.locks.Lock;\n-import java.util.concurrent.locks.ReentrantLock;\n-import java.util.function.Consumer;\n-import java.util.function.Supplier;\n-\n-import static java.lang.String.format;\n-import static java.util.Collections.singletonList;\n-import static java.util.concurrent.Executors.newSingleThreadExecutor;\n-import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;\n-import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-import static org.apache.dubbo.common.function.ThrowableAction.execute;\n-import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_PUBLISH_DELAY;\n-import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;\n-import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;\n-import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;\n-import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\n-\n-/**\n- * See {@link ApplicationModel} and {@link ExtensionLoader} for why this class is designed to be singleton.\n- * <p>\n- * The bootstrap class of Dubbo\n- * <p>\n- * Get singleton instance by calling static method {@link #getInstance()}.\n- * Designed as singleton because some classes inside Dubbo, such as ExtensionLoader, are designed only for one instance per process.\n- *\n- * @since 2.7.5\n- */\n-public class DubboBootstrap extends GenericEventListener {\n-\n-    public static final String DEFAULT_REGISTRY_ID = \"REGISTRY#DEFAULT\";\n-\n-    public static final String DEFAULT_PROTOCOL_ID = \"PROTOCOL#DEFAULT\";\n-\n-    public static final String DEFAULT_SERVICE_ID = \"SERVICE#DEFAULT\";\n-\n-    public static final String DEFAULT_REFERENCE_ID = \"REFERENCE#DEFAULT\";\n-\n-    public static final String DEFAULT_PROVIDER_ID = \"PROVIDER#DEFAULT\";\n-\n-    public static final String DEFAULT_CONSUMER_ID = \"CONSUMER#DEFAULT\";\n-\n-    private static final String NAME = DubboBootstrap.class.getSimpleName();\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private static volatile DubboBootstrap instance;\n-\n-    private final AtomicBoolean awaited = new AtomicBoolean(false);\n-\n-    private final Lock lock = new ReentrantLock();\n-\n-    private final Condition condition = lock.newCondition();\n-\n-    private final Lock destroyLock = new ReentrantLock();\n-\n-    private final ExecutorService executorService = newSingleThreadExecutor();\n-\n-    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\n-\n-    private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();\n-\n-    private final ConfigManager configManager;\n-\n-    private final Environment environment;\n-\n-    private ReferenceConfigCache cache;\n-\n-    private volatile boolean exportAsync;\n-\n-    private volatile boolean referAsync;\n-\n-    private AtomicBoolean initialized = new AtomicBoolean(false);\n-\n-    private AtomicBoolean started = new AtomicBoolean(false);\n-\n-    private AtomicBoolean ready = new AtomicBoolean(false);\n-\n-    private AtomicBoolean destroyed = new AtomicBoolean(false);\n-\n-    private volatile ServiceInstance serviceInstance;\n-\n-    private volatile MetadataService metadataService;\n-\n-    private volatile MetadataServiceExporter metadataServiceExporter;\n-\n-    private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();\n-\n-    private List<Future<?>> asyncExportingFutures = new ArrayList<>();\n-\n-    private List<CompletableFuture<Object>> asyncReferringFutures = new ArrayList<>();\n-\n-    /**\n-     * See {@link ApplicationModel} and {@link ExtensionLoader} for why DubboBootstrap is designed to be singleton.\n-     */\n-    public static DubboBootstrap getInstance() {\n-        if (instance == null) {\n-            synchronized (DubboBootstrap.class) {\n-                if (instance == null) {\n-                    instance = new DubboBootstrap();\n-                }\n-            }\n-        }\n-        return instance;\n-    }\n-\n-    private DubboBootstrap() {\n-        configManager = ApplicationModel.getConfigManager();\n-        environment = ApplicationModel.getEnvironment();\n-\n-        DubboShutdownHook.getDubboShutdownHook().register();\n-        ShutdownHookCallbacks.INSTANCE.addCallback(DubboBootstrap.this::destroy);\n-    }\n-\n-    public void unRegisterShutdownHook() {\n-        DubboShutdownHook.getDubboShutdownHook().unregister();\n-    }\n-\n-    private boolean isOnlyRegisterProvider() {\n-        Boolean registerConsumer = getApplication().getRegisterConsumer();\n-        return registerConsumer == null || !registerConsumer;\n-    }\n-\n-    private String getMetadataType() {\n-        String type = getApplication().getMetadataType();\n-        if (StringUtils.isEmpty(type)) {\n-            type = DEFAULT_METADATA_STORAGE_TYPE;\n-        }\n-        return type;\n-    }\n-\n-    public DubboBootstrap metadataReport(MetadataReportConfig metadataReportConfig) {\n-        configManager.addMetadataReport(metadataReportConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap metadataReports(List<MetadataReportConfig> metadataReportConfigs) {\n-        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\n-            return this;\n-        }\n-\n-        configManager.addMetadataReports(metadataReportConfigs);\n-        return this;\n-    }\n-\n-    // {@link ApplicationConfig} correlative methods\n-\n-    /**\n-     * Set the name of application\n-     *\n-     * @param name the name of application\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap application(String name) {\n-        return application(name, builder -> {\n-            // DO NOTHING\n-        });\n-    }\n-\n-    /**\n-     * Set the name of application and it's future build\n-     *\n-     * @param name            the name of application\n-     * @param consumerBuilder {@link ApplicationBuilder}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap application(String name, Consumer<ApplicationBuilder> consumerBuilder) {\n-        ApplicationBuilder builder = createApplicationBuilder(name);\n-        consumerBuilder.accept(builder);\n-        return application(builder.build());\n-    }\n-\n-    /**\n-     * Set the {@link ApplicationConfig}\n-     *\n-     * @param applicationConfig the {@link ApplicationConfig}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap application(ApplicationConfig applicationConfig) {\n-        configManager.setApplication(applicationConfig);\n-        return this;\n-    }\n-\n-\n-    // {@link RegistryConfig} correlative methods\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig} with {@link #DEFAULT_REGISTRY_ID default ID}\n-     *\n-     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registry(Consumer<RegistryBuilder> consumerBuilder) {\n-        return registry(DEFAULT_REGISTRY_ID, consumerBuilder);\n-    }\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig} with the specified ID\n-     *\n-     * @param id              the {@link RegistryConfig#getId() id}  of {@link RegistryConfig}\n-     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registry(String id, Consumer<RegistryBuilder> consumerBuilder) {\n-        RegistryBuilder builder = createRegistryBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return registry(builder.build());\n-    }\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig}\n-     *\n-     * @param registryConfig an instance of {@link RegistryConfig}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registry(RegistryConfig registryConfig) {\n-        configManager.addRegistry(registryConfig);\n-        return this;\n-    }\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig}\n-     *\n-     * @param registryConfigs the multiple instances of {@link RegistryConfig}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registries(List<RegistryConfig> registryConfigs) {\n-        if (CollectionUtils.isEmpty(registryConfigs)) {\n-            return this;\n-        }\n-        registryConfigs.forEach(this::registry);\n-        return this;\n-    }\n-\n-\n-    // {@link ProtocolConfig} correlative methods\n-    public DubboBootstrap protocol(Consumer<ProtocolBuilder> consumerBuilder) {\n-        return protocol(DEFAULT_PROTOCOL_ID, consumerBuilder);\n-    }\n-\n-    public DubboBootstrap protocol(String id, Consumer<ProtocolBuilder> consumerBuilder) {\n-        ProtocolBuilder builder = createProtocolBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return protocol(builder.build());\n-    }\n-\n-    public DubboBootstrap protocol(ProtocolConfig protocolConfig) {\n-        return protocols(singletonList(protocolConfig));\n-    }\n-\n-    public DubboBootstrap protocols(List<ProtocolConfig> protocolConfigs) {\n-        if (CollectionUtils.isEmpty(protocolConfigs)) {\n-            return this;\n-        }\n-        configManager.addProtocols(protocolConfigs);\n-        return this;\n-    }\n-\n-    // {@link ServiceConfig} correlative methods\n-    public <S> DubboBootstrap service(Consumer<ServiceBuilder<S>> consumerBuilder) {\n-        return service(DEFAULT_SERVICE_ID, consumerBuilder);\n-    }\n-\n-    public <S> DubboBootstrap service(String id, Consumer<ServiceBuilder<S>> consumerBuilder) {\n-        ServiceBuilder builder = createServiceBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return service(builder.build());\n-    }\n-\n-    public DubboBootstrap service(ServiceConfig<?> serviceConfig) {\n-        configManager.addService(serviceConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap services(List<ServiceConfig> serviceConfigs) {\n-        if (CollectionUtils.isEmpty(serviceConfigs)) {\n-            return this;\n-        }\n-        serviceConfigs.forEach(configManager::addService);\n-        return this;\n-    }\n-\n-    // {@link Reference} correlative methods\n-    public <S> DubboBootstrap reference(Consumer<ReferenceBuilder<S>> consumerBuilder) {\n-        return reference(DEFAULT_REFERENCE_ID, consumerBuilder);\n-    }\n-\n-    public <S> DubboBootstrap reference(String id, Consumer<ReferenceBuilder<S>> consumerBuilder) {\n-        ReferenceBuilder builder = createReferenceBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return reference(builder.build());\n-    }\n-\n-    public DubboBootstrap reference(ReferenceConfig<?> referenceConfig) {\n-        configManager.addReference(referenceConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap references(List<ReferenceConfig> referenceConfigs) {\n-        if (CollectionUtils.isEmpty(referenceConfigs)) {\n-            return this;\n-        }\n-\n-        referenceConfigs.forEach(configManager::addReference);\n-        return this;\n-    }\n-\n-    // {@link ProviderConfig} correlative methods\n-    public DubboBootstrap provider(Consumer<ProviderBuilder> builderConsumer) {\n-        return provider(DEFAULT_PROVIDER_ID, builderConsumer);\n-    }\n-\n-    public DubboBootstrap provider(String id, Consumer<ProviderBuilder> builderConsumer) {\n-        ProviderBuilder builder = createProviderBuilder(id);\n-        builderConsumer.accept(builder);\n-        return provider(builder.build());\n-    }\n-\n-    public DubboBootstrap provider(ProviderConfig providerConfig) {\n-        return providers(singletonList(providerConfig));\n-    }\n-\n-    public DubboBootstrap providers(List<ProviderConfig> providerConfigs) {\n-        if (CollectionUtils.isEmpty(providerConfigs)) {\n-            return this;\n-        }\n-\n-        providerConfigs.forEach(configManager::addProvider);\n-        return this;\n-    }\n-\n-    // {@link ConsumerConfig} correlative methods\n-    public DubboBootstrap consumer(Consumer<ConsumerBuilder> builderConsumer) {\n-        return consumer(DEFAULT_CONSUMER_ID, builderConsumer);\n-    }\n-\n-    public DubboBootstrap consumer(String id, Consumer<ConsumerBuilder> builderConsumer) {\n-        ConsumerBuilder builder = createConsumerBuilder(id);\n-        builderConsumer.accept(builder);\n-        return consumer(builder.build());\n-    }\n-\n-    public DubboBootstrap consumer(ConsumerConfig consumerConfig) {\n-        return consumers(singletonList(consumerConfig));\n-    }\n-\n-    public DubboBootstrap consumers(List<ConsumerConfig> consumerConfigs) {\n-        if (CollectionUtils.isEmpty(consumerConfigs)) {\n-            return this;\n-        }\n-\n-        consumerConfigs.forEach(configManager::addConsumer);\n-        return this;\n-    }\n-\n-    // {@link ConfigCenterConfig} correlative methods\n-    public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {\n-        return configCenters(singletonList(configCenterConfig));\n-    }\n-\n-    public DubboBootstrap configCenters(List<ConfigCenterConfig> configCenterConfigs) {\n-        if (CollectionUtils.isEmpty(configCenterConfigs)) {\n-            return this;\n-        }\n-        configManager.addConfigCenters(configCenterConfigs);\n-        return this;\n-    }\n-\n-    public DubboBootstrap monitor(MonitorConfig monitor) {\n-        configManager.setMonitor(monitor);\n-        return this;\n-    }\n-\n-    public DubboBootstrap metrics(MetricsConfig metrics) {\n-        configManager.setMetrics(metrics);\n-        return this;\n-    }\n-\n-    public DubboBootstrap module(ModuleConfig module) {\n-        configManager.setModule(module);\n-        return this;\n-    }\n-\n-    public DubboBootstrap ssl(SslConfig sslConfig) {\n-        configManager.setSsl(sslConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap cache(ReferenceConfigCache cache) {\n-        this.cache = cache;\n-        return this;\n-    }\n-\n-    public ReferenceConfigCache getCache() {\n-        if (cache == null) {\n-            cache = ReferenceConfigCache.getCache();\n-        }\n-        return cache;\n-    }\n-\n-    public DubboBootstrap exportAsync() {\n-        this.exportAsync = true;\n-        return this;\n-    }\n-\n-    public DubboBootstrap referAsync() {\n-        this.referAsync = true;\n-        return this;\n-    }\n-\n-    @Deprecated\n-    public void init() {\n-        initialize();\n-    }\n-\n-    /**\n-     * Initialize\n-     */\n-    public void initialize() {\n-        if (!initialized.compareAndSet(false, true)) {\n-            return;\n-        }\n-\n-        ApplicationModel.initFrameworkExts();\n-\n-        startConfigCenter();\n-\n-        loadRemoteConfigs();\n-\n-        checkGlobalConfigs();\n-\n-        // @since 2.7.8\n-        startMetadataCenter();\n-\n-        initMetadataService();\n-\n-        initEventListener();\n-\n-        if (logger.isInfoEnabled()) {\n-            logger.info(NAME + \" has been initialized!\");\n-        }\n-    }\n-\n-    private void checkGlobalConfigs() {\n-        // check Application\n-        ConfigValidationUtils.validateApplicationConfig(getApplication());\n-\n-        // check Metadata\n-        Collection<MetadataReportConfig> metadatas = configManager.getMetadataConfigs();\n-        if (CollectionUtils.isEmpty(metadatas)) {\n-            MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\n-            metadataReportConfig.refresh();\n-            if (metadataReportConfig.isValid()) {\n-                configManager.addMetadataReport(metadataReportConfig);\n-                metadatas = configManager.getMetadataConfigs();\n-            }\n-        }\n-        if (CollectionUtils.isNotEmpty(metadatas)) {\n-            for (MetadataReportConfig metadataReportConfig : metadatas) {\n-                metadataReportConfig.refresh();\n-                ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\n-            }\n-        }\n-\n-        // check Provider\n-        Collection<ProviderConfig> providers = configManager.getProviders();\n-        if (CollectionUtils.isEmpty(providers)) {\n-            configManager.getDefaultProvider().orElseGet(() -> {\n-                ProviderConfig providerConfig = new ProviderConfig();\n-                configManager.addProvider(providerConfig);\n-                providerConfig.refresh();\n-                return providerConfig;\n-            });\n-        }\n-        for (ProviderConfig providerConfig : configManager.getProviders()) {\n-            ConfigValidationUtils.validateProviderConfig(providerConfig);\n-        }\n-        // check Consumer\n-        Collection<ConsumerConfig> consumers = configManager.getConsumers();\n-        if (CollectionUtils.isEmpty(consumers)) {\n-            configManager.getDefaultConsumer().orElseGet(() -> {\n-                ConsumerConfig consumerConfig = new ConsumerConfig();\n-                configManager.addConsumer(consumerConfig);\n-                consumerConfig.refresh();\n-                return consumerConfig;\n-            });\n-        }\n-        for (ConsumerConfig consumerConfig : configManager.getConsumers()) {\n-            ConfigValidationUtils.validateConsumerConfig(consumerConfig);\n-        }\n-\n-        // check Monitor\n-        ConfigValidationUtils.validateMonitorConfig(getMonitor());\n-        // check Metrics\n-        ConfigValidationUtils.validateMetricsConfig(getMetrics());\n-        // check Module\n-        ConfigValidationUtils.validateModuleConfig(getModule());\n-        // check Ssl\n-        ConfigValidationUtils.validateSslConfig(getSsl());\n-    }\n-\n-    private void startConfigCenter() {\n-\n-        useRegistryAsConfigCenterIfNecessary();\n-\n-        Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();\n-\n-        // check Config Center\n-        if (CollectionUtils.isEmpty(configCenters)) {\n-            ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();\n-            configCenterConfig.refresh();\n-            if (configCenterConfig.isValid()) {\n-                configManager.addConfigCenter(configCenterConfig);\n-                configCenters = configManager.getConfigCenters();\n-            }\n-        } else {\n-            for (ConfigCenterConfig configCenterConfig : configCenters) {\n-                configCenterConfig.refresh();\n-                ConfigValidationUtils.validateConfigCenterConfig(configCenterConfig);\n-            }\n-        }\n-\n-        if (CollectionUtils.isNotEmpty(configCenters)) {\n-            CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration();\n-            for (ConfigCenterConfig configCenter : configCenters) {\n-                compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter));\n-            }\n-            environment.setDynamicConfiguration(compositeDynamicConfiguration);\n-        }\n-        configManager.refreshAll();\n-    }\n-\n-    private void startMetadataCenter() {\n-\n-        useRegistryAsMetadataCenterIfNecessary();\n-\n-        ApplicationConfig applicationConfig = getApplication();\n-\n-        String metadataType = applicationConfig.getMetadataType();\n-        // FIXME, multiple metadata config support.\n-        Collection<MetadataReportConfig> metadataReportConfigs = configManager.getMetadataConfigs();\n-        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\n-            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\n-                throw new IllegalStateException(\"No MetadataConfig found, Metadata Center address is required when 'metadata=remote' is enabled.\");\n-            }\n-            return;\n-        }\n-\n-        for (MetadataReportConfig metadataReportConfig : metadataReportConfigs) {\n-            ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\n-            if (!metadataReportConfig.isValid()) {\n-                return;\n-            }\n-            MetadataReportInstance.init(metadataReportConfig);\n-        }\n-    }\n-\n-    /**\n-     * For compatibility purpose, use registry as the default config center when\n-     * there's no config center specified explicitly and\n-     * useAsConfigCenter of registryConfig is null or true\n-     */\n-    private void useRegistryAsConfigCenterIfNecessary() {\n-        // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.\n-        if (environment.getDynamicConfiguration().isPresent()) {\n-            return;\n-        }\n-\n-        if (CollectionUtils.isNotEmpty(configManager.getConfigCenters())) {\n-            return;\n-        }\n-\n-        configManager\n-                .getDefaultRegistries()\n-                .stream()\n-                .filter(this::isUsedRegistryAsConfigCenter)\n-                .map(this::registryAsConfigCenter)\n-                .forEach(configManager::addConfigCenter);\n-    }\n-\n-    private boolean isUsedRegistryAsConfigCenter(RegistryConfig registryConfig) {\n-        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsConfigCenter, \"config\",\n-                DynamicConfigurationFactory.class);\n-    }\n-\n-    private ConfigCenterConfig registryAsConfigCenter(RegistryConfig registryConfig) {\n-        String protocol = registryConfig.getProtocol();\n-        Integer port = registryConfig.getPort();\n-        String id = \"config-center-\" + protocol + \"-\" + port;\n-        ConfigCenterConfig cc = new ConfigCenterConfig();\n-        cc.setId(id);\n-        if (cc.getParameters() == null) {\n-            cc.setParameters(new HashMap<>());\n-        }\n-        if (registryConfig.getParameters() != null) {\n-            cc.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\n-        }\n-        cc.getParameters().put(CLIENT_KEY, registryConfig.getClient());\n-        cc.setProtocol(protocol);\n-        cc.setPort(port);\n-        if (StringUtils.isNotEmpty(registryConfig.getGroup())) {\n-            cc.setGroup(registryConfig.getGroup());\n-        }\n-        cc.setAddress(getRegistryCompatibleAddress(registryConfig));\n-        cc.setNamespace(registryConfig.getGroup());\n-        cc.setUsername(registryConfig.getUsername());\n-        cc.setPassword(registryConfig.getPassword());\n-        if (registryConfig.getTimeout() != null) {\n-            cc.setTimeout(registryConfig.getTimeout().longValue());\n-        }\n-        cc.setHighestPriority(false);\n-        return cc;\n-    }\n-\n-    private void useRegistryAsMetadataCenterIfNecessary() {\n-\n-        Collection<MetadataReportConfig> metadataConfigs = configManager.getMetadataConfigs();\n-\n-        if (CollectionUtils.isNotEmpty(metadataConfigs)) {\n-            return;\n-        }\n-\n-        configManager\n-                .getDefaultRegistries()\n-                .stream()\n-                .filter(this::isUsedRegistryAsMetadataCenter)\n-                .map(this::registryAsMetadataCenter)\n-                .forEach(configManager::addMetadataReport);\n-\n-    }\n-\n-    private boolean isUsedRegistryAsMetadataCenter(RegistryConfig registryConfig) {\n-        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsMetadataCenter, \"metadata\",\n-                MetadataReportFactory.class);\n-    }\n-\n-    /**\n-     * Is used the specified registry as a center infrastructure\n-     *\n-     * @param registryConfig       the {@link RegistryConfig}\n-     * @param usedRegistryAsCenter the configured value on\n-     * @param centerType           the type name of center\n-     * @param extensionClass       an extension class of a center infrastructure\n-     * @return\n-     * @since 2.7.8\n-     */\n-    private boolean isUsedRegistryAsCenter(RegistryConfig registryConfig, Supplier<Boolean> usedRegistryAsCenter,\n-                                           String centerType,\n-                                           Class<?> extensionClass) {\n-        final boolean supported;\n-\n-        Boolean configuredValue = usedRegistryAsCenter.get();\n-        if (configuredValue != null) { // If configured, take its value.\n-            supported = configuredValue.booleanValue();\n-        } else {                       // Or check the extension existence\n-            String protocol = registryConfig.getProtocol();\n-            supported = supportsExtension(extensionClass, protocol);\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"No value is configured in the registry, the %s extension[name : %s] %s as the %s center\"\n-                        , extensionClass.getSimpleName(), protocol, supported ? \"supports\" : \"does not support\", centerType));\n-            }\n-        }\n-\n-        if (logger.isInfoEnabled()) {\n-            logger.info(format(\"The registry[%s] will be %s as the %s center\", registryConfig,\n-                    supported ? \"used\" : \"not used\", centerType));\n-        }\n-        return supported;\n-    }\n-\n-    /**\n-     * Supports the extension with the specified class and name\n-     *\n-     * @param extensionClass the {@link Class} of extension\n-     * @param name           the name of extension\n-     * @return if supports, return <code>true</code>, or <code>false</code>\n-     * @since 2.7.8\n-     */\n-    private boolean supportsExtension(Class<?> extensionClass, String name) {\n-        if (isNotEmpty(name)) {\n-            ExtensionLoader extensionLoader = getExtensionLoader(extensionClass);\n-            return extensionLoader.hasExtension(name);\n-        }\n-        return false;\n-    }\n-\n-    private MetadataReportConfig registryAsMetadataCenter(RegistryConfig registryConfig) {\n-        String protocol = registryConfig.getProtocol();\n-        Integer port = registryConfig.getPort();\n-        String id = \"metadata-center-\" + protocol + \"-\" + port;\n-        MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\n-        metadataReportConfig.setId(id);\n-        if (metadataReportConfig.getParameters() == null) {\n-            metadataReportConfig.setParameters(new HashMap<>());\n-        }\n-        if (registryConfig.getParameters() != null) {\n-            metadataReportConfig.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\n-        }\n-        metadataReportConfig.getParameters().put(CLIENT_KEY, registryConfig.getClient());\n-        metadataReportConfig.setGroup(registryConfig.getGroup());\n-        metadataReportConfig.setAddress(getRegistryCompatibleAddress(registryConfig));\n-        metadataReportConfig.setUsername(registryConfig.getUsername());\n-        metadataReportConfig.setPassword(registryConfig.getPassword());\n-        metadataReportConfig.setTimeout(registryConfig.getTimeout());\n-        return metadataReportConfig;\n-    }\n-\n-    private String getRegistryCompatibleAddress(RegistryConfig registryConfig) {\n-        String registryAddress = registryConfig.getAddress();\n-        String[] addresses = REGISTRY_SPLIT_PATTERN.split(registryAddress);\n-        if (ArrayUtils.isEmpty(addresses)) {\n-            throw new IllegalStateException(\"Invalid registry address found.\");\n-        }\n-        String address = addresses[0];\n-        // since 2.7.8\n-        // Issue : https://github.com/apache/dubbo/issues/6476\n-        StringBuilder metadataAddressBuilder = new StringBuilder();\n-        URL url = URL.valueOf(address);\n-        String protocolFromAddress = url.getProtocol();\n-        if (isEmpty(protocolFromAddress)) {\n-            // If the protocol from address is missing, is like :\n-            // \"dubbo.registry.address = 127.0.0.1:2181\"\n-            String protocolFromConfig = registryConfig.getProtocol();\n-            metadataAddressBuilder.append(protocolFromConfig).append(\"://\");\n-        }\n-        metadataAddressBuilder.append(address);\n-        return metadataAddressBuilder.toString();\n-    }\n-\n-    private void loadRemoteConfigs() {\n-        // registry ids to registry configs\n-        List<RegistryConfig> tmpRegistries = new ArrayList<>();\n-        Set<String> registryIds = configManager.getRegistryIds();\n-        registryIds.forEach(id -> {\n-            if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {\n-                tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> {\n-                    RegistryConfig registryConfig = new RegistryConfig();\n-                    registryConfig.setId(id);\n-                    registryConfig.refresh();\n-                    return registryConfig;\n-                }));\n-            }\n-        });\n-\n-        configManager.addRegistries(tmpRegistries);\n-\n-        // protocol ids to protocol configs\n-        List<ProtocolConfig> tmpProtocols = new ArrayList<>();\n-        Set<String> protocolIds = configManager.getProtocolIds();\n-        protocolIds.forEach(id -> {\n-            if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {\n-                tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> {\n-                    ProtocolConfig protocolConfig = new ProtocolConfig();\n-                    protocolConfig.setId(id);\n-                    protocolConfig.refresh();\n-                    return protocolConfig;\n-                }));\n-            }\n-        });\n-\n-        configManager.addProtocols(tmpProtocols);\n-    }\n-\n-\n-    /**\n-     * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension\n-     */\n-    private void initMetadataService() {\n-        this.metadataService = getDefaultExtension();\n-        this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(metadataService);\n-    }\n-\n-    /**\n-     * Initialize {@link EventListener}\n-     */\n-    private void initEventListener() {\n-        // Add current instance into listeners\n-        addEventListener(this);\n-    }\n-\n-    /**\n-     * Start the bootstrap\n-     */\n-    public DubboBootstrap start() {\n-        if (started.compareAndSet(false, true)) {\n-            ready.set(false);\n-            initialize();\n-            if (logger.isInfoEnabled()) {\n-                logger.info(NAME + \" is starting...\");\n-            }\n-            // 1. export Dubbo Services\n-            exportServices();\n-\n-            // Not only provider register\n-            if (!isOnlyRegisterProvider() || hasExportedServices()) {\n-                // 2. export MetadataService\n-                exportMetadataService();\n-                //3. Register the local ServiceInstance if required\n-                registerServiceInstance();\n-            }\n-\n-            referServices();\n-            if (asyncExportingFutures.size() > 0) {\n-                new Thread(() -> {\n-                    try {\n-                        this.awaitFinish();\n-                    } catch (Exception e) {\n-                        logger.warn(NAME + \" exportAsync occurred an exception.\");\n-                    }\n-                    ready.set(true);\n-                    if (logger.isInfoEnabled()) {\n-                        logger.info(NAME + \" is ready.\");\n-                    }\n-                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\n-                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\n-                }).start();\n-            } else {\n-                ready.set(true);\n-                if (logger.isInfoEnabled()) {\n-                    logger.info(NAME + \" is ready.\");\n-                }\n-                ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\n-                exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\n-            }\n-            if (logger.isInfoEnabled()) {\n-                logger.info(NAME + \" has started.\");\n-            }\n-        }\n-        return this;\n-    }\n-\n-    private boolean hasExportedServices() {\n-        return !metadataService.getExportedURLs().isEmpty();\n-    }\n-\n-    /**\n-     * Block current thread to be await.\n-     *\n-     * @return {@link DubboBootstrap}\n-     */\n-    public DubboBootstrap await() {\n-        // if has been waited, no need to wait again, return immediately\n-        if (!awaited.get()) {\n-            if (!executorService.isShutdown()) {\n-                executeMutually(() -> {\n-                    while (!awaited.get()) {\n-                        if (logger.isInfoEnabled()) {\n-                            logger.info(NAME + \" awaiting ...\");\n-                        }\n-                        try {\n-                            condition.await();\n-                        } catch (InterruptedException e) {\n-                            Thread.currentThread().interrupt();\n-                        }\n-                    }\n-                });\n-            }\n-        }\n-        return this;\n-    }\n-\n-    public DubboBootstrap awaitFinish() throws Exception {\n-        logger.info(NAME + \" waiting services exporting / referring ...\");\n-        if (exportAsync && asyncExportingFutures.size() > 0) {\n-            CompletableFuture future = CompletableFuture.allOf(asyncExportingFutures.toArray(new CompletableFuture[0]));\n-            future.get();\n-        }\n-        if (referAsync && asyncReferringFutures.size() > 0) {\n-            CompletableFuture future = CompletableFuture.allOf(asyncReferringFutures.toArray(new CompletableFuture[0]));\n-            future.get();\n-        }\n-\n-        logger.info(\"Service export / refer finished.\");\n-        return this;\n-    }\n-\n-    public boolean isInitialized() {\n-        return initialized.get();\n-    }\n-\n-    public boolean isStarted() {\n-        return started.get();\n-    }\n-\n-    public boolean isReady() {\n-        return ready.get();\n-    }\n-\n-\n-    public DubboBootstrap stop() throws IllegalStateException {\n-        destroy();\n-        return this;\n-    }\n-    /* serve for builder apis, begin */\n-\n-    private ApplicationBuilder createApplicationBuilder(String name) {\n-        return new ApplicationBuilder().name(name);\n-    }\n-\n-    private RegistryBuilder createRegistryBuilder(String id) {\n-        return new RegistryBuilder().id(id);\n-    }\n-\n-    private ProtocolBuilder createProtocolBuilder(String id) {\n-        return new ProtocolBuilder().id(id);\n-    }\n-\n-    private ServiceBuilder createServiceBuilder(String id) {\n-        return new ServiceBuilder().id(id);\n-    }\n-\n-    private ReferenceBuilder createReferenceBuilder(String id) {\n-        return new ReferenceBuilder().id(id);\n-    }\n-\n-    private ProviderBuilder createProviderBuilder(String id) {\n-        return new ProviderBuilder().id(id);\n-    }\n-\n-    private ConsumerBuilder createConsumerBuilder(String id) {\n-        return new ConsumerBuilder().id(id);\n-    }\n-    /* serve for builder apis, end */\n-\n-    private DynamicConfiguration prepareEnvironment(ConfigCenterConfig configCenter) {\n-        if (configCenter.isValid()) {\n-            if (!configCenter.checkOrUpdateInited()) {\n-                return null;\n-            }\n-            DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl());\n-            String configContent = dynamicConfiguration.getProperties(configCenter.getConfigFile(), configCenter.getGroup());\n-\n-            String appGroup = getApplication().getName();\n-            String appConfigContent = null;\n-            if (isNotEmpty(appGroup)) {\n-                appConfigContent = dynamicConfiguration.getProperties\n-                        (isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(),\n-                                appGroup\n-                        );\n-            }\n-            try {\n-                environment.setConfigCenterFirst(configCenter.isHighestPriority());\n-                environment.updateExternalConfigurationMap(parseProperties(configContent));\n-                environment.updateAppExternalConfigurationMap(parseProperties(appConfigContent));\n-            } catch (IOException e) {\n-                throw new IllegalStateException(\"Failed to parse configurations from Config Center.\", e);\n-            }\n-            return dynamicConfiguration;\n-        }\n-        return null;\n-    }\n-\n-    /**\n-     * Add an instance of {@link EventListener}\n-     *\n-     * @param listener {@link EventListener}\n-     * @return {@link DubboBootstrap}\n-     */\n-    public DubboBootstrap addEventListener(EventListener<?> listener) {\n-        eventDispatcher.addEventListener(listener);\n-        return this;\n-    }\n-\n-    /**\n-     * export {@link MetadataService}\n-     */\n-    private void exportMetadataService() {\n-        metadataServiceExporter.export();\n-    }\n-\n-    private void unexportMetadataService() {\n-        if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {\n-            metadataServiceExporter.unexport();\n-        }\n-    }\n-\n-    private void exportServices() {\n-        configManager.getServices().forEach(sc -> {\n-            // TODO, compatible with ServiceConfig.export()\n-            ServiceConfig serviceConfig = (ServiceConfig) sc;\n-            serviceConfig.setBootstrap(this);\n-\n-            if (exportAsync) {\n-                ExecutorService executor = executorRepository.getServiceExporterExecutor();\n-                Future<?> future = executor.submit(() -> {\n-                    sc.export();\n-                    exportedServices.add(sc);\n-                });\n-                asyncExportingFutures.add(future);\n-            } else {\n-                sc.export();\n-                exportedServices.add(sc);\n-            }\n-        });\n-    }\n-\n-    private void unexportServices() {\n-        exportedServices.forEach(sc -> {\n-            configManager.removeConfig(sc);\n-            sc.unexport();\n-        });\n-\n-        asyncExportingFutures.forEach(future -> {\n-            if (!future.isDone()) {\n-                future.cancel(true);\n-            }\n-        });\n-        asyncExportingFutures.clear();\n-        exportedServices.clear();\n-    }\n-\n-    private void referServices() {\n-        if (cache == null) {\n-            cache = ReferenceConfigCache.getCache();\n-        }\n-\n-        configManager.getReferences().forEach(rc -> {\n-            // TODO, compatible with  ReferenceConfig.refer()\n-            ReferenceConfig referenceConfig = (ReferenceConfig) rc;\n-            referenceConfig.setBootstrap(this);\n-\n-            if (rc.shouldInit()) {\n-                if (referAsync) {\n-                    CompletableFuture<Object> future = ScheduledCompletableFuture.submit(\n-                            executorRepository.getServiceExporterExecutor(),\n-                            () -> cache.get(rc)\n-                    );\n-                    asyncReferringFutures.add(future);\n-                } else {\n-                    cache.get(rc);\n-                }\n-            }\n-        });\n-    }\n-\n-    private void unreferServices() {\n-        if (cache == null) {\n-            cache = ReferenceConfigCache.getCache();\n-        }\n-\n-        asyncReferringFutures.forEach(future -> {\n-            if (!future.isDone()) {\n-                future.cancel(true);\n-            }\n-        });\n-        asyncReferringFutures.clear();\n-        cache.destroyAll();\n-    }\n-\n-    private void registerServiceInstance() {\n-        if (CollectionUtils.isEmpty(getServiceDiscoveries())) {\n-            return;\n-        }\n-\n-        ApplicationConfig application = getApplication();\n-\n-        String serviceName = application.getName();\n-\n-        URL exportedURL = selectMetadataServiceExportedURL();\n-\n-        String host = exportedURL.getHost();\n-\n-        int port = exportedURL.getPort();\n-\n-        ServiceInstance serviceInstance = createServiceInstance(serviceName, host, port);\n-\n-        doRegisterServiceInstance(serviceInstance);\n-\n-        // scheduled task for updating Metadata and ServiceInstance\n-        executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {\n-            try {\n-                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\n-                localMetadataService.blockUntilUpdated();\n-                ServiceInstanceMetadataUtils.refreshMetadataAndInstance();\n-            } catch (Throwable e) {\n-                logger.error(\"refresh metadata and instance failed\", e);\n-            }\n-        }, 0, ConfigurationUtils.get(METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);\n-    }\n-\n-    private void doRegisterServiceInstance(ServiceInstance serviceInstance) {\n-        //FIXME\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Start publishing metadata to remote center, this only makes sense for applications enabled remote metadata center.\");\n-        }\n-        publishMetadataToRemote(serviceInstance);\n-\n-        logger.info(\"Start registering instance address to registry.\");\n-        getServiceDiscoveries().forEach(serviceDiscovery ->\n-        {\n-            calInstanceRevision(serviceDiscovery, serviceInstance);\n-            if (logger.isDebugEnabled()) {\n-                logger.info(\"Start registering instance address to registry\" + serviceDiscovery.getUrl() + \", instance \" + serviceInstance);\n-            }\n-            // register metadata\n-            serviceDiscovery.register(serviceInstance);\n-        });\n-    }\n-\n-    private void publishMetadataToRemote(ServiceInstance serviceInstance) {\n-//        InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService)WritableMetadataService.getDefaultExtension();\n-//        localMetadataService.blockUntilUpdated();\n-        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\n-        remoteMetadataService.publishMetadata(serviceInstance.getServiceName());\n-    }\n-\n-    private URL selectMetadataServiceExportedURL() {\n-\n-        URL selectedURL = null;\n-\n-        SortedSet<String> urlValues = metadataService.getExportedURLs();\n-\n-        for (String urlValue : urlValues) {\n-            URL url = URL.valueOf(urlValue);\n-            if (MetadataService.class.getName().equals(url.getServiceInterface())) {\n-                continue;\n-            }\n-            if (\"rest\".equals(url.getProtocol())) { // REST first\n-                selectedURL = url;\n-                break;\n-            } else {\n-                selectedURL = url; // If not found, take any one\n-            }\n-        }\n-\n-        if (selectedURL == null && CollectionUtils.isNotEmpty(urlValues)) {\n-            selectedURL = URL.valueOf(urlValues.iterator().next());\n-        }\n-\n-        return selectedURL;\n-    }\n-\n-    private void unregisterServiceInstance() {\n-        if (serviceInstance != null) {\n-            getServiceDiscoveries().forEach(serviceDiscovery -> {\n-                serviceDiscovery.unregister(serviceInstance);\n-            });\n-        }\n-    }\n-\n-    private ServiceInstance createServiceInstance(String serviceName, String host, int port) {\n-        this.serviceInstance = new DefaultServiceInstance(serviceName, host, port);\n-        setMetadataStorageType(serviceInstance, getMetadataType());\n-\n-        ExtensionLoader<ServiceInstanceCustomizer> loader =\n-                ExtensionLoader.getExtensionLoader(ServiceInstanceCustomizer.class);\n-        // FIXME, sort customizer before apply\n-        loader.getSupportedExtensionInstances().forEach(customizer -> {\n-            // customizes\n-            customizer.customize(this.serviceInstance);\n-        });\n-\n-        return this.serviceInstance;\n-    }\n-\n-    public void destroy() {\n-        if (destroyLock.tryLock()) {\n-            try {\n-                DubboShutdownHook.destroyAll();\n-\n-                if (started.compareAndSet(true, false)\n-                        && destroyed.compareAndSet(false, true)) {\n-\n-                    unregisterServiceInstance();\n-                    unexportMetadataService();\n-                    unexportServices();\n-                    unreferServices();\n-\n-                    destroyRegistries();\n-\n-                    destroyServiceDiscoveries();\n-                    destroyExecutorRepository();\n-                    clear();\n-                    shutdown();\n-                    release();\n-                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\n-                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStop(this));\n-                }\n-            } finally {\n-                destroyLock.unlock();\n-            }\n-        }\n-    }\n-\n-    private void destroyExecutorRepository() {\n-        ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension().destroyAll();\n-    }\n-\n-    private void destroyRegistries() {\n-        AbstractRegistryFactory.destroyAll();\n-    }\n-\n-    private void destroyServiceDiscoveries() {\n-        getServiceDiscoveries().forEach(serviceDiscovery -> {\n-            execute(serviceDiscovery::destroy);\n-        });\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(NAME + \"'s all ServiceDiscoveries have been destroyed.\");\n-        }\n-    }\n-\n-    private void clear() {\n-        clearConfigs();\n-        clearApplicationModel();\n-    }\n-\n-    private void clearApplicationModel() {\n-\n-    }\n-\n-    private void clearConfigs() {\n-        configManager.destroy();\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(NAME + \"'s configs have been clear.\");\n-        }\n-    }\n-\n-    private void release() {\n-        executeMutually(() -> {\n-            while (awaited.compareAndSet(false, true)) {\n-                if (logger.isInfoEnabled()) {\n-                    logger.info(NAME + \" is about to shutdown...\");\n-                }\n-                condition.signalAll();\n-            }\n-        });\n-    }\n-\n-    private void shutdown() {\n-        if (!executorService.isShutdown()) {\n-            // Shutdown executorService\n-            executorService.shutdown();\n-        }\n-    }\n-\n-    private void executeMutually(Runnable runnable) {\n-        try {\n-            lock.lock();\n-            runnable.run();\n-        } finally {\n-            lock.unlock();\n-        }\n-    }\n-\n-    public ApplicationConfig getApplication() {\n-        ApplicationConfig application = configManager\n-                .getApplication()\n-                .orElseGet(() -> {\n-                    ApplicationConfig applicationConfig = new ApplicationConfig();\n-                    configManager.setApplication(applicationConfig);\n-                    return applicationConfig;\n-                });\n-\n-        application.refresh();\n-        return application;\n-    }\n-\n-    private MonitorConfig getMonitor() {\n-        MonitorConfig monitor = configManager\n-                .getMonitor()\n-                .orElseGet(() -> {\n-                    MonitorConfig monitorConfig = new MonitorConfig();\n-                    configManager.setMonitor(monitorConfig);\n-                    return monitorConfig;\n-                });\n-\n-        monitor.refresh();\n-        return monitor;\n-    }\n-\n-    private MetricsConfig getMetrics() {\n-        MetricsConfig metrics = configManager\n-                .getMetrics()\n-                .orElseGet(() -> {\n-                    MetricsConfig metricsConfig = new MetricsConfig();\n-                    configManager.setMetrics(metricsConfig);\n-                    return metricsConfig;\n-                });\n-        metrics.refresh();\n-        return metrics;\n-    }\n-\n-    private ModuleConfig getModule() {\n-        ModuleConfig module = configManager\n-                .getModule()\n-                .orElseGet(() -> {\n-                    ModuleConfig moduleConfig = new ModuleConfig();\n-                    configManager.setModule(moduleConfig);\n-                    return moduleConfig;\n-                });\n-\n-        module.refresh();\n-        return module;\n-    }\n-\n-    private SslConfig getSsl() {\n-        SslConfig ssl = configManager\n-                .getSsl()\n-                .orElseGet(() -> {\n-                    SslConfig sslConfig = new SslConfig();\n-                    configManager.setSsl(sslConfig);\n-                    return sslConfig;\n-                });\n-\n-        ssl.refresh();\n-        return ssl;\n-    }\n-\n-    public void setReady(boolean ready) {\n-        this.ready.set(ready);\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.bootstrap;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.common.config.Environment;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;\r\n+import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\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.concurrent.ScheduledCompletableFuture;\r\n+import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;\r\n+import org.apache.dubbo.common.utils.ArrayUtils;\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.ApplicationConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+import org.apache.dubbo.config.DubboShutdownHook;\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.ReferenceConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+import org.apache.dubbo.config.SslConfig;\r\n+import org.apache.dubbo.config.bootstrap.builders.ApplicationBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ConsumerBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ProtocolBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ProviderBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ReferenceBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.RegistryBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ServiceBuilder;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;\r\n+import org.apache.dubbo.config.utils.ConfigValidationUtils;\r\n+import org.apache.dubbo.config.utils.ReferenceConfigCache;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.event.GenericEventListener;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.MetadataServiceExporter;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.metadata.report.MetadataReportFactory;\r\n+import org.apache.dubbo.metadata.report.MetadataReportInstance;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\r\n+import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.io.IOException;\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+import java.util.SortedSet;\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.Future;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+import java.util.concurrent.locks.Condition;\r\n+import java.util.concurrent.locks.Lock;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+import java.util.function.Consumer;\r\n+import java.util.function.Supplier;\r\n+\r\n+import static java.lang.String.format;\r\n+import static java.util.Collections.singletonList;\r\n+import static java.util.concurrent.Executors.newSingleThreadExecutor;\r\n+import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;\r\n+import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+import static org.apache.dubbo.common.function.ThrowableAction.execute;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_PUBLISH_DELAY;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;\r\n+import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;\r\n+import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;\r\n+import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\r\n+\r\n+/**\r\n+ * See {@link ApplicationModel} and {@link ExtensionLoader} for why this class is designed to be singleton.\r\n+ * <p>\r\n+ * The bootstrap class of Dubbo\r\n+ * <p>\r\n+ * Get singleton instance by calling static method {@link #getInstance()}.\r\n+ * Designed as singleton because some classes inside Dubbo, such as ExtensionLoader, are designed only for one instance per process.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboBootstrap extends GenericEventListener {\r\n+\r\n+    public static final String DEFAULT_REGISTRY_ID = \"REGISTRY#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_PROTOCOL_ID = \"PROTOCOL#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_SERVICE_ID = \"SERVICE#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_REFERENCE_ID = \"REFERENCE#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_PROVIDER_ID = \"PROVIDER#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_CONSUMER_ID = \"CONSUMER#DEFAULT\";\r\n+\r\n+    private static final String NAME = DubboBootstrap.class.getSimpleName();\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private static volatile DubboBootstrap instance;\r\n+\r\n+    private final AtomicBoolean awaited = new AtomicBoolean(false);\r\n+\r\n+    private final Lock lock = new ReentrantLock();\r\n+\r\n+    private final Condition condition = lock.newCondition();\r\n+\r\n+    private final Lock destroyLock = new ReentrantLock();\r\n+\r\n+    private final ExecutorService executorService = newSingleThreadExecutor();\r\n+\r\n+    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\r\n+\r\n+    private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();\r\n+\r\n+    private final ConfigManager configManager;\r\n+\r\n+    private final Environment environment;\r\n+\r\n+    private ReferenceConfigCache cache;\r\n+\r\n+    private volatile boolean exportAsync;\r\n+\r\n+    private volatile boolean referAsync;\r\n+\r\n+    private AtomicBoolean initialized = new AtomicBoolean(false);\r\n+\r\n+    private AtomicBoolean started = new AtomicBoolean(false);\r\n+\r\n+    private AtomicBoolean ready = new AtomicBoolean(false);\r\n+\r\n+    private AtomicBoolean destroyed = new AtomicBoolean(false);\r\n+\r\n+    private volatile ServiceInstance serviceInstance;\r\n+\r\n+    private volatile MetadataService metadataService;\r\n+\r\n+    private volatile MetadataServiceExporter metadataServiceExporter;\r\n+\r\n+    private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();\r\n+\r\n+    private List<Future<?>> asyncExportingFutures = new ArrayList<>();\r\n+\r\n+    private List<CompletableFuture<Object>> asyncReferringFutures = new ArrayList<>();\r\n+\r\n+    /**\r\n+     * See {@link ApplicationModel} and {@link ExtensionLoader} for why DubboBootstrap is designed to be singleton.\r\n+     */\r\n+    public static DubboBootstrap getInstance() {\r\n+        if (instance == null) {\r\n+            synchronized (DubboBootstrap.class) {\r\n+                if (instance == null) {\r\n+                    instance = new DubboBootstrap();\r\n+                }\r\n+            }\r\n+        }\r\n+        return instance;\r\n+    }\r\n+\r\n+    private DubboBootstrap() {\r\n+        configManager = ApplicationModel.getConfigManager();\r\n+        environment = ApplicationModel.getEnvironment();\r\n+\r\n+        DubboShutdownHook.getDubboShutdownHook().register();\r\n+        ShutdownHookCallbacks.INSTANCE.addCallback(DubboBootstrap.this::destroy);\r\n+    }\r\n+\r\n+    public void unRegisterShutdownHook() {\r\n+        DubboShutdownHook.getDubboShutdownHook().unregister();\r\n+    }\r\n+\r\n+    private boolean isOnlyRegisterProvider() {\r\n+        Boolean registerConsumer = getApplication().getRegisterConsumer();\r\n+        return registerConsumer == null || !registerConsumer;\r\n+    }\r\n+\r\n+    private String getMetadataType() {\r\n+        String type = getApplication().getMetadataType();\r\n+        if (StringUtils.isEmpty(type)) {\r\n+            type = DEFAULT_METADATA_STORAGE_TYPE;\r\n+        }\r\n+        return type;\r\n+    }\r\n+\r\n+    public DubboBootstrap metadataReport(MetadataReportConfig metadataReportConfig) {\r\n+        configManager.addMetadataReport(metadataReportConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap metadataReports(List<MetadataReportConfig> metadataReportConfigs) {\r\n+        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        configManager.addMetadataReports(metadataReportConfigs);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ApplicationConfig} correlative methods\r\n+\r\n+    /**\r\n+     * Set the name of application\r\n+     *\r\n+     * @param name the name of application\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap application(String name) {\r\n+        return application(name, builder -> {\r\n+            // DO NOTHING\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the name of application and it's future build\r\n+     *\r\n+     * @param name            the name of application\r\n+     * @param consumerBuilder {@link ApplicationBuilder}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap application(String name, Consumer<ApplicationBuilder> consumerBuilder) {\r\n+        ApplicationBuilder builder = createApplicationBuilder(name);\r\n+        consumerBuilder.accept(builder);\r\n+        return application(builder.build());\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the {@link ApplicationConfig}\r\n+     *\r\n+     * @param applicationConfig the {@link ApplicationConfig}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap application(ApplicationConfig applicationConfig) {\r\n+        configManager.setApplication(applicationConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+\r\n+    // {@link RegistryConfig} correlative methods\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig} with {@link #DEFAULT_REGISTRY_ID default ID}\r\n+     *\r\n+     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registry(Consumer<RegistryBuilder> consumerBuilder) {\r\n+        return registry(DEFAULT_REGISTRY_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig} with the specified ID\r\n+     *\r\n+     * @param id              the {@link RegistryConfig#getId() id}  of {@link RegistryConfig}\r\n+     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registry(String id, Consumer<RegistryBuilder> consumerBuilder) {\r\n+        RegistryBuilder builder = createRegistryBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return registry(builder.build());\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig}\r\n+     *\r\n+     * @param registryConfig an instance of {@link RegistryConfig}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registry(RegistryConfig registryConfig) {\r\n+        configManager.addRegistry(registryConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig}\r\n+     *\r\n+     * @param registryConfigs the multiple instances of {@link RegistryConfig}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registries(List<RegistryConfig> registryConfigs) {\r\n+        if (CollectionUtils.isEmpty(registryConfigs)) {\r\n+            return this;\r\n+        }\r\n+        registryConfigs.forEach(this::registry);\r\n+        return this;\r\n+    }\r\n+\r\n+\r\n+    // {@link ProtocolConfig} correlative methods\r\n+    public DubboBootstrap protocol(Consumer<ProtocolBuilder> consumerBuilder) {\r\n+        return protocol(DEFAULT_PROTOCOL_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    public DubboBootstrap protocol(String id, Consumer<ProtocolBuilder> consumerBuilder) {\r\n+        ProtocolBuilder builder = createProtocolBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return protocol(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap protocol(ProtocolConfig protocolConfig) {\r\n+        return protocols(singletonList(protocolConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap protocols(List<ProtocolConfig> protocolConfigs) {\r\n+        if (CollectionUtils.isEmpty(protocolConfigs)) {\r\n+            return this;\r\n+        }\r\n+        configManager.addProtocols(protocolConfigs);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ServiceConfig} correlative methods\r\n+    public <S> DubboBootstrap service(Consumer<ServiceBuilder<S>> consumerBuilder) {\r\n+        return service(DEFAULT_SERVICE_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    public <S> DubboBootstrap service(String id, Consumer<ServiceBuilder<S>> consumerBuilder) {\r\n+        ServiceBuilder builder = createServiceBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return service(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap service(ServiceConfig<?> serviceConfig) {\r\n+        configManager.addService(serviceConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap services(List<ServiceConfig> serviceConfigs) {\r\n+        if (CollectionUtils.isEmpty(serviceConfigs)) {\r\n+            return this;\r\n+        }\r\n+        serviceConfigs.forEach(configManager::addService);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link Reference} correlative methods\r\n+    public <S> DubboBootstrap reference(Consumer<ReferenceBuilder<S>> consumerBuilder) {\r\n+        return reference(DEFAULT_REFERENCE_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    public <S> DubboBootstrap reference(String id, Consumer<ReferenceBuilder<S>> consumerBuilder) {\r\n+        ReferenceBuilder builder = createReferenceBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return reference(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap reference(ReferenceConfig<?> referenceConfig) {\r\n+        configManager.addReference(referenceConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap references(List<ReferenceConfig> referenceConfigs) {\r\n+        if (CollectionUtils.isEmpty(referenceConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        referenceConfigs.forEach(configManager::addReference);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ProviderConfig} correlative methods\r\n+    public DubboBootstrap provider(Consumer<ProviderBuilder> builderConsumer) {\r\n+        return provider(DEFAULT_PROVIDER_ID, builderConsumer);\r\n+    }\r\n+\r\n+    public DubboBootstrap provider(String id, Consumer<ProviderBuilder> builderConsumer) {\r\n+        ProviderBuilder builder = createProviderBuilder(id);\r\n+        builderConsumer.accept(builder);\r\n+        return provider(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap provider(ProviderConfig providerConfig) {\r\n+        return providers(singletonList(providerConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap providers(List<ProviderConfig> providerConfigs) {\r\n+        if (CollectionUtils.isEmpty(providerConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        providerConfigs.forEach(configManager::addProvider);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ConsumerConfig} correlative methods\r\n+    public DubboBootstrap consumer(Consumer<ConsumerBuilder> builderConsumer) {\r\n+        return consumer(DEFAULT_CONSUMER_ID, builderConsumer);\r\n+    }\r\n+\r\n+    public DubboBootstrap consumer(String id, Consumer<ConsumerBuilder> builderConsumer) {\r\n+        ConsumerBuilder builder = createConsumerBuilder(id);\r\n+        builderConsumer.accept(builder);\r\n+        return consumer(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap consumer(ConsumerConfig consumerConfig) {\r\n+        return consumers(singletonList(consumerConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap consumers(List<ConsumerConfig> consumerConfigs) {\r\n+        if (CollectionUtils.isEmpty(consumerConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        consumerConfigs.forEach(configManager::addConsumer);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ConfigCenterConfig} correlative methods\r\n+    public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {\r\n+        return configCenters(singletonList(configCenterConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap configCenters(List<ConfigCenterConfig> configCenterConfigs) {\r\n+        if (CollectionUtils.isEmpty(configCenterConfigs)) {\r\n+            return this;\r\n+        }\r\n+        configManager.addConfigCenters(configCenterConfigs);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap monitor(MonitorConfig monitor) {\r\n+        configManager.setMonitor(monitor);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap metrics(MetricsConfig metrics) {\r\n+        configManager.setMetrics(metrics);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap module(ModuleConfig module) {\r\n+        configManager.setModule(module);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap ssl(SslConfig sslConfig) {\r\n+        configManager.setSsl(sslConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap cache(ReferenceConfigCache cache) {\r\n+        this.cache = cache;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ReferenceConfigCache getCache() {\r\n+        if (cache == null) {\r\n+            cache = ReferenceConfigCache.getCache();\r\n+        }\r\n+        return cache;\r\n+    }\r\n+\r\n+    public DubboBootstrap exportAsync() {\r\n+        this.exportAsync = true;\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap referAsync() {\r\n+        this.referAsync = true;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void init() {\r\n+        initialize();\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize\r\n+     */\r\n+    public void initialize() {\r\n+        if (!initialized.compareAndSet(false, true)) {\r\n+            return;\r\n+        }\r\n+\r\n+        ApplicationModel.initFrameworkExts();\r\n+\r\n+        startConfigCenter();\r\n+\r\n+        loadRemoteConfigs();\r\n+\r\n+        checkGlobalConfigs();\r\n+\r\n+        // @since 2.7.8\r\n+        startMetadataCenter();\r\n+\r\n+        initMetadataService();\r\n+\r\n+        initEventListener();\r\n+\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(NAME + \" has been initialized!\");\r\n+        }\r\n+    }\r\n+\r\n+    private void checkGlobalConfigs() {\r\n+        // check Application\r\n+        ConfigValidationUtils.validateApplicationConfig(getApplication());\r\n+\r\n+        // check Metadata\r\n+        Collection<MetadataReportConfig> metadatas = configManager.getMetadataConfigs();\r\n+        if (CollectionUtils.isEmpty(metadatas)) {\r\n+            MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\r\n+            metadataReportConfig.refresh();\r\n+            if (metadataReportConfig.isValid()) {\r\n+                configManager.addMetadataReport(metadataReportConfig);\r\n+                metadatas = configManager.getMetadataConfigs();\r\n+            }\r\n+        }\r\n+        if (CollectionUtils.isNotEmpty(metadatas)) {\r\n+            for (MetadataReportConfig metadataReportConfig : metadatas) {\r\n+                metadataReportConfig.refresh();\r\n+                ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\r\n+            }\r\n+        }\r\n+\r\n+        // check Provider\r\n+        Collection<ProviderConfig> providers = configManager.getProviders();\r\n+        if (CollectionUtils.isEmpty(providers)) {\r\n+            configManager.getDefaultProvider().orElseGet(() -> {\r\n+                ProviderConfig providerConfig = new ProviderConfig();\r\n+                configManager.addProvider(providerConfig);\r\n+                providerConfig.refresh();\r\n+                return providerConfig;\r\n+            });\r\n+        }\r\n+        for (ProviderConfig providerConfig : configManager.getProviders()) {\r\n+            ConfigValidationUtils.validateProviderConfig(providerConfig);\r\n+        }\r\n+        // check Consumer\r\n+        Collection<ConsumerConfig> consumers = configManager.getConsumers();\r\n+        if (CollectionUtils.isEmpty(consumers)) {\r\n+            configManager.getDefaultConsumer().orElseGet(() -> {\r\n+                ConsumerConfig consumerConfig = new ConsumerConfig();\r\n+                configManager.addConsumer(consumerConfig);\r\n+                consumerConfig.refresh();\r\n+                return consumerConfig;\r\n+            });\r\n+        }\r\n+        for (ConsumerConfig consumerConfig : configManager.getConsumers()) {\r\n+            ConfigValidationUtils.validateConsumerConfig(consumerConfig);\r\n+        }\r\n+\r\n+        // check Monitor\r\n+        ConfigValidationUtils.validateMonitorConfig(getMonitor());\r\n+        // check Metrics\r\n+        ConfigValidationUtils.validateMetricsConfig(getMetrics());\r\n+        // check Module\r\n+        ConfigValidationUtils.validateModuleConfig(getModule());\r\n+        // check Ssl\r\n+        ConfigValidationUtils.validateSslConfig(getSsl());\r\n+    }\r\n+\r\n+    private void startConfigCenter() {\r\n+\r\n+        useRegistryAsConfigCenterIfNecessary();\r\n+\r\n+        Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();\r\n+\r\n+        // check Config Center\r\n+        if (CollectionUtils.isEmpty(configCenters)) {\r\n+            ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();\r\n+            configCenterConfig.refresh();\r\n+            if (configCenterConfig.isValid()) {\r\n+                configManager.addConfigCenter(configCenterConfig);\r\n+                configCenters = configManager.getConfigCenters();\r\n+            }\r\n+        } else {\r\n+            for (ConfigCenterConfig configCenterConfig : configCenters) {\r\n+                configCenterConfig.refresh();\r\n+                ConfigValidationUtils.validateConfigCenterConfig(configCenterConfig);\r\n+            }\r\n+        }\r\n+\r\n+        if (CollectionUtils.isNotEmpty(configCenters)) {\r\n+            CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration();\r\n+            for (ConfigCenterConfig configCenter : configCenters) {\r\n+                compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter));\r\n+            }\r\n+            environment.setDynamicConfiguration(compositeDynamicConfiguration);\r\n+        }\r\n+        configManager.refreshAll();\r\n+    }\r\n+\r\n+    private void startMetadataCenter() {\r\n+\r\n+        useRegistryAsMetadataCenterIfNecessary();\r\n+\r\n+        ApplicationConfig applicationConfig = getApplication();\r\n+\r\n+        String metadataType = applicationConfig.getMetadataType();\r\n+        // FIXME, multiple metadata config support.\r\n+        Collection<MetadataReportConfig> metadataReportConfigs = configManager.getMetadataConfigs();\r\n+        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\r\n+            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\r\n+                throw new IllegalStateException(\"No MetadataConfig found, Metadata Center address is required when 'metadata=remote' is enabled.\");\r\n+            }\r\n+            return;\r\n+        }\r\n+\r\n+        for (MetadataReportConfig metadataReportConfig : metadataReportConfigs) {\r\n+            ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\r\n+            if (!metadataReportConfig.isValid()) {\r\n+                return;\r\n+            }\r\n+            MetadataReportInstance.init(metadataReportConfig);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * For compatibility purpose, use registry as the default config center when\r\n+     * there's no config center specified explicitly and\r\n+     * useAsConfigCenter of registryConfig is null or true\r\n+     */\r\n+    private void useRegistryAsConfigCenterIfNecessary() {\r\n+        // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.\r\n+        if (environment.getDynamicConfiguration().isPresent()) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (CollectionUtils.isNotEmpty(configManager.getConfigCenters())) {\r\n+            return;\r\n+        }\r\n+\r\n+        configManager\r\n+                .getDefaultRegistries()\r\n+                .stream()\r\n+                .filter(this::isUsedRegistryAsConfigCenter)\r\n+                .map(this::registryAsConfigCenter)\r\n+                .forEach(configManager::addConfigCenter);\r\n+    }\r\n+\r\n+    private boolean isUsedRegistryAsConfigCenter(RegistryConfig registryConfig) {\r\n+        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsConfigCenter, \"config\",\r\n+                DynamicConfigurationFactory.class);\r\n+    }\r\n+\r\n+    private ConfigCenterConfig registryAsConfigCenter(RegistryConfig registryConfig) {\r\n+        String protocol = registryConfig.getProtocol();\r\n+        Integer port = registryConfig.getPort();\r\n+        String id = \"config-center-\" + protocol + \"-\" + port;\r\n+        ConfigCenterConfig cc = new ConfigCenterConfig();\r\n+        cc.setId(id);\r\n+        if (cc.getParameters() == null) {\r\n+            cc.setParameters(new HashMap<>());\r\n+        }\r\n+        if (registryConfig.getParameters() != null) {\r\n+            cc.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\r\n+        }\r\n+        cc.getParameters().put(CLIENT_KEY, registryConfig.getClient());\r\n+        cc.setProtocol(protocol);\r\n+        cc.setPort(port);\r\n+        if (StringUtils.isNotEmpty(registryConfig.getGroup())) {\r\n+            cc.setGroup(registryConfig.getGroup());\r\n+        }\r\n+        cc.setAddress(getRegistryCompatibleAddress(registryConfig));\r\n+        cc.setNamespace(registryConfig.getGroup());\r\n+        cc.setUsername(registryConfig.getUsername());\r\n+        cc.setPassword(registryConfig.getPassword());\r\n+        if (registryConfig.getTimeout() != null) {\r\n+            cc.setTimeout(registryConfig.getTimeout().longValue());\r\n+        }\r\n+        cc.setHighestPriority(false);\r\n+        return cc;\r\n+    }\r\n+\r\n+    private void useRegistryAsMetadataCenterIfNecessary() {\r\n+\r\n+        Collection<MetadataReportConfig> metadataConfigs = configManager.getMetadataConfigs();\r\n+\r\n+        if (CollectionUtils.isNotEmpty(metadataConfigs)) {\r\n+            return;\r\n+        }\r\n+\r\n+        configManager\r\n+                .getDefaultRegistries()\r\n+                .stream()\r\n+                .filter(this::isUsedRegistryAsMetadataCenter)\r\n+                .map(this::registryAsMetadataCenter)\r\n+                .forEach(configManager::addMetadataReport);\r\n+\r\n+    }\r\n+\r\n+    private boolean isUsedRegistryAsMetadataCenter(RegistryConfig registryConfig) {\r\n+        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsMetadataCenter, \"metadata\",\r\n+                MetadataReportFactory.class);\r\n+    }\r\n+\r\n+    /**\r\n+     * Is used the specified registry as a center infrastructure\r\n+     *\r\n+     * @param registryConfig       the {@link RegistryConfig}\r\n+     * @param usedRegistryAsCenter the configured value on\r\n+     * @param centerType           the type name of center\r\n+     * @param extensionClass       an extension class of a center infrastructure\r\n+     * @return\r\n+     * @since 2.7.8\r\n+     */\r\n+    private boolean isUsedRegistryAsCenter(RegistryConfig registryConfig, Supplier<Boolean> usedRegistryAsCenter,\r\n+                                           String centerType,\r\n+                                           Class<?> extensionClass) {\r\n+        final boolean supported;\r\n+\r\n+        Boolean configuredValue = usedRegistryAsCenter.get();\r\n+        if (configuredValue != null) { // If configured, take its value.\r\n+            supported = configuredValue.booleanValue();\r\n+        } else {                       // Or check the extension existence\r\n+            String protocol = registryConfig.getProtocol();\r\n+            supported = supportsExtension(extensionClass, protocol);\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"No value is configured in the registry, the %s extension[name : %s] %s as the %s center\"\r\n+                        , extensionClass.getSimpleName(), protocol, supported ? \"supports\" : \"does not support\", centerType));\r\n+            }\r\n+        }\r\n+\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(format(\"The registry[%s] will be %s as the %s center\", registryConfig,\r\n+                    supported ? \"used\" : \"not used\", centerType));\r\n+        }\r\n+        return supported;\r\n+    }\r\n+\r\n+    /**\r\n+     * Supports the extension with the specified class and name\r\n+     *\r\n+     * @param extensionClass the {@link Class} of extension\r\n+     * @param name           the name of extension\r\n+     * @return if supports, return <code>true</code>, or <code>false</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    private boolean supportsExtension(Class<?> extensionClass, String name) {\r\n+        if (isNotEmpty(name)) {\r\n+            ExtensionLoader extensionLoader = getExtensionLoader(extensionClass);\r\n+            return extensionLoader.hasExtension(name);\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    private MetadataReportConfig registryAsMetadataCenter(RegistryConfig registryConfig) {\r\n+        String protocol = registryConfig.getProtocol();\r\n+        Integer port = registryConfig.getPort();\r\n+        String id = \"metadata-center-\" + protocol + \"-\" + port;\r\n+        MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\r\n+        metadataReportConfig.setId(id);\r\n+        if (metadataReportConfig.getParameters() == null) {\r\n+            metadataReportConfig.setParameters(new HashMap<>());\r\n+        }\r\n+        if (registryConfig.getParameters() != null) {\r\n+            metadataReportConfig.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\r\n+        }\r\n+        metadataReportConfig.getParameters().put(CLIENT_KEY, registryConfig.getClient());\r\n+        metadataReportConfig.setGroup(registryConfig.getGroup());\r\n+        metadataReportConfig.setAddress(getRegistryCompatibleAddress(registryConfig));\r\n+        metadataReportConfig.setUsername(registryConfig.getUsername());\r\n+        metadataReportConfig.setPassword(registryConfig.getPassword());\r\n+        metadataReportConfig.setTimeout(registryConfig.getTimeout());\r\n+        return metadataReportConfig;\r\n+    }\r\n+\r\n+    private String getRegistryCompatibleAddress(RegistryConfig registryConfig) {\r\n+        String registryAddress = registryConfig.getAddress();\r\n+        String[] addresses = REGISTRY_SPLIT_PATTERN.split(registryAddress);\r\n+        if (ArrayUtils.isEmpty(addresses)) {\r\n+            throw new IllegalStateException(\"Invalid registry address found.\");\r\n+        }\r\n+        String address = addresses[0];\r\n+        // since 2.7.8\r\n+        // Issue : https://github.com/apache/dubbo/issues/6476\r\n+        StringBuilder metadataAddressBuilder = new StringBuilder();\r\n+        URL url = URL.valueOf(address);\r\n+        String protocolFromAddress = url.getProtocol();\r\n+        if (isEmpty(protocolFromAddress)) {\r\n+            // If the protocol from address is missing, is like :\r\n+            // \"dubbo.registry.address = 127.0.0.1:2181\"\r\n+            String protocolFromConfig = registryConfig.getProtocol();\r\n+            metadataAddressBuilder.append(protocolFromConfig).append(\"://\");\r\n+        }\r\n+        metadataAddressBuilder.append(address);\r\n+        return metadataAddressBuilder.toString();\r\n+    }\r\n+\r\n+    private void loadRemoteConfigs() {\r\n+        // registry ids to registry configs\r\n+        List<RegistryConfig> tmpRegistries = new ArrayList<>();\r\n+        Set<String> registryIds = configManager.getRegistryIds();\r\n+        registryIds.forEach(id -> {\r\n+            if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {\r\n+                tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> {\r\n+                    RegistryConfig registryConfig = new RegistryConfig();\r\n+                    registryConfig.setId(id);\r\n+                    registryConfig.refresh();\r\n+                    return registryConfig;\r\n+                }));\r\n+            }\r\n+        });\r\n+\r\n+        configManager.addRegistries(tmpRegistries);\r\n+\r\n+        // protocol ids to protocol configs\r\n+        List<ProtocolConfig> tmpProtocols = new ArrayList<>();\r\n+        Set<String> protocolIds = configManager.getProtocolIds();\r\n+        protocolIds.forEach(id -> {\r\n+            if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {\r\n+                tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> {\r\n+                    ProtocolConfig protocolConfig = new ProtocolConfig();\r\n+                    protocolConfig.setId(id);\r\n+                    protocolConfig.refresh();\r\n+                    return protocolConfig;\r\n+                }));\r\n+            }\r\n+        });\r\n+\r\n+        configManager.addProtocols(tmpProtocols);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension\r\n+     */\r\n+    private void initMetadataService() {\r\n+        this.metadataService = getDefaultExtension();\r\n+        this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(metadataService);\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize {@link EventListener}\r\n+     */\r\n+    private void initEventListener() {\r\n+        // Add current instance into listeners\r\n+        addEventListener(this);\r\n+    }\r\n+\r\n+    /**\r\n+     * Start the bootstrap\r\n+     */\r\n+    public DubboBootstrap start() {\r\n+        if (started.compareAndSet(false, true)) {\r\n+            ready.set(false);\r\n+            initialize();\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(NAME + \" is starting...\");\r\n+            }\r\n+            // 1. export Dubbo Services\r\n+            exportServices();\r\n+\r\n+            // Not only provider register\r\n+            if (!isOnlyRegisterProvider() || hasExportedServices()) {\r\n+                // 2. export MetadataService\r\n+                exportMetadataService();\r\n+                //3. Register the local ServiceInstance if required\r\n+                registerServiceInstance();\r\n+            }\r\n+\r\n+            referServices();\r\n+            if (asyncExportingFutures.size() > 0) {\r\n+                new Thread(() -> {\r\n+                    try {\r\n+                        this.awaitFinish();\r\n+                    } catch (Exception e) {\r\n+                        logger.warn(NAME + \" exportAsync occurred an exception.\");\r\n+                    }\r\n+                    ready.set(true);\r\n+                    if (logger.isInfoEnabled()) {\r\n+                        logger.info(NAME + \" is ready.\");\r\n+                    }\r\n+                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\r\n+                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\r\n+                }).start();\r\n+            } else {\r\n+                ready.set(true);\r\n+                if (logger.isInfoEnabled()) {\r\n+                    logger.info(NAME + \" is ready.\");\r\n+                }\r\n+                ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\r\n+                exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\r\n+            }\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(NAME + \" has started.\");\r\n+            }\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    private boolean hasExportedServices() {\r\n+        return !metadataService.getExportedURLs().isEmpty();\r\n+    }\r\n+\r\n+    /**\r\n+     * Block current thread to be await.\r\n+     *\r\n+     * @return {@link DubboBootstrap}\r\n+     */\r\n+    public DubboBootstrap await() {\r\n+        // if has been waited, no need to wait again, return immediately\r\n+        if (!awaited.get()) {\r\n+            if (!executorService.isShutdown()) {\r\n+                executeMutually(() -> {\r\n+                    while (!awaited.get()) {\r\n+                        if (logger.isInfoEnabled()) {\r\n+                            logger.info(NAME + \" awaiting ...\");\r\n+                        }\r\n+                        try {\r\n+                            condition.await();\r\n+                        } catch (InterruptedException e) {\r\n+                            Thread.currentThread().interrupt();\r\n+                        }\r\n+                    }\r\n+                });\r\n+            }\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap awaitFinish() throws Exception {\r\n+        logger.info(NAME + \" waiting services exporting / referring ...\");\r\n+        if (exportAsync && asyncExportingFutures.size() > 0) {\r\n+            CompletableFuture future = CompletableFuture.allOf(asyncExportingFutures.toArray(new CompletableFuture[0]));\r\n+            future.get();\r\n+        }\r\n+        if (referAsync && asyncReferringFutures.size() > 0) {\r\n+            CompletableFuture future = CompletableFuture.allOf(asyncReferringFutures.toArray(new CompletableFuture[0]));\r\n+            future.get();\r\n+        }\r\n+\r\n+        logger.info(\"Service export / refer finished.\");\r\n+        return this;\r\n+    }\r\n+\r\n+    public boolean isInitialized() {\r\n+        return initialized.get();\r\n+    }\r\n+\r\n+    public boolean isStarted() {\r\n+        return started.get();\r\n+    }\r\n+\r\n+    public boolean isReady() {\r\n+        return ready.get();\r\n+    }\r\n+\r\n+\r\n+    public DubboBootstrap stop() throws IllegalStateException {\r\n+        destroy();\r\n+        return this;\r\n+    }\r\n+    /* serve for builder apis, begin */\r\n+\r\n+    private ApplicationBuilder createApplicationBuilder(String name) {\r\n+        return new ApplicationBuilder().name(name);\r\n+    }\r\n+\r\n+    private RegistryBuilder createRegistryBuilder(String id) {\r\n+        return new RegistryBuilder().id(id);\r\n+    }\r\n+\r\n+    private ProtocolBuilder createProtocolBuilder(String id) {\r\n+        return new ProtocolBuilder().id(id);\r\n+    }\r\n+\r\n+    private ServiceBuilder createServiceBuilder(String id) {\r\n+        return new ServiceBuilder().id(id);\r\n+    }\r\n+\r\n+    private ReferenceBuilder createReferenceBuilder(String id) {\r\n+        return new ReferenceBuilder().id(id);\r\n+    }\r\n+\r\n+    private ProviderBuilder createProviderBuilder(String id) {\r\n+        return new ProviderBuilder().id(id);\r\n+    }\r\n+\r\n+    private ConsumerBuilder createConsumerBuilder(String id) {\r\n+        return new ConsumerBuilder().id(id);\r\n+    }\r\n+    /* serve for builder apis, end */\r\n+\r\n+    private DynamicConfiguration prepareEnvironment(ConfigCenterConfig configCenter) {\r\n+        if (configCenter.isValid()) {\r\n+            if (!configCenter.checkOrUpdateInited()) {\r\n+                return null;\r\n+            }\r\n+            DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl());\r\n+            String configContent = dynamicConfiguration.getProperties(configCenter.getConfigFile(), configCenter.getGroup());\r\n+\r\n+            String appGroup = getApplication().getName();\r\n+            String appConfigContent = null;\r\n+            if (isNotEmpty(appGroup)) {\r\n+                appConfigContent = dynamicConfiguration.getProperties\r\n+                        (isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(),\r\n+                                appGroup\r\n+                        );\r\n+            }\r\n+            try {\r\n+                environment.setConfigCenterFirst(configCenter.isHighestPriority());\r\n+                environment.updateExternalConfigurationMap(parseProperties(configContent));\r\n+                environment.updateAppExternalConfigurationMap(parseProperties(appConfigContent));\r\n+            } catch (IOException e) {\r\n+                throw new IllegalStateException(\"Failed to parse configurations from Config Center.\", e);\r\n+            }\r\n+            return dynamicConfiguration;\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link EventListener}\r\n+     *\r\n+     * @param listener {@link EventListener}\r\n+     * @return {@link DubboBootstrap}\r\n+     */\r\n+    public DubboBootstrap addEventListener(EventListener<?> listener) {\r\n+        eventDispatcher.addEventListener(listener);\r\n+        return this;\r\n+    }\r\n+\r\n+    /**\r\n+     * export {@link MetadataService}\r\n+     */\r\n+    private void exportMetadataService() {\r\n+        metadataServiceExporter.export();\r\n+    }\r\n+\r\n+    private void unexportMetadataService() {\r\n+        if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {\r\n+            metadataServiceExporter.unexport();\r\n+        }\r\n+    }\r\n+\r\n+    private void exportServices() {\r\n+        configManager.getServices().forEach(sc -> {\r\n+            // TODO, compatible with ServiceConfig.export()\r\n+            ServiceConfig serviceConfig = (ServiceConfig) sc;\r\n+            serviceConfig.setBootstrap(this);\r\n+\r\n+            if (exportAsync) {\r\n+                ExecutorService executor = executorRepository.getServiceExporterExecutor();\r\n+                Future<?> future = executor.submit(() -> {\r\n+                    sc.export();\r\n+                    exportedServices.add(sc);\r\n+                });\r\n+                asyncExportingFutures.add(future);\r\n+            } else {\r\n+                sc.export();\r\n+                exportedServices.add(sc);\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void unexportServices() {\r\n+        exportedServices.forEach(sc -> {\r\n+            configManager.removeConfig(sc);\r\n+            sc.unexport();\r\n+        });\r\n+\r\n+        asyncExportingFutures.forEach(future -> {\r\n+            if (!future.isDone()) {\r\n+                future.cancel(true);\r\n+            }\r\n+        });\r\n+        asyncExportingFutures.clear();\r\n+        exportedServices.clear();\r\n+    }\r\n+\r\n+    private void referServices() {\r\n+        if (cache == null) {\r\n+            cache = ReferenceConfigCache.getCache();\r\n+        }\r\n+\r\n+        configManager.getReferences().forEach(rc -> {\r\n+            // TODO, compatible with  ReferenceConfig.refer()\r\n+            ReferenceConfig referenceConfig = (ReferenceConfig) rc;\r\n+            referenceConfig.setBootstrap(this);\r\n+\r\n+            if (rc.shouldInit()) {\r\n+                if (referAsync) {\r\n+                    CompletableFuture<Object> future = ScheduledCompletableFuture.submit(\r\n+                            executorRepository.getServiceExporterExecutor(),\r\n+                            () -> cache.get(rc)\r\n+                    );\r\n+                    asyncReferringFutures.add(future);\r\n+                } else {\r\n+                    cache.get(rc);\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void unreferServices() {\r\n+        if (cache == null) {\r\n+            cache = ReferenceConfigCache.getCache();\r\n+        }\r\n+\r\n+        asyncReferringFutures.forEach(future -> {\r\n+            if (!future.isDone()) {\r\n+                future.cancel(true);\r\n+            }\r\n+        });\r\n+        asyncReferringFutures.clear();\r\n+        cache.destroyAll();\r\n+    }\r\n+\r\n+    private void registerServiceInstance() {\r\n+        if (CollectionUtils.isEmpty(getServiceDiscoveries())) {\r\n+            return;\r\n+        }\r\n+\r\n+        ApplicationConfig application = getApplication();\r\n+\r\n+        String serviceName = application.getName();\r\n+\r\n+        URL exportedURL = selectMetadataServiceExportedURL();\r\n+\r\n+        String host = exportedURL.getHost();\r\n+\r\n+        int port = exportedURL.getPort();\r\n+\r\n+        ServiceInstance serviceInstance = createServiceInstance(serviceName, host, port);\r\n+\r\n+        doRegisterServiceInstance(serviceInstance);\r\n+\r\n+        // scheduled task for updating Metadata and ServiceInstance\r\n+        executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {\r\n+            try {\r\n+                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\r\n+                localMetadataService.blockUntilUpdated();\r\n+                ServiceInstanceMetadataUtils.refreshMetadataAndInstance();\r\n+            } catch (Throwable e) {\r\n+                logger.error(\"refresh metadata and instance failed\", e);\r\n+            }\r\n+        }, 0, ConfigurationUtils.get(METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    private void doRegisterServiceInstance(ServiceInstance serviceInstance) {\r\n+        //FIXME\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Start publishing metadata to remote center, this only makes sense for applications enabled remote metadata center.\");\r\n+        }\r\n+        publishMetadataToRemote(serviceInstance);\r\n+\r\n+        logger.info(\"Start registering instance address to registry.\");\r\n+        getServiceDiscoveries().forEach(serviceDiscovery ->\r\n+        {\r\n+            calInstanceRevision(serviceDiscovery, serviceInstance);\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.info(\"Start registering instance address to registry\" + serviceDiscovery.getUrl() + \", instance \" + serviceInstance);\r\n+            }\r\n+            // register metadata\r\n+            serviceDiscovery.register(serviceInstance);\r\n+        });\r\n+    }\r\n+\r\n+    private void publishMetadataToRemote(ServiceInstance serviceInstance) {\r\n+//        InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService)WritableMetadataService.getDefaultExtension();\r\n+//        localMetadataService.blockUntilUpdated();\r\n+        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\r\n+        remoteMetadataService.publishMetadata(serviceInstance.getServiceName());\r\n+    }\r\n+\r\n+    private URL selectMetadataServiceExportedURL() {\r\n+\r\n+        URL selectedURL = null;\r\n+\r\n+        SortedSet<String> urlValues = metadataService.getExportedURLs();\r\n+\r\n+        for (String urlValue : urlValues) {\r\n+            URL url = URL.valueOf(urlValue);\r\n+            if (MetadataService.class.getName().equals(url.getServiceInterface())) {\r\n+                continue;\r\n+            }\r\n+            if (\"rest\".equals(url.getProtocol())) { // REST first\r\n+                selectedURL = url;\r\n+                break;\r\n+            } else {\r\n+                selectedURL = url; // If not found, take any one\r\n+            }\r\n+        }\r\n+\r\n+        if (selectedURL == null && CollectionUtils.isNotEmpty(urlValues)) {\r\n+            selectedURL = URL.valueOf(urlValues.iterator().next());\r\n+        }\r\n+\r\n+        return selectedURL;\r\n+    }\r\n+\r\n+    private void unregisterServiceInstance() {\r\n+        if (serviceInstance != null) {\r\n+            getServiceDiscoveries().forEach(serviceDiscovery -> {\r\n+                serviceDiscovery.unregister(serviceInstance);\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    private ServiceInstance createServiceInstance(String serviceName, String host, int port) {\r\n+        this.serviceInstance = new DefaultServiceInstance(serviceName, host, port);\r\n+        setMetadataStorageType(serviceInstance, getMetadataType());\r\n+\r\n+        ExtensionLoader<ServiceInstanceCustomizer> loader =\r\n+                ExtensionLoader.getExtensionLoader(ServiceInstanceCustomizer.class);\r\n+        // FIXME, sort customizer before apply\r\n+        loader.getSupportedExtensionInstances().forEach(customizer -> {\r\n+            // customizes\r\n+            customizer.customize(this.serviceInstance);\r\n+        });\r\n+\r\n+        return this.serviceInstance;\r\n+    }\r\n+\r\n+    public void destroy() {\r\n+        if (destroyLock.tryLock()) {\r\n+            try {\r\n+                DubboShutdownHook.destroyAll();\r\n+\r\n+                if (started.compareAndSet(true, false)\r\n+                        && destroyed.compareAndSet(false, true)) {\r\n+\r\n+                    unregisterServiceInstance();\r\n+                    unexportMetadataService();\r\n+                    unexportServices();\r\n+                    unreferServices();\r\n+\r\n+                    destroyRegistries();\r\n+\r\n+                    destroyServiceDiscoveries();\r\n+                    destroyExecutorRepository();\r\n+                    clear();\r\n+                    shutdown();\r\n+                    release();\r\n+                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\r\n+                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStop(this));\r\n+                }\r\n+            } finally {\r\n+                destroyLock.unlock();\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void destroyExecutorRepository() {\r\n+        ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension().destroyAll();\r\n+    }\r\n+\r\n+    private void destroyRegistries() {\r\n+        AbstractRegistryFactory.destroyAll();\r\n+    }\r\n+\r\n+    private void destroyServiceDiscoveries() {\r\n+        getServiceDiscoveries().forEach(serviceDiscovery -> {\r\n+            execute(serviceDiscovery::destroy);\r\n+        });\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(NAME + \"'s all ServiceDiscoveries have been destroyed.\");\r\n+        }\r\n+    }\r\n+\r\n+    private void clear() {\r\n+        clearConfigs();\r\n+        clearApplicationModel();\r\n+    }\r\n+\r\n+    private void clearApplicationModel() {\r\n+\r\n+    }\r\n+\r\n+    private void clearConfigs() {\r\n+        configManager.destroy();\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(NAME + \"'s configs have been clear.\");\r\n+        }\r\n+    }\r\n+\r\n+    private void release() {\r\n+        executeMutually(() -> {\r\n+            while (awaited.compareAndSet(false, true)) {\r\n+                if (logger.isInfoEnabled()) {\r\n+                    logger.info(NAME + \" is about to shutdown...\");\r\n+                }\r\n+                condition.signalAll();\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void shutdown() {\r\n+        if (!executorService.isShutdown()) {\r\n+            // Shutdown executorService\r\n+            executorService.shutdown();\r\n+        }\r\n+    }\r\n+\r\n+    private void executeMutually(Runnable runnable) {\r\n+        try {\r\n+            lock.lock();\r\n+            runnable.run();\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+    }\r\n+\r\n+    public ApplicationConfig getApplication() {\r\n+        ApplicationConfig application = configManager\r\n+                .getApplication()\r\n+                .orElseGet(() -> {\r\n+                    ApplicationConfig applicationConfig = new ApplicationConfig();\r\n+                    configManager.setApplication(applicationConfig);\r\n+                    return applicationConfig;\r\n+                });\r\n+\r\n+        application.refresh();\r\n+        return application;\r\n+    }\r\n+\r\n+    private MonitorConfig getMonitor() {\r\n+        MonitorConfig monitor = configManager\r\n+                .getMonitor()\r\n+                .orElseGet(() -> {\r\n+                    MonitorConfig monitorConfig = new MonitorConfig();\r\n+                    configManager.setMonitor(monitorConfig);\r\n+                    return monitorConfig;\r\n+                });\r\n+\r\n+        monitor.refresh();\r\n+        return monitor;\r\n+    }\r\n+\r\n+    private MetricsConfig getMetrics() {\r\n+        MetricsConfig metrics = configManager\r\n+                .getMetrics()\r\n+                .orElseGet(() -> {\r\n+                    MetricsConfig metricsConfig = new MetricsConfig();\r\n+                    configManager.setMetrics(metricsConfig);\r\n+                    return metricsConfig;\r\n+                });\r\n+        metrics.refresh();\r\n+        return metrics;\r\n+    }\r\n+\r\n+    private ModuleConfig getModule() {\r\n+        ModuleConfig module = configManager\r\n+                .getModule()\r\n+                .orElseGet(() -> {\r\n+                    ModuleConfig moduleConfig = new ModuleConfig();\r\n+                    configManager.setModule(moduleConfig);\r\n+                    return moduleConfig;\r\n+                });\r\n+\r\n+        module.refresh();\r\n+        return module;\r\n+    }\r\n+\r\n+    private SslConfig getSsl() {\r\n+        SslConfig ssl = configManager\r\n+                .getSsl()\r\n+                .orElseGet(() -> {\r\n+                    SslConfig sslConfig = new SslConfig();\r\n+                    configManager.setSsl(sslConfig);\r\n+                    return sslConfig;\r\n+                });\r\n+\r\n+        ssl.refresh();\r\n+        return ssl;\r\n+    }\r\n+\r\n+    public void setReady(boolean ready) {\r\n+        this.ready.set(ready);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java", "source2": "org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.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-\n-package org.apache.dubbo.config.bootstrap;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-/**\n- * call on DubboBootstrap start or stop.\n- *\n- * @scene 2.7.9\n- * @see DubboBootstrap\n- */\n-@SPI\n-public interface DubboBootstrapStartStopListener {\n-\n-    void onStart(DubboBootstrap bootstrap);\n-\n-    void onStop(DubboBootstrap bootstrap);\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.bootstrap;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+/**\r\n+ * call on DubboBootstrap start or stop.\r\n+ *\r\n+ * @scene 2.7.9\r\n+ * @see DubboBootstrap\r\n+ */\r\n+@SPI\r\n+public interface DubboBootstrapStartStopListener {\r\n+\r\n+    void onStart(DubboBootstrap bootstrap);\r\n+\r\n+    void onStop(DubboBootstrap bootstrap);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.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.config.bootstrap.builders;\n-\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- * AbstractBuilder\n- *\n- * @param <C> The type of {@link AbstractConfig Config}\n- * @param <B> The type of {@link AbstractBuilder Builder}\n- * @since 2.7\n- */\n-public abstract class AbstractBuilder<C extends AbstractConfig, B extends AbstractBuilder> {\n-    /**\n-     * The config id\n-     */\n-    protected String id;\n-    protected String prefix;\n-\n-    public B id(String id) {\n-        this.id = id;\n-        return getThis();\n-    }\n-\n-    protected B prefix(String prefix) {\n-        this.prefix = prefix;\n-        return getThis();\n-    }\n-\n-    protected abstract B getThis();\n-\n-    protected static Map<String, String> appendParameter(Map<String, String> parameters, String key, String value) {\n-        if (parameters == null) {\n-            parameters = new HashMap<>();\n-        }\n-        parameters.put(key, value);\n-        return parameters;\n-    }\n-\n-    protected static Map<String, String> appendParameters(Map<String, String> parameters, Map<String, String> appendParameters) {\n-        if (parameters == null) {\n-            parameters = new HashMap<>();\n-        }\n-        parameters.putAll(appendParameters);\n-        return parameters;\n-    }\n-\n-    protected void build(C instance) {\n-        if (!StringUtils.isEmpty(id)) {\n-            instance.setId(id);\n-        }\n-        if (!StringUtils.isEmpty(prefix)) {\n-            instance.setPrefix(prefix);\n-        }\n-    }\n-\n-    /**\n-     * Build an instance of {@link AbstractConfig config}\n-     *\n-     * @return an instance of {@link AbstractConfig config}\n-     */\n-    public abstract C build();\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.bootstrap.builders;\r\n+\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+ * AbstractBuilder\r\n+ *\r\n+ * @param <C> The type of {@link AbstractConfig Config}\r\n+ * @param <B> The type of {@link AbstractBuilder Builder}\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractBuilder<C extends AbstractConfig, B extends AbstractBuilder> {\r\n+    /**\r\n+     * The config id\r\n+     */\r\n+    protected String id;\r\n+    protected String prefix;\r\n+\r\n+    public B id(String id) {\r\n+        this.id = id;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    protected B prefix(String prefix) {\r\n+        this.prefix = prefix;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    protected abstract B getThis();\r\n+\r\n+    protected static Map<String, String> appendParameter(Map<String, String> parameters, String key, String value) {\r\n+        if (parameters == null) {\r\n+            parameters = new HashMap<>();\r\n+        }\r\n+        parameters.put(key, value);\r\n+        return parameters;\r\n+    }\r\n+\r\n+    protected static Map<String, String> appendParameters(Map<String, String> parameters, Map<String, String> appendParameters) {\r\n+        if (parameters == null) {\r\n+            parameters = new HashMap<>();\r\n+        }\r\n+        parameters.putAll(appendParameters);\r\n+        return parameters;\r\n+    }\r\n+\r\n+    protected void build(C instance) {\r\n+        if (!StringUtils.isEmpty(id)) {\r\n+            instance.setId(id);\r\n+        }\r\n+        if (!StringUtils.isEmpty(prefix)) {\r\n+            instance.setPrefix(prefix);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Build an instance of {@link AbstractConfig config}\r\n+     *\r\n+     * @return an instance of {@link AbstractConfig config}\r\n+     */\r\n+    public abstract C build();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,345 +1,345 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractInterfaceConfig;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-import org.apache.dubbo.config.MetadataReportConfig;\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.rpc.Filter;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractInterfaceBuilder<T extends AbstractInterfaceConfig, B extends AbstractInterfaceBuilder<T, B>>\n-        extends AbstractMethodBuilder<T, B> {\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 {@link 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-     * Registry centers\n-     */\n-    protected List<RegistryConfig> registries;\n-\n-    protected String registryIds;\n-\n-    // connection events\n-    protected String onconnect;\n-\n-    /**\n-     * Disconnection events\n-     */\n-    protected String ondisconnect;\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-    private String tag;\n-\n-    /**\n-     * @param local\n-     * @see AbstractInterfaceBuilder#stub(String)\n-     * @deprecated Replace to <code>stub(String)</code>\n-     */\n-    @Deprecated\n-    public B local(String local) {\n-        this.local = local;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param local\n-     * @see AbstractInterfaceBuilder#stub(Boolean)\n-     * @deprecated Replace to <code>stub(Boolean)</code>\n-     */\n-    @Deprecated\n-    public B local(Boolean local) {\n-        if (local != null) {\n-            this.local = local.toString();\n-        } else {\n-            this.local = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B stub(String stub) {\n-        this.stub = stub;\n-        return getThis();\n-    }\n-\n-    public B stub(Boolean stub) {\n-        if (stub != null) {\n-            this.stub = stub.toString();\n-        } else {\n-            this.stub = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B monitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        return getThis();\n-    }\n-\n-    public B monitor(String monitor) {\n-        this.monitor = new MonitorConfig(monitor);\n-        return getThis();\n-    }\n-\n-    public B proxy(String proxy) {\n-        this.proxy = proxy;\n-        return getThis();\n-    }\n-\n-    public B cluster(String cluster) {\n-        this.cluster = cluster;\n-        return getThis();\n-    }\n-\n-    public B filter(String filter) {\n-        this.filter = filter;\n-        return getThis();\n-    }\n-\n-    public B listener(String listener) {\n-        this.listener = listener;\n-        return getThis();\n-    }\n-\n-    public B owner(String owner) {\n-        this.owner = owner;\n-        return getThis();\n-    }\n-\n-    public B connections(Integer connections) {\n-        this.connections = connections;\n-        return getThis();\n-    }\n-\n-    public B layer(String layer) {\n-        this.layer = layer;\n-        return getThis();\n-    }\n-\n-    public B application(ApplicationConfig application) {\n-        this.application = application;\n-        return getThis();\n-    }\n-\n-    public B module(ModuleConfig module) {\n-        this.module = module;\n-        return getThis();\n-    }\n-\n-    public B addRegistries(List<RegistryConfig> registries) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.addAll(registries);\n-        return getThis();\n-    }\n-\n-    public B addRegistry(RegistryConfig registry) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.add(registry);\n-        return getThis();\n-    }\n-\n-    public B registryIds(String registryIds) {\n-        this.registryIds = registryIds;\n-        return getThis();\n-    }\n-\n-    public B onconnect(String onconnect) {\n-        this.onconnect = onconnect;\n-        return getThis();\n-    }\n-\n-    public B ondisconnect(String ondisconnect) {\n-        this.ondisconnect = ondisconnect;\n-        return getThis();\n-    }\n-\n-    public B metadataReportConfig(MetadataReportConfig metadataReportConfig) {\n-        this.metadataReportConfig = metadataReportConfig;\n-        return getThis();\n-    }\n-\n-    public B configCenter(ConfigCenterConfig configCenter) {\n-        this.configCenter = configCenter;\n-        return getThis();\n-    }\n-\n-    public B callbacks(Integer callbacks) {\n-        this.callbacks = callbacks;\n-        return getThis();\n-    }\n-\n-    public B scope(String scope) {\n-        this.scope = scope;\n-        return getThis();\n-    }\n-\n-    public B tag(String tag) {\n-        this.tag = tag;\n-        return getThis();\n-    }\n-\n-    @Override\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (!StringUtils.isEmpty(local)) {\n-            instance.setLocal(local);\n-        }\n-        if (!StringUtils.isEmpty(stub)) {\n-            instance.setStub(stub);\n-        }\n-        if (monitor != null) {\n-            instance.setMonitor(monitor);\n-        }\n-        if (!StringUtils.isEmpty(proxy)) {\n-            instance.setProxy(proxy);\n-        }\n-        if (!StringUtils.isEmpty(cluster)) {\n-            instance.setCluster(cluster);\n-        }\n-        if (!StringUtils.isEmpty(filter)) {\n-            instance.setFilter(filter);\n-        }\n-        if (!StringUtils.isEmpty(listener)) {\n-            instance.setListener(listener);\n-        }\n-        if (!StringUtils.isEmpty(owner)) {\n-            instance.setOwner(owner);\n-        }\n-        if (connections != null) {\n-            instance.setConnections(connections);\n-        }\n-        if (!StringUtils.isEmpty(layer)) {\n-            instance.setLayer(layer);\n-        }\n-        if (application != null) {\n-            instance.setApplication(application);\n-        }\n-        if (module != null) {\n-            instance.setModule(module);\n-        }\n-        if (registries != null) {\n-            instance.setRegistries(registries);\n-        }\n-        if (!StringUtils.isEmpty(registryIds)) {\n-            instance.setRegistryIds(registryIds);\n-        }\n-        if (!StringUtils.isEmpty(onconnect)) {\n-            instance.setOnconnect(onconnect);\n-        }\n-        if (!StringUtils.isEmpty(ondisconnect)) {\n-            instance.setOndisconnect(ondisconnect);\n-        }\n-        if (metadataReportConfig != null) {\n-            instance.setMetadataReportConfig(metadataReportConfig);\n-        }\n-        if (configCenter != null) {\n-            instance.setConfigCenter(configCenter);\n-        }\n-        if (callbacks != null) {\n-            instance.setCallbacks(callbacks);\n-        }\n-        if (!StringUtils.isEmpty(scope)) {\n-            instance.setScope(scope);\n-        }\n-        if (StringUtils.isNotEmpty(tag)) {\n-            instance.setTag(tag);\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractInterfaceConfig;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.rpc.Filter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractInterfaceBuilder<T extends AbstractInterfaceConfig, B extends AbstractInterfaceBuilder<T, B>>\r\n+        extends AbstractMethodBuilder<T, B> {\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 {@link 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+     * Registry centers\r\n+     */\r\n+    protected List<RegistryConfig> registries;\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+    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+    private String tag;\r\n+\r\n+    /**\r\n+     * @param local\r\n+     * @see AbstractInterfaceBuilder#stub(String)\r\n+     * @deprecated Replace to <code>stub(String)</code>\r\n+     */\r\n+    @Deprecated\r\n+    public B local(String local) {\r\n+        this.local = local;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param local\r\n+     * @see AbstractInterfaceBuilder#stub(Boolean)\r\n+     * @deprecated Replace to <code>stub(Boolean)</code>\r\n+     */\r\n+    @Deprecated\r\n+    public B local(Boolean local) {\r\n+        if (local != null) {\r\n+            this.local = local.toString();\r\n+        } else {\r\n+            this.local = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B stub(String stub) {\r\n+        this.stub = stub;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B stub(Boolean stub) {\r\n+        if (stub != null) {\r\n+            this.stub = stub.toString();\r\n+        } else {\r\n+            this.stub = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B monitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B monitor(String monitor) {\r\n+        this.monitor = new MonitorConfig(monitor);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B proxy(String proxy) {\r\n+        this.proxy = proxy;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B cluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B filter(String filter) {\r\n+        this.filter = filter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B listener(String listener) {\r\n+        this.listener = listener;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B owner(String owner) {\r\n+        this.owner = owner;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B connections(Integer connections) {\r\n+        this.connections = connections;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B layer(String layer) {\r\n+        this.layer = layer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B application(ApplicationConfig application) {\r\n+        this.application = application;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B module(ModuleConfig module) {\r\n+        this.module = module;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addRegistries(List<RegistryConfig> registries) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.addAll(registries);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addRegistry(RegistryConfig registry) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.add(registry);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B registryIds(String registryIds) {\r\n+        this.registryIds = registryIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B onconnect(String onconnect) {\r\n+        this.onconnect = onconnect;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B ondisconnect(String ondisconnect) {\r\n+        this.ondisconnect = ondisconnect;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B metadataReportConfig(MetadataReportConfig metadataReportConfig) {\r\n+        this.metadataReportConfig = metadataReportConfig;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B configCenter(ConfigCenterConfig configCenter) {\r\n+        this.configCenter = configCenter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B callbacks(Integer callbacks) {\r\n+        this.callbacks = callbacks;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B scope(String scope) {\r\n+        this.scope = scope;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B tag(String tag) {\r\n+        this.tag = tag;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (!StringUtils.isEmpty(local)) {\r\n+            instance.setLocal(local);\r\n+        }\r\n+        if (!StringUtils.isEmpty(stub)) {\r\n+            instance.setStub(stub);\r\n+        }\r\n+        if (monitor != null) {\r\n+            instance.setMonitor(monitor);\r\n+        }\r\n+        if (!StringUtils.isEmpty(proxy)) {\r\n+            instance.setProxy(proxy);\r\n+        }\r\n+        if (!StringUtils.isEmpty(cluster)) {\r\n+            instance.setCluster(cluster);\r\n+        }\r\n+        if (!StringUtils.isEmpty(filter)) {\r\n+            instance.setFilter(filter);\r\n+        }\r\n+        if (!StringUtils.isEmpty(listener)) {\r\n+            instance.setListener(listener);\r\n+        }\r\n+        if (!StringUtils.isEmpty(owner)) {\r\n+            instance.setOwner(owner);\r\n+        }\r\n+        if (connections != null) {\r\n+            instance.setConnections(connections);\r\n+        }\r\n+        if (!StringUtils.isEmpty(layer)) {\r\n+            instance.setLayer(layer);\r\n+        }\r\n+        if (application != null) {\r\n+            instance.setApplication(application);\r\n+        }\r\n+        if (module != null) {\r\n+            instance.setModule(module);\r\n+        }\r\n+        if (registries != null) {\r\n+            instance.setRegistries(registries);\r\n+        }\r\n+        if (!StringUtils.isEmpty(registryIds)) {\r\n+            instance.setRegistryIds(registryIds);\r\n+        }\r\n+        if (!StringUtils.isEmpty(onconnect)) {\r\n+            instance.setOnconnect(onconnect);\r\n+        }\r\n+        if (!StringUtils.isEmpty(ondisconnect)) {\r\n+            instance.setOndisconnect(ondisconnect);\r\n+        }\r\n+        if (metadataReportConfig != null) {\r\n+            instance.setMetadataReportConfig(metadataReportConfig);\r\n+        }\r\n+        if (configCenter != null) {\r\n+            instance.setConfigCenter(configCenter);\r\n+        }\r\n+        if (callbacks != null) {\r\n+            instance.setCallbacks(callbacks);\r\n+        }\r\n+        if (!StringUtils.isEmpty(scope)) {\r\n+            instance.setScope(scope);\r\n+        }\r\n+        if (StringUtils.isNotEmpty(tag)) {\r\n+            instance.setTag(tag);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,213 +1,213 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractMethodConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractMethodBuilder<T extends AbstractMethodConfig, B extends AbstractMethodBuilder<T, B>>\n-        extends AbstractBuilder<T, B> {\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-     *\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 B timeout(Integer timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public B retries(Integer retries) {\n-        this.retries = retries;\n-        return getThis();\n-    }\n-\n-    public B actives(Integer actives) {\n-        this.actives = actives;\n-        return getThis();\n-    }\n-\n-    public B loadbalance(String loadbalance) {\n-        this.loadbalance = loadbalance;\n-        return getThis();\n-    }\n-\n-    public B async(Boolean async) {\n-        this.async = async;\n-        return getThis();\n-    }\n-\n-    public B sent(Boolean sent) {\n-        this.sent = sent;\n-        return getThis();\n-    }\n-\n-    public B mock(String mock) {\n-        this.mock = mock;\n-        return getThis();\n-    }\n-\n-    public B mock(Boolean mock) {\n-        if (mock != null) {\n-            this.mock = mock.toString();\n-        } else {\n-            this.mock = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B merger(String merger) {\n-        this.merger = merger;\n-        return getThis();\n-    }\n-\n-    public B cache(String cache) {\n-        this.cache = cache;\n-        return getThis();\n-    }\n-\n-    public B validation(String validation) {\n-        this.validation = validation;\n-        return getThis();\n-    }\n-\n-    public B appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public B appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public B forks(Integer forks) {\n-        this.forks = forks;\n-        return getThis();\n-    }\n-\n-    @Override\n-    @SuppressWarnings(\"unchecked\")\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (actives != null) {\n-            instance.setActives(actives);\n-        }\n-        if (async != null) {\n-            instance.setAsync(async);\n-        }\n-        if (!StringUtils.isEmpty(cache)) {\n-            instance.setCache(cache);\n-        }\n-        if (forks != null) {\n-            instance.setForks(forks);\n-        }\n-        if (!StringUtils.isEmpty(loadbalance)) {\n-            instance.setLoadbalance(loadbalance);\n-        }\n-        if (!StringUtils.isEmpty(merger)) {\n-            instance.setMerger(merger);\n-        }\n-        if(!StringUtils.isEmpty(mock)) {\n-            instance.setMock(mock);\n-        }\n-        if (retries != null) {\n-            instance.setRetries(retries);\n-        }\n-        if (sent != null) {\n-            instance.setSent(sent);\n-        }\n-        if (timeout != null) {\n-            instance.setTimeout(timeout);\n-        }\n-        if (!StringUtils.isEmpty(validation)) {\n-            instance.setValidation(validation);\n-        }\n-        if (parameters != null) {\n-            instance.setParameters(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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractMethodConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractMethodBuilder<T extends AbstractMethodConfig, B extends AbstractMethodBuilder<T, B>>\r\n+        extends AbstractBuilder<T, B> {\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+     *\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 B timeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B retries(Integer retries) {\r\n+        this.retries = retries;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B actives(Integer actives) {\r\n+        this.actives = actives;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B loadbalance(String loadbalance) {\r\n+        this.loadbalance = loadbalance;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B async(Boolean async) {\r\n+        this.async = async;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B sent(Boolean sent) {\r\n+        this.sent = sent;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B mock(String mock) {\r\n+        this.mock = mock;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B mock(Boolean mock) {\r\n+        if (mock != null) {\r\n+            this.mock = mock.toString();\r\n+        } else {\r\n+            this.mock = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B merger(String merger) {\r\n+        this.merger = merger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B cache(String cache) {\r\n+        this.cache = cache;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B validation(String validation) {\r\n+        this.validation = validation;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B forks(Integer forks) {\r\n+        this.forks = forks;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (actives != null) {\r\n+            instance.setActives(actives);\r\n+        }\r\n+        if (async != null) {\r\n+            instance.setAsync(async);\r\n+        }\r\n+        if (!StringUtils.isEmpty(cache)) {\r\n+            instance.setCache(cache);\r\n+        }\r\n+        if (forks != null) {\r\n+            instance.setForks(forks);\r\n+        }\r\n+        if (!StringUtils.isEmpty(loadbalance)) {\r\n+            instance.setLoadbalance(loadbalance);\r\n+        }\r\n+        if (!StringUtils.isEmpty(merger)) {\r\n+            instance.setMerger(merger);\r\n+        }\r\n+        if(!StringUtils.isEmpty(mock)) {\r\n+            instance.setMock(mock);\r\n+        }\r\n+        if (retries != null) {\r\n+            instance.setRetries(retries);\r\n+        }\r\n+        if (sent != null) {\r\n+            instance.setSent(sent);\r\n+        }\r\n+        if (timeout != null) {\r\n+            instance.setTimeout(timeout);\r\n+        }\r\n+        if (!StringUtils.isEmpty(validation)) {\r\n+            instance.setValidation(validation);\r\n+        }\r\n+        if (parameters != null) {\r\n+            instance.setParameters(parameters);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,161 +1,161 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractReferenceConfig;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractReferenceBuilder<T extends AbstractReferenceConfig, B extends AbstractReferenceBuilder<T, B>>\n-        extends AbstractInterfaceBuilder<T, B> {\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;\n-\n-    /**\n-     * The remote service version the customer side will reference\n-     */\n-    protected String version;\n-\n-    /**\n-     * The remote service group the customer side will reference\n-     */\n-    protected String group;\n-\n-    public B check(Boolean check) {\n-        this.check = check;\n-        return getThis();\n-    }\n-\n-    public B init(Boolean init) {\n-        this.init = init;\n-        return getThis();\n-    }\n-\n-    public B generic(String generic) {\n-        this.generic = generic;\n-        return getThis();\n-    }\n-\n-    public B generic(Boolean generic) {\n-        if (generic != null) {\n-            this.generic = generic.toString();\n-        } else {\n-            this.generic = null;\n-        }\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param injvm\n-     * @see AbstractInterfaceBuilder#scope(String)\n-     * @deprecated instead, use the parameter <b>scope</b> to judge if it's in jvm, scope=local\n-     */\n-    @Deprecated\n-    public B injvm(Boolean injvm) {\n-        this.injvm = injvm;\n-        return getThis();\n-    }\n-\n-    public B lazy(Boolean lazy) {\n-        this.lazy = lazy;\n-        return getThis();\n-    }\n-\n-    public B reconnect(String reconnect) {\n-        this.reconnect = reconnect;\n-        return getThis();\n-    }\n-\n-    public B sticky(Boolean sticky) {\n-        this.sticky = sticky;\n-        return getThis();\n-    }\n-\n-    public B version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public B group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    @Override\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (check != null) {\n-            instance.setCheck(check);\n-        }\n-        if (init != null) {\n-            instance.setInit(init);\n-        }\n-        if (!StringUtils.isEmpty(generic)) {\n-            instance.setGeneric(generic);\n-        }\n-        if (injvm != null) {\n-            instance.setInjvm(injvm);\n-        }\n-        if (lazy != null) {\n-            instance.setLazy(lazy);\n-        }\n-        if (!StringUtils.isEmpty(reconnect)) {\n-            instance.setReconnect(reconnect);\n-        }\n-        if (sticky != null) {\n-            instance.setSticky(sticky);\n-        }\n-        if (!StringUtils.isEmpty(version)) {\n-            instance.setVersion(version);\n-        }\n-        if (!StringUtils.isEmpty(group)) {\n-            instance.setGroup(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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractReferenceConfig;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractReferenceBuilder<T extends AbstractReferenceConfig, B extends AbstractReferenceBuilder<T, B>>\r\n+        extends AbstractInterfaceBuilder<T, B> {\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;\r\n+\r\n+    /**\r\n+     * The remote service version the customer side will reference\r\n+     */\r\n+    protected String version;\r\n+\r\n+    /**\r\n+     * The remote service group the customer side will reference\r\n+     */\r\n+    protected String group;\r\n+\r\n+    public B check(Boolean check) {\r\n+        this.check = check;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B init(Boolean init) {\r\n+        this.init = init;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B generic(String generic) {\r\n+        this.generic = generic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B generic(Boolean generic) {\r\n+        if (generic != null) {\r\n+            this.generic = generic.toString();\r\n+        } else {\r\n+            this.generic = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param injvm\r\n+     * @see AbstractInterfaceBuilder#scope(String)\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 B injvm(Boolean injvm) {\r\n+        this.injvm = injvm;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B lazy(Boolean lazy) {\r\n+        this.lazy = lazy;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B reconnect(String reconnect) {\r\n+        this.reconnect = reconnect;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B sticky(Boolean sticky) {\r\n+        this.sticky = sticky;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (check != null) {\r\n+            instance.setCheck(check);\r\n+        }\r\n+        if (init != null) {\r\n+            instance.setInit(init);\r\n+        }\r\n+        if (!StringUtils.isEmpty(generic)) {\r\n+            instance.setGeneric(generic);\r\n+        }\r\n+        if (injvm != null) {\r\n+            instance.setInjvm(injvm);\r\n+        }\r\n+        if (lazy != null) {\r\n+            instance.setLazy(lazy);\r\n+        }\r\n+        if (!StringUtils.isEmpty(reconnect)) {\r\n+            instance.setReconnect(reconnect);\r\n+        }\r\n+        if (sticky != null) {\r\n+            instance.setSticky(sticky);\r\n+        }\r\n+        if (!StringUtils.isEmpty(version)) {\r\n+            instance.setVersion(version);\r\n+        }\r\n+        if (!StringUtils.isEmpty(group)) {\r\n+            instance.setGroup(group);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,272 +1,272 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractServiceConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractServiceBuilder<T extends AbstractServiceConfig, B extends AbstractServiceBuilder<T, B>>\n-        extends AbstractInterfaceBuilder<T, B> {\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;\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, it the value is false, the status will be disabled\n-     * after the service registered,and it needs to be enabled manually; if you want to disable the service, you also need\n-     * manual processing\n-     */\n-    protected Boolean dynamic;\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-     */\n-    protected List<ProtocolConfig> protocols;\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 B version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public B group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public B deprecated(Boolean deprecated) {\n-        this.deprecated = deprecated;\n-        return getThis();\n-    }\n-\n-    public B delay(Integer delay) {\n-        this.delay = delay;\n-        return getThis();\n-    }\n-\n-    public B export(Boolean export) {\n-        this.export = export;\n-        return getThis();\n-    }\n-\n-    public B weight(Integer weight) {\n-        this.weight = weight;\n-        return getThis();\n-    }\n-\n-    public B document(String document) {\n-        this.document = document;\n-        return getThis();\n-    }\n-\n-    public B dynamic(Boolean dynamic) {\n-        this.dynamic = dynamic;\n-        return getThis();\n-    }\n-\n-    public B token(String token) {\n-        this.token = token;\n-        return getThis();\n-    }\n-\n-    public B token(Boolean token) {\n-        if (token != null) {\n-            this.token = token.toString();\n-        } else {\n-            this.token = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B accesslog(String accesslog) {\n-        this.accesslog = accesslog;\n-        return getThis();\n-    }\n-\n-    public B accesslog(Boolean accesslog) {\n-        if (accesslog != null) {\n-            this.accesslog = accesslog.toString();\n-        } else {\n-            this.accesslog = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B addProtocols(List<ProtocolConfig> protocols) {\n-        if (this.protocols == null) {\n-            this.protocols = new ArrayList<>();\n-        }\n-        this.protocols.addAll(protocols);\n-        return getThis();\n-    }\n-\n-    public B addProtocol(ProtocolConfig protocol) {\n-        if (this.protocols == null) {\n-            this.protocols = new ArrayList<>();\n-        }\n-        this.protocols.add(protocol);\n-        return getThis();\n-    }\n-\n-    public B protocolIds(String protocolIds) {\n-        this.protocolIds = protocolIds;\n-        return getThis();\n-    }\n-\n-    public B executes(Integer executes) {\n-        this.executes = executes;\n-        return getThis();\n-    }\n-\n-    public B register(Boolean register) {\n-        this.register = register;\n-        return getThis();\n-    }\n-\n-    public B warmup(Integer warmup) {\n-        this.warmup = warmup;\n-        return getThis();\n-    }\n-\n-    public  B serialization(String serialization) {\n-        this.serialization = serialization;\n-        return getThis();\n-    }\n-\n-    @Override\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (!StringUtils.isEmpty(version)) {\n-            instance.setVersion(version);\n-        }\n-        if (!StringUtils.isEmpty(group)) {\n-            instance.setGroup(group);\n-        }\n-        if (deprecated != null) {\n-            instance.setDeprecated(deprecated);\n-        }\n-        if (delay != null) {\n-            instance.setDelay(delay);\n-        }\n-        if (export != null) {\n-            instance.setExport(export);\n-        }\n-        if (weight != null) {\n-            instance.setWeight(weight);\n-        }\n-        if (!StringUtils.isEmpty(document)) {\n-            instance.setDocument(document);\n-        }\n-        if (dynamic != null) {\n-            instance.setDynamic(dynamic);\n-        }\n-        if (!StringUtils.isEmpty(token)) {\n-            instance.setToken(token);\n-        }\n-        if (!StringUtils.isEmpty(accesslog)) {\n-            instance.setAccesslog(accesslog);\n-        }\n-        if (protocols != null) {\n-            instance.setProtocols(protocols);\n-        }\n-        if (!StringUtils.isEmpty(protocolIds)) {\n-            instance.setProtocolIds(protocolIds);\n-        }\n-        if (executes != null) {\n-            instance.setExecutes(executes);\n-        }\n-        if (register != null) {\n-            instance.setRegister(register);\n-        }\n-        if (warmup != null) {\n-            instance.setWarmup(warmup);\n-        }\n-        if (!StringUtils.isEmpty(serialization)) {\n-            instance.setSerialization(serialization);\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractServiceConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractServiceBuilder<T extends AbstractServiceConfig, B extends AbstractServiceBuilder<T, B>>\r\n+        extends AbstractInterfaceBuilder<T, B> {\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;\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, it the value is false, the status will be disabled\r\n+     * after the service registered,and it needs to be enabled manually; if you want to disable the service, you also need\r\n+     * manual processing\r\n+     */\r\n+    protected Boolean dynamic;\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+     */\r\n+    protected List<ProtocolConfig> protocols;\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 B version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B deprecated(Boolean deprecated) {\r\n+        this.deprecated = deprecated;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B delay(Integer delay) {\r\n+        this.delay = delay;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B export(Boolean export) {\r\n+        this.export = export;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B weight(Integer weight) {\r\n+        this.weight = weight;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B document(String document) {\r\n+        this.document = document;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B dynamic(Boolean dynamic) {\r\n+        this.dynamic = dynamic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B token(String token) {\r\n+        this.token = token;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B token(Boolean token) {\r\n+        if (token != null) {\r\n+            this.token = token.toString();\r\n+        } else {\r\n+            this.token = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B accesslog(String accesslog) {\r\n+        this.accesslog = accesslog;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B accesslog(Boolean accesslog) {\r\n+        if (accesslog != null) {\r\n+            this.accesslog = accesslog.toString();\r\n+        } else {\r\n+            this.accesslog = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addProtocols(List<ProtocolConfig> protocols) {\r\n+        if (this.protocols == null) {\r\n+            this.protocols = new ArrayList<>();\r\n+        }\r\n+        this.protocols.addAll(protocols);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addProtocol(ProtocolConfig protocol) {\r\n+        if (this.protocols == null) {\r\n+            this.protocols = new ArrayList<>();\r\n+        }\r\n+        this.protocols.add(protocol);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B protocolIds(String protocolIds) {\r\n+        this.protocolIds = protocolIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B executes(Integer executes) {\r\n+        this.executes = executes;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B register(Boolean register) {\r\n+        this.register = register;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B warmup(Integer warmup) {\r\n+        this.warmup = warmup;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public  B serialization(String serialization) {\r\n+        this.serialization = serialization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (!StringUtils.isEmpty(version)) {\r\n+            instance.setVersion(version);\r\n+        }\r\n+        if (!StringUtils.isEmpty(group)) {\r\n+            instance.setGroup(group);\r\n+        }\r\n+        if (deprecated != null) {\r\n+            instance.setDeprecated(deprecated);\r\n+        }\r\n+        if (delay != null) {\r\n+            instance.setDelay(delay);\r\n+        }\r\n+        if (export != null) {\r\n+            instance.setExport(export);\r\n+        }\r\n+        if (weight != null) {\r\n+            instance.setWeight(weight);\r\n+        }\r\n+        if (!StringUtils.isEmpty(document)) {\r\n+            instance.setDocument(document);\r\n+        }\r\n+        if (dynamic != null) {\r\n+            instance.setDynamic(dynamic);\r\n+        }\r\n+        if (!StringUtils.isEmpty(token)) {\r\n+            instance.setToken(token);\r\n+        }\r\n+        if (!StringUtils.isEmpty(accesslog)) {\r\n+            instance.setAccesslog(accesslog);\r\n+        }\r\n+        if (protocols != null) {\r\n+            instance.setProtocols(protocols);\r\n+        }\r\n+        if (!StringUtils.isEmpty(protocolIds)) {\r\n+            instance.setProtocolIds(protocolIds);\r\n+        }\r\n+        if (executes != null) {\r\n+            instance.setExecutes(executes);\r\n+        }\r\n+        if (register != null) {\r\n+            instance.setRegister(register);\r\n+        }\r\n+        if (warmup != null) {\r\n+            instance.setWarmup(warmup);\r\n+        }\r\n+        if (!StringUtils.isEmpty(serialization)) {\r\n+            instance.setSerialization(serialization);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,214 +1,214 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;\n-\n-/**\n- * This is a builder for build {@link ApplicationConfig}.\n- * @since 2.7\n- */\n-public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, ApplicationBuilder> {\n-    private String name;\n-    private String metadata;\n-    private String version;\n-    private String owner;\n-    private String organization;\n-    private String architecture;\n-    private String environment = PRODUCTION_ENVIRONMENT;\n-    private String compiler;\n-    private String logger;\n-    private List<RegistryConfig> registries;\n-    private String registryIds;\n-    private MonitorConfig monitor;\n-    private Boolean isDefault;\n-    private String dumpDirectory;\n-    private Boolean qosEnable;\n-    private Integer qosPort;\n-    private Boolean qosAcceptForeignIp;\n-    private Map<String, String> parameters;\n-    private String shutwait;\n-    private Integer metadataServicePort;\n-\n-    public static ApplicationBuilder newBuilder() {\n-        return new ApplicationBuilder();\n-    }\n-\n-    public ApplicationBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder metadata(String metadata) {\n-        this.metadata = metadata;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder owner(String owner) {\n-        this.owner = owner;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder organization(String organization) {\n-        this.organization = organization;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder architecture(String architecture) {\n-        this.architecture = architecture;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder environment(String environment) {\n-        this.environment = environment;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder compiler(String compiler) {\n-        this.compiler = compiler;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder logger(String logger) {\n-        this.logger = logger;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder addRegistry(RegistryConfig registry) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.add(registry);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder addRegistries(List<? extends RegistryConfig> registries) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.addAll(registries);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder registryIds(String registryIds) {\n-        this.registryIds = registryIds;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder monitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder monitor(String monitor) {\n-        this.monitor = new MonitorConfig(monitor);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder dumpDirectory(String dumpDirectory) {\n-        this.dumpDirectory = dumpDirectory;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder qosEnable(Boolean qosEnable) {\n-        this.qosEnable = qosEnable;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder qosPort(Integer qosPort) {\n-        this.qosPort = qosPort;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder qosAcceptForeignIp(Boolean qosAcceptForeignIp) {\n-        this.qosAcceptForeignIp = qosAcceptForeignIp;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder shutwait(String shutwait) {\n-        this.shutwait = shutwait;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder metadataServicePort(Integer metadataServicePort) {\n-        this.metadataServicePort = metadataServicePort;\n-        return getThis();\n-    }\n-\n-    public ApplicationConfig build() {\n-        ApplicationConfig config = new ApplicationConfig();\n-        super.build(config);\n-\n-        config.setName(name);\n-        config.setMetadataType(metadata);\n-        config.setVersion(this.version);\n-        config.setOwner(this.owner);\n-        config.setOrganization(this.organization);\n-        config.setArchitecture(this.architecture);\n-        config.setEnvironment(this.environment);\n-        config.setCompiler(this.compiler);\n-        config.setLogger(this.logger);\n-        config.setRegistries(this.registries);\n-        config.setRegistryIds(this.registryIds);\n-        config.setMonitor(this.monitor);\n-        config.setDefault(this.isDefault);\n-        config.setDumpDirectory(this.dumpDirectory);\n-        config.setQosEnable(this.qosEnable);\n-        config.setQosPort(this.qosPort);\n-        config.setQosAcceptForeignIp(this.qosAcceptForeignIp);\n-        config.setMetadataServicePort(this.metadataServicePort);\n-        config.setParameters(this.parameters);\n-        if (!StringUtils.isEmpty(shutwait)) {\n-            config.setShutwait(shutwait);\n-        }\n-        return config;\n-    }\n-\n-    @Override\n-    protected ApplicationBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ApplicationConfig}.\r\n+ * @since 2.7\r\n+ */\r\n+public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, ApplicationBuilder> {\r\n+    private String name;\r\n+    private String metadata;\r\n+    private String version;\r\n+    private String owner;\r\n+    private String organization;\r\n+    private String architecture;\r\n+    private String environment = PRODUCTION_ENVIRONMENT;\r\n+    private String compiler;\r\n+    private String logger;\r\n+    private List<RegistryConfig> registries;\r\n+    private String registryIds;\r\n+    private MonitorConfig monitor;\r\n+    private Boolean isDefault;\r\n+    private String dumpDirectory;\r\n+    private Boolean qosEnable;\r\n+    private Integer qosPort;\r\n+    private Boolean qosAcceptForeignIp;\r\n+    private Map<String, String> parameters;\r\n+    private String shutwait;\r\n+    private Integer metadataServicePort;\r\n+\r\n+    public static ApplicationBuilder newBuilder() {\r\n+        return new ApplicationBuilder();\r\n+    }\r\n+\r\n+    public ApplicationBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder metadata(String metadata) {\r\n+        this.metadata = metadata;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder owner(String owner) {\r\n+        this.owner = owner;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder organization(String organization) {\r\n+        this.organization = organization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder architecture(String architecture) {\r\n+        this.architecture = architecture;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder environment(String environment) {\r\n+        this.environment = environment;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder compiler(String compiler) {\r\n+        this.compiler = compiler;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder logger(String logger) {\r\n+        this.logger = logger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder addRegistry(RegistryConfig registry) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.add(registry);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder addRegistries(List<? extends RegistryConfig> registries) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.addAll(registries);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder registryIds(String registryIds) {\r\n+        this.registryIds = registryIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder monitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder monitor(String monitor) {\r\n+        this.monitor = new MonitorConfig(monitor);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder dumpDirectory(String dumpDirectory) {\r\n+        this.dumpDirectory = dumpDirectory;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder qosEnable(Boolean qosEnable) {\r\n+        this.qosEnable = qosEnable;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder qosPort(Integer qosPort) {\r\n+        this.qosPort = qosPort;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder qosAcceptForeignIp(Boolean qosAcceptForeignIp) {\r\n+        this.qosAcceptForeignIp = qosAcceptForeignIp;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder shutwait(String shutwait) {\r\n+        this.shutwait = shutwait;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder metadataServicePort(Integer metadataServicePort) {\r\n+        this.metadataServicePort = metadataServicePort;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationConfig build() {\r\n+        ApplicationConfig config = new ApplicationConfig();\r\n+        super.build(config);\r\n+\r\n+        config.setName(name);\r\n+        config.setMetadataType(metadata);\r\n+        config.setVersion(this.version);\r\n+        config.setOwner(this.owner);\r\n+        config.setOrganization(this.organization);\r\n+        config.setArchitecture(this.architecture);\r\n+        config.setEnvironment(this.environment);\r\n+        config.setCompiler(this.compiler);\r\n+        config.setLogger(this.logger);\r\n+        config.setRegistries(this.registries);\r\n+        config.setRegistryIds(this.registryIds);\r\n+        config.setMonitor(this.monitor);\r\n+        config.setDefault(this.isDefault);\r\n+        config.setDumpDirectory(this.dumpDirectory);\r\n+        config.setQosEnable(this.qosEnable);\r\n+        config.setQosPort(this.qosPort);\r\n+        config.setQosAcceptForeignIp(this.qosAcceptForeignIp);\r\n+        config.setMetadataServicePort(this.metadataServicePort);\r\n+        config.setParameters(this.parameters);\r\n+        if (!StringUtils.isEmpty(shutwait)) {\r\n+            config.setShutwait(shutwait);\r\n+        }\r\n+        return config;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ApplicationBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,63 +1,63 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ArgumentConfig;\n-\n-/**\n- * This is a builder for build {@link ArgumentConfig}.\n- * @since 2.7\n- */\n-public class ArgumentBuilder {\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 ArgumentBuilder index(Integer index) {\n-        this.index = index;\n-        return this;\n-    }\n-\n-    public ArgumentBuilder type(String type) {\n-        this.type = type;\n-        return this;\n-    }\n-\n-    public ArgumentBuilder callback(Boolean callback) {\n-        this.callback = callback;\n-        return this;\n-    }\n-\n-    public ArgumentConfig build() {\n-        ArgumentConfig argumentConfig = new ArgumentConfig();\n-        argumentConfig.setIndex(index);\n-        argumentConfig.setType(type);\n-        argumentConfig.setCallback(callback);\n-        return argumentConfig;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ArgumentConfig;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ArgumentConfig}.\r\n+ * @since 2.7\r\n+ */\r\n+public class ArgumentBuilder {\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 ArgumentBuilder index(Integer index) {\r\n+        this.index = index;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ArgumentBuilder type(String type) {\r\n+        this.type = type;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ArgumentBuilder callback(Boolean callback) {\r\n+        this.callback = callback;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ArgumentConfig build() {\r\n+        ArgumentConfig argumentConfig = new ArgumentConfig();\r\n+        argumentConfig.setIndex(index);\r\n+        argumentConfig.setType(type);\r\n+        argumentConfig.setCallback(callback);\r\n+        return argumentConfig;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,141 +1,141 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link ConfigCenterConfig}.\n- *\n- * @since 2.7\n- */\n-public class ConfigCenterBuilder extends AbstractBuilder<ConfigCenterConfig, ConfigCenterBuilder> {\n-\n-    private String protocol;\n-    private String address;\n-    private String cluster;\n-    private String namespace = \"dubbo\";\n-    private String group = \"dubbo\";\n-    private String username;\n-    private String password;\n-    private Long timeout = 3000L;\n-    private Boolean highestPriority = true;\n-    private Boolean check = true;\n-\n-    private String configFile = \"dubbo.properties\";\n-    private String appConfigFile;\n-\n-    private Map<String, String> parameters;\n-\n-    public ConfigCenterBuilder protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-\tpublic ConfigCenterBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder cluster(String cluster) {\n-        this.cluster = cluster;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder namespace(String namespace) {\n-        this.namespace = namespace;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder timeout(Long timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder highestPriority(Boolean highestPriority) {\n-        this.highestPriority = highestPriority;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder check(Boolean check) {\n-        this.check = check;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder configFile(String configFile) {\n-        this.configFile = configFile;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder appConfigFile(String appConfigFile) {\n-        this.appConfigFile = appConfigFile;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(this.parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(this.parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public ConfigCenterConfig build() {\n-        ConfigCenterConfig configCenter = new ConfigCenterConfig();\n-        super.build(configCenter);\n-\n-        configCenter.setProtocol(protocol);\n-        configCenter.setAddress(address);\n-        configCenter.setCluster(cluster);\n-        configCenter.setNamespace(namespace);\n-        configCenter.setGroup(group);\n-        configCenter.setUsername(username);\n-        configCenter.setPassword(password);\n-        configCenter.setTimeout(timeout);\n-        configCenter.setHighestPriority(highestPriority);\n-        configCenter.setCheck(check);\n-        configCenter.setConfigFile(configFile);\n-        configCenter.setAppConfigFile(appConfigFile);\n-        configCenter.setParameters(parameters);\n-\n-        return configCenter;\n-    }\n-\n-    @Override\n-    protected ConfigCenterBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ConfigCenterConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ConfigCenterBuilder extends AbstractBuilder<ConfigCenterConfig, ConfigCenterBuilder> {\r\n+\r\n+    private String protocol;\r\n+    private String address;\r\n+    private String cluster;\r\n+    private String namespace = \"dubbo\";\r\n+    private String group = \"dubbo\";\r\n+    private String username;\r\n+    private String password;\r\n+    private Long timeout = 3000L;\r\n+    private Boolean highestPriority = true;\r\n+    private Boolean check = true;\r\n+\r\n+    private String configFile = \"dubbo.properties\";\r\n+    private String appConfigFile;\r\n+\r\n+    private Map<String, String> parameters;\r\n+\r\n+    public ConfigCenterBuilder protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+\tpublic ConfigCenterBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder cluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder namespace(String namespace) {\r\n+        this.namespace = namespace;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder timeout(Long timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder highestPriority(Boolean highestPriority) {\r\n+        this.highestPriority = highestPriority;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder check(Boolean check) {\r\n+        this.check = check;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder configFile(String configFile) {\r\n+        this.configFile = configFile;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder appConfigFile(String appConfigFile) {\r\n+        this.appConfigFile = appConfigFile;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(this.parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(this.parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterConfig build() {\r\n+        ConfigCenterConfig configCenter = new ConfigCenterConfig();\r\n+        super.build(configCenter);\r\n+\r\n+        configCenter.setProtocol(protocol);\r\n+        configCenter.setAddress(address);\r\n+        configCenter.setCluster(cluster);\r\n+        configCenter.setNamespace(namespace);\r\n+        configCenter.setGroup(group);\r\n+        configCenter.setUsername(username);\r\n+        configCenter.setPassword(password);\r\n+        configCenter.setTimeout(timeout);\r\n+        configCenter.setHighestPriority(highestPriority);\r\n+        configCenter.setCheck(check);\r\n+        configCenter.setConfigFile(configFile);\r\n+        configCenter.setAppConfigFile(appConfigFile);\r\n+        configCenter.setParameters(parameters);\r\n+\r\n+        return configCenter;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ConfigCenterBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ConsumerConfig;\n-\n-/**\n- * This is a builder for build {@link ConsumerConfig}.\n- *\n- * @since 2.7\n- */\n-public class ConsumerBuilder extends AbstractReferenceBuilder<ConsumerConfig, ConsumerBuilder> {\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-    public ConsumerBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder threadPool(String threadPool) {\n-        this.threadpool = threadPool;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder coreThreads(Integer coreThreads) {\n-        this.corethreads = coreThreads;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder threads(Integer threads) {\n-        this.threads = threads;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder queues(Integer queues) {\n-        this.queues = queues;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder shareConnections(Integer shareConnections) {\n-        this.shareconnections = shareConnections;\n-        return getThis();\n-    }\n-\n-    public ConsumerConfig build() {\n-        ConsumerConfig consumer = new ConsumerConfig();\n-        super.build(consumer);\n-\n-        consumer.setDefault(isDefault);\n-        consumer.setClient(client);\n-        consumer.setThreadpool(threadpool);\n-        consumer.setCorethreads(corethreads);\n-        consumer.setThreads(threads);\n-        consumer.setQueues(queues);\n-        consumer.setShareconnections(shareconnections);\n-\n-        return consumer;\n-    }\n-\n-    @Override\n-    protected ConsumerBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ConsumerConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ConsumerBuilder extends AbstractReferenceBuilder<ConsumerConfig, ConsumerBuilder> {\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+    public ConsumerBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder threadPool(String threadPool) {\r\n+        this.threadpool = threadPool;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder coreThreads(Integer coreThreads) {\r\n+        this.corethreads = coreThreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder threads(Integer threads) {\r\n+        this.threads = threads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder queues(Integer queues) {\r\n+        this.queues = queues;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder shareConnections(Integer shareConnections) {\r\n+        this.shareconnections = shareConnections;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerConfig build() {\r\n+        ConsumerConfig consumer = new ConsumerConfig();\r\n+        super.build(consumer);\r\n+\r\n+        consumer.setDefault(isDefault);\r\n+        consumer.setClient(client);\r\n+        consumer.setThreadpool(threadpool);\r\n+        consumer.setCorethreads(corethreads);\r\n+        consumer.setThreads(threads);\r\n+        consumer.setQueues(queues);\r\n+        consumer.setShareconnections(shareconnections);\r\n+\r\n+        return consumer;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ConsumerBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,144 +1,144 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.MetadataReportConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link MetadataReportConfig}.\n- *\n- * @since 2.7\n- */\n-public class MetadataReportBuilder extends AbstractBuilder<MetadataReportConfig, MetadataReportBuilder> {\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-    public static MetadataReportBuilder newBuilder() {\n-        return new MetadataReportBuilder();\n-    }\n-\n-    public MetadataReportBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder timeout(Integer timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(this.parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(this.parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder retryTimes(Integer retryTimes) {\n-        this.retryTimes = retryTimes;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder retryPeriod(Integer retryPeriod) {\n-        this.retryPeriod = retryPeriod;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder cycleReport(Boolean cycleReport) {\n-        this.cycleReport = cycleReport;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder syncReport(Boolean syncReport) {\n-        this.syncReport = syncReport;\n-        return getThis();\n-    }\n-\n-    public MetadataReportConfig build() {\n-        MetadataReportConfig metadataReport = new MetadataReportConfig();\n-        super.build(metadataReport);\n-\n-        metadataReport.setAddress(address);\n-        metadataReport.setUsername(username);\n-        metadataReport.setPassword(password);\n-        metadataReport.setTimeout(timeout);\n-        metadataReport.setGroup(group);\n-        metadataReport.setParameters(parameters);\n-        metadataReport.setRetryTimes(retryTimes);\n-        metadataReport.setRetryPeriod(retryPeriod);\n-        metadataReport.setCycleReport(cycleReport);\n-        metadataReport.setSyncReport(syncReport);\n-\n-        return metadataReport;\n-    }\n-\n-    @Override\n-    protected MetadataReportBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link MetadataReportConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class MetadataReportBuilder extends AbstractBuilder<MetadataReportConfig, MetadataReportBuilder> {\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+    public static MetadataReportBuilder newBuilder() {\r\n+        return new MetadataReportBuilder();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder timeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(this.parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(this.parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder retryTimes(Integer retryTimes) {\r\n+        this.retryTimes = retryTimes;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder retryPeriod(Integer retryPeriod) {\r\n+        this.retryPeriod = retryPeriod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder cycleReport(Boolean cycleReport) {\r\n+        this.cycleReport = cycleReport;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder syncReport(Boolean syncReport) {\r\n+        this.syncReport = syncReport;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportConfig build() {\r\n+        MetadataReportConfig metadataReport = new MetadataReportConfig();\r\n+        super.build(metadataReport);\r\n+\r\n+        metadataReport.setAddress(address);\r\n+        metadataReport.setUsername(username);\r\n+        metadataReport.setPassword(password);\r\n+        metadataReport.setTimeout(timeout);\r\n+        metadataReport.setGroup(group);\r\n+        metadataReport.setParameters(parameters);\r\n+        metadataReport.setRetryTimes(retryTimes);\r\n+        metadataReport.setRetryPeriod(retryPeriod);\r\n+        metadataReport.setCycleReport(cycleReport);\r\n+        metadataReport.setSyncReport(syncReport);\r\n+\r\n+        return metadataReport;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected MetadataReportBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,237 +1,237 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ArgumentConfig;\n-import org.apache.dubbo.config.MethodConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * This is a builder for build {@link MethodConfig}.\n- *\n- * @since 2.7\n- */\n-public class MethodBuilder extends AbstractMethodBuilder<MethodConfig, MethodBuilder> {\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-    public MethodBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder stat(Integer stat) {\n-        this.stat = stat;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder retry(Boolean retry) {\n-        this.retry = retry;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder reliable(Boolean reliable) {\n-        this.reliable = reliable;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder executes(Integer executes) {\n-        this.executes = executes;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder deprecated(Boolean deprecated) {\n-        this.deprecated = deprecated;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder sticky(Boolean sticky) {\n-        this.sticky = sticky;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder isReturn(Boolean isReturn) {\n-        this.isReturn = isReturn;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder oninvoke(Object oninvoke) {\n-        this.oninvoke = oninvoke;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder oninvokeMethod(String oninvokeMethod) {\n-        this.oninvokeMethod = oninvokeMethod;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onreturn(Object onreturn) {\n-        this.onreturn = onreturn;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onreturnMethod(String onreturnMethod) {\n-        this.onreturnMethod = onreturnMethod;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onthrow(Object onthrow) {\n-        this.onthrow = onthrow;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onthrowMethod(String onthrowMethod) {\n-        this.onthrowMethod = onthrowMethod;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder addArguments(List<? extends ArgumentConfig> arguments) {\n-        if (this.arguments == null) {\n-            this.arguments = new ArrayList<>();\n-        }\n-        this.arguments.addAll(arguments);\n-        return getThis();\n-    }\n-\n-    public MethodBuilder addArgument(ArgumentConfig argument) {\n-        if (this.arguments == null) {\n-            this.arguments = new ArrayList<>();\n-        }\n-        this.arguments.add(argument);\n-        return getThis();\n-    }\n-\n-    public MethodBuilder service(String service) {\n-        this.service = service;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder serviceId(String serviceId) {\n-        this.serviceId = serviceId;\n-        return getThis();\n-    }\n-\n-    public MethodConfig build() {\n-        MethodConfig methodConfig = new MethodConfig();\n-        super.build(methodConfig);\n-\n-        methodConfig.setArguments(arguments);\n-        methodConfig.setDeprecated(deprecated);\n-        methodConfig.setExecutes(executes);\n-        methodConfig.setName(name);\n-        methodConfig.setOninvoke(oninvoke);\n-        methodConfig.setOninvokeMethod(oninvokeMethod);\n-        methodConfig.setOnreturn(onreturn);\n-        methodConfig.setOnreturnMethod(onreturnMethod);\n-        methodConfig.setOnthrow(onthrow);\n-        methodConfig.setOnthrowMethod(onthrowMethod);\n-        methodConfig.setReturn(isReturn);\n-        methodConfig.setService(service);\n-        methodConfig.setServiceId(serviceId);\n-        methodConfig.setSticky(sticky);\n-        methodConfig.setReliable(reliable);\n-        methodConfig.setStat(stat);\n-        methodConfig.setRetry(retry);\n-\n-        return methodConfig;\n-    }\n-\n-    @Override\n-    protected MethodBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ArgumentConfig;\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link MethodConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class MethodBuilder extends AbstractMethodBuilder<MethodConfig, MethodBuilder> {\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+    public MethodBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder stat(Integer stat) {\r\n+        this.stat = stat;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder retry(Boolean retry) {\r\n+        this.retry = retry;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder reliable(Boolean reliable) {\r\n+        this.reliable = reliable;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder executes(Integer executes) {\r\n+        this.executes = executes;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder deprecated(Boolean deprecated) {\r\n+        this.deprecated = deprecated;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder sticky(Boolean sticky) {\r\n+        this.sticky = sticky;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder isReturn(Boolean isReturn) {\r\n+        this.isReturn = isReturn;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder oninvoke(Object oninvoke) {\r\n+        this.oninvoke = oninvoke;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder oninvokeMethod(String oninvokeMethod) {\r\n+        this.oninvokeMethod = oninvokeMethod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onreturn(Object onreturn) {\r\n+        this.onreturn = onreturn;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onreturnMethod(String onreturnMethod) {\r\n+        this.onreturnMethod = onreturnMethod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onthrow(Object onthrow) {\r\n+        this.onthrow = onthrow;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onthrowMethod(String onthrowMethod) {\r\n+        this.onthrowMethod = onthrowMethod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder addArguments(List<? extends ArgumentConfig> arguments) {\r\n+        if (this.arguments == null) {\r\n+            this.arguments = new ArrayList<>();\r\n+        }\r\n+        this.arguments.addAll(arguments);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder addArgument(ArgumentConfig argument) {\r\n+        if (this.arguments == null) {\r\n+            this.arguments = new ArrayList<>();\r\n+        }\r\n+        this.arguments.add(argument);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder service(String service) {\r\n+        this.service = service;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder serviceId(String serviceId) {\r\n+        this.serviceId = serviceId;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodConfig build() {\r\n+        MethodConfig methodConfig = new MethodConfig();\r\n+        super.build(methodConfig);\r\n+\r\n+        methodConfig.setArguments(arguments);\r\n+        methodConfig.setDeprecated(deprecated);\r\n+        methodConfig.setExecutes(executes);\r\n+        methodConfig.setName(name);\r\n+        methodConfig.setOninvoke(oninvoke);\r\n+        methodConfig.setOninvokeMethod(oninvokeMethod);\r\n+        methodConfig.setOnreturn(onreturn);\r\n+        methodConfig.setOnreturnMethod(onreturnMethod);\r\n+        methodConfig.setOnthrow(onthrow);\r\n+        methodConfig.setOnthrowMethod(onthrowMethod);\r\n+        methodConfig.setReturn(isReturn);\r\n+        methodConfig.setService(service);\r\n+        methodConfig.setServiceId(serviceId);\r\n+        methodConfig.setSticky(sticky);\r\n+        methodConfig.setReliable(reliable);\r\n+        methodConfig.setStat(stat);\r\n+        methodConfig.setRetry(retry);\r\n+\r\n+        return methodConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected MethodBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * This is a builder for build {@link ModuleConfig}.\n- *\n- * @since 2.7\n- */\n-public class ModuleBuilder extends AbstractBuilder<ModuleConfig, ModuleBuilder> {\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 ModuleBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder owner(String owner) {\n-        this.owner = owner;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder organization(String organization) {\n-        this.organization = organization;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder addRegistries(List<? extends RegistryConfig> registries) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.addAll(registries);\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder addRegistry(RegistryConfig registry) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.add(registry);\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder monitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ModuleConfig build() {\n-        ModuleConfig moduleConfig = new ModuleConfig();\n-        super.build(moduleConfig);\n-\n-        moduleConfig.setDefault(isDefault);\n-        moduleConfig.setMonitor(monitor);\n-        moduleConfig.setName(name);\n-        moduleConfig.setOrganization(organization);\n-        moduleConfig.setOwner(owner);\n-        moduleConfig.setRegistries(registries);\n-        moduleConfig.setVersion(version);\n-\n-        return moduleConfig;\n-    }\n-\n-    @Override\n-    protected ModuleBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ModuleConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ModuleBuilder extends AbstractBuilder<ModuleConfig, ModuleBuilder> {\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 ModuleBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder owner(String owner) {\r\n+        this.owner = owner;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder organization(String organization) {\r\n+        this.organization = organization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder addRegistries(List<? extends RegistryConfig> registries) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.addAll(registries);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder addRegistry(RegistryConfig registry) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.add(registry);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder monitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleConfig build() {\r\n+        ModuleConfig moduleConfig = new ModuleConfig();\r\n+        super.build(moduleConfig);\r\n+\r\n+        moduleConfig.setDefault(isDefault);\r\n+        moduleConfig.setMonitor(monitor);\r\n+        moduleConfig.setName(name);\r\n+        moduleConfig.setOrganization(organization);\r\n+        moduleConfig.setOwner(owner);\r\n+        moduleConfig.setRegistries(registries);\r\n+        moduleConfig.setVersion(version);\r\n+\r\n+        return moduleConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ModuleBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.MonitorConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link MonitorConfig}.\n- *\n- * @since 2.7\n- */\n-public class MonitorBuilder extends AbstractBuilder<MonitorConfig, MonitorBuilder> {\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 MonitorBuilder protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder interval(String interval) {\n-        this.interval = interval;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public MonitorConfig build() {\n-        MonitorConfig monitorConfig = new MonitorConfig();\n-        super.build(monitorConfig);\n-\n-        monitorConfig.setProtocol(protocol);\n-        monitorConfig.setAddress(address);\n-        monitorConfig.setUsername(username);\n-        monitorConfig.setPassword(password);\n-        monitorConfig.setGroup(group);\n-        monitorConfig.setVersion(version);\n-        monitorConfig.setInterval(interval);\n-        monitorConfig.setParameters(parameters);\n-        monitorConfig.setDefault(isDefault);\n-\n-        return monitorConfig;\n-    }\n-\n-    @Override\n-    protected MonitorBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link MonitorConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class MonitorBuilder extends AbstractBuilder<MonitorConfig, MonitorBuilder> {\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 MonitorBuilder protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder interval(String interval) {\r\n+        this.interval = interval;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorConfig build() {\r\n+        MonitorConfig monitorConfig = new MonitorConfig();\r\n+        super.build(monitorConfig);\r\n+\r\n+        monitorConfig.setProtocol(protocol);\r\n+        monitorConfig.setAddress(address);\r\n+        monitorConfig.setUsername(username);\r\n+        monitorConfig.setPassword(password);\r\n+        monitorConfig.setGroup(group);\r\n+        monitorConfig.setVersion(version);\r\n+        monitorConfig.setInterval(interval);\r\n+        monitorConfig.setParameters(parameters);\r\n+        monitorConfig.setDefault(isDefault);\r\n+\r\n+        return monitorConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected MonitorBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,427 +1,427 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ProtocolConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link ProtocolConfig}.\n- *\n- * @since 2.7\n- */\n-public class ProtocolBuilder extends AbstractBuilder<ProtocolConfig, ProtocolBuilder> {\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 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'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-    public static ProtocolBuilder newBuilder() {\n-        return new ProtocolBuilder();\n-    }\n-\n-    public ProtocolBuilder id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public ProtocolBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder host(String host) {\n-        this.host = host;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder port(Integer port) {\n-        this.port = port;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder contextpath(String contextpath) {\n-        this.contextpath = contextpath;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param path\n-     * @return ProtocolBuilder\n-     * @see ProtocolBuilder#contextpath(String)\n-     */\n-    @Deprecated\n-    public ProtocolBuilder path(String path) {\n-        this.contextpath = path;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder threadpool(String threadpool) {\n-        this.threadpool = threadpool;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder corethreads(Integer corethreads) {\n-        this.corethreads = corethreads;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder threads(Integer threads) {\n-        this.threads = threads;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder iothreads(Integer iothreads) {\n-        this.iothreads = iothreads;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder queues(Integer queues) {\n-        this.queues = queues;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder accepts(Integer accepts) {\n-        this.accepts = accepts;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder codec(String codec) {\n-        this.codec = codec;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder serialization(String serialization) {\n-        this.serialization = serialization;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder charset(String charset) {\n-        this.charset = charset;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder payload(Integer payload) {\n-        this.payload = payload;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder buffer(Integer buffer) {\n-        this.buffer = buffer;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder heartbeat(Integer heartbeat) {\n-        this.heartbeat = heartbeat;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder accesslog(String accesslog) {\n-        this.accesslog = accesslog;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder transporter(String transporter) {\n-        this.transporter = transporter;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder exchanger(String exchanger) {\n-        this.exchanger = exchanger;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder dispatcher(String dispatcher) {\n-        this.dispatcher = dispatcher;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param dispather\n-     * @return ProtocolBuilder\n-     * @see ProtocolBuilder#dispatcher(String)\n-     */\n-    @Deprecated\n-    public ProtocolBuilder dispather(String dispather) {\n-        this.dispatcher = dispather;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder networker(String networker) {\n-        this.networker = networker;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder server(String server) {\n-        this.server = server;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder telnet(String telnet) {\n-        this.telnet = telnet;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder prompt(String prompt) {\n-        this.prompt = prompt;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder status(String status) {\n-        this.status = status;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder register(Boolean register) {\n-        this.register = register;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder keepAlive(Boolean keepAlive) {\n-        this.keepAlive = keepAlive;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder optimizer(String optimizer) {\n-        this.optimizer = optimizer;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder extension(String extension) {\n-        this.extension = extension;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ProtocolConfig build() {\n-        ProtocolConfig protocolConfig = new ProtocolConfig();\n-        super.build(protocolConfig);\n-\n-        protocolConfig.setAccepts(accepts);\n-        protocolConfig.setAccesslog(accesslog);\n-        protocolConfig.setBuffer(buffer);\n-        protocolConfig.setCharset(charset);\n-        protocolConfig.setClient(client);\n-        protocolConfig.setCodec(codec);\n-        protocolConfig.setContextpath(contextpath);\n-        protocolConfig.setCorethreads(corethreads);\n-        protocolConfig.setDefault(isDefault);\n-        protocolConfig.setDispatcher(dispatcher);\n-        protocolConfig.setExchanger(exchanger);\n-        protocolConfig.setExtension(extension);\n-        protocolConfig.setHeartbeat(heartbeat);\n-        protocolConfig.setHost(host);\n-        protocolConfig.setIothreads(iothreads);\n-        protocolConfig.setKeepAlive(keepAlive);\n-        protocolConfig.setName(name);\n-        protocolConfig.setNetworker(networker);\n-        protocolConfig.setOptimizer(optimizer);\n-        protocolConfig.setParameters(parameters);\n-        protocolConfig.setPayload(payload);\n-        protocolConfig.setPort(port);\n-        protocolConfig.setPrompt(prompt);\n-        protocolConfig.setQueues(queues);\n-        protocolConfig.setRegister(register);\n-        protocolConfig.setSerialization(serialization);\n-        protocolConfig.setServer(server);\n-        protocolConfig.setStatus(status);\n-        protocolConfig.setTelnet(telnet);\n-        protocolConfig.setThreadpool(threadpool);\n-        protocolConfig.setThreads(threads);\n-        protocolConfig.setTransporter(transporter);\n-\n-        return protocolConfig;\n-    }\n-\n-    @Override\n-    protected ProtocolBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ProtocolConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ProtocolBuilder extends AbstractBuilder<ProtocolConfig, ProtocolBuilder> {\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 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'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+    public static ProtocolBuilder newBuilder() {\r\n+        return new ProtocolBuilder();\r\n+    }\r\n+\r\n+    public ProtocolBuilder id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public ProtocolBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder host(String host) {\r\n+        this.host = host;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder port(Integer port) {\r\n+        this.port = port;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder contextpath(String contextpath) {\r\n+        this.contextpath = contextpath;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param path\r\n+     * @return ProtocolBuilder\r\n+     * @see ProtocolBuilder#contextpath(String)\r\n+     */\r\n+    @Deprecated\r\n+    public ProtocolBuilder path(String path) {\r\n+        this.contextpath = path;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder threadpool(String threadpool) {\r\n+        this.threadpool = threadpool;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder corethreads(Integer corethreads) {\r\n+        this.corethreads = corethreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder threads(Integer threads) {\r\n+        this.threads = threads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder iothreads(Integer iothreads) {\r\n+        this.iothreads = iothreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder queues(Integer queues) {\r\n+        this.queues = queues;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder accepts(Integer accepts) {\r\n+        this.accepts = accepts;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder codec(String codec) {\r\n+        this.codec = codec;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder serialization(String serialization) {\r\n+        this.serialization = serialization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder charset(String charset) {\r\n+        this.charset = charset;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder payload(Integer payload) {\r\n+        this.payload = payload;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder buffer(Integer buffer) {\r\n+        this.buffer = buffer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder heartbeat(Integer heartbeat) {\r\n+        this.heartbeat = heartbeat;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder accesslog(String accesslog) {\r\n+        this.accesslog = accesslog;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder transporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder exchanger(String exchanger) {\r\n+        this.exchanger = exchanger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder dispatcher(String dispatcher) {\r\n+        this.dispatcher = dispatcher;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param dispather\r\n+     * @return ProtocolBuilder\r\n+     * @see ProtocolBuilder#dispatcher(String)\r\n+     */\r\n+    @Deprecated\r\n+    public ProtocolBuilder dispather(String dispather) {\r\n+        this.dispatcher = dispather;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder networker(String networker) {\r\n+        this.networker = networker;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder server(String server) {\r\n+        this.server = server;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder telnet(String telnet) {\r\n+        this.telnet = telnet;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder prompt(String prompt) {\r\n+        this.prompt = prompt;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder status(String status) {\r\n+        this.status = status;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder register(Boolean register) {\r\n+        this.register = register;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder keepAlive(Boolean keepAlive) {\r\n+        this.keepAlive = keepAlive;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder optimizer(String optimizer) {\r\n+        this.optimizer = optimizer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder extension(String extension) {\r\n+        this.extension = extension;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolConfig build() {\r\n+        ProtocolConfig protocolConfig = new ProtocolConfig();\r\n+        super.build(protocolConfig);\r\n+\r\n+        protocolConfig.setAccepts(accepts);\r\n+        protocolConfig.setAccesslog(accesslog);\r\n+        protocolConfig.setBuffer(buffer);\r\n+        protocolConfig.setCharset(charset);\r\n+        protocolConfig.setClient(client);\r\n+        protocolConfig.setCodec(codec);\r\n+        protocolConfig.setContextpath(contextpath);\r\n+        protocolConfig.setCorethreads(corethreads);\r\n+        protocolConfig.setDefault(isDefault);\r\n+        protocolConfig.setDispatcher(dispatcher);\r\n+        protocolConfig.setExchanger(exchanger);\r\n+        protocolConfig.setExtension(extension);\r\n+        protocolConfig.setHeartbeat(heartbeat);\r\n+        protocolConfig.setHost(host);\r\n+        protocolConfig.setIothreads(iothreads);\r\n+        protocolConfig.setKeepAlive(keepAlive);\r\n+        protocolConfig.setName(name);\r\n+        protocolConfig.setNetworker(networker);\r\n+        protocolConfig.setOptimizer(optimizer);\r\n+        protocolConfig.setParameters(parameters);\r\n+        protocolConfig.setPayload(payload);\r\n+        protocolConfig.setPort(port);\r\n+        protocolConfig.setPrompt(prompt);\r\n+        protocolConfig.setQueues(queues);\r\n+        protocolConfig.setRegister(register);\r\n+        protocolConfig.setSerialization(serialization);\r\n+        protocolConfig.setServer(server);\r\n+        protocolConfig.setStatus(status);\r\n+        protocolConfig.setTelnet(telnet);\r\n+        protocolConfig.setThreadpool(threadpool);\r\n+        protocolConfig.setThreads(threads);\r\n+        protocolConfig.setTransporter(transporter);\r\n+\r\n+        return protocolConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ProtocolBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,293 +1,293 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ProviderConfig;\n-\n-/**\n- * This is a builder for build {@link ProviderConfig}.\n- *\n- * @since 2.7\n- */\n-public class ProviderBuilder extends AbstractServiceBuilder<ProviderConfig, ProviderBuilder> {\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 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 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-    public ProviderBuilder host(String host) {\n-        this.host = host;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder port(Integer port) {\n-        this.port = port;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder contextPath(String contextPath) {\n-        this.contextpath = contextPath;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder threadPool(String threadPool) {\n-        this.threadpool = threadPool;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder threads(Integer threads) {\n-        this.threads = threads;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder ioThreads(Integer ioThreads) {\n-        this.iothreads = ioThreads;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder queues(Integer queues) {\n-        this.queues = queues;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder accepts(Integer accepts) {\n-        this.accepts = accepts;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder codec(String codec) {\n-        this.codec = codec;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder charset(String charset) {\n-        this.charset = charset;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder payload(Integer payload) {\n-        this.payload = payload;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder buffer(Integer buffer) {\n-        this.buffer = buffer;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder transporter(String transporter) {\n-        this.transporter = transporter;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder exchanger(String exchanger) {\n-        this.exchanger = exchanger;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder dispatcher(String dispatcher) {\n-        this.dispatcher = dispatcher;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder networker(String networker) {\n-        this.networker = networker;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder server(String server) {\n-        this.server = server;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder telnet(String telnet) {\n-        this.telnet = telnet;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder prompt(String prompt) {\n-        this.prompt = prompt;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder status(String status) {\n-        this.status = status;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder wait(Integer wait) {\n-        this.wait = wait;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ProviderConfig build() {\n-        ProviderConfig provider = new ProviderConfig();\n-        super.build(provider);\n-\n-        provider.setHost(host);\n-        provider.setPort(port);\n-        provider.setContextpath(contextpath);\n-        provider.setThreadpool(threadpool);\n-        provider.setThreads(threads);\n-        provider.setIothreads(iothreads);\n-        provider.setQueues(queues);\n-        provider.setAccepts(accepts);\n-        provider.setCodec(codec);\n-        provider.setPayload(payload);\n-        provider.setCharset(charset);\n-        provider.setBuffer(buffer);\n-        provider.setTransporter(transporter);\n-        provider.setExchanger(exchanger);\n-        provider.setDispatcher(dispatcher);\n-        provider.setNetworker(networker);\n-        provider.setServer(server);\n-        provider.setClient(client);\n-        provider.setTelnet(telnet);\n-        provider.setPrompt(prompt);\n-        provider.setStatus(status);\n-        provider.setWait(wait);\n-        provider.setDefault(isDefault);\n-\n-        return provider;\n-    }\n-\n-    @Override\n-    protected ProviderBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ProviderConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ProviderBuilder extends AbstractServiceBuilder<ProviderConfig, ProviderBuilder> {\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 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 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+    public ProviderBuilder host(String host) {\r\n+        this.host = host;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder port(Integer port) {\r\n+        this.port = port;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder contextPath(String contextPath) {\r\n+        this.contextpath = contextPath;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder threadPool(String threadPool) {\r\n+        this.threadpool = threadPool;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder threads(Integer threads) {\r\n+        this.threads = threads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder ioThreads(Integer ioThreads) {\r\n+        this.iothreads = ioThreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder queues(Integer queues) {\r\n+        this.queues = queues;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder accepts(Integer accepts) {\r\n+        this.accepts = accepts;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder codec(String codec) {\r\n+        this.codec = codec;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder charset(String charset) {\r\n+        this.charset = charset;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder payload(Integer payload) {\r\n+        this.payload = payload;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder buffer(Integer buffer) {\r\n+        this.buffer = buffer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder transporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder exchanger(String exchanger) {\r\n+        this.exchanger = exchanger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder dispatcher(String dispatcher) {\r\n+        this.dispatcher = dispatcher;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder networker(String networker) {\r\n+        this.networker = networker;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder server(String server) {\r\n+        this.server = server;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder telnet(String telnet) {\r\n+        this.telnet = telnet;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder prompt(String prompt) {\r\n+        this.prompt = prompt;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder status(String status) {\r\n+        this.status = status;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder wait(Integer wait) {\r\n+        this.wait = wait;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderConfig build() {\r\n+        ProviderConfig provider = new ProviderConfig();\r\n+        super.build(provider);\r\n+\r\n+        provider.setHost(host);\r\n+        provider.setPort(port);\r\n+        provider.setContextpath(contextpath);\r\n+        provider.setThreadpool(threadpool);\r\n+        provider.setThreads(threads);\r\n+        provider.setIothreads(iothreads);\r\n+        provider.setQueues(queues);\r\n+        provider.setAccepts(accepts);\r\n+        provider.setCodec(codec);\r\n+        provider.setPayload(payload);\r\n+        provider.setCharset(charset);\r\n+        provider.setBuffer(buffer);\r\n+        provider.setTransporter(transporter);\r\n+        provider.setExchanger(exchanger);\r\n+        provider.setDispatcher(dispatcher);\r\n+        provider.setNetworker(networker);\r\n+        provider.setServer(server);\r\n+        provider.setClient(client);\r\n+        provider.setTelnet(telnet);\r\n+        provider.setPrompt(prompt);\r\n+        provider.setStatus(status);\r\n+        provider.setWait(wait);\r\n+        provider.setDefault(isDefault);\r\n+\r\n+        return provider;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ProviderBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,165 +1,165 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ConsumerConfig;\n-import org.apache.dubbo.config.MethodConfig;\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.toCommaDelimitedString;\n-\n-/**\n- * This is a builder for build {@link ReferenceConfigBase}.\n- *\n- * @since 2.7\n- */\n-public class ReferenceBuilder<T> extends AbstractReferenceBuilder<ReferenceConfig, ReferenceBuilder<T>> {\n-    /**\n-     * The interface name of the reference service\n-     */\n-    private String interfaceName;\n-\n-    /**\n-     * The interface class of the reference service\n-     */\n-    private Class<?> interfaceClass;\n-\n-    /**\n-     * client type\n-     */\n-    private String client;\n-\n-    /**\n-     * The url for peer-to-peer invocation\n-     */\n-    private String url;\n-\n-    /**\n-     * The method configs\n-     */\n-    private List<MethodConfig> methods;\n-\n-    /**\n-     * The consumer config (default)\n-     */\n-    private ConsumerConfig consumer;\n-\n-    /**\n-     * Only the service provider of the specified protocol is invoked, and other protocols are ignored.\n-     */\n-    private String protocol;\n-\n-    /**\n-     * The string presenting the service names that the Dubbo interface subscribed\n-     *\n-     * @since 2.7.8\n-     */\n-    private String services;\n-\n-    public static ReferenceBuilder newBuilder() {\n-        return new ReferenceBuilder();\n-    }\n-\n-    public ReferenceBuilder<T> id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public ReferenceBuilder<T> interfaceName(String interfaceName) {\n-        this.interfaceName = interfaceName;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> interfaceClass(Class<?> interfaceClass) {\n-        this.interfaceClass = interfaceClass;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> url(String url) {\n-        this.url = url;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> addMethods(List<MethodConfig> methods) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.addAll(methods);\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> addMethod(MethodConfig method) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.add(method);\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> consumer(ConsumerConfig consumer) {\n-        this.consumer = consumer;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param service       one service name\n-     * @param otherServices other service names\n-     * @return {@link ReferenceBuilder}\n-     * @since 2.7.8\n-     */\n-    public ReferenceBuilder<T> services(String service, String... otherServices) {\n-        this.services = toCommaDelimitedString(service, otherServices);\n-        return getThis();\n-    }\n-\n-    public ReferenceConfig<T> build() {\n-        ReferenceConfig<T> reference = new ReferenceConfig<>();\n-        super.build(reference);\n-\n-        reference.setInterface(interfaceName);\n-        if (interfaceClass != null) {\n-            reference.setInterface(interfaceClass);\n-        }\n-        reference.setClient(client);\n-        reference.setUrl(url);\n-        reference.setMethods(methods);\n-        reference.setConsumer(consumer);\n-        reference.setProtocol(protocol);\n-        // @since 2.7.8\n-        reference.setServices(services);\n-\n-        return reference;\n-    }\n-\n-    @Override\n-    protected ReferenceBuilder<T> getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.ReferenceConfigBase;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.toCommaDelimitedString;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ReferenceConfigBase}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ReferenceBuilder<T> extends AbstractReferenceBuilder<ReferenceConfig, ReferenceBuilder<T>> {\r\n+    /**\r\n+     * The interface name of the reference service\r\n+     */\r\n+    private String interfaceName;\r\n+\r\n+    /**\r\n+     * The interface class of the reference service\r\n+     */\r\n+    private Class<?> interfaceClass;\r\n+\r\n+    /**\r\n+     * client type\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * The url for peer-to-peer invocation\r\n+     */\r\n+    private String url;\r\n+\r\n+    /**\r\n+     * The method configs\r\n+     */\r\n+    private List<MethodConfig> methods;\r\n+\r\n+    /**\r\n+     * The consumer config (default)\r\n+     */\r\n+    private 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+    private String protocol;\r\n+\r\n+    /**\r\n+     * The string presenting the service names that the Dubbo interface subscribed\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    private String services;\r\n+\r\n+    public static ReferenceBuilder newBuilder() {\r\n+        return new ReferenceBuilder();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> interfaceName(String interfaceName) {\r\n+        this.interfaceName = interfaceName;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> interfaceClass(Class<?> interfaceClass) {\r\n+        this.interfaceClass = interfaceClass;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> url(String url) {\r\n+        this.url = url;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> addMethods(List<MethodConfig> methods) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.addAll(methods);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> addMethod(MethodConfig method) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.add(method);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> consumer(ConsumerConfig consumer) {\r\n+        this.consumer = consumer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param service       one service name\r\n+     * @param otherServices other service names\r\n+     * @return {@link ReferenceBuilder}\r\n+     * @since 2.7.8\r\n+     */\r\n+    public ReferenceBuilder<T> services(String service, String... otherServices) {\r\n+        this.services = toCommaDelimitedString(service, otherServices);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceConfig<T> build() {\r\n+        ReferenceConfig<T> reference = new ReferenceConfig<>();\r\n+        super.build(reference);\r\n+\r\n+        reference.setInterface(interfaceName);\r\n+        if (interfaceClass != null) {\r\n+            reference.setInterface(interfaceClass);\r\n+        }\r\n+        reference.setClient(client);\r\n+        reference.setUrl(url);\r\n+        reference.setMethods(methods);\r\n+        reference.setConsumer(consumer);\r\n+        reference.setProtocol(protocol);\r\n+        // @since 2.7.8\r\n+        reference.setServices(services);\r\n+\r\n+        return reference;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ReferenceBuilder<T> getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,383 +1,383 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.RegistryConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link RegistryConfig}.\n- *\n- * @since 2.7\n- */\n-public class RegistryBuilder extends AbstractBuilder<RegistryConfig, RegistryBuilder> {\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-    private String cluster;\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 static RegistryBuilder newBuilder() {\n-        return new RegistryBuilder();\n-    }\n-\n-    public RegistryBuilder id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public RegistryBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder port(Integer port) {\n-        this.port = port;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder transporter(String transporter) {\n-        this.transporter = transporter;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param transport\n-     * @see #transporter(String)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public RegistryBuilder transport(String transport) {\n-        this.transporter = transport;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder server(String server) {\n-        this.server = server;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder cluster(String cluster) {\n-        this.cluster = cluster;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder timeout(Integer timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder session(Integer session) {\n-        this.session = session;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder file(String file) {\n-        this.file = file;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param wait\n-     * @see ProviderBuilder#wait(Integer)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public RegistryBuilder wait(Integer wait) {\n-        this.wait = wait;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder isCheck(Boolean check) {\n-        this.check = check;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder isDynamic(Boolean dynamic) {\n-        this.dynamic = dynamic;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder register(Boolean register) {\n-        this.register = register;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder subscribe(Boolean subscribe) {\n-        this.subscribe = subscribe;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param name   the parameter name\n-     * @param value the parameter value\n-     * @return {@link RegistryBuilder}\n-     * @since 2.7.8\n-     */\n-    public RegistryBuilder parameter(String name, String value) {\n-        return appendParameter(name, value);\n-    }\n-\n-    public RegistryBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder simplified(Boolean simplified) {\n-        this.simplified = simplified;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder extraKeys(String extraKeys) {\n-        this.extraKeys = extraKeys;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder useAsConfigCenter(Boolean useAsConfigCenter) {\n-        this.useAsConfigCenter = useAsConfigCenter;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder useAsMetadataCenter(Boolean useAsMetadataCenter) {\n-        this.useAsMetadataCenter = useAsMetadataCenter;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder preferred(Boolean preferred) {\n-        this.preferred = preferred;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder accepts(String accepts) {\n-        this.accepts = accepts;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder weight(Integer weight) {\n-        this.weight = weight;\n-        return getThis();\n-    }\n-\n-    public RegistryConfig build() {\n-        RegistryConfig registry = new RegistryConfig();\n-        super.build(registry);\n-\n-        registry.setCheck(check);\n-        registry.setClient(client);\n-        registry.setCluster(cluster);\n-        registry.setDefault(isDefault);\n-        registry.setDynamic(dynamic);\n-        registry.setExtraKeys(extraKeys);\n-        registry.setFile(file);\n-        registry.setGroup(group);\n-        registry.setParameters(parameters);\n-        registry.setPassword(password);\n-        registry.setPort(port);\n-        registry.setProtocol(protocol);\n-        registry.setRegister(register);\n-        registry.setServer(server);\n-        registry.setSession(session);\n-        registry.setSimplified(simplified);\n-        registry.setSubscribe(subscribe);\n-        registry.setTimeout(timeout);\n-        registry.setTransporter(transporter);\n-        registry.setUsername(username);\n-        registry.setVersion(version);\n-        registry.setWait(wait);\n-        registry.setUseAsConfigCenter(useAsConfigCenter);\n-        registry.setUseAsMetadataCenter(useAsMetadataCenter);\n-        registry.setAccepts(accepts);\n-        registry.setPreferred(preferred);\n-        registry.setWeight(weight);\n-        registry.setAddress(address);\n-\n-        return registry;\n-    }\n-\n-    @Override\n-    protected RegistryBuilder getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link RegistryConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class RegistryBuilder extends AbstractBuilder<RegistryConfig, RegistryBuilder> {\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+    private String cluster;\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 static RegistryBuilder newBuilder() {\r\n+        return new RegistryBuilder();\r\n+    }\r\n+\r\n+    public RegistryBuilder id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public RegistryBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder port(Integer port) {\r\n+        this.port = port;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder transporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param transport\r\n+     * @see #transporter(String)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public RegistryBuilder transport(String transport) {\r\n+        this.transporter = transport;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder server(String server) {\r\n+        this.server = server;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder cluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder timeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder session(Integer session) {\r\n+        this.session = session;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder file(String file) {\r\n+        this.file = file;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param wait\r\n+     * @see ProviderBuilder#wait(Integer)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public RegistryBuilder wait(Integer wait) {\r\n+        this.wait = wait;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder isCheck(Boolean check) {\r\n+        this.check = check;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder isDynamic(Boolean dynamic) {\r\n+        this.dynamic = dynamic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder register(Boolean register) {\r\n+        this.register = register;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder subscribe(Boolean subscribe) {\r\n+        this.subscribe = subscribe;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param name   the parameter name\r\n+     * @param value the parameter value\r\n+     * @return {@link RegistryBuilder}\r\n+     * @since 2.7.8\r\n+     */\r\n+    public RegistryBuilder parameter(String name, String value) {\r\n+        return appendParameter(name, value);\r\n+    }\r\n+\r\n+    public RegistryBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder simplified(Boolean simplified) {\r\n+        this.simplified = simplified;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder extraKeys(String extraKeys) {\r\n+        this.extraKeys = extraKeys;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder useAsConfigCenter(Boolean useAsConfigCenter) {\r\n+        this.useAsConfigCenter = useAsConfigCenter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder useAsMetadataCenter(Boolean useAsMetadataCenter) {\r\n+        this.useAsMetadataCenter = useAsMetadataCenter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder preferred(Boolean preferred) {\r\n+        this.preferred = preferred;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder accepts(String accepts) {\r\n+        this.accepts = accepts;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder weight(Integer weight) {\r\n+        this.weight = weight;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryConfig build() {\r\n+        RegistryConfig registry = new RegistryConfig();\r\n+        super.build(registry);\r\n+\r\n+        registry.setCheck(check);\r\n+        registry.setClient(client);\r\n+        registry.setCluster(cluster);\r\n+        registry.setDefault(isDefault);\r\n+        registry.setDynamic(dynamic);\r\n+        registry.setExtraKeys(extraKeys);\r\n+        registry.setFile(file);\r\n+        registry.setGroup(group);\r\n+        registry.setParameters(parameters);\r\n+        registry.setPassword(password);\r\n+        registry.setPort(port);\r\n+        registry.setProtocol(protocol);\r\n+        registry.setRegister(register);\r\n+        registry.setServer(server);\r\n+        registry.setSession(session);\r\n+        registry.setSimplified(simplified);\r\n+        registry.setSubscribe(subscribe);\r\n+        registry.setTimeout(timeout);\r\n+        registry.setTransporter(transporter);\r\n+        registry.setUsername(username);\r\n+        registry.setVersion(version);\r\n+        registry.setWait(wait);\r\n+        registry.setUseAsConfigCenter(useAsConfigCenter);\r\n+        registry.setUseAsMetadataCenter(useAsMetadataCenter);\r\n+        registry.setAccepts(accepts);\r\n+        registry.setPreferred(preferred);\r\n+        registry.setWeight(weight);\r\n+        registry.setAddress(address);\r\n+\r\n+        return registry;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected RegistryBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,161 +1,161 @@\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.bootstrap.builders;\n-\n-import org.apache.dubbo.config.MethodConfig;\n-import org.apache.dubbo.config.ProviderConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * This is a builder for build {@link ServiceConfigBase}.\n- *\n- * @since 2.7\n- */\n-public class ServiceBuilder<U> extends AbstractServiceBuilder<ServiceConfig, ServiceBuilder<U>> {\n-    /**\n-     * The interface name of the exported service\n-     */\n-    private String interfaceName;\n-\n-    /**\n-     * The interface class of the exported service\n-     */\n-    private Class<?> interfaceClass;\n-\n-    /**\n-     * The reference of the interface implementation\n-     */\n-    private U ref;\n-\n-    /**\n-     * The service name\n-     */\n-    private String path;\n-\n-    /**\n-     * The method configuration\n-     */\n-    private List<MethodConfig> methods;\n-\n-    /**\n-     * The provider configuration\n-     */\n-    private ProviderConfig provider;\n-\n-    /**\n-     * The providerIds\n-     */\n-    private String providerIds;\n-    /**\n-     * whether it is a GenericService\n-     */\n-    private String generic;\n-\n-    public static ServiceBuilder newBuilder() {\n-        return new ServiceBuilder();\n-    }\n-\n-    public ServiceBuilder id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public ServiceBuilder<U> interfaceName(String interfaceName) {\n-        this.interfaceName = interfaceName;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> interfaceClass(Class<?> interfaceClass) {\n-        this.interfaceClass = interfaceClass;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> ref(U ref) {\n-        this.ref = ref;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> path(String path) {\n-        this.path = path;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> addMethod(MethodConfig method) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.add(method);\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> addMethods(List<? extends MethodConfig> methods) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.addAll(methods);\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> provider(ProviderConfig provider) {\n-        this.provider = provider;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> providerIds(String providerIds) {\n-        this.providerIds = providerIds;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> generic(String generic) {\n-        this.generic = generic;\n-        return getThis();\n-    }\n-\n-//    @Override\n-//    public ServiceBuilder<U> mock(String mock) {\n-//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\n-//    }\n-\n-//    @Override\n-//    public ServiceBuilder<U> mock(Boolean mock) {\n-//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\n-//    }\n-\n-    public ServiceConfig<U> build() {\n-        ServiceConfig<U> serviceConfig = new ServiceConfig<>();\n-        super.build(serviceConfig);\n-\n-        serviceConfig.setInterface(interfaceName);\n-        serviceConfig.setInterface(interfaceClass);\n-        serviceConfig.setRef(ref);\n-        serviceConfig.setPath(path);\n-        serviceConfig.setMethods(methods);\n-        serviceConfig.setProvider(provider);\n-        serviceConfig.setProviderIds(providerIds);\n-        serviceConfig.setGeneric(generic);\n-\n-        return serviceConfig;\n-    }\n-\n-    @Override\n-    protected ServiceBuilder<U> getThis() {\n-        return this;\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.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ServiceConfigBase}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ServiceBuilder<U> extends AbstractServiceBuilder<ServiceConfig, ServiceBuilder<U>> {\r\n+    /**\r\n+     * The interface name of the exported service\r\n+     */\r\n+    private String interfaceName;\r\n+\r\n+    /**\r\n+     * The interface class of the exported service\r\n+     */\r\n+    private Class<?> interfaceClass;\r\n+\r\n+    /**\r\n+     * The reference of the interface implementation\r\n+     */\r\n+    private U ref;\r\n+\r\n+    /**\r\n+     * The service name\r\n+     */\r\n+    private String path;\r\n+\r\n+    /**\r\n+     * The method configuration\r\n+     */\r\n+    private List<MethodConfig> methods;\r\n+\r\n+    /**\r\n+     * The provider configuration\r\n+     */\r\n+    private ProviderConfig provider;\r\n+\r\n+    /**\r\n+     * The providerIds\r\n+     */\r\n+    private String providerIds;\r\n+    /**\r\n+     * whether it is a GenericService\r\n+     */\r\n+    private String generic;\r\n+\r\n+    public static ServiceBuilder newBuilder() {\r\n+        return new ServiceBuilder();\r\n+    }\r\n+\r\n+    public ServiceBuilder id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> interfaceName(String interfaceName) {\r\n+        this.interfaceName = interfaceName;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> interfaceClass(Class<?> interfaceClass) {\r\n+        this.interfaceClass = interfaceClass;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> ref(U ref) {\r\n+        this.ref = ref;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> path(String path) {\r\n+        this.path = path;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> addMethod(MethodConfig method) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.add(method);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> addMethods(List<? extends MethodConfig> methods) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.addAll(methods);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> provider(ProviderConfig provider) {\r\n+        this.provider = provider;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> providerIds(String providerIds) {\r\n+        this.providerIds = providerIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> generic(String generic) {\r\n+        this.generic = generic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+//    @Override\r\n+//    public ServiceBuilder<U> mock(String mock) {\r\n+//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\r\n+//    }\r\n+\r\n+//    @Override\r\n+//    public ServiceBuilder<U> mock(Boolean mock) {\r\n+//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\r\n+//    }\r\n+\r\n+    public ServiceConfig<U> build() {\r\n+        ServiceConfig<U> serviceConfig = new ServiceConfig<>();\r\n+        super.build(serviceConfig);\r\n+\r\n+        serviceConfig.setInterface(interfaceName);\r\n+        serviceConfig.setInterface(interfaceClass);\r\n+        serviceConfig.setRef(ref);\r\n+        serviceConfig.setPath(path);\r\n+        serviceConfig.setMethods(methods);\r\n+        serviceConfig.setProvider(provider);\r\n+        serviceConfig.setProviderIds(providerIds);\r\n+        serviceConfig.setGeneric(generic);\r\n+\r\n+        return serviceConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ServiceBuilder<U> getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/package-info.java", "source2": "org/apache/dubbo/config/bootstrap/builders/package-info.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,21 +1,21 @@\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- * A bunch of builder classes to facilitate programming of raw API.\n- * TODO, these are experimental APIs and are possible to change at any time before marked as production.\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+ * A bunch of builder classes to facilitate programming of raw API.\r\n+ * TODO, these are experimental APIs and are possible to change at any time before marked as production.\r\n+ */\r\n package org.apache.dubbo.config.bootstrap.builders;\n"}, {"source1": "org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java", "source2": "org/apache/dubbo/config/event/DubboServiceDestroyedEvent.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.config.event;\n-\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An {@link Event Dubbo event} when the Dubbo service is about to be destroyed.\n- *\n- * @see Event\n- * @since 2.7.5\n- */\n-public class DubboServiceDestroyedEvent extends Event {\n-\n-    public DubboServiceDestroyedEvent(Object source) {\n-        super(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.config.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 service is about to be destroyed.\r\n+ *\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboServiceDestroyedEvent extends Event {\r\n+\r\n+    public DubboServiceDestroyedEvent(Object source) {\r\n+        super(source);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java", "source2": "org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.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.config.event;\n-\n-import org.apache.dubbo.config.DubboShutdownHook;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An event raised when the {@link DubboShutdownHook} {@link Runtime#addShutdownHook(Thread) registered} on\n- * {@link ApplicationShutdownHooks JVM ShutdownHooks}\n- *\n- * @see DubboShutdownHook\n- * @see ApplicationShutdownHooks\n- * @since 2.7.5\n- */\n-public class DubboShutdownHookRegisteredEvent extends Event {\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param dubboShutdownHook The object on which the Event initially occurred.\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public DubboShutdownHookRegisteredEvent(DubboShutdownHook dubboShutdownHook) {\n-        super(dubboShutdownHook);\n-    }\n-\n-    public DubboShutdownHook getDubboShutdownHook() {\n-        return (DubboShutdownHook) getSource();\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.event;\r\n+\r\n+import org.apache.dubbo.config.DubboShutdownHook;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * An event raised when the {@link DubboShutdownHook} {@link Runtime#addShutdownHook(Thread) registered} on\r\n+ * {@link ApplicationShutdownHooks JVM ShutdownHooks}\r\n+ *\r\n+ * @see DubboShutdownHook\r\n+ * @see ApplicationShutdownHooks\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboShutdownHookRegisteredEvent extends Event {\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param dubboShutdownHook The object on which the Event initially occurred.\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public DubboShutdownHookRegisteredEvent(DubboShutdownHook dubboShutdownHook) {\r\n+        super(dubboShutdownHook);\r\n+    }\r\n+\r\n+    public DubboShutdownHook getDubboShutdownHook() {\r\n+        return (DubboShutdownHook) getSource();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java", "source2": "org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,45 +1,45 @@\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.event;\n-\n-import org.apache.dubbo.config.DubboShutdownHook;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An event raised when the {@link DubboShutdownHook} {@link Runtime#removeShutdownHook(Thread) unregistered} on\n- * {@link ApplicationShutdownHooks JVM ShutdownHooks}\n- *\n- * @see DubboShutdownHook\n- * @see ApplicationShutdownHooks\n- * @since 2.7.5\n- */\n-public class DubboShutdownHookUnregisteredEvent extends Event {\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param dubboShutdownHook The object on which the Event initially occurred.\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public DubboShutdownHookUnregisteredEvent(DubboShutdownHook dubboShutdownHook) {\n-        super(dubboShutdownHook);\n-    }\n-\n-    public DubboShutdownHook getDubboShutdownHook() {\n-        return (DubboShutdownHook) 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.config.event;\r\n+\r\n+import org.apache.dubbo.config.DubboShutdownHook;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * An event raised when the {@link DubboShutdownHook} {@link Runtime#removeShutdownHook(Thread) unregistered} on\r\n+ * {@link ApplicationShutdownHooks JVM ShutdownHooks}\r\n+ *\r\n+ * @see DubboShutdownHook\r\n+ * @see ApplicationShutdownHooks\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboShutdownHookUnregisteredEvent extends Event {\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param dubboShutdownHook The object on which the Event initially occurred.\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public DubboShutdownHookUnregisteredEvent(DubboShutdownHook dubboShutdownHook) {\r\n+        super(dubboShutdownHook);\r\n+    }\r\n+\r\n+    public DubboShutdownHook getDubboShutdownHook() {\r\n+        return (DubboShutdownHook) getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java", "source2": "org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.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.config.event;\n-\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * The {@link ReferenceConfig Dubbo service ReferenceConfig} destroyed {@link Event event}\n- *\n- * @see Reference\n- * @see ReferenceConfig#destroy()\n- * @see Event\n- * @since 2.7.5\n- */\n-public class ReferenceConfigDestroyedEvent extends Event {\n-\n-    public ReferenceConfigDestroyedEvent(ReferenceConfig referenceConfig) {\n-        super(referenceConfig);\n-    }\n-\n-    public ReferenceConfig getReferenceConfig() {\n-        return (ReferenceConfig) 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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.annotation.Reference;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * The {@link ReferenceConfig Dubbo service ReferenceConfig} destroyed {@link Event event}\r\n+ *\r\n+ * @see Reference\r\n+ * @see ReferenceConfig#destroy()\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ReferenceConfigDestroyedEvent extends Event {\r\n+\r\n+    public ReferenceConfigDestroyedEvent(ReferenceConfig referenceConfig) {\r\n+        super(referenceConfig);\r\n+    }\r\n+\r\n+    public ReferenceConfig getReferenceConfig() {\r\n+        return (ReferenceConfig) getSource();\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java", "source2": "org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.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.event;\n-\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.rpc.Invoker;\n-\n-/**\n- * The {@link ReferenceConfig Dubbo service ReferenceConfig} initialized {@link Event event}\n- *\n- * @see Reference\n- * @see ReferenceConfig#get()\n- * @see Event\n- * @since 2.7.5\n- */\n-public class ReferenceConfigInitializedEvent extends Event {\n-\n-    private final Invoker<?> invoker;\n-\n-    public ReferenceConfigInitializedEvent(ReferenceConfig referenceConfig, Invoker<?> invoker) {\n-        super(referenceConfig);\n-        this.invoker = invoker;\n-    }\n-\n-    public ReferenceConfig getReferenceConfig() {\n-        return (ReferenceConfig) getSource();\n-    }\n-\n-    public Invoker<?> getInvoker() {\n-        return invoker;\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.event;\r\n+\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.annotation.Reference;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+\r\n+/**\r\n+ * The {@link ReferenceConfig Dubbo service ReferenceConfig} initialized {@link Event event}\r\n+ *\r\n+ * @see Reference\r\n+ * @see ReferenceConfig#get()\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ReferenceConfigInitializedEvent extends Event {\r\n+\r\n+    private final Invoker<?> invoker;\r\n+\r\n+    public ReferenceConfigInitializedEvent(ReferenceConfig referenceConfig, Invoker<?> invoker) {\r\n+        super(referenceConfig);\r\n+        this.invoker = invoker;\r\n+    }\r\n+\r\n+    public ReferenceConfig getReferenceConfig() {\r\n+        return (ReferenceConfig) getSource();\r\n+    }\r\n+\r\n+    public Invoker<?> getInvoker() {\r\n+        return invoker;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/ServiceConfigExportedEvent.java", "source2": "org/apache/dubbo/config/event/ServiceConfigExportedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,36 +1,36 @@\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.event;\n-\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * {@link ServiceConfig} event post-{@link ServiceConfig#export() export}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceConfigExportedEvent extends Event {\n-\n-    public ServiceConfigExportedEvent(ServiceConfig source) {\n-        super(source);\n-    }\n-\n-    public ServiceConfig getServiceConfig() {\n-        return (ServiceConfig) 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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * {@link ServiceConfig} event post-{@link ServiceConfig#export() export}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceConfigExportedEvent extends Event {\r\n+\r\n+    public ServiceConfigExportedEvent(ServiceConfig source) {\r\n+        super(source);\r\n+    }\r\n+\r\n+    public ServiceConfig getServiceConfig() {\r\n+        return (ServiceConfig) getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java", "source2": "org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,36 +1,36 @@\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.event;\n-\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * {@link ServiceConfig} event post-{@link ServiceConfig#unexport() unexport}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceConfigUnexportedEvent extends Event {\n-\n-    public ServiceConfigUnexportedEvent(ServiceConfig source) {\n-        super(source);\n-    }\n-\n-    public ServiceConfig getServiceConfig() {\n-        return (ServiceConfig) 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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * {@link ServiceConfig} event post-{@link ServiceConfig#unexport() unexport}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceConfigUnexportedEvent extends Event {\r\n+\r\n+    public ServiceConfigUnexportedEvent(ServiceConfig source) {\r\n+        super(source);\r\n+    }\r\n+\r\n+    public ServiceConfig getServiceConfig() {\r\n+        return (ServiceConfig) getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/listener/LoggingEventListener.java", "source2": "org/apache/dubbo/config/event/listener/LoggingEventListener.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.config.event.listener;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.event.DubboServiceDestroyedEvent;\n-import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.GenericEventListener;\n-\n-import static java.lang.String.format;\n-\n-/**\n- * A listener for logging the {@link Event Dubbo event}\n- *\n- * @see ServiceConfigExportedEvent\n- * @since 2.7.5\n- */\n-public class LoggingEventListener extends GenericEventListener {\n-\n-    private static final String NAME = \"Dubbo Service\";\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    public void onEvent(DubboServiceDestroyedEvent event) {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(NAME + \" has been destroyed.\");\n-        }\n-    }\n-\n-    private void debug(String pattern, Object... args) {\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(format(pattern, args));\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.event.listener;\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.config.event.DubboServiceDestroyedEvent;\r\n+import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.GenericEventListener;\r\n+\r\n+import static java.lang.String.format;\r\n+\r\n+/**\r\n+ * A listener for logging the {@link Event Dubbo event}\r\n+ *\r\n+ * @see ServiceConfigExportedEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+public class LoggingEventListener extends GenericEventListener {\r\n+\r\n+    private static final String NAME = \"Dubbo Service\";\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    public void onEvent(DubboServiceDestroyedEvent event) {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(NAME + \" has been destroyed.\");\r\n+        }\r\n+    }\r\n+\r\n+    private void debug(String pattern, Object... args) {\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(format(pattern, args));\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java", "source2": "org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.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.config.invoker;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-/**\n- *\n- * A Invoker wrapper that wrap the invoker and all the metadata (ServiceConfig)\n- */\n-public class DelegateProviderMetaDataInvoker<T> implements Invoker {\n-    protected final Invoker<T> invoker;\n-    private ServiceConfig<?> metadata;\n-\n-    public DelegateProviderMetaDataInvoker(Invoker<T> invoker, ServiceConfig<?> metadata) {\n-        this.invoker = invoker;\n-        this.metadata = metadata;\n-    }\n-\n-    @Override\n-    public Class<T> getInterface() {\n-        return invoker.getInterface();\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return invoker.getUrl();\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return invoker.isAvailable();\n-    }\n-\n-    @Override\n-    public Result invoke(Invocation invocation) throws RpcException {\n-        return invoker.invoke(invocation);\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        invoker.destroy();\n-    }\n-\n-    public ServiceConfig<?> getMetadata() {\n-        return metadata;\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.invoker;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+/**\r\n+ *\r\n+ * A Invoker wrapper that wrap the invoker and all the metadata (ServiceConfig)\r\n+ */\r\n+public class DelegateProviderMetaDataInvoker<T> implements Invoker {\r\n+    protected final Invoker<T> invoker;\r\n+    private ServiceConfig<?> metadata;\r\n+\r\n+    public DelegateProviderMetaDataInvoker(Invoker<T> invoker, ServiceConfig<?> metadata) {\r\n+        this.invoker = invoker;\r\n+        this.metadata = metadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Class<T> getInterface() {\r\n+        return invoker.getInterface();\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return invoker.getUrl();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return invoker.isAvailable();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Result invoke(Invocation invocation) throws RpcException {\r\n+        return invoker.invoke(invocation);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        invoker.destroy();\r\n+    }\r\n+\r\n+    public ServiceConfig<?> getMetadata() {\r\n+        return metadata;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java", "source2": "org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,129 +1,129 @@\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.metadata;\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.config.ApplicationConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.MetadataServiceExporter;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-import static java.util.Collections.emptyList;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-\n-/**\n- * {@link MetadataServiceExporter} implementation based on {@link ConfigManager Dubbo configurations}, the clients\n- * should make sure the {@link ApplicationConfig}, {@link RegistryConfig} and {@link ProtocolConfig} are ready before\n- * {@link #export()}.\n- * <p>\n- * Typically, do not worry about their ready status, because they are initialized before\n- * any {@link ServiceConfig} exports, or The Dubbo export will be failed.\n- * <p>\n- * Being aware of it's not a thread-safe implementation.\n- *\n- * @see MetadataServiceExporter\n- * @see ServiceConfig\n- * @see ConfigManager\n- * @since 2.7.5\n- */\n-public class ConfigurableMetadataServiceExporter implements MetadataServiceExporter {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final MetadataService metadataService;\n-\n-    private volatile ServiceConfig<MetadataService> serviceConfig;\n-\n-    public ConfigurableMetadataServiceExporter(MetadataService metadataService) {\n-        this.metadataService = metadataService;\n-    }\n-\n-    @Override\n-    public ConfigurableMetadataServiceExporter export() {\n-\n-        if (!isExported()) {\n-\n-            ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();\n-            serviceConfig.setApplication(getApplicationConfig());\n-            serviceConfig.setRegistries(getRegistries());\n-            serviceConfig.setProtocol(generateMetadataProtocol());\n-            serviceConfig.setInterface(MetadataService.class);\n-            serviceConfig.setRef(metadataService);\n-            serviceConfig.setGroup(getApplicationConfig().getName());\n-            serviceConfig.setVersion(metadataService.version());\n-\n-            // export\n-            serviceConfig.export();\n-\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"The MetadataService exports urls : \" + serviceConfig.getExportedUrls());\n-            }\n-\n-            this.serviceConfig = serviceConfig;\n-\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"The MetadataService has been exported : \" + serviceConfig.getExportedUrls());\n-            }\n-        }\n-\n-        return this;\n-    }\n-\n-    @Override\n-    public ConfigurableMetadataServiceExporter unexport() {\n-        if (isExported()) {\n-            serviceConfig.unexport();\n-        }\n-        return this;\n-    }\n-\n-    @Override\n-    public List<URL> getExportedURLs() {\n-        return serviceConfig != null ? serviceConfig.getExportedUrls() : emptyList();\n-    }\n-\n-    public boolean isExported() {\n-        return serviceConfig != null && serviceConfig.isExported();\n-    }\n-\n-    private ApplicationConfig getApplicationConfig() {\n-        return ApplicationModel.getConfigManager().getApplication().get();\n-    }\n-\n-    private List<RegistryConfig> getRegistries() {\n-        return new ArrayList<>(ApplicationModel.getConfigManager().getRegistries());\n-    }\n-\n-    private ProtocolConfig generateMetadataProtocol() {\n-        ProtocolConfig defaultProtocol = new ProtocolConfig();\n-        defaultProtocol.setName(DUBBO);\n-        // defaultProtocol.setHost() ?\n-        // auto-increment port\n-        defaultProtocol.setPort(-1);\n-        return defaultProtocol;\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.metadata;\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.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.MetadataServiceExporter;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+import static java.util.Collections.emptyList;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+\r\n+/**\r\n+ * {@link MetadataServiceExporter} implementation based on {@link ConfigManager Dubbo configurations}, the clients\r\n+ * should make sure the {@link ApplicationConfig}, {@link RegistryConfig} and {@link ProtocolConfig} are ready before\r\n+ * {@link #export()}.\r\n+ * <p>\r\n+ * Typically, do not worry about their ready status, because they are initialized before\r\n+ * any {@link ServiceConfig} exports, or The Dubbo export will be failed.\r\n+ * <p>\r\n+ * Being aware of it's not a thread-safe implementation.\r\n+ *\r\n+ * @see MetadataServiceExporter\r\n+ * @see ServiceConfig\r\n+ * @see ConfigManager\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ConfigurableMetadataServiceExporter implements MetadataServiceExporter {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final MetadataService metadataService;\r\n+\r\n+    private volatile ServiceConfig<MetadataService> serviceConfig;\r\n+\r\n+    public ConfigurableMetadataServiceExporter(MetadataService metadataService) {\r\n+        this.metadataService = metadataService;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ConfigurableMetadataServiceExporter export() {\r\n+\r\n+        if (!isExported()) {\r\n+\r\n+            ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();\r\n+            serviceConfig.setApplication(getApplicationConfig());\r\n+            serviceConfig.setRegistries(getRegistries());\r\n+            serviceConfig.setProtocol(generateMetadataProtocol());\r\n+            serviceConfig.setInterface(MetadataService.class);\r\n+            serviceConfig.setRef(metadataService);\r\n+            serviceConfig.setGroup(getApplicationConfig().getName());\r\n+            serviceConfig.setVersion(metadataService.version());\r\n+\r\n+            // export\r\n+            serviceConfig.export();\r\n+\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"The MetadataService exports urls : \" + serviceConfig.getExportedUrls());\r\n+            }\r\n+\r\n+            this.serviceConfig = serviceConfig;\r\n+\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"The MetadataService has been exported : \" + serviceConfig.getExportedUrls());\r\n+            }\r\n+        }\r\n+\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ConfigurableMetadataServiceExporter unexport() {\r\n+        if (isExported()) {\r\n+            serviceConfig.unexport();\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> getExportedURLs() {\r\n+        return serviceConfig != null ? serviceConfig.getExportedUrls() : emptyList();\r\n+    }\r\n+\r\n+    public boolean isExported() {\r\n+        return serviceConfig != null && serviceConfig.isExported();\r\n+    }\r\n+\r\n+    private ApplicationConfig getApplicationConfig() {\r\n+        return ApplicationModel.getConfigManager().getApplication().get();\r\n+    }\r\n+\r\n+    private List<RegistryConfig> getRegistries() {\r\n+        return new ArrayList<>(ApplicationModel.getConfigManager().getRegistries());\r\n+    }\r\n+\r\n+    private ProtocolConfig generateMetadataProtocol() {\r\n+        ProtocolConfig defaultProtocol = new ProtocolConfig();\r\n+        defaultProtocol.setName(DUBBO);\r\n+        // defaultProtocol.setHost() ?\r\n+        // auto-increment port\r\n+        defaultProtocol.setPort(-1);\r\n+        return defaultProtocol;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java", "source2": "org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.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.config.metadata;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Collection;\n-import java.util.stream.Stream;\n-\n-/**\n- * The {@link ServiceInstanceCustomizer} to customize the {@link ServiceInstance#getPort() port} of service instance.\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstancePortCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-\n-        if (serviceInstance.getPort() != null) {\n-            return;\n-        }\n-\n-        Collection<ProtocolConfig> protocols = ApplicationModel.getConfigManager()\n-                .getProtocols();\n-\n-        if (CollectionUtils.isEmpty(protocols)) {\n-            throw new IllegalStateException(\"We should have at least one protocol configured at this point.\");\n-        }\n-\n-        Stream<ProtocolConfig> protocolStream = protocols.stream();\n-        ProtocolConfig protocolConfig = protocolStream\n-                // use rest as service instance's default protocol.\n-                .filter(protocol -> \"rest\".equals(protocol.getName()))\n-                .findFirst()\n-                .orElseGet(() -> protocolStream.findFirst().get());\n-\n-        if (serviceInstance instanceof DefaultServiceInstance) {\n-            DefaultServiceInstance instance = (DefaultServiceInstance) serviceInstance;\n-            if (protocolConfig.getPort() != null) {\n-                instance.setPort(protocolConfig.getPort());\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.metadata;\r\n+\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.stream.Stream;\r\n+\r\n+/**\r\n+ * The {@link ServiceInstanceCustomizer} to customize the {@link ServiceInstance#getPort() port} of service instance.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancePortCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+\r\n+        if (serviceInstance.getPort() != null) {\r\n+            return;\r\n+        }\r\n+\r\n+        Collection<ProtocolConfig> protocols = ApplicationModel.getConfigManager()\r\n+                .getProtocols();\r\n+\r\n+        if (CollectionUtils.isEmpty(protocols)) {\r\n+            throw new IllegalStateException(\"We should have at least one protocol configured at this point.\");\r\n+        }\r\n+\r\n+        Stream<ProtocolConfig> protocolStream = protocols.stream();\r\n+        ProtocolConfig protocolConfig = protocolStream\r\n+                // use rest as service instance's default protocol.\r\n+                .filter(protocol -> \"rest\".equals(protocol.getName()))\r\n+                .findFirst()\r\n+                .orElseGet(() -> protocolStream.findFirst().get());\r\n+\r\n+        if (serviceInstance instanceof DefaultServiceInstance) {\r\n+            DefaultServiceInstance instance = (DefaultServiceInstance) serviceInstance;\r\n+            if (protocolConfig.getPort() != null) {\r\n+                instance.setPort(protocolConfig.getPort());\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/utils/ConfigValidationUtils.java", "source2": "org/apache/dubbo/config/utils/ConfigValidationUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,658 +1,658 @@\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.utils;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\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.serialize.Serialization;\n-import org.apache.dubbo.common.status.StatusChecker;\n-import org.apache.dubbo.common.threadpool.ThreadPool;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.config.AbstractConfig;\n-import org.apache.dubbo.config.AbstractInterfaceConfig;\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.MethodConfig;\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.ReferenceConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.SslConfig;\n-import org.apache.dubbo.monitor.MonitorFactory;\n-import org.apache.dubbo.monitor.MonitorService;\n-import org.apache.dubbo.registry.RegistryService;\n-import org.apache.dubbo.remoting.Codec2;\n-import org.apache.dubbo.remoting.Dispatcher;\n-import org.apache.dubbo.remoting.Transporter;\n-import org.apache.dubbo.remoting.exchange.Exchanger;\n-import org.apache.dubbo.remoting.telnet.TelnetHandler;\n-import org.apache.dubbo.rpc.ExporterListener;\n-import org.apache.dubbo.rpc.Filter;\n-import org.apache.dubbo.rpc.InvokerListener;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.LoadBalance;\n-import org.apache.dubbo.rpc.support.MockInvoker;\n-\n-import java.net.InetAddress;\n-import java.net.UnknownHostException;\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.regex.Matcher;\n-import java.util.regex.Pattern;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;\n-import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PASSWORD_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.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;\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-import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-import static org.apache.dubbo.common.utils.UrlUtils.isServiceDiscoveryRegistryType;\n-import static org.apache.dubbo.config.Constants.ARCHITECTURE;\n-import static org.apache.dubbo.config.Constants.CONTEXTPATH_KEY;\n-import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\n-import static org.apache.dubbo.config.Constants.ENVIRONMENT;\n-import static org.apache.dubbo.config.Constants.IGNORE_CHECK_KEYS;\n-import static org.apache.dubbo.config.Constants.LAYER_KEY;\n-import static org.apache.dubbo.config.Constants.NAME;\n-import static org.apache.dubbo.config.Constants.ORGANIZATION;\n-import static org.apache.dubbo.config.Constants.OWNER;\n-import static org.apache.dubbo.config.Constants.STATUS_KEY;\n-import static org.apache.dubbo.monitor.Constants.LOGSTAT_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.SUBSCRIBE_KEY;\n-import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\n-import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\n-import static org.apache.dubbo.remoting.Constants.DISPATCHER_KEY;\n-import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERVER_KEY;\n-import static org.apache.dubbo.remoting.Constants.TELNET;\n-import static org.apache.dubbo.remoting.Constants.TRANSPORTER_KEY;\n-import static org.apache.dubbo.rpc.Constants.FAIL_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.FORCE_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.LOCAL_KEY;\n-import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\n-import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\n-import static org.apache.dubbo.rpc.Constants.RETURN_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.THROW_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-\n-public class ConfigValidationUtils {\n-    private static final Logger logger = LoggerFactory.getLogger(ConfigValidationUtils.class);\n-    /**\n-     * The maximum length of a <b>parameter's value</b>\n-     */\n-    private static final int MAX_LENGTH = 200;\n-\n-    /**\n-     * The maximum length of a <b>path</b>\n-     */\n-    private static final int MAX_PATH_LENGTH = 200;\n-\n-    /**\n-     * The rule qualification for <b>name</b>\n-     */\n-    private static final Pattern PATTERN_NAME = Pattern.compile(\"[\\\\-._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The rule qualification for <b>multiply name</b>\n-     */\n-    private static final Pattern PATTERN_MULTI_NAME = Pattern.compile(\"[,\\\\-._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The rule qualification for <b>method names</b>\n-     */\n-    private static final Pattern PATTERN_METHOD_NAME = Pattern.compile(\"[a-zA-Z][0-9a-zA-Z]*\");\n-\n-    /**\n-     * The rule qualification for <b>path</b>\n-     */\n-    private static final Pattern PATTERN_PATH = Pattern.compile(\"[/\\\\-$._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The pattern matches a value who has a symbol\n-     */\n-    private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile(\"[:*,\\\\s/\\\\-._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The pattern matches a property key\n-     */\n-    private static final Pattern PATTERN_KEY = Pattern.compile(\"[*,\\\\-._0-9a-zA-Z]+\");\n-\n-    public static final String IPV6_START_MARK = \"[\";\n-\n-    public static final String IPV6_END_MARK = \"]\";\n-\n-\n-    public static List<URL> loadRegistries(AbstractInterfaceConfig interfaceConfig, boolean provider) {\n-        // check && override if necessary\n-        List<URL> registryList = new ArrayList<URL>();\n-        ApplicationConfig application = interfaceConfig.getApplication();\n-        List<RegistryConfig> registries = interfaceConfig.getRegistries();\n-        if (CollectionUtils.isNotEmpty(registries)) {\n-            for (RegistryConfig config : registries) {\n-                String address = config.getAddress();\n-                if (StringUtils.isEmpty(address)) {\n-                    address = ANYHOST_VALUE;\n-                }\n-                if (!RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {\n-                    Map<String, String> map = new HashMap<String, String>();\n-                    AbstractConfig.appendParameters(map, application);\n-                    AbstractConfig.appendParameters(map, config);\n-                    map.put(PATH_KEY, RegistryService.class.getName());\n-                    AbstractInterfaceConfig.appendRuntimeParameters(map);\n-                    if (!map.containsKey(PROTOCOL_KEY)) {\n-                        map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\n-                    }\n-                    List<URL> urls = UrlUtils.parseURLs(address, map);\n-\n-                    for (URL url : urls) {\n-\n-                        url = URLBuilder.from(url)\n-                                .addParameter(REGISTRY_KEY, url.getProtocol())\n-                                .setProtocol(extractRegistryType(url))\n-                                .build();\n-                        if ((provider && url.getParameter(REGISTER_KEY, true))\n-                                || (!provider && url.getParameter(SUBSCRIBE_KEY, true))) {\n-                            registryList.add(url);\n-                        }\n-                    }\n-                }\n-            }\n-        }\n-        return genCompatibleRegistries(registryList, provider);\n-    }\n-\n-    private static List<URL> genCompatibleRegistries(List<URL> registryList, boolean provider) {\n-        List<URL> result = new ArrayList<>(registryList.size());\n-        registryList.forEach(registryURL -> {\n-            result.add(registryURL);\n-            if (provider) {\n-                // for registries enabled service discovery, automatically register interface compatible addresses.\n-                if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())\n-                        && registryURL.getParameter(REGISTRY_PUBLISH_INTERFACE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getBoolean(DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY, false))\n-                        && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) {\n-                    URL interfaceCompatibleRegistryURL = URLBuilder.from(registryURL)\n-                            .setProtocol(REGISTRY_PROTOCOL)\n-                            .removeParameter(REGISTRY_TYPE_KEY)\n-                            .build();\n-                    result.add(interfaceCompatibleRegistryURL);\n-                }\n-            }\n-        });\n-        return result;\n-    }\n-\n-    private static boolean registryNotExists(URL registryURL, List<URL> registryList, String registryType) {\n-        return registryList.stream().noneMatch(\n-                url -> registryType.equals(url.getProtocol()) && registryURL.getBackupAddress().equals(url.getBackupAddress())\n-        );\n-    }\n-\n-    public static URL loadMonitor(AbstractInterfaceConfig interfaceConfig, URL registryURL) {\n-        Map<String, String> map = new HashMap<String, String>();\n-        map.put(INTERFACE_KEY, MonitorService.class.getName());\n-        AbstractInterfaceConfig.appendRuntimeParameters(map);\n-        //set ip\n-        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\n-        if (StringUtils.isEmpty(hostToRegistry)) {\n-            hostToRegistry = NetUtils.getLocalHost();\n-        } else if (NetUtils.isInvalidLocalHost(hostToRegistry)) {\n-            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" +\n-                    DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\n-        }\n-        map.put(REGISTER_IP_KEY, hostToRegistry);\n-\n-        MonitorConfig monitor = interfaceConfig.getMonitor();\n-        ApplicationConfig application = interfaceConfig.getApplication();\n-        AbstractConfig.appendParameters(map, monitor);\n-        AbstractConfig.appendParameters(map, application);\n-        String address = null;\n-        String sysaddress = System.getProperty(\"dubbo.monitor.address\");\n-        if (sysaddress != null && sysaddress.length() > 0) {\n-            address = sysaddress;\n-        } else if (monitor != null) {\n-            address = monitor.getAddress();\n-        }\n-        if (ConfigUtils.isNotEmpty(address)) {\n-            if (!map.containsKey(PROTOCOL_KEY)) {\n-                if (getExtensionLoader(MonitorFactory.class).hasExtension(LOGSTAT_PROTOCOL)) {\n-                    map.put(PROTOCOL_KEY, LOGSTAT_PROTOCOL);\n-                } else {\n-                    map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\n-                }\n-            }\n-            return UrlUtils.parseURL(address, map);\n-        } else if (monitor != null &&\n-                (REGISTRY_PROTOCOL.equals(monitor.getProtocol()) || SERVICE_REGISTRY_PROTOCOL.equals(monitor.getProtocol()))\n-                && registryURL != null) {\n-            return URLBuilder.from(registryURL)\n-                    .setProtocol(DUBBO_PROTOCOL)\n-                    .addParameter(PROTOCOL_KEY, monitor.getProtocol())\n-                    .addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map))\n-                    .build();\n-        }\n-        return null;\n-    }\n-\n-    /**\n-     * Legitimacy check and setup of local simulated operations. The operations can be a string with Simple operation or\n-     * a classname whose {@link Class} implements a particular function\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 that will be referenced\n-     */\n-    public static void checkMock(Class<?> interfaceClass, AbstractInterfaceConfig config) {\n-        String mock = config.getMock();\n-        if (ConfigUtils.isEmpty(mock)) {\n-            return;\n-        }\n-\n-        String normalizedMock = MockInvoker.normalizeMock(mock);\n-        if (normalizedMock.startsWith(RETURN_PREFIX)) {\n-            normalizedMock = normalizedMock.substring(RETURN_PREFIX.length()).trim();\n-            try {\n-                //Check whether the mock value is legal, if it is illegal, throw exception\n-                MockInvoker.parseMockValue(normalizedMock);\n-            } catch (Exception e) {\n-                throw new IllegalStateException(\"Illegal mock return in <dubbo:service/reference ... \" +\n-                        \"mock=\\\"\" + mock + \"\\\" />\");\n-            }\n-        } else if (normalizedMock.startsWith(THROW_PREFIX)) {\n-            normalizedMock = normalizedMock.substring(THROW_PREFIX.length()).trim();\n-            if (ConfigUtils.isNotEmpty(normalizedMock)) {\n-                try {\n-                    //Check whether the mock value is legal\n-                    MockInvoker.getThrowable(normalizedMock);\n-                } catch (Exception e) {\n-                    throw new IllegalStateException(\"Illegal mock throw in <dubbo:service/reference ... \" +\n-                            \"mock=\\\"\" + mock + \"\\\" />\");\n-                }\n-            }\n-        } else {\n-            //Check whether the mock class is a implementation of the interfaceClass, and if it has a default constructor\n-            MockInvoker.getMockObject(normalizedMock, interfaceClass);\n-        }\n-    }\n-\n-    public static void validateAbstractInterfaceConfig(AbstractInterfaceConfig config) {\n-        checkName(LOCAL_KEY, config.getLocal());\n-        checkName(\"stub\", config.getStub());\n-        checkMultiName(\"owner\", config.getOwner());\n-\n-        checkExtension(ProxyFactory.class, PROXY_KEY, config.getProxy());\n-        checkExtension(Cluster.class, CLUSTER_KEY, config.getCluster());\n-        checkMultiExtension(Filter.class, FILE_KEY, config.getFilter());\n-        checkNameHasSymbol(LAYER_KEY, config.getLayer());\n-\n-        List<MethodConfig> methods = config.getMethods();\n-        if (CollectionUtils.isNotEmpty(methods)) {\n-            methods.forEach(ConfigValidationUtils::validateMethodConfig);\n-        }\n-    }\n-\n-    public static void validateServiceConfig(ServiceConfig config) {\n-        checkKey(VERSION_KEY, config.getVersion());\n-        checkKey(GROUP_KEY, config.getGroup());\n-        checkName(TOKEN_KEY, config.getToken());\n-        checkPathName(PATH_KEY, config.getPath());\n-\n-        checkMultiExtension(ExporterListener.class, \"listener\", config.getListener());\n-\n-        validateAbstractInterfaceConfig(config);\n-\n-        List<RegistryConfig> registries = config.getRegistries();\n-        if (registries != null) {\n-            for (RegistryConfig registry : registries) {\n-                validateRegistryConfig(registry);\n-            }\n-        }\n-\n-        List<ProtocolConfig> protocols = config.getProtocols();\n-        if (protocols != null) {\n-            for (ProtocolConfig protocol : protocols) {\n-                validateProtocolConfig(protocol);\n-            }\n-        }\n-\n-        ProviderConfig providerConfig = config.getProvider();\n-        if (providerConfig != null) {\n-            validateProviderConfig(providerConfig);\n-        }\n-    }\n-\n-    public static void validateReferenceConfig(ReferenceConfig config) {\n-        checkMultiExtension(InvokerListener.class, \"listener\", config.getListener());\n-        checkKey(VERSION_KEY, config.getVersion());\n-        checkKey(GROUP_KEY, config.getGroup());\n-        checkName(CLIENT_KEY, config.getClient());\n-\n-        validateAbstractInterfaceConfig(config);\n-\n-        List<RegistryConfig> registries = config.getRegistries();\n-        if (registries != null) {\n-            for (RegistryConfig registry : registries) {\n-                validateRegistryConfig(registry);\n-            }\n-        }\n-\n-        ConsumerConfig consumerConfig = config.getConsumer();\n-        if (consumerConfig != null) {\n-            validateConsumerConfig(consumerConfig);\n-        }\n-    }\n-\n-    public static void validateConfigCenterConfig(ConfigCenterConfig config) {\n-        if (config != null) {\n-            checkParameterName(config.getParameters());\n-        }\n-    }\n-\n-    public static void validateApplicationConfig(ApplicationConfig config) {\n-        if (config == null) {\n-            return;\n-        }\n-\n-        if (!config.isValid()) {\n-            throw new IllegalStateException(\"No application config found or it's not a valid config! \" +\n-                    \"Please add <dubbo:application name=\\\"...\\\" /> to your spring config.\");\n-        }\n-\n-        // backward compatibility\n-        String wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_KEY);\n-        if (wait != null && wait.trim().length() > 0) {\n-            System.setProperty(SHUTDOWN_WAIT_KEY, wait.trim());\n-        } else {\n-            wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_SECONDS_KEY);\n-            if (wait != null && wait.trim().length() > 0) {\n-                System.setProperty(SHUTDOWN_WAIT_SECONDS_KEY, wait.trim());\n-            }\n-        }\n-\n-        checkName(NAME, config.getName());\n-        checkMultiName(OWNER, config.getOwner());\n-        checkName(ORGANIZATION, config.getOrganization());\n-        checkName(ARCHITECTURE, config.getArchitecture());\n-        checkName(ENVIRONMENT, config.getEnvironment());\n-        checkParameterName(config.getParameters());\n-    }\n-\n-    public static void validateModuleConfig(ModuleConfig config) {\n-        if (config != null) {\n-            checkName(NAME, config.getName());\n-            checkName(OWNER, config.getOwner());\n-            checkName(ORGANIZATION, config.getOrganization());\n-        }\n-    }\n-\n-    public static void validateMetadataConfig(MetadataReportConfig metadataReportConfig) {\n-        if (metadataReportConfig == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateMetricsConfig(MetricsConfig metricsConfig) {\n-        if (metricsConfig == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateSslConfig(SslConfig sslConfig) {\n-        if (sslConfig == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateMonitorConfig(MonitorConfig config) {\n-        if (config != null) {\n-            if (!config.isValid()) {\n-                logger.info(\"There's no valid monitor config found, if you want to open monitor statistics for Dubbo, \" +\n-                        \"please make sure your monitor is configured properly.\");\n-            }\n-\n-            checkParameterName(config.getParameters());\n-        }\n-    }\n-\n-    public static void validateProtocolConfig(ProtocolConfig config) {\n-        if (config != null) {\n-            String name = config.getName();\n-            checkName(\"name\", name);\n-            checkHost(HOST_KEY, config.getHost());\n-            checkPathName(\"contextpath\", config.getContextpath());\n-\n-\n-            if (DUBBO_PROTOCOL.equals(name)) {\n-                checkMultiExtension(Codec2.class, CODEC_KEY, config.getCodec());\n-                checkMultiExtension(Serialization.class, SERIALIZATION_KEY, config.getSerialization());\n-                checkMultiExtension(Transporter.class, SERVER_KEY, config.getServer());\n-                checkMultiExtension(Transporter.class, CLIENT_KEY, config.getClient());\n-            }\n-\n-            checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\n-            checkMultiExtension(StatusChecker.class, \"status\", config.getStatus());\n-            checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\n-            checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\n-            checkExtension(Dispatcher.class, DISPATCHER_KEY, config.getDispatcher());\n-            checkExtension(Dispatcher.class, \"dispather\", config.getDispather());\n-            checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\n-        }\n-    }\n-\n-    public static void validateProviderConfig(ProviderConfig config) {\n-        checkPathName(CONTEXTPATH_KEY, config.getContextpath());\n-        checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\n-        checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\n-        checkMultiExtension(StatusChecker.class, STATUS_KEY, config.getStatus());\n-        checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\n-        checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\n-    }\n-\n-    public static void validateConsumerConfig(ConsumerConfig config) {\n-        if (config == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateRegistryConfig(RegistryConfig config) {\n-        checkName(PROTOCOL_KEY, config.getProtocol());\n-        checkName(USERNAME_KEY, config.getUsername());\n-        checkLength(PASSWORD_KEY, config.getPassword());\n-        checkPathLength(FILE_KEY, config.getFile());\n-        checkName(TRANSPORTER_KEY, config.getTransporter());\n-        checkName(SERVER_KEY, config.getServer());\n-        checkName(CLIENT_KEY, config.getClient());\n-        checkParameterName(config.getParameters());\n-    }\n-\n-    public static void validateMethodConfig(MethodConfig config) {\n-        checkExtension(LoadBalance.class, LOADBALANCE_KEY, config.getLoadbalance());\n-        checkParameterName(config.getParameters());\n-        checkMethodName(\"name\", config.getName());\n-\n-        String mock = config.getMock();\n-        if (StringUtils.isNotEmpty(mock)) {\n-            if (mock.startsWith(RETURN_PREFIX) || mock.startsWith(THROW_PREFIX + \" \")) {\n-                checkLength(MOCK_KEY, mock);\n-            } else if (mock.startsWith(FAIL_PREFIX) || mock.startsWith(FORCE_PREFIX)) {\n-                checkNameHasSymbol(MOCK_KEY, mock);\n-            } else {\n-                checkName(MOCK_KEY, mock);\n-            }\n-        }\n-    }\n-\n-    private static String extractRegistryType(URL url) {\n-        return isServiceDiscoveryRegistryType(url) ? SERVICE_REGISTRY_PROTOCOL : REGISTRY_PROTOCOL;\n-    }\n-\n-    public static void checkExtension(Class<?> type, String property, String value) {\n-        checkName(property, value);\n-        if (StringUtils.isNotEmpty(value)\n-                && !ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {\n-            throw new IllegalStateException(\"No such extension \" + value + \" for \" + property + \"/\" + type.getName());\n-        }\n-    }\n-\n-    /**\n-     * Check whether there is a <code>Extension</code> who's name (property) is <code>value</code> (special treatment is\n-     * required)\n-     *\n-     * @param type     The Extension type\n-     * @param property The extension key\n-     * @param value    The Extension name\n-     */\n-    public static void checkMultiExtension(Class<?> type, String property, String value) {\n-        checkMultiName(property, value);\n-        if (StringUtils.isNotEmpty(value)) {\n-            String[] values = value.split(\"\\\\s*[,]+\\\\s*\");\n-            for (String v : values) {\n-                if (v.startsWith(REMOVE_VALUE_PREFIX)) {\n-                    v = v.substring(1);\n-                }\n-                if (DEFAULT_KEY.equals(v)) {\n-                    continue;\n-                }\n-                if (!ExtensionLoader.getExtensionLoader(type).hasExtension(v)) {\n-                    throw new IllegalStateException(\"No such extension \" + v + \" for \" + property + \"/\" + type.getName());\n-                }\n-            }\n-        }\n-    }\n-\n-    public static void checkLength(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, null);\n-    }\n-\n-    public static void checkPathLength(String property, String value) {\n-        checkProperty(property, value, MAX_PATH_LENGTH, null);\n-    }\n-\n-    public static void checkName(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);\n-    }\n-\n-    public static void checkHost(String property, String value) {\n-        if (StringUtils.isEmpty(value)) {\n-            return;\n-        }\n-        if (value.startsWith(IPV6_START_MARK) && value.endsWith(IPV6_END_MARK)) {\n-            // if the value start with \"[\" and end with \"]\", check whether it is IPV6\n-            try {\n-                InetAddress.getByName(value);\n-                return;\n-            } catch (UnknownHostException e) {\n-                // not a IPv6 string, do nothing, go on to checkName\n-            }\n-        }\n-        checkName(property, value);\n-    }\n-\n-    public static void checkNameHasSymbol(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);\n-    }\n-\n-    public static void checkKey(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);\n-    }\n-\n-    public static void checkMultiName(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);\n-    }\n-\n-    public static void checkPathName(String property, String value) {\n-        checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);\n-    }\n-\n-    public static void checkMethodName(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);\n-    }\n-\n-    public static void checkParameterName(Map<String, String> parameters) {\n-        if (CollectionUtils.isEmptyMap(parameters)) {\n-            return;\n-        }\n-        List<String> ignoreCheckKeys = new ArrayList<>();\n-        ignoreCheckKeys.add(BACKUP_KEY);\n-        String ignoreCheckKeysStr = parameters.get(IGNORE_CHECK_KEYS);\n-        if (!StringUtils.isBlank(ignoreCheckKeysStr)) {\n-            ignoreCheckKeys.addAll(Arrays.asList(ignoreCheckKeysStr.split(\",\")));\n-        }\n-        for (Map.Entry<String, String> entry : parameters.entrySet()) {\n-            if (!ignoreCheckKeys.contains(entry.getKey())) {\n-                checkNameHasSymbol(entry.getKey(), entry.getValue());\n-            }\n-        }\n-    }\n-\n-    public static void checkProperty(String property, String value, int maxlength, Pattern pattern) {\n-        if (StringUtils.isEmpty(value)) {\n-            return;\n-        }\n-        if (value.length() > maxlength) {\n-            throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" is longer than \" + maxlength);\n-        }\n-        if (pattern != null) {\n-            Matcher matcher = pattern.matcher(value);\n-            if (!matcher.matches()) {\n-                throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" contains illegal \" +\n-                        \"character, only digit, letter, '-', '_' or '.' is legal.\");\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.utils;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\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.serialize.Serialization;\r\n+import org.apache.dubbo.common.status.StatusChecker;\r\n+import org.apache.dubbo.common.threadpool.ThreadPool;\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.NetUtils;\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.AbstractConfig;\r\n+import org.apache.dubbo.config.AbstractInterfaceConfig;\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.MethodConfig;\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.ReferenceConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.SslConfig;\r\n+import org.apache.dubbo.monitor.MonitorFactory;\r\n+import org.apache.dubbo.monitor.MonitorService;\r\n+import org.apache.dubbo.registry.RegistryService;\r\n+import org.apache.dubbo.remoting.Codec2;\r\n+import org.apache.dubbo.remoting.Dispatcher;\r\n+import org.apache.dubbo.remoting.Transporter;\r\n+import org.apache.dubbo.remoting.exchange.Exchanger;\r\n+import org.apache.dubbo.remoting.telnet.TelnetHandler;\r\n+import org.apache.dubbo.rpc.ExporterListener;\r\n+import org.apache.dubbo.rpc.Filter;\r\n+import org.apache.dubbo.rpc.InvokerListener;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.LoadBalance;\r\n+import org.apache.dubbo.rpc.support.MockInvoker;\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.Arrays;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.regex.Matcher;\r\n+import java.util.regex.Pattern;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PASSWORD_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.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;\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+import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+import static org.apache.dubbo.common.utils.UrlUtils.isServiceDiscoveryRegistryType;\r\n+import static org.apache.dubbo.config.Constants.ARCHITECTURE;\r\n+import static org.apache.dubbo.config.Constants.CONTEXTPATH_KEY;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\r\n+import static org.apache.dubbo.config.Constants.ENVIRONMENT;\r\n+import static org.apache.dubbo.config.Constants.IGNORE_CHECK_KEYS;\r\n+import static org.apache.dubbo.config.Constants.LAYER_KEY;\r\n+import static org.apache.dubbo.config.Constants.NAME;\r\n+import static org.apache.dubbo.config.Constants.ORGANIZATION;\r\n+import static org.apache.dubbo.config.Constants.OWNER;\r\n+import static org.apache.dubbo.config.Constants.STATUS_KEY;\r\n+import static org.apache.dubbo.monitor.Constants.LOGSTAT_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SUBSCRIBE_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.DISPATCHER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERVER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.TELNET;\r\n+import static org.apache.dubbo.remoting.Constants.TRANSPORTER_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.FAIL_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.FORCE_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.LOCAL_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.RETURN_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.THROW_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+\r\n+public class ConfigValidationUtils {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ConfigValidationUtils.class);\r\n+    /**\r\n+     * The maximum length of a <b>parameter's value</b>\r\n+     */\r\n+    private static final int MAX_LENGTH = 200;\r\n+\r\n+    /**\r\n+     * The maximum length of a <b>path</b>\r\n+     */\r\n+    private static final int MAX_PATH_LENGTH = 200;\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>name</b>\r\n+     */\r\n+    private static final Pattern PATTERN_NAME = Pattern.compile(\"[\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>multiply name</b>\r\n+     */\r\n+    private static final Pattern PATTERN_MULTI_NAME = Pattern.compile(\"[,\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>method names</b>\r\n+     */\r\n+    private static final Pattern PATTERN_METHOD_NAME = Pattern.compile(\"[a-zA-Z][0-9a-zA-Z]*\");\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>path</b>\r\n+     */\r\n+    private static final Pattern PATTERN_PATH = Pattern.compile(\"[/\\\\-$._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The pattern matches a value who has a symbol\r\n+     */\r\n+    private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile(\"[:*,\\\\s/\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The pattern matches a property key\r\n+     */\r\n+    private static final Pattern PATTERN_KEY = Pattern.compile(\"[*,\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    public static final String IPV6_START_MARK = \"[\";\r\n+\r\n+    public static final String IPV6_END_MARK = \"]\";\r\n+\r\n+\r\n+    public static List<URL> loadRegistries(AbstractInterfaceConfig interfaceConfig, boolean provider) {\r\n+        // check && override if necessary\r\n+        List<URL> registryList = new ArrayList<URL>();\r\n+        ApplicationConfig application = interfaceConfig.getApplication();\r\n+        List<RegistryConfig> registries = interfaceConfig.getRegistries();\r\n+        if (CollectionUtils.isNotEmpty(registries)) {\r\n+            for (RegistryConfig config : registries) {\r\n+                String address = config.getAddress();\r\n+                if (StringUtils.isEmpty(address)) {\r\n+                    address = ANYHOST_VALUE;\r\n+                }\r\n+                if (!RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {\r\n+                    Map<String, String> map = new HashMap<String, String>();\r\n+                    AbstractConfig.appendParameters(map, application);\r\n+                    AbstractConfig.appendParameters(map, config);\r\n+                    map.put(PATH_KEY, RegistryService.class.getName());\r\n+                    AbstractInterfaceConfig.appendRuntimeParameters(map);\r\n+                    if (!map.containsKey(PROTOCOL_KEY)) {\r\n+                        map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\r\n+                    }\r\n+                    List<URL> urls = UrlUtils.parseURLs(address, map);\r\n+\r\n+                    for (URL url : urls) {\r\n+\r\n+                        url = URLBuilder.from(url)\r\n+                                .addParameter(REGISTRY_KEY, url.getProtocol())\r\n+                                .setProtocol(extractRegistryType(url))\r\n+                                .build();\r\n+                        if ((provider && url.getParameter(REGISTER_KEY, true))\r\n+                                || (!provider && url.getParameter(SUBSCRIBE_KEY, true))) {\r\n+                            registryList.add(url);\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+        return genCompatibleRegistries(registryList, provider);\r\n+    }\r\n+\r\n+    private static List<URL> genCompatibleRegistries(List<URL> registryList, boolean provider) {\r\n+        List<URL> result = new ArrayList<>(registryList.size());\r\n+        registryList.forEach(registryURL -> {\r\n+            result.add(registryURL);\r\n+            if (provider) {\r\n+                // for registries enabled service discovery, automatically register interface compatible addresses.\r\n+                if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())\r\n+                        && registryURL.getParameter(REGISTRY_PUBLISH_INTERFACE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getBoolean(DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY, false))\r\n+                        && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) {\r\n+                    URL interfaceCompatibleRegistryURL = URLBuilder.from(registryURL)\r\n+                            .setProtocol(REGISTRY_PROTOCOL)\r\n+                            .removeParameter(REGISTRY_TYPE_KEY)\r\n+                            .build();\r\n+                    result.add(interfaceCompatibleRegistryURL);\r\n+                }\r\n+            }\r\n+        });\r\n+        return result;\r\n+    }\r\n+\r\n+    private static boolean registryNotExists(URL registryURL, List<URL> registryList, String registryType) {\r\n+        return registryList.stream().noneMatch(\r\n+                url -> registryType.equals(url.getProtocol()) && registryURL.getBackupAddress().equals(url.getBackupAddress())\r\n+        );\r\n+    }\r\n+\r\n+    public static URL loadMonitor(AbstractInterfaceConfig interfaceConfig, URL registryURL) {\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        map.put(INTERFACE_KEY, MonitorService.class.getName());\r\n+        AbstractInterfaceConfig.appendRuntimeParameters(map);\r\n+        //set ip\r\n+        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\r\n+        if (StringUtils.isEmpty(hostToRegistry)) {\r\n+            hostToRegistry = NetUtils.getLocalHost();\r\n+        } else if (NetUtils.isInvalidLocalHost(hostToRegistry)) {\r\n+            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" +\r\n+                    DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\r\n+        }\r\n+        map.put(REGISTER_IP_KEY, hostToRegistry);\r\n+\r\n+        MonitorConfig monitor = interfaceConfig.getMonitor();\r\n+        ApplicationConfig application = interfaceConfig.getApplication();\r\n+        AbstractConfig.appendParameters(map, monitor);\r\n+        AbstractConfig.appendParameters(map, application);\r\n+        String address = null;\r\n+        String sysaddress = System.getProperty(\"dubbo.monitor.address\");\r\n+        if (sysaddress != null && sysaddress.length() > 0) {\r\n+            address = sysaddress;\r\n+        } else if (monitor != null) {\r\n+            address = monitor.getAddress();\r\n+        }\r\n+        if (ConfigUtils.isNotEmpty(address)) {\r\n+            if (!map.containsKey(PROTOCOL_KEY)) {\r\n+                if (getExtensionLoader(MonitorFactory.class).hasExtension(LOGSTAT_PROTOCOL)) {\r\n+                    map.put(PROTOCOL_KEY, LOGSTAT_PROTOCOL);\r\n+                } else {\r\n+                    map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\r\n+                }\r\n+            }\r\n+            return UrlUtils.parseURL(address, map);\r\n+        } else if (monitor != null &&\r\n+                (REGISTRY_PROTOCOL.equals(monitor.getProtocol()) || SERVICE_REGISTRY_PROTOCOL.equals(monitor.getProtocol()))\r\n+                && registryURL != null) {\r\n+            return URLBuilder.from(registryURL)\r\n+                    .setProtocol(DUBBO_PROTOCOL)\r\n+                    .addParameter(PROTOCOL_KEY, monitor.getProtocol())\r\n+                    .addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map))\r\n+                    .build();\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Legitimacy check and setup of local simulated operations. The operations can be a string with Simple operation or\r\n+     * a classname whose {@link Class} implements a particular function\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 that will be referenced\r\n+     */\r\n+    public static void checkMock(Class<?> interfaceClass, AbstractInterfaceConfig config) {\r\n+        String mock = config.getMock();\r\n+        if (ConfigUtils.isEmpty(mock)) {\r\n+            return;\r\n+        }\r\n+\r\n+        String normalizedMock = MockInvoker.normalizeMock(mock);\r\n+        if (normalizedMock.startsWith(RETURN_PREFIX)) {\r\n+            normalizedMock = normalizedMock.substring(RETURN_PREFIX.length()).trim();\r\n+            try {\r\n+                //Check whether the mock value is legal, if it is illegal, throw exception\r\n+                MockInvoker.parseMockValue(normalizedMock);\r\n+            } catch (Exception e) {\r\n+                throw new IllegalStateException(\"Illegal mock return in <dubbo:service/reference ... \" +\r\n+                        \"mock=\\\"\" + mock + \"\\\" />\");\r\n+            }\r\n+        } else if (normalizedMock.startsWith(THROW_PREFIX)) {\r\n+            normalizedMock = normalizedMock.substring(THROW_PREFIX.length()).trim();\r\n+            if (ConfigUtils.isNotEmpty(normalizedMock)) {\r\n+                try {\r\n+                    //Check whether the mock value is legal\r\n+                    MockInvoker.getThrowable(normalizedMock);\r\n+                } catch (Exception e) {\r\n+                    throw new IllegalStateException(\"Illegal mock throw in <dubbo:service/reference ... \" +\r\n+                            \"mock=\\\"\" + mock + \"\\\" />\");\r\n+                }\r\n+            }\r\n+        } else {\r\n+            //Check whether the mock class is a implementation of the interfaceClass, and if it has a default constructor\r\n+            MockInvoker.getMockObject(normalizedMock, interfaceClass);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateAbstractInterfaceConfig(AbstractInterfaceConfig config) {\r\n+        checkName(LOCAL_KEY, config.getLocal());\r\n+        checkName(\"stub\", config.getStub());\r\n+        checkMultiName(\"owner\", config.getOwner());\r\n+\r\n+        checkExtension(ProxyFactory.class, PROXY_KEY, config.getProxy());\r\n+        checkExtension(Cluster.class, CLUSTER_KEY, config.getCluster());\r\n+        checkMultiExtension(Filter.class, FILE_KEY, config.getFilter());\r\n+        checkNameHasSymbol(LAYER_KEY, config.getLayer());\r\n+\r\n+        List<MethodConfig> methods = config.getMethods();\r\n+        if (CollectionUtils.isNotEmpty(methods)) {\r\n+            methods.forEach(ConfigValidationUtils::validateMethodConfig);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateServiceConfig(ServiceConfig config) {\r\n+        checkKey(VERSION_KEY, config.getVersion());\r\n+        checkKey(GROUP_KEY, config.getGroup());\r\n+        checkName(TOKEN_KEY, config.getToken());\r\n+        checkPathName(PATH_KEY, config.getPath());\r\n+\r\n+        checkMultiExtension(ExporterListener.class, \"listener\", config.getListener());\r\n+\r\n+        validateAbstractInterfaceConfig(config);\r\n+\r\n+        List<RegistryConfig> registries = config.getRegistries();\r\n+        if (registries != null) {\r\n+            for (RegistryConfig registry : registries) {\r\n+                validateRegistryConfig(registry);\r\n+            }\r\n+        }\r\n+\r\n+        List<ProtocolConfig> protocols = config.getProtocols();\r\n+        if (protocols != null) {\r\n+            for (ProtocolConfig protocol : protocols) {\r\n+                validateProtocolConfig(protocol);\r\n+            }\r\n+        }\r\n+\r\n+        ProviderConfig providerConfig = config.getProvider();\r\n+        if (providerConfig != null) {\r\n+            validateProviderConfig(providerConfig);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateReferenceConfig(ReferenceConfig config) {\r\n+        checkMultiExtension(InvokerListener.class, \"listener\", config.getListener());\r\n+        checkKey(VERSION_KEY, config.getVersion());\r\n+        checkKey(GROUP_KEY, config.getGroup());\r\n+        checkName(CLIENT_KEY, config.getClient());\r\n+\r\n+        validateAbstractInterfaceConfig(config);\r\n+\r\n+        List<RegistryConfig> registries = config.getRegistries();\r\n+        if (registries != null) {\r\n+            for (RegistryConfig registry : registries) {\r\n+                validateRegistryConfig(registry);\r\n+            }\r\n+        }\r\n+\r\n+        ConsumerConfig consumerConfig = config.getConsumer();\r\n+        if (consumerConfig != null) {\r\n+            validateConsumerConfig(consumerConfig);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateConfigCenterConfig(ConfigCenterConfig config) {\r\n+        if (config != null) {\r\n+            checkParameterName(config.getParameters());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateApplicationConfig(ApplicationConfig config) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (!config.isValid()) {\r\n+            throw new IllegalStateException(\"No application config found or it's not a valid config! \" +\r\n+                    \"Please add <dubbo:application name=\\\"...\\\" /> to your spring config.\");\r\n+        }\r\n+\r\n+        // backward compatibility\r\n+        String wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_KEY);\r\n+        if (wait != null && wait.trim().length() > 0) {\r\n+            System.setProperty(SHUTDOWN_WAIT_KEY, wait.trim());\r\n+        } else {\r\n+            wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_SECONDS_KEY);\r\n+            if (wait != null && wait.trim().length() > 0) {\r\n+                System.setProperty(SHUTDOWN_WAIT_SECONDS_KEY, wait.trim());\r\n+            }\r\n+        }\r\n+\r\n+        checkName(NAME, config.getName());\r\n+        checkMultiName(OWNER, config.getOwner());\r\n+        checkName(ORGANIZATION, config.getOrganization());\r\n+        checkName(ARCHITECTURE, config.getArchitecture());\r\n+        checkName(ENVIRONMENT, config.getEnvironment());\r\n+        checkParameterName(config.getParameters());\r\n+    }\r\n+\r\n+    public static void validateModuleConfig(ModuleConfig config) {\r\n+        if (config != null) {\r\n+            checkName(NAME, config.getName());\r\n+            checkName(OWNER, config.getOwner());\r\n+            checkName(ORGANIZATION, config.getOrganization());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateMetadataConfig(MetadataReportConfig metadataReportConfig) {\r\n+        if (metadataReportConfig == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateMetricsConfig(MetricsConfig metricsConfig) {\r\n+        if (metricsConfig == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateSslConfig(SslConfig sslConfig) {\r\n+        if (sslConfig == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateMonitorConfig(MonitorConfig config) {\r\n+        if (config != null) {\r\n+            if (!config.isValid()) {\r\n+                logger.info(\"There's no valid monitor config found, if you want to open monitor statistics for Dubbo, \" +\r\n+                        \"please make sure your monitor is configured properly.\");\r\n+            }\r\n+\r\n+            checkParameterName(config.getParameters());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateProtocolConfig(ProtocolConfig config) {\r\n+        if (config != null) {\r\n+            String name = config.getName();\r\n+            checkName(\"name\", name);\r\n+            checkHost(HOST_KEY, config.getHost());\r\n+            checkPathName(\"contextpath\", config.getContextpath());\r\n+\r\n+\r\n+            if (DUBBO_PROTOCOL.equals(name)) {\r\n+                checkMultiExtension(Codec2.class, CODEC_KEY, config.getCodec());\r\n+                checkMultiExtension(Serialization.class, SERIALIZATION_KEY, config.getSerialization());\r\n+                checkMultiExtension(Transporter.class, SERVER_KEY, config.getServer());\r\n+                checkMultiExtension(Transporter.class, CLIENT_KEY, config.getClient());\r\n+            }\r\n+\r\n+            checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\r\n+            checkMultiExtension(StatusChecker.class, \"status\", config.getStatus());\r\n+            checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\r\n+            checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\r\n+            checkExtension(Dispatcher.class, DISPATCHER_KEY, config.getDispatcher());\r\n+            checkExtension(Dispatcher.class, \"dispather\", config.getDispather());\r\n+            checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateProviderConfig(ProviderConfig config) {\r\n+        checkPathName(CONTEXTPATH_KEY, config.getContextpath());\r\n+        checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\r\n+        checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\r\n+        checkMultiExtension(StatusChecker.class, STATUS_KEY, config.getStatus());\r\n+        checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\r\n+        checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\r\n+    }\r\n+\r\n+    public static void validateConsumerConfig(ConsumerConfig config) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateRegistryConfig(RegistryConfig config) {\r\n+        checkName(PROTOCOL_KEY, config.getProtocol());\r\n+        checkName(USERNAME_KEY, config.getUsername());\r\n+        checkLength(PASSWORD_KEY, config.getPassword());\r\n+        checkPathLength(FILE_KEY, config.getFile());\r\n+        checkName(TRANSPORTER_KEY, config.getTransporter());\r\n+        checkName(SERVER_KEY, config.getServer());\r\n+        checkName(CLIENT_KEY, config.getClient());\r\n+        checkParameterName(config.getParameters());\r\n+    }\r\n+\r\n+    public static void validateMethodConfig(MethodConfig config) {\r\n+        checkExtension(LoadBalance.class, LOADBALANCE_KEY, config.getLoadbalance());\r\n+        checkParameterName(config.getParameters());\r\n+        checkMethodName(\"name\", config.getName());\r\n+\r\n+        String mock = config.getMock();\r\n+        if (StringUtils.isNotEmpty(mock)) {\r\n+            if (mock.startsWith(RETURN_PREFIX) || mock.startsWith(THROW_PREFIX + \" \")) {\r\n+                checkLength(MOCK_KEY, mock);\r\n+            } else if (mock.startsWith(FAIL_PREFIX) || mock.startsWith(FORCE_PREFIX)) {\r\n+                checkNameHasSymbol(MOCK_KEY, mock);\r\n+            } else {\r\n+                checkName(MOCK_KEY, mock);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private static String extractRegistryType(URL url) {\r\n+        return isServiceDiscoveryRegistryType(url) ? SERVICE_REGISTRY_PROTOCOL : REGISTRY_PROTOCOL;\r\n+    }\r\n+\r\n+    public static void checkExtension(Class<?> type, String property, String value) {\r\n+        checkName(property, value);\r\n+        if (StringUtils.isNotEmpty(value)\r\n+                && !ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {\r\n+            throw new IllegalStateException(\"No such extension \" + value + \" for \" + property + \"/\" + type.getName());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Check whether there is a <code>Extension</code> who's name (property) is <code>value</code> (special treatment is\r\n+     * required)\r\n+     *\r\n+     * @param type     The Extension type\r\n+     * @param property The extension key\r\n+     * @param value    The Extension name\r\n+     */\r\n+    public static void checkMultiExtension(Class<?> type, String property, String value) {\r\n+        checkMultiName(property, value);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            String[] values = value.split(\"\\\\s*[,]+\\\\s*\");\r\n+            for (String v : values) {\r\n+                if (v.startsWith(REMOVE_VALUE_PREFIX)) {\r\n+                    v = v.substring(1);\r\n+                }\r\n+                if (DEFAULT_KEY.equals(v)) {\r\n+                    continue;\r\n+                }\r\n+                if (!ExtensionLoader.getExtensionLoader(type).hasExtension(v)) {\r\n+                    throw new IllegalStateException(\"No such extension \" + v + \" for \" + property + \"/\" + type.getName());\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static void checkLength(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, null);\r\n+    }\r\n+\r\n+    public static void checkPathLength(String property, String value) {\r\n+        checkProperty(property, value, MAX_PATH_LENGTH, null);\r\n+    }\r\n+\r\n+    public static void checkName(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);\r\n+    }\r\n+\r\n+    public static void checkHost(String property, String value) {\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            return;\r\n+        }\r\n+        if (value.startsWith(IPV6_START_MARK) && value.endsWith(IPV6_END_MARK)) {\r\n+            // if the value start with \"[\" and end with \"]\", check whether it is IPV6\r\n+            try {\r\n+                InetAddress.getByName(value);\r\n+                return;\r\n+            } catch (UnknownHostException e) {\r\n+                // not a IPv6 string, do nothing, go on to checkName\r\n+            }\r\n+        }\r\n+        checkName(property, value);\r\n+    }\r\n+\r\n+    public static void checkNameHasSymbol(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);\r\n+    }\r\n+\r\n+    public static void checkKey(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);\r\n+    }\r\n+\r\n+    public static void checkMultiName(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);\r\n+    }\r\n+\r\n+    public static void checkPathName(String property, String value) {\r\n+        checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);\r\n+    }\r\n+\r\n+    public static void checkMethodName(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);\r\n+    }\r\n+\r\n+    public static void checkParameterName(Map<String, String> parameters) {\r\n+        if (CollectionUtils.isEmptyMap(parameters)) {\r\n+            return;\r\n+        }\r\n+        List<String> ignoreCheckKeys = new ArrayList<>();\r\n+        ignoreCheckKeys.add(BACKUP_KEY);\r\n+        String ignoreCheckKeysStr = parameters.get(IGNORE_CHECK_KEYS);\r\n+        if (!StringUtils.isBlank(ignoreCheckKeysStr)) {\r\n+            ignoreCheckKeys.addAll(Arrays.asList(ignoreCheckKeysStr.split(\",\")));\r\n+        }\r\n+        for (Map.Entry<String, String> entry : parameters.entrySet()) {\r\n+            if (!ignoreCheckKeys.contains(entry.getKey())) {\r\n+                checkNameHasSymbol(entry.getKey(), entry.getValue());\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static void checkProperty(String property, String value, int maxlength, Pattern pattern) {\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            return;\r\n+        }\r\n+        if (value.length() > maxlength) {\r\n+            throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" is longer than \" + maxlength);\r\n+        }\r\n+        if (pattern != null) {\r\n+            Matcher matcher = pattern.matcher(value);\r\n+            if (!matcher.matches()) {\r\n+                throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" contains illegal \" +\r\n+                        \"character, only digit, letter, '-', '_' or '.' is legal.\");\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/utils/ReferenceConfigCache.java", "source2": "org/apache/dubbo/config/utils/ReferenceConfigCache.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,252 +1,252 @@\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.utils;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.service.Destroyable;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-/**\n- * A simple util class for cache {@link ReferenceConfigBase}.\n- * <p>\n- * {@link ReferenceConfigBase} is a heavy Object, it's necessary to cache these object\n- * for the framework which create {@link ReferenceConfigBase} frequently.\n- * <p>\n- * You can implement and use your own {@link ReferenceConfigBase} cache if you need use complicate strategy.\n- */\n-public class ReferenceConfigCache {\n-    public static final String DEFAULT_NAME = \"_DEFAULT_\";\n-    /**\n-     * Create the key with the <b>Group</b>, <b>Interface</b> and <b>version</b> attribute of {@link ReferenceConfigBase}.\n-     * <p>\n-     * key example: <code>group1/org.apache.dubbo.foo.FooService:1.0.0</code>.\n-     */\n-    public static final KeyGenerator DEFAULT_KEY_GENERATOR = referenceConfig -> {\n-        String iName = referenceConfig.getInterface();\n-        if (StringUtils.isBlank(iName)) {\n-            Class<?> clazz = referenceConfig.getInterfaceClass();\n-            iName = clazz.getName();\n-        }\n-        if (StringUtils.isBlank(iName)) {\n-            throw new IllegalArgumentException(\"No interface info in ReferenceConfig\" + referenceConfig);\n-        }\n-\n-        StringBuilder ret = new StringBuilder();\n-        if (!StringUtils.isBlank(referenceConfig.getGroup())) {\n-            ret.append(referenceConfig.getGroup()).append(\"/\");\n-        }\n-        ret.append(iName);\n-        if (!StringUtils.isBlank(referenceConfig.getVersion())) {\n-            ret.append(\":\").append(referenceConfig.getVersion());\n-        }\n-        return ret.toString();\n-    };\n-\n-    static final ConcurrentMap<String, ReferenceConfigCache> CACHE_HOLDER = new ConcurrentHashMap<String, ReferenceConfigCache>();\n-    private final String name;\n-    private final KeyGenerator generator;\n-\n-    private final ConcurrentMap<String, ReferenceConfigBase<?>> referredReferences = new ConcurrentHashMap<>();\n-\n-    private final ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> proxies = new ConcurrentHashMap<>();\n-\n-    private ReferenceConfigCache(String name, KeyGenerator generator) {\n-        this.name = name;\n-        this.generator = generator;\n-    }\n-\n-    /**\n-     * Get the cache use default name and {@link #DEFAULT_KEY_GENERATOR} to generate cache key.\n-     * Create cache if not existed yet.\n-     */\n-    public static ReferenceConfigCache getCache() {\n-        return getCache(DEFAULT_NAME);\n-    }\n-\n-    /**\n-     * Get the cache use specified name and {@link KeyGenerator}.\n-     * Create cache if not existed yet.\n-     */\n-    public static ReferenceConfigCache getCache(String name) {\n-        return getCache(name, DEFAULT_KEY_GENERATOR);\n-    }\n-\n-    /**\n-     * Get the cache use specified {@link KeyGenerator}.\n-     * Create cache if not existed yet.\n-     */\n-    public static ReferenceConfigCache getCache(String name, KeyGenerator keyGenerator) {\n-        return CACHE_HOLDER.computeIfAbsent(name, k -> new ReferenceConfigCache(k, keyGenerator));\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(ReferenceConfigBase<T> referenceConfig) {\n-        String key = generator.generateKey(referenceConfig);\n-        Class<?> type = referenceConfig.getInterfaceClass();\n-\n-        proxies.computeIfAbsent(type, _t -> new ConcurrentHashMap<>());\n-\n-        ConcurrentMap<String, Object> proxiesOfType = proxies.get(type);\n-        proxiesOfType.computeIfAbsent(key, _k -> {\n-            Object proxy = referenceConfig.get();\n-            referredReferences.put(key, referenceConfig);\n-            return proxy;\n-        });\n-\n-        return (T) proxiesOfType.get(key);\n-    }\n-\n-    /**\n-     * Fetch cache with the specified key. The key is decided by KeyGenerator passed-in. If the default KeyGenerator is\n-     * used, then the key is in the format of <code>group/interfaceClass:version</code>\n-     *\n-     * @param key  cache key\n-     * @param type object class\n-     * @param <T>  object type\n-     * @return object from the cached ReferenceConfigBase\n-     * @see KeyGenerator#generateKey(ReferenceConfigBase)\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(String key, Class<T> type) {\n-        Map<String, Object> proxiesOfType = proxies.get(type);\n-        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\n-            return null;\n-        }\n-        return (T) proxiesOfType.get(key);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(String key) {\n-        ReferenceConfigBase<?> rc = referredReferences.get(key);\n-        if (rc == null) {\n-            return null;\n-        }\n-\n-        return (T) get(key, rc.getInterfaceClass());\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> List<T> getAll(Class<T> type) {\n-        Map<String, Object> proxiesOfType = proxies.get(type);\n-        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\n-            return Collections.emptyList();\n-        }\n-\n-        List<T> proxySet = new ArrayList<>();\n-        proxiesOfType.values().forEach(obj -> proxySet.add((T) obj));\n-        return proxySet;\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(Class<T> type) {\n-        Map<String, Object> proxiesOfType = proxies.get(type);\n-        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\n-            return null;\n-        }\n-\n-        return (T) proxiesOfType.values().iterator().next();\n-    }\n-\n-    public void destroy(String key, Class<?> type) {\n-        ReferenceConfigBase<?> rc = referredReferences.remove(key);\n-        if (rc == null) {\n-            return;\n-        }\n-\n-        ApplicationModel.getConfigManager().removeConfig(rc);\n-        rc.destroy();\n-\n-        Map<String, Object> proxiesOftype = proxies.get(type);\n-        if (CollectionUtils.isNotEmptyMap(proxiesOftype)) {\n-            proxiesOftype.remove(key);\n-            if (proxiesOftype.isEmpty()) {\n-                proxies.remove(type);\n-            }\n-        }\n-    }\n-\n-    public void destroy(Class<?> type) {\n-        Map<String, Object> proxiesOfType = proxies.remove(type);\n-        proxiesOfType.forEach((k, v) -> {\n-            ReferenceConfigBase rc = referredReferences.remove(k);\n-            rc.destroy();\n-        });\n-    }\n-\n-    /**\n-     * clear and destroy one {@link ReferenceConfigBase} in the cache.\n-     *\n-     * @param referenceConfig use for create key.\n-     */\n-    public <T> void destroy(ReferenceConfigBase<T> referenceConfig) {\n-        String key = generator.generateKey(referenceConfig);\n-        Class<?> type = referenceConfig.getInterfaceClass();\n-\n-        destroy(key, type);\n-    }\n-\n-    /**\n-     * clear and destroy all {@link ReferenceConfigBase} in the cache.\n-     */\n-    public void destroyAll() {\n-        if (CollectionUtils.isEmptyMap(referredReferences)) {\n-            return;\n-        }\n-\n-        referredReferences.forEach((_k, referenceConfig) -> {\n-            referenceConfig.destroy();\n-            ApplicationModel.getConfigManager().removeConfig(referenceConfig);\n-        });\n-\n-        proxies.forEach((_type, proxiesOfType) -> {\n-            proxiesOfType.forEach((_k, v) -> {\n-                Destroyable proxy = (Destroyable) v;\n-                proxy.$destroy();\n-            });\n-        });\n-\n-        referredReferences.clear();\n-        proxies.clear();\n-    }\n-\n-    public ConcurrentMap<String, ReferenceConfigBase<?>> getReferredReferences() {\n-        return referredReferences;\n-    }\n-\n-    public ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> getProxies() {\n-        return proxies;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return \"ReferenceConfigCache(name: \" + name\n-                + \")\";\n-    }\n-\n-    public interface KeyGenerator {\n-        String generateKey(ReferenceConfigBase<?> referenceConfig);\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.utils;\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.ReferenceConfigBase;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.service.Destroyable;\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.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+/**\r\n+ * A simple util class for cache {@link ReferenceConfigBase}.\r\n+ * <p>\r\n+ * {@link ReferenceConfigBase} is a heavy Object, it's necessary to cache these object\r\n+ * for the framework which create {@link ReferenceConfigBase} frequently.\r\n+ * <p>\r\n+ * You can implement and use your own {@link ReferenceConfigBase} cache if you need use complicate strategy.\r\n+ */\r\n+public class ReferenceConfigCache {\r\n+    public static final String DEFAULT_NAME = \"_DEFAULT_\";\r\n+    /**\r\n+     * Create the key with the <b>Group</b>, <b>Interface</b> and <b>version</b> attribute of {@link ReferenceConfigBase}.\r\n+     * <p>\r\n+     * key example: <code>group1/org.apache.dubbo.foo.FooService:1.0.0</code>.\r\n+     */\r\n+    public static final KeyGenerator DEFAULT_KEY_GENERATOR = referenceConfig -> {\r\n+        String iName = referenceConfig.getInterface();\r\n+        if (StringUtils.isBlank(iName)) {\r\n+            Class<?> clazz = referenceConfig.getInterfaceClass();\r\n+            iName = clazz.getName();\r\n+        }\r\n+        if (StringUtils.isBlank(iName)) {\r\n+            throw new IllegalArgumentException(\"No interface info in ReferenceConfig\" + referenceConfig);\r\n+        }\r\n+\r\n+        StringBuilder ret = new StringBuilder();\r\n+        if (!StringUtils.isBlank(referenceConfig.getGroup())) {\r\n+            ret.append(referenceConfig.getGroup()).append(\"/\");\r\n+        }\r\n+        ret.append(iName);\r\n+        if (!StringUtils.isBlank(referenceConfig.getVersion())) {\r\n+            ret.append(\":\").append(referenceConfig.getVersion());\r\n+        }\r\n+        return ret.toString();\r\n+    };\r\n+\r\n+    static final ConcurrentMap<String, ReferenceConfigCache> CACHE_HOLDER = new ConcurrentHashMap<String, ReferenceConfigCache>();\r\n+    private final String name;\r\n+    private final KeyGenerator generator;\r\n+\r\n+    private final ConcurrentMap<String, ReferenceConfigBase<?>> referredReferences = new ConcurrentHashMap<>();\r\n+\r\n+    private final ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> proxies = new ConcurrentHashMap<>();\r\n+\r\n+    private ReferenceConfigCache(String name, KeyGenerator generator) {\r\n+        this.name = name;\r\n+        this.generator = generator;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the cache use default name and {@link #DEFAULT_KEY_GENERATOR} to generate cache key.\r\n+     * Create cache if not existed yet.\r\n+     */\r\n+    public static ReferenceConfigCache getCache() {\r\n+        return getCache(DEFAULT_NAME);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the cache use specified name and {@link KeyGenerator}.\r\n+     * Create cache if not existed yet.\r\n+     */\r\n+    public static ReferenceConfigCache getCache(String name) {\r\n+        return getCache(name, DEFAULT_KEY_GENERATOR);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the cache use specified {@link KeyGenerator}.\r\n+     * Create cache if not existed yet.\r\n+     */\r\n+    public static ReferenceConfigCache getCache(String name, KeyGenerator keyGenerator) {\r\n+        return CACHE_HOLDER.computeIfAbsent(name, k -> new ReferenceConfigCache(k, keyGenerator));\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(ReferenceConfigBase<T> referenceConfig) {\r\n+        String key = generator.generateKey(referenceConfig);\r\n+        Class<?> type = referenceConfig.getInterfaceClass();\r\n+\r\n+        proxies.computeIfAbsent(type, _t -> new ConcurrentHashMap<>());\r\n+\r\n+        ConcurrentMap<String, Object> proxiesOfType = proxies.get(type);\r\n+        proxiesOfType.computeIfAbsent(key, _k -> {\r\n+            Object proxy = referenceConfig.get();\r\n+            referredReferences.put(key, referenceConfig);\r\n+            return proxy;\r\n+        });\r\n+\r\n+        return (T) proxiesOfType.get(key);\r\n+    }\r\n+\r\n+    /**\r\n+     * Fetch cache with the specified key. The key is decided by KeyGenerator passed-in. If the default KeyGenerator is\r\n+     * used, then the key is in the format of <code>group/interfaceClass:version</code>\r\n+     *\r\n+     * @param key  cache key\r\n+     * @param type object class\r\n+     * @param <T>  object type\r\n+     * @return object from the cached ReferenceConfigBase\r\n+     * @see KeyGenerator#generateKey(ReferenceConfigBase)\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(String key, Class<T> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.get(type);\r\n+        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\r\n+            return null;\r\n+        }\r\n+        return (T) proxiesOfType.get(key);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(String key) {\r\n+        ReferenceConfigBase<?> rc = referredReferences.get(key);\r\n+        if (rc == null) {\r\n+            return null;\r\n+        }\r\n+\r\n+        return (T) get(key, rc.getInterfaceClass());\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> List<T> getAll(Class<T> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.get(type);\r\n+        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\r\n+            return Collections.emptyList();\r\n+        }\r\n+\r\n+        List<T> proxySet = new ArrayList<>();\r\n+        proxiesOfType.values().forEach(obj -> proxySet.add((T) obj));\r\n+        return proxySet;\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(Class<T> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.get(type);\r\n+        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\r\n+            return null;\r\n+        }\r\n+\r\n+        return (T) proxiesOfType.values().iterator().next();\r\n+    }\r\n+\r\n+    public void destroy(String key, Class<?> type) {\r\n+        ReferenceConfigBase<?> rc = referredReferences.remove(key);\r\n+        if (rc == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        ApplicationModel.getConfigManager().removeConfig(rc);\r\n+        rc.destroy();\r\n+\r\n+        Map<String, Object> proxiesOftype = proxies.get(type);\r\n+        if (CollectionUtils.isNotEmptyMap(proxiesOftype)) {\r\n+            proxiesOftype.remove(key);\r\n+            if (proxiesOftype.isEmpty()) {\r\n+                proxies.remove(type);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public void destroy(Class<?> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.remove(type);\r\n+        proxiesOfType.forEach((k, v) -> {\r\n+            ReferenceConfigBase rc = referredReferences.remove(k);\r\n+            rc.destroy();\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * clear and destroy one {@link ReferenceConfigBase} in the cache.\r\n+     *\r\n+     * @param referenceConfig use for create key.\r\n+     */\r\n+    public <T> void destroy(ReferenceConfigBase<T> referenceConfig) {\r\n+        String key = generator.generateKey(referenceConfig);\r\n+        Class<?> type = referenceConfig.getInterfaceClass();\r\n+\r\n+        destroy(key, type);\r\n+    }\r\n+\r\n+    /**\r\n+     * clear and destroy all {@link ReferenceConfigBase} in the cache.\r\n+     */\r\n+    public void destroyAll() {\r\n+        if (CollectionUtils.isEmptyMap(referredReferences)) {\r\n+            return;\r\n+        }\r\n+\r\n+        referredReferences.forEach((_k, referenceConfig) -> {\r\n+            referenceConfig.destroy();\r\n+            ApplicationModel.getConfigManager().removeConfig(referenceConfig);\r\n+        });\r\n+\r\n+        proxies.forEach((_type, proxiesOfType) -> {\r\n+            proxiesOfType.forEach((_k, v) -> {\r\n+                Destroyable proxy = (Destroyable) v;\r\n+                proxy.$destroy();\r\n+            });\r\n+        });\r\n+\r\n+        referredReferences.clear();\r\n+        proxies.clear();\r\n+    }\r\n+\r\n+    public ConcurrentMap<String, ReferenceConfigBase<?>> getReferredReferences() {\r\n+        return referredReferences;\r\n+    }\r\n+\r\n+    public ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> getProxies() {\r\n+        return proxies;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return \"ReferenceConfigCache(name: \" + name\r\n+                + \")\";\r\n+    }\r\n+\r\n+    public interface KeyGenerator {\r\n+        String generateKey(ReferenceConfigBase<?> referenceConfig);\r\n+    }\r\n+}\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.event.EventListener", "source2": "META-INF/dubbo/internal/org.apache.dubbo.event.EventListener", "comments": ["Ordering differences only"], "unified_diff": "@@ -1 +1 @@\n-config-logging=org.apache.dubbo.config.event.listener.LoggingEventListener\n+config-logging=org.apache.dubbo.config.event.listener.LoggingEventListener\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter", "source2": "META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-# since 2.7.8\n-local = org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter\n+# since 2.7.8\r\n+local = org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "unified_diff": null, "details": [{"source1": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "comments": ["Ordering differences only"], "unified_diff": "@@ -130,16 +130,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-registry-eureka</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-registry-etcd3</artifactId>\n       <version>${project.parent.version}</version>\n@@ -154,16 +154,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-zookeeper</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-etcd</artifactId>\n       <version>${project.parent.version}</version>\n@@ -172,16 +172,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-nacos</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-consul</artifactId>\n       <version>${project.parent.version}</version>\n@@ -202,16 +202,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-configcenter-nacos</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-configcenter-consul</artifactId>\n       <version>${project.parent.version}</version>\n"}]}]}
