import * as GameTest from "mojang-gametest";
import { BlockLocation, MinecraftBlockTypes } from "mojang-minecraft";

function locToStr(loc) {
  return [loc.x.toFixed(3), loc.y.toFixed(3), loc.z.toFixed(3)].join(", ");
}

function locationToBlockLocation(loc) {
  return new BlockLocation(Math.floor(loc.x), Math.floor(loc.y), Math.floor(loc.z));
}

// because of the barrier blocks, these positions are offset (2, 0, 40) from the Java tests
GameTest.register("TntTests", "cannon", (test) => {
  const projectilePosition = new BlockLocation(3, 10, 41);
  const chargePosition = new BlockLocation(3, 10, 43);

  for (var i = 0; i < 5; i++) {
    var chargeTnt = test.spawn("minecraft:tnt", chargePosition);
    test.setTntFuse(chargeTnt, 20);
  }

  var projectiles = new Array(5);

  test
    .startSequence()
    .thenExecuteAfter(10, () => {
      for (var projectile of projectiles) {
        projectile = test.spawn("minecraft:tnt", projectilePosition);
        test.setTntFuse(projectile, 30);
      }
    })
    .thenExecuteAfter(1, () => {
      test.setBlockType(MinecraftBlockTypes.air, new BlockLocation(2, 10, 40));
    })
    .thenExecuteFor(19, () => {
      const expectedBlockLocation = locationToBlockLocation(projectiles[0].location);
      const expectedVelocity = projectiles[0].velocity;

      for (var i = 1; i < projectiles.length; i++) {
        const blockLoc = locationToBlockLocation(projectiles[i].location);
        if (!blockLoc.equals(expectedBlockLocation)) {
          test.fail(
            "All projectile tnt should be in the same location, but they have spread apart. Expected " +
              locToStr(expectedBlockLocation) +
              ", but got " +
              locToStr(blockLoc)
          );
        }

        if (!projectiles[i].velocity.equals(expectedVelocity)) {
          test.fail(
            "All projectile tnt should have the same velocity, but they do not. Expected " +
              locToStr(expectedVelocity) +
              ", but got " +
              locToStr(projectiles[i].velocity)
          );
        }

        // java tests the projectiles are still "alive". This seems unecessary because the TNT shouldn't be moving unless it is alive.
      }
    })
    .thenExecute(() => {
      const expectedLocation = new BlockLocation(3, 14, 4);
      for (const projectile of projectiles) {
        test.assertEntityInstancePresent(projectile, expectedLocation);
      }
    })
    .thenSucceed();
})
  .maxTicks(30)
  .tag("suite:java_parity");

GameTest.register("TntTests", "bedrock_cannon", (test) => {
  const projectilePosition = new BlockLocation(3, 9, 19);
  const chargePosition = new BlockLocation(3, 9, 22);

  for (var i = 0; i < 5; i++) {
    var chargeTnt = test.spawn("minecraft:tnt", chargePosition);
    test.setTntFuse(chargeTnt, 20);
  }

  var projectile = null;

  test
    .startSequence()
    .thenExecuteAfter(10, () => {
      for (var i = 0; i < 5; i++) {
        projectile = test.spawn("minecraft:tnt", projectilePosition);
        test.setTntFuse(projectile, 15);
      }
    })
    .thenExecuteAfter(10, () => {
      test.setBlockType(MinecraftBlockTypes.air, new BlockLocation(3, 9, 18));
    })
    .thenExecuteAfter(5, () => {
      const expectedLocation = new BlockLocation(3, 9, 7);

      test.assertEntityInstancePresent(projectile, expectedLocation);
    })
    .thenSucceed();
})
  .maxTicks(26)
  .tag(GameTest.Tags.suiteDefault);

// SIG // Begin signature block
// SIG // MIInrwYJKoZIhvcNAQcCoIInoDCCJ5wCAQExDzANBglg
// SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
// SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC
// SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
// SIG // Cw8pJyuOVJr9IwAeXcMUU1+X9zLIXYub82FAiA4G5GGg
// SIG // gg2BMIIF/zCCA+egAwIBAgITMwAAAlKLM6r4lfM52wAA
// SIG // AAACUjANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJV
// SIG // UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
// SIG // UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
// SIG // cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT
// SIG // aWduaW5nIFBDQSAyMDExMB4XDTIxMDkwMjE4MzI1OVoX
// SIG // DTIyMDkwMTE4MzI1OVowdDELMAkGA1UEBhMCVVMxEzAR
// SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
// SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
// SIG // bjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
// SIG // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
// SIG // 0OTPj7P1+wTbr+Qf9COrqA8I9DSTqNSq1UKju4IEV3HJ
// SIG // Jck61i+MTEoYyKLtiLG2Jxeu8F81QKuTpuKHvi380gzs
// SIG // 43G+prNNIAaNDkGqsENQYo8iezbw3/NCNX1vTi++irdF
// SIG // qXNs6xoc3B3W+7qT678b0jTVL8St7IMO2E7d9eNdL6RK
// SIG // fMnwRJf4XfGcwL+OwwoCeY9c5tvebNUVWRzaejKIkBVT
// SIG // hApuAMCtpdvIvmBEdSTuCKZUx+OLr81/aEZyR2jL1s2R
// SIG // KaMz8uIzTtgw6m3DbOM4ewFjIRNT1hVQPghyPxJ+ZwEr
// SIG // wry5rkf7fKuG3PF0fECGSUEqftlOptpXTQIDAQABo4IB
// SIG // fjCCAXowHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYB
// SIG // BQUHAwMwHQYDVR0OBBYEFDWSWhFBi9hrsLe2TgLuHnxG
// SIG // F3nRMFAGA1UdEQRJMEekRTBDMSkwJwYDVQQLEyBNaWNy
// SIG // b3NvZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEWMBQG
// SIG // A1UEBRMNMjMwMDEyKzQ2NzU5NzAfBgNVHSMEGDAWgBRI
// SIG // bmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmg
// SIG // R6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
// SIG // b3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDct
// SIG // MDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcw
// SIG // AoZFaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
// SIG // cy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDct
// SIG // MDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL
// SIG // BQADggIBABZJN7ksZExAYdTbQJewYryBLAFnYF9amfhH
// SIG // WTGG0CmrGOiIUi10TMRdQdzinUfSv5HHKZLzXBpfA+2M
// SIG // mEuJoQlDAUflS64N3/D1I9/APVeWomNvyaJO1mRTgJoz
// SIG // 0TTRp8noO5dJU4k4RahPtmjrOvoXnoKgHXpRoDSSkRy1
// SIG // kboRiriyMOZZIMfSsvkL2a5/w3YvLkyIFiqfjBhvMWOj
// SIG // wb744LfY0EoZZz62d1GPAb8Muq8p4VwWldFdE0y9IBMe
// SIG // 3ofytaPDImq7urP+xcqji3lEuL0x4fU4AS+Q7cQmLq12
// SIG // 0gVbS9RY+OPjnf+nJgvZpr67Yshu9PWN0Xd2HSY9n9xi
// SIG // au2OynVqtEGIWrSoQXoOH8Y4YNMrrdoOmjNZsYzT6xOP
// SIG // M+h1gjRrvYDCuWbnZXUcOGuOWdOgKJLaH9AqjskxK76t
// SIG // GI6BOF6WtPvO0/z1VFzan+2PqklO/vS7S0LjGEeMN3Ej
// SIG // 47jbrLy3/YAZ3IeUajO5Gg7WFg4C8geNhH7MXjKsClsA
// SIG // Pk1YtB61kan0sdqJWxOeoSXBJDIzkis97EbrqRQl91K6
// SIG // MmH+di/tolU63WvF1nrDxutjJ590/ALi383iRbgG3zkh
// SIG // EceyBWTvdlD6FxNbhIy+bJJdck2QdzLm4DgOBfCqETYb
// SIG // 4hQBEk/pxvHPLiLG2Xm9PEnmEDKo1RJpMIIHejCCBWKg
// SIG // AwIBAgIKYQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCB
// SIG // iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
// SIG // b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
// SIG // Y3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWlj
// SIG // cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
// SIG // IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw
// SIG // OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
// SIG // aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
// SIG // ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQD
// SIG // Ex9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDEx
// SIG // MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
// SIG // q/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4Bjga
// SIG // BEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSH
// SIG // fpRgJGyvnkmc6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpg
// SIG // GgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpc
// SIG // oRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnn
// SIG // Db6gE3e+lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD
// SIG // 2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLT
// SIG // swM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOE
// SIG // y/S6A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2
// SIG // z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
// SIG // A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL
// SIG // 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uD
// SIG // jexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmnEyim
// SIG // p31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8Hh
// SIG // hUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX
// SIG // 3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0wggHpMBAG
// SIG // CSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXT
// SIG // gqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMA
// SIG // dQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
// SIG // AwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx
// SIG // 0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3Js
// SIG // Lm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N
// SIG // aWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4G
// SIG // CCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDov
// SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS
// SIG // b29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
// SIG // HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF
// SIG // BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
// SIG // aW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsGAQUF
// SIG // BwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5
// SIG // AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3
// SIG // DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKbC5YR4WOS
// SIG // mUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np
// SIG // 22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r
// SIG // 4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6I/MTfaaQdION
// SIG // 9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWlu
// SIG // WpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiX
// SIG // mE0OPQvyCInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ
// SIG // 2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNA
// SIG // BQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPD
// SIG // XVJihsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yH
// SIG // PgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
// SIG // XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS
// SIG // oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5
// SIG // GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33VtY5E9
// SIG // 0Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZO
// SIG // SEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGYYw
// SIG // ghmCAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQI
// SIG // EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
// SIG // HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAm
// SIG // BgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENB
// SIG // IDIwMTECEzMAAAJSizOq+JXzOdsAAAAAAlIwDQYJYIZI
// SIG // AWUDBAIBBQCggcAwGQYJKoZIhvcNAQkDMQwGCisGAQQB
// SIG // gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcC
// SIG // ARUwLwYJKoZIhvcNAQkEMSIEIKhASdMK1yYk5Jo/7d3d
// SIG // Ak7obL/DPYXy8wpPbF4inyxiMFQGCisGAQQBgjcCAQwx
// SIG // RjBEoCSAIgBNAGkAbgBlAGMAcgBhAGYAdAAgAEIAZQBk
// SIG // AHIAbwBjAGuhHIAaaHR0cHM6Ly93d3cubWluZWNyYWZ0
// SIG // Lm5ldC8wDQYJKoZIhvcNAQEBBQAEggEARROaLrXOXqNx
// SIG // Gadn9BQ5bK+Yl8ZScrSV+lw5AdYYv7VqK09/SafnjCkf
// SIG // iRy/02n2bhPFMC/eD96+4BKqe2fjvfTxXgIf6xdsZsr3
// SIG // Pv2TpiDhAR9uuBpkciI0c8RegC9lk6DrWExfUqx1pUdw
// SIG // AnRIQsoJez14VhmM8Oy1f/cmQ2ZrSBVrhGxPpkDvL8W+
// SIG // 5Zs12hoqcSw03zGwFzf8zMqhwCGi9S/fSRfd76p4wr0u
// SIG // oFgUDXiYo1UHKV9LuZF79PtUlmlxG+d9jZq455+yndZ3
// SIG // YGpFY12mhb6OhWFz28T9K6+Ho5vgZW8LxI201EhEJA0l
// SIG // 5zpfaxYL8J0CxwfXB4eBdaGCFv4wghb6BgorBgEEAYI3
// SIG // AwMBMYIW6jCCFuYGCSqGSIb3DQEHAqCCFtcwghbTAgED
// SIG // MQ8wDQYJYIZIAWUDBAIBBQAwggFPBgsqhkiG9w0BCRAB
// SIG // BKCCAT4EggE6MIIBNgIBAQYKKwYBBAGEWQoDATAxMA0G
// SIG // CWCGSAFlAwQCAQUABCA/SYqSw4DQwllYelad9tTIctFW
// SIG // +4VclKCTn88kzHIOQAIGYoJ8BpWpGBEyMDIyMDUyMzIw
// SIG // NTIxNi4xWjAEgAIB9KCB0KSBzTCByjELMAkGA1UEBhMC
// SIG // VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
// SIG // B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
// SIG // b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJp
// SIG // Y2EgT3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRT
// SIG // UyBFU046RTVBNi1FMjdDLTU5MkUxJTAjBgNVBAMTHE1p
// SIG // Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghFXMIIH
// SIG // DDCCBPSgAwIBAgITMwAAAZW3/A3W4zcxJQABAAABlTAN
// SIG // BgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEG
// SIG // A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
// SIG // ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
// SIG // MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ
// SIG // Q0EgMjAxMDAeFw0yMTEyMDIxOTA1MTJaFw0yMzAyMjgx
// SIG // OTA1MTJaMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
// SIG // V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
// SIG // A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYD
// SIG // VQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
// SIG // MSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpFNUE2LUUy
// SIG // N0MtNTkyRTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt
// SIG // U3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEBBQAD
// SIG // ggIPADCCAgoCggIBAJ9tQQxntks7P1qhEJ4kviGFP1Dw
// SIG // lkHbFpWUw0K3dvCFxMjkYs+u3Z73cMCyaWo7PDVwWI8+
// SIG // DpLmwsJfPstttRCkuFrxLi/apxwy1OiQRoNBL5AkSucC
// SIG // yXpVKZG8DLSeWP4L89pm4tvc7NjQBHDtR4JkunJY88f6
// SIG // Tkx1iPo1QNM2hepvNAcK4+z5+AiiujnLcMeg7TvuDoiv
// SIG // ZMcjHXJ9UUS3nMNwU85gyDjIGLgDpdzeGb21nrDzj2cG
// SIG // 9UrCblgAt8ffL9/efguc3rVvXDMDHdkJmN/XdQpukTun
// SIG // oNgmsdEH/6nAWMb31PAcfq5fMN5lPr+vqofsAAHCfx+l
// SIG // hzVOaV4VjxhG5XPOOn1WQ8dXxXO/MsvtAraS155csv9j
// SIG // iW+MvqHPI6YT7UtUPeURtiGjXMK34XttT4WmPIF9MLiL
// SIG // /Aeym1vbXxiVuRC3WLUHqWWYnBUXAItfuDFDjxAgZRpw
// SIG // zLySnX7NzNj5LGWloSA2ZCR9zWto+H3Lmwxrpfjz7HQr
// SIG // sHw6oOhdxOIQIiMl63HC24GVCx4nTkdF+Kx+AWbT2Qbu
// SIG // 90cSjc1tS4wwEWKRzhug31R+bSJSGr8m2pXQrCu/0K/d
// SIG // rIOB03ARaIvZrrkicRZKlFNh+wJDTd6oSHkDevBX8p9Q
// SIG // VyK34Os/71VwOmNZGwKiRm/i2CfmoBc0y0drw2KpAgMB
// SIG // AAGjggE2MIIBMjAdBgNVHQ4EFgQUq5fTYgIUV1eCtwIG
// SIG // YMl8fm/8qRcwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXS
// SIG // ZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDov
// SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj
// SIG // cm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAo
// SIG // MSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcw
// SIG // AoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
// SIG // cy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIw
// SIG // UENBJTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAT
// SIG // BgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsF
// SIG // AAOCAgEA4LM23h8n6M69C6rQi2ffshmtg0EazACL4gAU
// SIG // zdgYr/AZCUSdyCOY0G5pz3lbZ8AvrG0VV8x+R6pIswuq
// SIG // iJ1WxT0GbgMQGNpY05P25f+1xiIlJ8VAzSsNuuXxXicz
// SIG // zxFkXnob+olb2Dl0io5KiKbMpS39DtYfpUHJbSxqvnAa
// SIG // +Ci8reoVp3ApKHNFhwSpOQcfbOKnl7veN7M8fHb61pio
// SIG // kbnEnN0MStnWcyLFGNoezcqlyyZli7GwhF8Fg4m8AUbK
// SIG // ZMZG/k+7Cw2mz0RyHUBqyrzgf9j/zE3cZCPg/cyIOfyL
// SIG // NQEMK5ch8diTf1uqdoCYVtSIJvL5Zam7N2TigMrP+xbC
// SIG // ueyhDva4QZUQ3v6TLD34dKjmLyXxmDViaP21SAOlVQaM
// SIG // B26gvIdDteqScqZL2QlIEqTiiQQODQh3ot4otDAfV7hp
// SIG // V5PJRjBwFffCDukslBa9HudrZIau2X/bdgZBO52ZY6vK
// SIG // HH2WdTsoEZX9o2/PS1Olyy5ywr5xkUoMSRYH+hQVWu3K
// SIG // 6fo0Pmlhk2PQKBG6nmCtUAKr8CBv4Q4YsIP7MS0Y2ini
// SIG // 18q+xhvrjbns0n1esweCkKJvvpZPfhE+YIEHLEtSQfEe
// SIG // rnMLJg27QgVcC3UBWJzDXgz5zMtghUzs07JWkV1wHUH0
// SIG // yImKTul5KKLRdNF2Xn9X8qxxNoIEXPcwggdxMIIFWaAD
// SIG // AgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3
// SIG // DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
// SIG // V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
// SIG // A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
// SIG // VQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB
// SIG // dXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0z
// SIG // MDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYD
// SIG // VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
// SIG // MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
// SIG // JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD
// SIG // QSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
// SIG // CgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9Kp
// SIG // bE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5K
// SIG // Wv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTz
// SIG // xXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9
// SIG // cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl
// SIG // 3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3K
// SIG // Ni1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3t
// SIG // pK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5Jas
// SIG // AUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ
// SIG // 1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHo
// SIG // vwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz
// SIG // 1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymei
// SIG // XtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8w
// SIG // dJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFd
// SIG // Etsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94
// SIG // q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0w
// SIG // ggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGC
// SIG // NxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1Ud
// SIG // DgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAE
// SIG // VTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIB
// SIG // FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
// SIG // L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYI
// SIG // KwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD
// SIG // AEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
// SIG // HwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQw
// SIG // VgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNy
// SIG // b3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9v
// SIG // Q2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB
// SIG // BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNy
// SIG // b3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRf
// SIG // MjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIB
// SIG // AJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEG
// SIG // k5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi
// SIG // 7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce57
// SIG // 32pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OO
// SIG // PcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECW
// SIG // OKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWK
// SIG // NsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3m
// SIG // Sj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSw
// SIG // ethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23K
// SIG // jgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4
// SIG // S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFE
// SIG // fnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+
// SIG // pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/
// SIG // Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7t
// SIG // fqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJt
// SIG // pQUQwXEGahC0HVUzWLOhcGbyoYICzjCCAjcCAQEwgfih
// SIG // gdCkgc0wgcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
// SIG // YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
// SIG // VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNV
// SIG // BAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx
// SIG // JjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkU1QTYtRTI3
// SIG // Qy01OTJFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T
// SIG // dGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQDRj4LI
// SIG // t7MaBUdYU2YojUu4T+Fjq6CBgzCBgKR+MHwxCzAJBgNV
// SIG // BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
// SIG // VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
// SIG // Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU
// SIG // aW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBBQUA
// SIG // AgUA5jY0szAiGA8yMDIyMDUyNDAwMjgzNVoYDzIwMjIw
// SIG // NTI1MDAyODM1WjB3MD0GCisGAQQBhFkKBAExLzAtMAoC
// SIG // BQDmNjSzAgEAMAoCAQACAhW2AgH/MAcCAQACAhJdMAoC
// SIG // BQDmN4YzAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisG
// SIG // AQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAw
// SIG // DQYJKoZIhvcNAQEFBQADgYEAKzIsavzmqEeWzh3hmOMy
// SIG // zN/LByT8JloZoKfOLap34orrYjP7IlDmy+Sua4GQTAQR
// SIG // 0iclQy1ERC9Alb/MQa4SR+yjjnSkCVYO30h2Skvd+UJf
// SIG // eXOMA/E/TkqvpUfNazYZ+2Ka/DWy/6lryOKo+iej7+nM
// SIG // Qb8YM5HcT7FqGZzPNb4xggQNMIIECQIBATCBkzB8MQsw
// SIG // CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
// SIG // MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
// SIG // b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv
// SIG // ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAZW3/A3W
// SIG // 4zcxJQABAAABlTANBglghkgBZQMEAgEFAKCCAUowGgYJ
// SIG // KoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3
// SIG // DQEJBDEiBCB6CozDDuOFtxfSd9b5c3/Nz+ZgeeYBCT7n
// SIG // bfHEVmefjzCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQw
// SIG // gb0EIFzmS+GNkAt7aaEjP9B3uR5U6YD9wLV3MplPjJss
// SIG // SQLHMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
// SIG // BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
// SIG // HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
// SIG // MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
// SIG // IDIwMTACEzMAAAGVt/wN1uM3MSUAAQAAAZUwIgQgG/c8
// SIG // PSg8pyMWXw7cy1W8MNlaKq9f5J4bwwOqNbN+OOcwDQYJ
// SIG // KoZIhvcNAQELBQAEggIAeeB/fJkwTAhfhRXocxhHQb82
// SIG // hrKt+vq40lsRZUL8JsVWGtcO788hEEkiKYJsJPHxhWW+
// SIG // Dc4hFA+XDuHVWlrkbobtNVxhVOSJUgKmHa1iH+k8FsBR
// SIG // npNTDXyevNy2bCCBkiBx6PkfoWSZvbIfpxNpIVkYJ2Dw
// SIG // KhXCz80MlhQbJJQELtBdomyhX45VR1pL0Jw2EV7orv9E
// SIG // FdcoBhBZ1VB1eST+V9oXWCeg7tpWJrxOTXyXP5qcjdF3
// SIG // 6wAWstI6LYb2+GLfd6oON6EkCcMqT0oj9OlB+f50G8EW
// SIG // 6RgqE0XcVuLyFlEPHGLLwXEljYSO/OFAtQugI52+aQyB
// SIG // hdRzrlzVpZ6tAFdFQ+Jn1WbLFkLxGn9AubRWbq7GxR1i
// SIG // 7Bsp30Pw8Tpgcl8TQjLcLXRPwqoalsTW86i8B8lb3Deq
// SIG // FqOi6aywx2lb1mAGSDWpooEHqSZ7myMW/9XWT8XbgfbX
// SIG // n+G/r9M2R2eKEUcd4jtX3ekHLN3RwxiQtX06jVvVAEBm
// SIG // S/UqS4xs/HFLmkUmhLy0fDrrjwc4kZM/sKwT8q5RpDjg
// SIG // DkHiH7hrzb4ibO1nw/VpSUDs/MFzBKMu1vcSNJMbDBp1
// SIG // O+szzWyGzzbfG5Is/sg9s7CbyYzDo98UAP32bl4dOc/w
// SIG // NjZ5hM08MOVCeDzyzo6BPtXjNuYsoiYvOTNoG/jZWGk=
// SIG // End signature block
